• ベストアンサー

エクセルVBA 他ブックのシートのsub呼び出し

ブックBのシート(*)に関数 sub aaaを定義します。 (*)シートオブジェクト名を任意のものに変更します。(→eee) この時、ブックAのVBAからブックBを開き、その参照を得て(workbook型の wbという名前の変数に格納します。)、「Call wb.eee.aaa」と 呼び出すことができると思っていましたが、"オブジェクトは そのメソッド/プロパティを持っていません"という旨のエラーが 出て、呼び出すことができませんでした。 どのようにしたら呼び出すことができるようになりますか。 aaaはpublicで定義しています。

質問者が選んだベストアンサー

  • ベストアンサー
  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.2

> aaaはpublicで定義しています。 Workbook型の変数では、ユーザーが独自に定義したメソッドを呼び出せなくなります。 (Workbookオブジェクトに定義された(=組み込み済みの)メソッドしか呼び出せない) そのオブジェクトを受ける変数の型をObject型にすれば、独自に定義したaaaメソッドを 呼び出すことができるかと思います。 (「Dim wb As Object」と宣言すればOk、と) なお、VBEのメニューから「ツール(T)→参照設定(R)」で『参照設定』ダイアログを開き、 『参照(B)』ボタンを押して、ブックBへの参照設定を行うと、  Dim wb As VBAProject.eee といった宣言も可能になり、eeeシートに定義したPublicなプロパティ/メソッドに対して インテリセンスによる入力支援を有効にすることもできますので、併せて参考まで。 (上記での「VBAProject」には、VBEのメニューで「ツール(T)→○○のプロパティ(E)」  で開く『プロジェクトプロパティ』ダイアログの『全般』タブにある『プロジェクト名(N)』を  指定します) 但し、ブックAを開くと同時に毎回ブックBが開かれることになりますので、運用できる 場面は限られるかと思いますが(汗)

otaks
質問者

お礼

以下な感じで他ブックのシートに定義されている関数を呼び出すことが できました。sshがworkbookだと関数がうまく呼び出せなかったので、 参考にさせていただき助かりました。ご回答ありがとうございました。 Private Sub CommandButton1_Click() Dim wb As Workbook Dim path Dim ssh As Object path = Application.GetOpenFilename("Microsoft Excelブック,*.*") Set wb = Workbooks.Open(path) Call get_ob(wb, ssh, "eee") 'コードネームからシートオブジェクト取得 Call ssh.aaa wb.Close (False) Set wb = Nothing End Sub 'コードネームからシートオブジェクト取得 Sub get_ob(wb, ssh, name) Dim sh As Object For Each sh In wb.Worksheets If sh.CodeName = name Then Set ssh = sh Exit For End If Next End Sub

その他の回答 (1)

回答No.1

こんなかんじでできました Call Application.Workbooks("Book1").Sheets("Sheet1").test Call Application.Workbooks(ファイル名).Sheets(シート名).プロシージャ名 シート名は、対象の Worksheet の Name プロパティを指定します。 オブジェクト名はプロジェクト単位で通用するグローバルなシンボルのようです。 プロジェクト単位(ブック)を超えてプロシージャを参照するには、Application オブジェクト経由でワークブックの名前とオブジェクトの名前(Name プロパティ)で対象のオブジェクトを解決する必要があるようです。

otaks
質問者

お礼

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