windows7のエクスプローラをVBAで操作-1
アドバイスをお願いします。
Excel-VBAで起動しているエクスプローラに対してハンドルを取得してクリックしたり、テキストボックスに文字をセットするプログラムを作って動かしています。
WindowsXPのときはできていたのですが、Windows7になったら正しく動作しなくなりました。
下のコードはエクスプローラの現在のフォルダパスが表示されるところに(添付ファイル参照)文字を入れるものです。
最後のSendMessageAnyで1が返ってしまいます。何が考えられますでしょうか。どう対策したらいいでしょうか。
なおハンドルの値はSDKのInspect Objectsで確認していますので、正しく取得できていると思っています。
よろしくお願いします。
Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As Any, ByVal lpWindowName As Any) As Long
Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" ( _
ByVal hwndParent As Long, _
ByVal hwndChildAfter As Long, _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Declare Function SendMessageAny Lib "user32.dll" _
Alias "SendMessageA" _
(ByVal hwnd As Long, _
ByVal MSG As Long, _
ByVal wParam As Long, _
ByVal lParam As Any) As Long
Const WM_SETTEXT = &HC
Private hwnd As Long
Private FOLDER As String
Sub Put_folder_name1()
hwnd = FindWindow("CabinetWClass", vbNullString)
hwnd = FindWindowEx(hwnd, 0, "WorkerW", vbNullString)
hwnd = FindWindowEx(hwnd, 0, "ReBarWindow32", vbNullString)
hwnd = FindWindowEx(hwnd, 0, "Address Band Root", vbNullString)
hwnd = FindWindowEx(hwnd, 0, "msctls_progress32", vbNullString)
hwnd = FindWindowEx(hwnd, 0, "ComboBoxEx32", vbNullString)
hwnd = FindWindowEx(hwnd, 0, "ComboBox", vbNullString)
hwnd = FindWindowEx(hwnd, 0, "Edit", vbNullString)
FOLDER = "\\xx.xx.xx.xx\test"
RC = SendMessageAny(hwnd, WM_SETTEXT, 0, ByVal FOLDER)
end sub
お礼
いつも解決するまで何度も的確なアドバイスありがとうございます!助かります。 おっしゃるとおりloop文をなくしてみたら、うまいこと動きました。 以前の回答で言われたとおり、sendmessageでもすこしつまずきました。 Application.Wait(Now + TimeValue("00:00:10"))の時間待ちも軽かったです。 IF文の使い方も助かりました。 GETID勉強になりました。「UWSC」も見てみました。 予算の都合がありますので、エクセル2003とVB2010の評価版でがんばります。 ‘メインウィンドウのハンドル取得 hMainWindow = FindWindowA("MX100STD_Viewer", "Data Viewer") ‘開くボタンのハンドル取得 OpenButton = FindWindowExA(hMainWindow, 0, "ToolbarWindow32", vbNullString) Sleep 1000 <開くボタンをクリック処理> Sleep 1000 'ファイルを開くダイアログのウィンドウハンドル取得 hOpenDlg = FindWindowA("#32770", "Open") 'ファイル名入力欄のハンドルを取得 hFNInput = FindWindowExA(hOpenDlg, 0, "Edit", vbNullString) 'ファイル名を入力 strFN = strFolderPath & strFileName(i) DoEvents Call SendMessageAny(hFNInput, WM_SETTEXT, 0, ByVal strFN) '開くボタンを押す hDlgOpenButton = FindWindowExA(hOpenDlg, 0, "Button", "開く(&O)") Call PostMessageA(hDlgOpenButton, WM_LBUTTONDOWN, MK_LBUTTON, 0) Call PostMessageA(hDlgOpenButton, WM_LBUTTONUP, MK_LBUTTON, 0) Sleep 1000 'メッセージ「同期処理を行いますか?・・・」 hMsg = FindWindowA("#32770", "情報") 'Yボタンのハンドル取得 hMsgYButton = FindWindowExA(hMsg, 0, "Button", "はい(&Y)") If hMsgYButton <> 0 Then '←メッセージが出ない時がある 'Y押す Call PostMessageA(hMsgYButton, WM_KEYDOWN, VK_Y, 0) Call PostMessageA(hMsgYButton, WM_KEYUP, VK_Y, 0) End If