次の方法で共有

EXCEL_VBAでファイルオープン連鎖について

Anonymous
2012-05-24T10:17:20+00:00

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になるのでしょうか?

開発者テクノロジ | Visual Basic for Applications

ロックされた質問。 この質問は、Microsoft サポート コミュニティから移行されました。 役に立つかどうかに投票することはできますが、コメントの追加、質問への返信やフォローはできません。

0 件のコメント コメントはありません

質問作成者が受け入れた回答

Anonymous
2012-05-25T05:53:57+00:00

本当の対症療法ですが、発想を逆転して、Cファイルの方のOpenイベントで必要情報を集めちゃったらいかがですか?

この回答は役に立ちましたか?

0 件のコメント コメントはありません

質問作成者が受け入れた回答

Anonymous
2012-05-25T01:47:49+00:00

おっしゃっている症状は確認しました。

通常のものであれば、他のブックからVBAで開かれたブックで更にブックを開くことは問題ありません。

しかし、それが、BeforeCloseイベントプロシージャ内ですと、ファイルOpenもセーブもできないようです。

例えばブックBのOpenイベントでCを開けばちゃんと開けます。ただし、その後のBeforeClose プロシージャの中ではSaveは一切機能しないようです。

対象療法みたいなものはいくつか考えられますが(まだ試してません)、それ以前に全体の設計がおかしいように思います。

現状ではBは何もしないで、シート1をCブックにコピーしているだけなわけで、こんなことはAから直接やってしまえばよい話でしょう。(BとCを開いてAでコピーするなど)

Bにはどのような機能を期待されているんでしょうか?

この回答は役に立ちましたか?

0 件のコメント コメントはありません

質問作成者が受け入れた回答

Anonymous
2012-05-24T15:25:16+00:00

もう少し詳細に情報をお願いします。

Aファイルから開いた場合と書かれてますが、Bファイルのクローズはどうやっておられるんでしょうか?

手動orVBA

VBAの場合はAに入っているコードをだしてください。

また、そのエラーになるときどの行で停止していますか、またエラーは正確にはどう表示されてますか?

この回答は役に立ちましたか?

0 件のコメント コメントはありません

3 件の追加の回答

並べ替え方法: 最も役に立つ
  1. Anonymous
    2012-05-25T05:50:05+00:00

    ご教示ありがとうございます。あいこです。

    この構成に関してですがBファイルは基本台帳としているものです。Cファイルはこの基本台帳の閲覧用ファイルです。 Bファイル内の閲覧にむかないシートがあるため、部分的なシートコピーを実施します。

    Aファイルは台帳に登録する資料の基本データです。台帳へ登録落ち、入力間違えを防ぐため、VBAで台帳入力をしています。当然、AファイルデータをBファイルに登録するならばCファイルを書き換える必要があります。BファイルはAファイルデータ以外(Dファイルや手入力)の入力もあるため、必然的にBファイルからCファイルと・・・考えます。

    y.sakuda様のご教示によりますとBeforeClose内でのOpen,saveが実施できないということ・・・ありがとうございます。本来ならばオペレータが無意識にCファイルを操作していることが理想でした・・・・

    なにか、アドバイスいただけますと助かります。以上、よろしくお願いします

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません
  2. Anonymous
    2012-05-24T23:54:08+00:00

    ご回答、ありがとうございます。あいこです。

    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メゾッドのパラメータも確認しましたが該当するものが無いと思いました。以上、よろしくお願いします

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません