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

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

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

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

Q&A

解決済

2回答

1335閲覧

VBA 他のプログラム起動を1回だけにしたいです

ttii

総合スコア14

VBA

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

0グッド

0クリップ

投稿2020/04/22 03:46

VBAのマクロで繰り返し動作中に他のプログラムを起動してSendkeyを送りたいのですが、繰り返し処理が行われてるためプログラムの起動とSendkeyも重複して動作してしまいます。
以下のコードでプログラムの起動を1回のみで重複しないようにするにはどうすればいいでしょうか?
よろしくお願いいたします。

Dim i As Integer
On Error GoTo Hotkey
i = Shell(CreateObject("Wscript.Shell").SpecialFolders("Desktop") & "\test.exe", vbNormalNoFocus)
Application.SendKeys "n"
Application.SendKeys "^+u"
Hotkey:
Application.EnableEvents = True
Application.ScreenUpdating = True

End Sub

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

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

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

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

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

guest

回答2

0

ベストアンサー

VBAから Win API関数を呼び出す方法を紹介します。
プロセスハンドル有無を判定し、プログラム重複起動を回避できます。

VBA

1#If VBA7 And Win64 Then 2 Private Declare PtrSafe Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As LongPtr, ByVal dwProcessId As Long) As LongPtr 3 Private hProc As LongPtr 'プロセスハンドル 4#Else 5 Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long 6 Private hProc As Long 'プロセスハンドル 7#End If 8 9Private Const PROCESS_ALL_ACCESS As Long = &H1F0FFF

本文はこちら

VBA

1hProc = OpenProcess(PROCESS_ALL_ACCESS, 0, i) 2'プロセスハンドルが返された場合、プログラム起動させない 3If hProc = 0& Then 4 i = Shell(CreateObject("Wscript.Shell").SpecialFolders("Desktop") & "\test.exe", vbNormalNoFocus) 5End If

投稿2020/04/22 12:50

編集2020/04/22 12:55
TanakaHiroaki

総合スコア1063

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

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

ttii

2020/04/23 10:06

ご回答ありがとうございます。テストでコードを組んでみたところ問題なく動きました。実際に現場でテスト運用してみます。
ttii

2020/04/25 09:15

以下のコードでプログラム起動の重複を避けることができました。 とても助かりました。ありがとうございました。 If hProc = 0& Then i = Shell(CreateObject("Wscript.Shell").SpecialFolders("Desktop") & "\test.exe", vbNormalNoFocus) hProc = OpenProcess(PROCESS_ALL_ACCESS, 0, i) End If
guest

0

既に起動済みかどうかを判断すればよく、幾つかの方法があります。
以下参考
アプリケーションの起動

投稿2020/04/22 04:02

sazi

総合スコア25195

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

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

ttii

2020/04/22 07:51

ご回答ありがとうございます。 URL先を参考に色々調べてテストしてみましたが、私の知識が浅いため上手くいきません。 またマクロを複数回動かすため、プログラムを一度起動してしまうと次に同じマクロを動かしたときにプログラムが起動済となりSendkeyの入力ができなくなります。 プログラムを終了させる手も考えたのですが、そうすると毎回起動と終了を繰り返すことになり動作が重複してしまいます。 何か良い対処法はあるのでしょうか?
sazi

2020/04/22 09:03 編集

起動とsendkeyは切り離して考えれば良いのでは? sendkeyするためには起動されていることは前提ですけど、起動はsendkeyとは関係なく起動されているかどうかだけの判断ですので、起動されていない時だけ起動するようにすれば繰り返しても問題ないはずです。
ttii

2020/04/22 09:39

今調整しているコードは私が最初から作った訳ではなく、すでにあるものに変更点を加えたいのですが、プログラムの起動とSendkeyはセットで動かす必要があるのです。 理由としては一連の動作の中でサーバーにデータを読みに行くのですが、その間どうしてもマクロの動作が遅くなり、プログラムの起動とSendkeyがセットで動かないと他の操作によって誤作動を起こす場合があります。複数人が使うマクロなので、動作中は他の操作をしないよう禁止にするのは難しいです。
sazi

2020/04/22 10:48

> 複数人が使うマクロ とはどういう状況でしょうか? 起動しているプログラムは各PCで動作しているのだと思いますけど、その起動しているプログラムはクラサバのアプリケーションですか? その場合の排他はそのプログラムが担うべきですし、そうでないなら複数人が同じPCのプログラムを起動するという状況が想像できません。
ttii

2020/04/23 09:59

説明不足で申し訳ありません。プログラムは各PC上で動作しています。ただその各PCごとの使用者が複数人いる状況なのです。例えば特定の作業用PCがあって、それを複数人が使っています。
sazi

2020/04/23 13:41

TanakaHiroakiさんの回答へのコメントをみると > 上手く行かない とはもっと具体的なコードが欲しいという事だったんですね。
ttii

2020/04/25 09:02

はい、マクロに関して知識が浅く自分でも色々調べてみているのですが、教えていただいたリンク先を参考にしても応用が難しい状況でした。でも今回の件でとても勉強になりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問