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

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

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

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

Q&A

2回答

4465閲覧

Excelのvbaで外部アプリ呼び出しするとユーザーフォームが消える

hinoki

総合スコア0

VBA

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

0グッド

0クリップ

投稿2020/08/22 08:46

編集2020/08/23 09:05

前提・実現したいこと

お世話になります。
ユーザーフォームを呼び出し、外部アプリ(捺印アプリ)を呼び出して使いたい。

ソースコードのどこに問題があるでしょうか?

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

パソコン起動したあと、最初の1度目のみに発生します。
2回目以降は大丈夫です。

Private Sub UserForm_Initialize内のrc = Shell(Targetprogram, vbNormalFocus)
で、外部アプリを呼び出すのですが、1度目は何故かここで立ち上がっていないようです。特にエラーメッセージも表示されません。
そこで、
Private Sub UserForm_Activate()
内に、
AppActivate "職印くん32", True
とし、外部アプリをアクティブに指定していますが、立ち上がっていない時は、エラーを返すので、エラー5を返す場合は、立ち上がっていないようなので、再度呼び出して立ち上げます。
If Err.Number = 5 Then
rc = Shell(Targetprogram)

で、ここで呼び出すことができるのですが、その後、ユーザーフォームを操作しようとすると、ユーザーフォームが消えてしまいます。操作するまでは、存在しています。

(一度この該当Excelファイルを閉じて再度立ち上げ直したとしても)パソコンを起動して2回目以降に実行する場合であれば、最初のPrivate Sub UserForm_Initialize内のrc = Shell(Targetprogram, vbNormalFocus)で、外部アプリが立ち上がりその後のユーザーフォームもそのまま使えます。

Err.Number = 5  ```(パソコン起動後、最初の一回目の実行時のみ発生)

該当のソースコード

Private Sub UserForm_Initialize()
On Error GoTo myError
Targetprogram = "C:\Program Files\Hashi's Tools\職印くん32\Shokuin.exe"
rc = Shell(Targetprogram, vbNormalFocus)

DoEvents
If rc = 0 Then
MsgBox "職印くん32の起動に失敗しました。" & vbCrLf & _
"お手数ですが、再度実行して下さい。"
Exit Sub
End If
Exit Sub

myError:
If Err.Number = 53 Then
MsgBox "指定した場所に捺印アプリがみつかりません。" & vbCrLf & _
"UserForm1のUserForm_Initialize内に記述してあるファイルの指定場所(Targetprogram)を変更して下さい。", vbExclamation
Else
MsgBox "エラーが発生しました" & vbCrLf & _
Err.Description, vbExclamation
End If
End
End Sub

VBA

1 2 3 4 5 6### 試したこと 7 8 9 10### 補足情報(FW/ツールのバージョンなど) 11Excel2013 32ピット、64ビットパソコンのどちらでも発生することを確認 12上記2台のPCで試しましたが、再現率100%です。

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

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

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

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

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

guest

回答2

0

問題点は大きく2つですよね。
1.そもそも1度目に外部アプリが起動しない(ユーザーフォームは起動する
2.UserForm_Activateで外部アプリ起動後ユーザーフォームが消える
別々で考えた方がいいかもしれません。

Initializeで起動指示したあとプロセスはどうなってますか?
単に時間がかかってるだけそうなら、
AppActivate "職印くん32", True
をInitializeにも入れてみたらどうでしょう。


コメント返信のつもりが誤って別回答に・・・すいません。

投稿2020/08/24 23:56

編集2020/08/24 23:57
radames1000

総合スコア1925

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

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

hinoki

2020/08/25 16:01

ありがとうございます。 >2.UserForm_Activateで外部アプリ起動後ユーザーフォームが消える >別々で考えた方がいいかもしれません。 これにヒントを得て考えてみました。 どうも、PC起動後の1発目に呼び出しに失敗する原因は、外部アプリ(職印くん)にあることが分かりました。バグなのかな? 直接、アプリをクリックで起動した時も、PC起動後の最初の1回目は無応答になりました。2回目以降の呼び出しは問題なしでした。 vbaからの呼び出しだろうが、直接アイコンのクリックで呼び出そうが、1回目は呼び出せないようです。 だから、これは呼び出しに失敗した時のエラー処理で再度呼び出せばよいということが分かりました。 UserForm_Initialize内に以下を記載してもよさそうです。 ElseIf Err.Number = 5 Then rc = Shell(Targetprogram) DoEvents AppActivate "職印くん32", True Err.Clear こんな感じでよさそうです。 ただし、このエラー処理で外部アプリを呼び出すとユーザーフォームが立ち上がらない問題は解決していません。 UserForm_Activate内のエラー処理5で職印くんを立ち上げるとユーザーフォームをクリック操作しようとすると消えてしまいましたが、UserForm_Initialize内のエラー処理5で職印くんを立ち上げるとユーザーフォームが立ち上がらないことが分かりました。それから考えると、vbaのバグなのか何かが影響しているのでしょうかね? 再度ユーザーフォームを呼び出すような方法で回避するような方法はないでしょうかね?
radames1000

2020/08/25 23:59

UserForm_Initializeでは初回はエラーが出てないんですよね? であればErr.Numberで判定したら呼び出されないです。 Err.Numberに関わらず実行していいかもしれません。 ユーザーフォームが消える件は他のアプリで試してみるのはいかがでしょう。 問題なければ職印くん側が原因かもしれません。 ユーザーフォーム.Showとかで立ち上がるのかなど色々検証してみてください。
guest

0

最大化してみてはいかがでしょうか。

VBA

1Private Sub UserForm_Initialize内のrc = Shell(Targetprogram, vbMaximizedFocus)

投稿2020/08/24 08:24

radames1000

総合スコア1925

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

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

hinoki

2020/08/24 16:13

回答頂き、ありがとうございました。 試してみましたが、変化ありませんでした。1発目のみユーザーフォームが消え、再度実行すると問題なく動作します。なぜでしょう?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問