プロが教える店舗&オフィスのセキュリティ対策術

いつもお世話になっております。
おしえてくれませんでしょうか
下記のコードは
BBB.xlsmのエクセルを開き
wb.Worksheets("go").Cells(1, 1).Valueの値を
ThisWorkbook.Worksheets("Sheet5").Cells(1, 1).Valueに
書き込むコードです。

ここまではできましたが、
既にBBB.xlsmが開いていた場合
既に開いていますメッセージが表示表示され
エラーになります。

このエラーを表示させず、
下記のコードを実行して
BBB.xlsmを閉じて終了することは
できますでしょうか

わかる方おしえてくれませんでしょうか

ThisWorkbook.Worksheets("Sheet5").Cells(1, 1).Value = _
wb.Worksheets("go").Cells(1, 1).Value



Sub xlaaa()

Dim xlApp As New Application
Dim wb As Workbook
Dim str As String
str = "C:\Users\user\OneDrive\デスクトップ\BBB.xlsm"

Set wb = xlApp.Workbooks.Open(str)


ThisWorkbook.Worksheets("Sheet5").Cells(1, 1).Value = _
wb.Worksheets("go").Cells(1, 1).Value


wb.Close (False)


End Sub

質問者からの補足コメント

  • うーん・・・

    文字数制限のため分けて投稿します

    Dim w As Workbook
    Dim str As String
    Dim xlApp As New Application
    Dim wb As Workbook
    str = "C:\Users\user\OneDrive\デスクトップ\BBB.xlsm"
    For Each w In Workbooks
    If w.Name = "BBB.xlsm" Then Set wb = w: Exit For
    Next w

    No.1の回答に寄せられた補足コメントです。 補足日時:2022/04/11 16:51
  • うーん・・・

    If wb Is Nothing Then Set wb = xlApp.Workbooks.Open("C:\Users\user\OneDrive\デスクトップ\BBB.xlsm")
    ThisWorkbook.Worksheets("Sheet5").Cells(1, 1).Value = _
    wb.Worksheets("go").Cells(1, 1).Value
    wb.Close

    わたし、どこかまちがっいるんですが、わかりませんです。
    理由としては別のプログラムでのOLEの操作が完了するまで待機します。
    とでてしまいます。

      補足日時:2022/04/11 16:53

A 回答 (3件)

No2です



>バックグラウンドにエクセルが増殖していました。
>なんなんでしょうか。
以下は、推測になりますが・・

別のマクロかどうかは不明ですが、No1の2番目のように別にエクセルを立ち上げる処理を行っていませんか?
その際に、(No1にも書きましたが)後始末をしないままで終了すると、バックグラウンドでエクセルが立ち上がったままになります。
(エラーなどで終了処理をしていない場合も同様です。)

・・ということが起こっているのではないかと推測します。
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2022/04/11 19:37

No1です



>どこかまちがっいるんですが、わかりませんです
No1のコードも、当方がご提示のコード(の一部)をコピペしてしまったため、おかしな記述になっていました。
すみませんでした。

Dim str1 As String
Dim w As Workbook
Dim wb As Workbook

str1 = "C:\Users\user\OneDrive\デスクトップ\BBB.xlsm"
For Each w In Workbooks
If w.Name = "BBB.xlsm" Then Set wb = w: Exit For
Next w
If wb Is Nothing Then Set wb = Workbooks.Open(str1)

ThisWorkbook.Worksheets("Sheet5").Cells(1, 1).Value = _
wb.Worksheets("go").Cells(1, 1).Value
wb.Close

ではうまくいきませんか?


ちなみに、No1の最後に記した方法だと、

Const str1 = "'C:\Users\user\OneDrive\デスクトップ\[BBB.xlsm]go'!R1C1"
ThisWorkbook.Worksheets("Sheet5").Cells(1, 1).Value = _
ExecuteExcel4Macro(str1)

で同様の処理が可能だと思いますけれど・・
※ OneDriveでは試したことがないので、もしかするとうまくいかないかもですが。
    • good
    • 0
この回答へのお礼

いつもありがとうございます。
うまくいきました。
タスクマネージャーで確認したところ
バックグラウンドにエクセルが増殖していました。
なんなんでしょうか。
それを全て削除してから、実行したら
問題ありませんでした。
ありがとうございました。

お礼日時:2022/04/11 18:37

こんにちは



すぐに思いつく方法として2通りあります。

◇開いているブックに同名のブックがあるか調べる
For Each w In Workbooks
If w.Name = "BBB.xlsm" Then Set wb = w: Exit For
Next w
If wb Is Nothing Then Set wb = xlApp.Workbooks.Open(str)

※ 上記はブック名だけで確認していますので、同名の別ブックが存在する場合はパスのチェックも必要になります。


◇別のエクセルスレッドから開く
Set EX = CreateObject("Excel.Application")
Set wb = EX.Workbooks.Open(str)

※ 別スレッドなの、すでに開いているブックでも重複して開けます。
※ 処理終了時にApplicationも終了しておく必要があります。


◇ご質問とは直接関係はありませんが・・・
読み込むセルが固定位置の1か所だけなのであれば、わざわざブックをオープンしなくても直接読み込むことも可能です。
こちらの方法であれば、すでに開いているかを気にする必要もありませんし、1箇所だけなら格段に速いです。
https://akira55.com/do_not_open_the_book/
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!