質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

2835閲覧

ExcelVBA 非アクティブブックのマクロ実行エラーを解決したい

shirakoponzu000

総合スコア9

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2020/05/01 01:23

Excel VBAで、非アクティブブックのマクロを実行させようとするとエラーが発生します。
一般化してしまっていますが以下がコードです。
この中で
ThisWorkbook.Activate
をなくすと正常に動作します。

何かわかる方がいましたらアドバイスいただけると幸いです。

'fileURL 開きたいブックのURL 'fileName 開いたブックの名前 'macro1  開いたブックのマクロ名 Workbooks.Open fileURL  'fileURLは開きたいブックのURLです。 ThisWorkbook.Activate '開いたファイルを非アクティブにする。 Application.Run fileName & "!" & macro1 '開いた別ブックのマクロを実行

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

呼び出している処理側の問題のようなので、参考としてActive依存をチェックする方法を載せておきます。

グローバルなRangeプロパティへの参照を機械的に検知するアイディア - Qiita
imihito_Sandbox/DisableExcelGlobal.bas at master · imihito/imihito_Sandbox

今回の場合であれば以下のようにすればチェックできるでしょう

  1. Application.Runで呼び出しているブックに標準モジュールを追加
    1. で追加した標準モジュールに以下のコードを貼り付ける
  2. メニューバー「デバッグ」の中の「~のコンパイル」を実行(シュートカットキー Alt→D→L)
  3. Activeに依存した処理の箇所でコンパイルエラーが発生するため、適切に修正
  4. 3.、4.をエラーが無くなるまで繰り返す
  5. 1.で追加した標準モジュールを削除

vba

1'Excelのグローバルなメンバーを無効化するモジュール 2'https://qiita.com/nukie_53/items/4e9226ac8f747e772afd 3'https://github.com/imihito/imihito_Sandbox/blob/master/Excel/DisableExcelGlobal.bas 4 5'https://teratail.com/questions/257856 6 7Option Private Module 8 9'親を明示しないと危ないもの、使用頻度が低そうなメンバー(主観)の定義を上書きし無効化する。 10'上位階層のプロパティや関数的なメソッドのみが残る。 11 12'Method override 13Public Sub Calculate(a): End Sub 14Public Sub DDEExecute(): End Sub 15Public Sub DDEInitiate(): End Sub 16Public Sub DDEPoke(): End Sub 17Public Sub DDERequest(): End Sub 18Public Sub DDETerminate(): End Sub 19 20'Property override 21Public Sub ActiveCell(): End Sub 22Public Sub ActiveChart(): End Sub 23Public Sub ActivePrinter(): End Sub 24Public Sub ActiveSheet(): End Sub 25Public Sub ActiveWindow(): End Sub 26Public Sub ActiveWorkbook(): End Sub 27Public Sub AddIns(): End Sub 28Public Sub Cells(): End Sub 29Public Sub Charts(): End Sub 30Public Sub Columns(): End Sub 31Public Sub CommandBars(): End Sub 32Public Sub Creator(): End Sub 33Public Sub DDEAppReturnCode(): End Sub 34Public Sub Excel4IntlMacroSheets(): End Sub 35Public Sub Excel4MacroSheets(): End Sub 36Public Sub Names(): End Sub 37Public Sub Parent(): End Sub 38Public Sub Range(): End Sub 39Public Sub Rows(): End Sub 40Public Sub Selection(): End Sub 41Public Sub Sheets(): End Sub 42Public Sub Worksheets(): End Sub 43 44'Hidden Property 45Public Sub ActiveDialog(): End Sub 46Public Sub ActiveMenuBar(): End Sub 47Public Sub Assistant(): End Sub 48Public Sub DialogSheets(): End Sub 49Public Sub MenuBars(): End Sub 50Public Sub Modules(): End Sub 51Public Sub ShortcutMenus(): End Sub 52Public Sub Toolbars(): End Sub

ymakoto さんの回答と近い話ですが、fileNameの中身がおかしいのではないでしょうか?

また、開いたブックから名前を取得できるためfileName自体不要でしょう。

以下参考コードです。
fileURLとなっていたことから、適当なOneDrive上のファイルのURLで試してみましたが問題無く動作しました。

vba

1Public Sub teratail257856() 2 3 Dim fileURL As String 4 fileURL = "https://example.com/Sample.xlsm" 5 6 Dim macro1 As String 7 macro1 = "Macro1" 8 9 Dim macroBook As Workbook 10 Set macroBook = Workbooks.Open(fileURL) 11 12 ThisWorkbook.Activate 13 14 Dim appXl As Application 15 Set appXl = macroBook.Application 16 17 'macro1 が Sub プロシージャなら不要。 18 Dim resultOfMacro1 As Variant 19 20 '以下のどちらでも動作する。 21 'ブックの名前などは「'」で囲った方がベター。 22 'ブック名のみ指定。 23 resultOfMacro1 = appXl.Run("'" & macroBook.Name & "'!" & macro1) 24 'フルパスで指定。 25 resultOfMacro1 = appXl.Run("'" & macroBook.FullName & "'!" & macro1) 26 27 macroBook.Saved = True 28 macroBook.Close 29 30End Sub

投稿2020/05/01 10:01

編集2020/05/02 03:31
imihito

総合スコア2166

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/05/01 10:04

勉強になりました。ありがとうございます!
shirakoponzu000

2020/05/01 13:51

ありがとうございます。 コード勉強になりました。 しかしながらうまくいきません。 質問にもあるとおいThisWorkbook.Activeをなくす(コメントブロック)すれば正常に動くので、ブック名やURLには問題ないと思うのですが。。。。 自分でも再度見直してみます。
imihito

2020/05/01 13:55

そういえば、そもそもどんなエラーが出るのですか?
shirakoponzu000

2020/05/01 15:07

エラーは 実行時エラー 9 インデックスが有効な範囲にありません となります。 色々試していますが、うまくいかないです。
imihito

2020/05/02 03:15

となると Application.Run ではなく、外部ブックのマクロの作りの問題ですね。 恐らく ActiveWorkbookに依存した処理があるのでしょう。 呼び出し先のプロジェクトがロックされていなければ、「デバッグ」で問題の箇所がわかるはずです。
shirakoponzu000

2020/05/02 12:56

アドバイスありがとうございます。 アドバイスを参考にしていましたら原因がわかりました。 まさに外部ブックのマクロの中に、その外部ブック内の指定シートの操作がありました。 ブック名から設定していたつもりでしたが指定しておらず、その外部ブックがアクティブな状態では指定シートを探し出せ、アクティブでない場合は指定シートが探しだせないエラーでした。 ありがとうございました。
guest

0

勘違いでしたら申し訳ありません。VBAの提示が一部ですので何とも言えませんが
通常ですとFilepathをつけて開かれると思います。
サンプルではfileNameのみでfileURLと紐づいていないような気がします。

Thisworkbook.activeを入れることによってOPENしたExcelのファイル名はわかるものの
pathが見つけられなるのでエラーになるのではないでしょうか。

違っていたらすみません(無視してください)。。。

VBA

1Sub OpenWorkbookTest() 2 Dim Filepath 3 Filepath = "C:¥temp¥test1.xlsx"'■通常はこのように記述する 4 5 Dim targetWorkbook As Workbook 6 Set targetWorkbook = Workbooks.Open(Filepath) 7 8End Sub

投稿2020/05/01 02:08

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shirakoponzu000

2020/05/01 13:53

ありがとうございます。 ご提示いただいたように、やっていたのですが、うまくいきまんせん。 ブック名やURLには問題ないと思うのですが。。。。 再度見直してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問