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
No.3ベストアンサー
- 回答日時:
フリーソフトに関する詳細が分からないのですが、たぶん、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によるキーボード操作で保存動作を行う必要があります。
回答ありがとつございました。
説明不足だったかもしれません。
動作待ちになるのは、プログラムの中ほどに記載しました、DoEventsのところで、フリーソフトを開いた後、ファイルオープンウィンドウが開いたところです。
shell関数は、使っていませんので、トライしてみますが、
フリーソウトを開いて、その後も、コマンドボタンを押したりはキー操作や、VBAの操作はできています。
SENDKEYSは、使用してみました。これだと、今考えるとなぜか、ファイル入力ウィンドウが開き、ファイル名の入力もできたのですが、最初の数回だけ動作し、その後は、どの様なVBAを別ブックで組んでも、キー操作ができなくなりました。ネットで調べたところ、動作が不安定になることがあると幾人かの方が書込みをされていました。よって、key_eventなどを使用しました。が、結果、DoEnentsが必要になり、そうすると、ファイルオープンウインドウを開くと、そこで止まってしまいます。
もし解決のヒントになる様なことがありましたら、ご教示お願いします。
No.4
- 回答日時:
DoEventsを書く場所を後ろにずらしたらどうでしょうか?ファイル名をペーストして、さらにOKボタンをクリックしてからDoEventsとすれば、進むような気がします。
要するに、FreeSoftが待ち状態を通過するまでの操作を行ってからDoEventsを発行するイメージです。回答ありがとうございました。
ご教示頂いたDoEventsの場所を、ペーストの後に入れても同じく、ファイルオープン画面で止まります。
残念な結果です。また、お気づきの点がありましたら、ご回答お願いします。
No.2
- 回答日時:
回答ありがとうございました。理解が不十分だったら、ごめんなさい。
WM_GETOBJECTについては、ウインドウのクラスやハンドルを取得して、子ウインドウにファイル名を入力する方法と思われます。この方法はやってみましたが、このクラスやハンドルを取得するVBAの行まで、プログラムが進みませんでした。すなわち、DoEventsで、停止してしまっています。フリーソフトのファイルオープンウインドウが、開かれた時点で、止まっています。すなわち、制御がフリーソフトに渡されたままになっているためと思っています。
UI Automationは、
mSDNには、「デスクトップ上のほとんどの user interface (UI) 要素へのプログラムによるアクセスを提供し、・・・」とありますので、勉強してみます。
これについて、ご存知でしたら、どの様に適用できるのか、ヒントだけでもご教示お願いします。
No.1
- 回答日時:
最初の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メソッドで呼び出すには両方のブックを開いている必要があります。
ご回答頂きありがとうございました。
しかしながら、当方の説明が充分でなかったと思いますが、
質問の主旨は、1)他のマクロを起動、2)中断、3)自己マクロで、他のマクロへデータファイル名を入力、4)他のマクロの中断点からの継続起動 というもので、2)の中断、ができないというものです。
ご存じでしたら、ご教示お願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) エクセルのマクロについて教えてください。 7 2023/07/04 09:18
- PowerPoint(パワーポイント) エクセルのマクロについて教えてください。 1 2022/03/25 17:03
- Excel(エクセル) 【VBAファイル移動】2つのマクロを順に実行。1つ目のマクロが実行不可⇒2つ目が実行不可となる件 2 2022/07/29 12:17
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/07/03 09:11
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/06/04 09:39
- Visual Basic(VBA) VBAコードを張り付け後のエクセルの進め方 2 2023/02/07 18:24
- PowerPoint(パワーポイント) エクセルのマクロについて教えてください。 2 2022/11/18 15:34
- Visual Basic(VBA) tatsumaru77様 昨日回答して頂いたものです。 すみませんが、昨日の質問で1つ補足があります 1 2022/05/15 15:06
- Excel(エクセル) エクセル VBA実行中のApplication.ScreenUpdatingについて 3 2023/07/13 21:06
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで特定の列が0表示の場...
-
Excel マクロ VBA プロシー...
-
Excel・Word リサーチ機能を無...
-
ExcelのVBA。public変数の値が...
-
特定のPCだけ動作しないVBAマク...
-
メッセージボックスのOKボタ...
-
一つのTeratermのマクロで複数...
-
エクセルで別のセルにあるふり...
-
サクラエディタ・マクロ → VSCo...
-
ExcelVBAでPDFを閉じるソース
-
Excel VBAからAccessマクロを実...
-
EXCELのVBAでRange("A1:C4")を...
-
エクセルに張り付けた写真のフ...
-
エクセルのマクロについて教え...
-
ユーザーフォームを起動しなが...
-
エクセルのマクロについて教え...
-
VBA アドインについて お詳しい...
-
VBA初心者 Ctrl+での操作、ボタ...
-
特定文字のある行の前に空白行...
-
2つのマクロでチェックボックス...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel・Word リサーチ機能を無...
-
特定のPCだけ動作しないVBAマク...
-
エクセルで特定の列が0表示の場...
-
Excel マクロ VBA プロシー...
-
メッセージボックスのOKボタ...
-
一つのTeratermのマクロで複数...
-
エクセルで別のセルにあるふり...
-
ExcelのVBA。public変数の値が...
-
エクセルに張り付けた写真のフ...
-
ExcelVBAでPDFを閉じるソース
-
EXCELのVBAでRange("A1:C4")を...
-
Excel VBAからAccessマクロを実...
-
TERA TERMを隠す方法
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
マクロ実行時、ユーザーフォー...
-
Excelのマクロについて教えてく...
-
ソース内の行末に\\
おすすめ情報