Microsoft 製品に組み込まれている Visual Basic の実装。
本当の対症療法ですが、発想を逆転して、Cファイルの方のOpenイベントで必要情報を集めちゃったらいかがですか?
このブラウザーはサポートされなくなりました。
Microsoft Edge にアップグレードすると、最新の機能、セキュリティ更新プログラム、およびテクニカル サポートを利用できます。
EXCEL_VBAで複数のファイルを操作しようと考えています。
VBAを組み込んだAファイル、Bファイル、VBAが組み込まれてないCファイルがあります。
Bファイルを"開く”でオープンしファイルクローズ時処理
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim fileName As String
fileName = ThisWorkbook.Path & "\c.xlsx"
Dim dstWBc As Workbook
Set dstWBc = Workbooks.Open(fileName)
dstWBc.Worksheets("sheet1").Delete
ThisWorkbook.Worksheets("sheet1").Copy Before:=dstWBc.Sheets("Sheet2")
dstWBc.Close
Set dstWBc = Nothing
End Sub
にてCファイルをオープン、Bファイルから1シートコピーしてCファイル、Bファイルはクローズします。
Bファイル、Cファイルは正常に動作しました。
ところがAファイルでVBAプログラムから
Workbooks.Open Bファイル
でオープンし、Bファイルをクローズしたとき、上記プログラムでブレイクしながら実行して
確認したところdstWBc=NothingでありCファイルがオープンできないため、以降がエラーになることが判りました。
なぜ、dstWBc=Nothingになるのでしょうか?
Microsoft 製品に組み込まれている Visual Basic の実装。
ロックされた質問。 この質問は、Microsoft サポート コミュニティから移行されました。 役に立つかどうかに投票することはできますが、コメントの追加、質問への返信やフォローはできません。
質問作成者が受け入れた回答
本当の対症療法ですが、発想を逆転して、Cファイルの方のOpenイベントで必要情報を集めちゃったらいかがですか?
質問作成者が受け入れた回答
おっしゃっている症状は確認しました。
通常のものであれば、他のブックからVBAで開かれたブックで更にブックを開くことは問題ありません。
しかし、それが、BeforeCloseイベントプロシージャ内ですと、ファイルOpenもセーブもできないようです。
例えばブックBのOpenイベントでCを開けばちゃんと開けます。ただし、その後のBeforeClose プロシージャの中ではSaveは一切機能しないようです。
対象療法みたいなものはいくつか考えられますが(まだ試してません)、それ以前に全体の設計がおかしいように思います。
現状ではBは何もしないで、シート1をCブックにコピーしているだけなわけで、こんなことはAから直接やってしまえばよい話でしょう。(BとCを開いてAでコピーするなど)
Bにはどのような機能を期待されているんでしょうか?
質問作成者が受け入れた回答
もう少し詳細に情報をお願いします。
Aファイルから開いた場合と書かれてますが、Bファイルのクローズはどうやっておられるんでしょうか?
手動orVBA
VBAの場合はAに入っているコードをだしてください。
また、そのエラーになるときどの行で停止していますか、またエラーは正確にはどう表示されてますか?
ご教示ありがとうございます。あいこです。
この構成に関してですがBファイルは基本台帳としているものです。Cファイルはこの基本台帳の閲覧用ファイルです。 Bファイル内の閲覧にむかないシートがあるため、部分的なシートコピーを実施します。
Aファイルは台帳に登録する資料の基本データです。台帳へ登録落ち、入力間違えを防ぐため、VBAで台帳入力をしています。当然、AファイルデータをBファイルに登録するならばCファイルを書き換える必要があります。BファイルはAファイルデータ以外(Dファイルや手入力)の入力もあるため、必然的にBファイルからCファイルと・・・考えます。
y.sakuda様のご教示によりますとBeforeClose内でのOpen,saveが実施できないということ・・・ありがとうございます。本来ならばオペレータが無意識にCファイルを操作していることが理想でした・・・・
なにか、アドバイスいただけますと助かります。以上、よろしくお願いします
ご回答、ありがとうございます。あいこです。
Aファイルにシート上にボタンbtnOPENSを配置し、以下リストを実行します。
Private Sub btnOPENS_Click()
Dim fileName As String
fileName = ThisWorkbook.Path & "\b.xlsm"
Dim dstWBb As Workbook
Stop
Set dstWBb = Workbooks.Open(fileName)
Application.DisplayAlerts = False '削除可否等の表示無削除、コピー)
Application.DisplayAlerts = True '削除可否等の表示有
dstWBb.Close
Set dstWBb = Nothing
End Sub
Bファイルリスト内の以下←箇所でエラー、ただしなぜかdstWBc=Nothingになっています。
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim fileName As String
fileName = ThisWorkbook.Path & "\c.xlsx"
Dim dstWBc As Workbook
Set dstWBc = Workbooks.Open(fileName)
dstWBc.Worksheets("sheet1").Delete ← err=91:オブジェクト変数またはwth変数が設定されていません
ThisWorkbook.Worksheets("sheet1").Copy Before:=dstWBc.Sheets("Sheet2")
dstWBc.Close
Set dstWBc = Nothing
End Sub
”開く”でファイルをオープンしたときにはdstWBcは正常だが、Aファイルの上記プログラムからだとdstWBc=Nothingになってしまいます。Workbooks.Openメゾッドのパラメータも確認しましたが該当するものが無いと思いました。以上、よろしくお願いします