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

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

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

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

Q&A

2回答

7049閲覧

他のブックを開いている状態でマクロを立ち上げるとエラーが出る

ts05

総合スコア0

VBA

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

0グッド

0クリップ

投稿2020/05/14 09:07

前提・実現したいこと

マクロエクセルを開くと、自動でファイルの読み込みと、
その結果を出力するユーザーフォームを表示させるVBAを作っています。
マクロエクセルは最小化して、ユーザーフォームのみ前面に出てほしいです。

下記のようなコードを組むことで、
他のエクセルを開いていないときは問題なく動きますが、
他のエクセルを開いている状態で、マクロエクセルを立ち上げると不具合が出ています。

Private Sub Workbook_Open()

ThisWorkbook.Activate

   ’(他ファイルの読み込み部(略))

Application.WindowState = xlMinimized VBA.AppActivate Excel.Application.Caption '※1 UserForm1.Show vbModeless

End Sub

発生している問題・エラーメッセージ

エラーメッセージ 実行時エラー5 プロシージャの呼び出し、または引数が不正です。

該当のソースコード

VBA.AppActivate Excel.Application.Caption '※1

試したこと

  デバックをすると、※1部のExcel.applicition.captionが別のエクセルファイルになっていました(元々開いていたやつ)
マクロファイルを最小化した時点で、アクティブ権が元々開いていたやつに移ってしまった?と考えています。
※1をなくした場合、エラーは出ませんが、
フォームが前面に出てこず裏で埋もれてしまいます。
Thisworkbook.activateの位置を動かしたり、無効にしたりしてみましたが解決には至っていません。

補足情報(FW/ツールのバージョンなど)

Excel2019

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

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

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

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

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

guest

回答2

0

>プロシージャの呼び出し、または引数が不正です
>VBA.AppActivate Excel.Application.Caption '※1
VBA.AppActivateの部分へ適当な文字を入れると同じエラーでませんか?
記述例:VBA.AppActivate "abcdefg"

これは、正常な文字列が取得出来ていないことを示します。
直前にmsgbox Excel.Application.Captionを入れて文字列を確認して下さい。

また、WindowsタスクマネージャーにてExcelプロセス配下のスレッド名称を見ます。
msgbox表示のマクロBook名称とは別の名前が取得されていませんか、
一致しない時は下記記述に誤りがあると言うことです
’(他ファイルの読み込み部(略))
若しかしたら、ThisWorkbook.Activateを直前に置くことで治るかもしれませんが、やってみないと分かりません。ただ、動いたとしても不安が残ります。
別のBookを操作すると触ったBookがActivateになります。
デバック方法は以上の方法でやられたら如何かと思います。

また、エラー部分6行のみ残してその他全部削除で動作試験もありです。
'-----------------------------------------------
p.s.
Excel.Application.Captionを使うと言うことは、先程のタスクマネジャーの
プロセスの現在有効なスレッドブックを見ることを意味すると思われます。
複数のブックを起動する時には、VBAは自スレッド内(自ブック内部)から出ないように記述する必要があります。
(もちろん、意図的に他のブックを見ることもあります)
基本複数のExcelを起動してのVBA操作は非常に難しいです。
意図しない操作をされたり、バージョンでプロセス管理方法が違ったりする為です。

投稿2020/05/15 00:57

編集2020/05/18 18:15
tosi

総合スコア553

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

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

ts05

2020/05/18 09:09

アドバイスありがとうございます。 ①>直前にmsgbox Excel.Application.Captionを入れて文字列を確認して下さい。 直前にmsgboxを入れてテストしてみると、Excel.application.captionの文字列はマクロエクセルのファイル名でした。 ただ、msgboxを入れた場合、次文のVBA.AppActivateの部分でエラーが発生しませんでした。(正常に動く)  msgboxあり→エラーなし  msgboxなし→エラーあり ②※1部に行く前に他エクセルの最小化処理を入れてみたのですが、 やはりmsgboxなしではエラーが出ました。 ③VBA.AppActivate Excel.Application.Captionをテストで文頭に出した場合で、他エクセルを開いていない状態でも同様のエラーがでました。 Private Sub Workbook_Open() VBA.AppActivate Excel.Application.Caption '※1 UserForm1.Show vbModeless End Sub 正直ちんぷんかんぷんで何か解決策が思い浮かぶまでは スマートでないですがダミーのMsgboxを1つ入れようかなという感じです…。
tosi

2020/05/18 18:06 編集

>③VBA.AppActivate Excel.Application.Captionをテストで文頭に出した >場合で、他エクセルを開いていない状態でも同様のエラーがでました。 私のExcel動作環境では出ません。正常に動作します。 (Window10(64bit)/Excel2010(32bit))) Excelのバーションは何でしょうか。又、64bit品/32bit品どちらですか。 OSは何でしょうか。Window10(64bit)かな? Excelのプロセス/スレッド管理方法は、たしかExcel2013~19くらいで大幅に変更になったと記憶しています。 >msgboxあり→エラーなし >msgboxなし→エラーあり 上記の現象が出ていると言う事は、msgboxが動いた瞬間に、 Activeな名称が変更された可能性があると思います。 (説明例):Active名称(Excel.Application.Caption) 1.起動時->Excelプロセス起動(Excelプロセス名) 2.Book起動->Bookスレッド起動(Excelプロセス名) 3.Bookopen開始-->VBA開始(Excelプロセス名) 4.msgboxを発行->Bookへ瞬間移動(Bookスレッド名) 5.Excel.Application.Caption->コマンド実行(Bookスレッド名) つまり、msgboxを発行した事で、人がBOOKを前面へ表示操作したのと同じ効果が発生したのではないでしょうか。 デバック方法をmsgboxではなく、debug.printへ切り替えてイミディエイト画面で実行結果を見て下さい。 VBA.AppActivateの前後へmsgboxを入れた場合となしの場合で、それぞれの結果を見る事で不具合の原因は分かりそうです。 後は、希望する文字列をどの様に取得するかで解決すると思われます。 '--------------------------------------------------------------------------- p.s. 以下は私見です。 タスクマネージャーではExcel名称の下にBook名称が見えます。 Excel名称がプロセルでBook名称がスレッドと思われます。 現在のExcelは、Excel起動時にもプロセス/スレッドはマルチで並行に動いている可能性あると思います。 つまり、Excel起動とWorkBook起動時が並行で動いている訳です。 ただ、Excelの起動が完了する前に、WorkBookが動いて大丈夫なの? という疑問が出てくると思いますが、それは必要な時にあれば良いわけで、必要な部分さえ完了していれば、後は独自に動いた方がマルチタスクとしては効率は良いです。 つまり、WorkBook側から見て、動く為の必要な部分がExcel側で完了していれば、別段に待つ必要もなく勝手に動けます。 両方とも動作中ですから、Excel.Application.Captionがこの2つのタスクのどちらから文字をもってくるのかは、仕様の問題でどちらでも可能です。 旧Excelでは、Excel起動が完了した後に、WorkBookを起動していたのかも知れません。 Excel起動が完了したのですから、Active名称がWorkBookへ移動しても何ら不思議ではありません。
guest

0

ユーザーフォームに記述してみては?

VBA

1Private Sub UserForm_Initialize() 2 Application.Visible = False 3End Sub 4 5Private Sub UserForm_Terminate() 6 Application.Visible = True 7End Sub

投稿2020/05/14 14:00

ryuno_vanilla

総合スコア119

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

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

ts05

2020/05/18 09:10

アドバイスありがとうございます。 コードをユーザーフォームに追加してみましたが、 現象としては特に変化がありませんでした。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問