プロが教えるわが家の防犯対策術!

excel vbaで、他のEXCELファイルのマクロの処理を中断して、自己ファイルのマクロを処理後、再度他のEXCELファイルのマクロを継続して再度処理を行わせるにはどうすれば良いですか。教えて下さい

他のEXCELファイルとして、フリーソフトを利用しています。
そのソフトは、モジュールにロックが掛ってるので、その中のマクロなどを編集することはできません。(ロック解除などは考えていません。)
そのソフトを起動して、データファイル入力画面で、データファイルを入力して、処理をして、処理結果を保存することを、入力データファイルを変えながら、繰り返し行いたいです。
そこで、処理マクロを作成しています。その手順とVBAを説明します。

1)フリーソフト(違法なものではありません。)を開き、
2)そのフリーソフトのシート内のボタンを、VBAで、マウスカーソルを移動させて、マウスのキー操作で、「押す」「離す」を行い、
3)ファイルの初期化の問合せの警告が出るので、キー操作で、「Y」を押し、
4)データファイルの名称をクリップボードにコピーし
5)EXCELのカレントフォルダを、データファイルのあるフォルダに変えて
6)DoEventsとして、フリーソフトのデータファイル入力画面を開いています。
この時、画面のポインタは、データ入力画面のファイル名入力欄にあり、
この後、データファイル名をクリップボードから入力したいので、
キー操作で、「crtl+v」としたいのですが
フリーソフトのマクロが起動中で、作成している処理マクロに制御が移らないためと思いますが
入力できません。(人手での入力は可能ですが)、自動化したいので、どの様にすれば良いか教えて下さい。
マクロは長いので、抜粋して記載します。

sub a()
(宣言文省略します。)
Workbooks.Open freesoft
Dim mPSet As Long
mPSet = SetCursorPos(b,c)
Call mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
Call mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
keybd_event VK_Y, 0, fKEYDOWN, 0
keybd_event VK_Y, 0, fKEYUP, 0
Application.CutCopyMode = False
Dim d As New DataObject
With d
.SetText e
.PutInClipboard
End With
ChDrive f
ChDir g
DoEvents
(ここで、止まります。)
With d
.GetFromClipboard
.GetText
End With
keybd_event VK_RETURN, 0, fKEYDOWN, 0
keybd_event VK_RETURN, 0, fKEYUP, 0
DoEvents
Dim mPSet2 As Long
mPSet2 = SetCursorPos(h, i)
Call mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
Call mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
Workbooks(freesoft).SaveAs FileFormat:=xlNormal, Filename:=k
Workbooks(k).Close
End sub

A 回答 (4件)

フリーソフトに関する詳細が分からないのですが、たぶん、MsgBox、InputBox、または、モーダルのUserFormが表示されたタイミングで、動作待ちになっているものと思われます。

動作待ちになるトリガーは、Workbooks.Open freesoftでしょうか?(Open直後にUserFormが表示される?)

であれば、次のように、Shell関数でブックを開くようにすれば良いと思います。
Dim FreeSoft
FreeSoft = Shell("Excel " & "C:\xxxxx\フリーソフト.xlsm",1)
MsgBox "フリーソフトが開くまでの時間稼ぎ!!"
AppActivate FreeSoft

その後は、SendKeysステートメントでフリーソフトを操作することになります。たぶん、mouse_eventやkeybd_event も使えると思います。
ただし、Workbooks(freesoft).SaveAs 等は使えなくなるので、SendKeysによるキーボード操作で保存動作を行う必要があります。
    • good
    • 0
この回答へのお礼

回答ありがとつございました。
 説明不足だったかもしれません。
動作待ちになるのは、プログラムの中ほどに記載しました、DoEventsのところで、フリーソフトを開いた後、ファイルオープンウィンドウが開いたところです。
 shell関数は、使っていませんので、トライしてみますが、
フリーソウトを開いて、その後も、コマンドボタンを押したりはキー操作や、VBAの操作はできています。
 SENDKEYSは、使用してみました。これだと、今考えるとなぜか、ファイル入力ウィンドウが開き、ファイル名の入力もできたのですが、最初の数回だけ動作し、その後は、どの様なVBAを別ブックで組んでも、キー操作ができなくなりました。ネットで調べたところ、動作が不安定になることがあると幾人かの方が書込みをされていました。よって、key_eventなどを使用しました。が、結果、DoEnentsが必要になり、そうすると、ファイルオープンウインドウを開くと、そこで止まってしまいます。

もし解決のヒントになる様なことがありましたら、ご教示お願いします。

お礼日時:2016/03/11 09:37

DoEventsを書く場所を後ろにずらしたらどうでしょうか?ファイル名をペーストして、さらにOKボタンをクリックしてからDoEventsとすれば、進むような気がします。

要するに、FreeSoftが待ち状態を通過するまでの操作を行ってからDoEventsを発行するイメージです。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
ご教示頂いたDoEventsの場所を、ペーストの後に入れても同じく、ファイルオープン画面で止まります。
残念な結果です。また、お気づきの点がありましたら、ご回答お願いします。

お礼日時:2016/03/14 09:21

WM_GETOBJECTか、


http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one; …
UI Automationとか。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。理解が不十分だったら、ごめんなさい。
 WM_GETOBJECTについては、ウインドウのクラスやハンドルを取得して、子ウインドウにファイル名を入力する方法と思われます。この方法はやってみましたが、このクラスやハンドルを取得するVBAの行まで、プログラムが進みませんでした。すなわち、DoEventsで、停止してしまっています。フリーソフトのファイルオープンウインドウが、開かれた時点で、止まっています。すなわち、制御がフリーソフトに渡されたままになっているためと思っています。
 UI Automationは、
mSDNには、「デスクトップ上のほとんどの user interface (UI) 要素へのプログラムによるアクセスを提供し、・・・」とありますので、勉強してみます。
これについて、ご存知でしたら、どの様に適用できるのか、ヒントだけでもご教示お願いします。

お礼日時:2016/03/11 09:26

最初の1行しか読んでいませんが。



単に他のマクロを呼び出したいのであれば、runメソッドを用いてマクロを走らせればいいだけではないでしょうか?
例えば、以下はブック2のマクロ(test2)からブック1のマクロ(test1)を途中で呼び出すコードです

Sub test2()
For i = 1 To 5
Cells(i, 1) = i
Next

Application.Run "Book1.xls!test1"

For i = 6 To 10
Cells(i, 1) = i
Next
End Sub

ただし、Runメソッドで呼び出すには両方のブックを開いている必要があります。
    • good
    • 0
この回答へのお礼

ご回答頂きありがとうございました。
しかしながら、当方の説明が充分でなかったと思いますが、
質問の主旨は、1)他のマクロを起動、2)中断、3)自己マクロで、他のマクロへデータファイル名を入力、4)他のマクロの中断点からの継続起動 というもので、2)の中断、ができないというものです。
ご存じでしたら、ご教示お願いします。

お礼日時:2016/03/09 09:55

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!