
アドバイスをお願いします。
Excel-VBAで起動しているエクスプローラに対してハンドルを取得してクリックしたり、テキストボックスに文字をセットするプログラムを作って動かしています。
WindowsXPのときはできていたのですが、Windows7になったらエクスプローラが変わったため正しく動作しなくなりました。
やりたいのはエクスプローラに検索文字列(添付ファイル参照)をセットして検索をさせたいのです。
「windows7のエクスプローラをVBAで操作-1」「windows7のエクスプローラをVBAで操作-2」のタイトルで質問させていただき、下のコードを考えましたが、★のところでハンドルが返らず0でした。InspectObjectsで見ると「読み込み専用」と。これが原因ですか?どうしたらいいのだろう・・・。
またこのハンドルを取得して、AccessibleObjectFromWindowでIAccessible を取り出して、accDoDefaultActionしたいのですが、UUIDの値が分かりません。OLEViewで見たのですがExplorer関連がいくつかあり(添付ファイル参照)どれを使っていいものやら。ボタンクリックの後に文字列セットがあるのですが、まだたどり着けず。
IAccessible初心者です。
質問ばかりで済みませんがコーディングのアドバイスお願いします。
Option Explicit
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
Private Declare Function AccessibleObjectFromWindow Lib "oleacc" _
(ByVal hWnd As Long, _
ByVal dwObjectID As Long, _
ByRef riid As Any, _
ByRef ppvObject As Any) As Long
Const WM_SETTEXT = &HC '文字列送信
Const BM_CLICK = &HF5 'クリック
Const OBJID_CLIENT As Integer = &HFFFFFFFC
Private Type UUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(7) As Byte
End Type
Private IID_IAccessible As UUID
Private oShell
Private ie
Private hWnd As Long
Private SearchBoxハンドル As Long
Private Search_Folder As String
Private RC As Long
'Private objAcc As IAccessible
Private objAcc As UUID
Private varChild As Variant
Private cnt
Private fullnames As String
Sub 検索指定のインプット()
Search_Folder = "c:\xxx"
Set oShell = CreateObject("Shell.Application")
For cnt = oShell.Windows().Count - 1 To 0 Step -1
' On Error Resume Next
Set ie = oShell.Windows().Item(cnt)
fullnames = ie.FullName
' On Error GoTo 0
If fullnames = "C:\Windows\Explorer.EXE" Then
ie.Navigate (Search_Folder)
hWnd = FindWindow("CabinetWClass", vbNullString)
hWnd = FindWindowEx(hWnd, 0, "WorkerW", vbNullString)
hWnd = FindWindowEx(hWnd, 0, "ReBarWindow32", vbNullString)
hWnd = FindWindowEx(hWnd, 0, "UniversalSearchBand", vbNullString)
hWnd = FindWindowEx(hWnd, 0, "Search Box", vbNullString)
hWnd = FindWindowEx(hWnd, 0, "SearchEditBoxWrapperClass", vbNullString)
hWnd = FindWindowEx(hWnd, 0, "SearchBox", vbNullString) ' ★--> 0 return
SearchBoxハンドル = hWnd
hWnd = FindWindowEx(SearchBoxハンドル, 0, "Button", "検索")
hWnd = FindWindowEx(SearchBoxハンドル, 0, "SearchEditBox", vbNullString)
' "SearchEditBox" に検索文字列入力の予定だった
With IID_IAccessible
.Data1 = &H68284FAA
.Data2 = &H6A48
.Data3 = &H11D0
.Data4(0) = &H8C
.Data4(1) = &H78
.Data4(2) = &H0
.Data4(3) = &HC0
.Data4(4) = &H4F
.Data4(5) = &HD9
.Data4(6) = &H18
.Data4(7) = &HB4
End With
RC = AccessibleObjectFromWindow(hWnd, OBJID_CLIENT, IID_IAccessible, objAcc)
' 80004005が返る
varChild = 2 ' Class="Button", Name="検索"のコントロールをクリックしたいが・・・
' RC = objAcc.accDoDefaultAction(varChild) ' 書き方が違うみたい・・・
' Class="SearchEditBox" に検索する文字列を入れたいが・・・
Exit Sub
End If
Set ie = Nothing
Next
End Sub

No.1
- 回答日時:
If fullnames = "C:\Windows\Explorer.EXE" Then
internetExplorer じゃないの?
あと、参照設定がどうなってるか
2014itochanさん
アドバイスありがとうございました。
>internetExplorer じゃないの?
変数名をIEとしていたのが紛らわしかったですね。
Explorerです
>あと、参照設定がどうなってるか
参照設定は次のようになっていました。
Visual Basic For Applications
Microsoft Excel 14.0 Object Library
OLE Automation
Microsoft Office 14.0 Object Library
またよろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Vba LongPtrについて教えてください 2 2022/08/19 11:14
- Access(アクセス) Vba Userformを前面に出すについて 3 2022/04/15 12:29
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) このVBAでExcelアプリケーションを作成は必要ですか? 3 2023/07/19 21:13
- Excel(エクセル) 【マクロ】スクショ印刷がうまく動かない件 5 2022/12/06 17:37
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- Visual Basic(VBA) VBA 別ブックからの転記の高速化について VBA 別ブックからの転記の高速化についてご教授下さい。 19 2022/07/26 13:07
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルでアルファベットか数...
-
EXCELで=より左の文字を一括で...
-
文字列からタブコードを取り除...
-
エクセルで文字列の最大値を抽...
-
ORCLEでの小数の表示方法の変更...
-
VBAでの Replace関数で、ワイル...
-
VBA2005 16進を2桁で表示したい。
-
【Excel VBA】複数ある特定の文...
-
アクセスで特定の数字以外(複...
-
エクセルで文字列をtxtファイル...
-
【Teratermマクロ】文字列の分...
-
OnTime 使用時のプロシージャへ...
-
エクセル 数値データを桁をそ...
-
aaa.bbb.ccc という、「ドット...
-
MS SQLServer のSQLで文字列の...
-
textboxユーザーコントロールの...
-
C#で年月を比較する
-
VBscriptで文字サイズを指定で...
-
A B C D E の五文字のすべてを...
-
Left関数とRight関数を合わせた...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルでアルファベットか数...
-
EXCELで=より左の文字を一括で...
-
文字列からタブコードを取り除...
-
VBAでの Replace関数で、ワイル...
-
エクセルで文字列をtxtファイル...
-
【Excel VBA】複数ある特定の文...
-
エクセル 数値データを桁をそ...
-
Excelで3E8を3.00E+8にしない方...
-
VBA2005 16進を2桁で表示したい。
-
エクセルで文字列の最大値を抽...
-
同一セル内に関数と文字列を同...
-
Left関数とRight関数を合わせた...
-
Excelで指数表現しないようにす...
-
MS SQLServer のSQLで文字列の...
-
VBの「As String * 128」とは?
-
エクセルでセル内の文字列の最...
-
ORCLEでの小数の表示方法の変更...
-
bashスクリプトでの文字列から...
-
LEFT関数で文字数を指定しない...
-
アクセスで特定の数字以外(複...
おすすめ情報