LoginSignup
1
3

Excel VBAでUIAutomationを用いてブラウザ操作(参照不可)

Last updated at Posted at 2024-02-17

ここでは、ウインドウ名からウインドウハンドルを取得し、それを基準に要素を取得しています。その要素に対してクリック操作を行う例を示しています。具体的なウインドウ名、要素のAutomationId等は、実際の環境に合わせて変更してご使用ください。また、操作はクリックのみを示していますが、キー入力など他の操作を行う場合は、それに対応するメソッドを使用してください。

Option Explicit

' UIAutomationオブジェクトを取得
Function GetUIAutomation() As Object
    Set GetUIAutomation = CreateObject("UIAutomationClient.CUIAutomation")
End Function

' 指定されたウインドウ名からウインドウハンドルを取得
Function GetWindowHandle(windowName As String) As Long
    GetWindowHandle = FindWindow(vbNullString, windowName)
End Function

' 基準となる要素を取得
Function GetRootElement(windowHandle As Long) As Object
    Dim uiAutomation As Object
    Set uiAutomation = GetUIAutomation
    Set GetRootElement = uiAutomation.ElementFromHandle(ByVal windowHandle)
End Function

' 指定された属性と値を持つ要素を取得
Function FindElement(rootElement As Object, attributeName As String, attributeValue As String) As Object
    Dim condition As Object
    Dim uiAutomation As Object
    Set uiAutomation = GetUIAutomation
    Set condition = uiAutomation.CreatePropertyCondition(uiAutomation.GetPropertyId(attributeName), attributeValue)
    Set FindElement = rootElement.FindFirst(1, condition)
End Function

' 要素に対してクリック操作を実行
Sub ClickElement(element As Object)
    Dim invokePattern As Object
    Set invokePattern = element.GetCurrentPattern(10000)
    invokePattern.Invoke
End Sub

Sub TestBrowserControl()
    Dim windowHandle As Long
    Dim rootElement As Object
    Dim targetElement As Object
    
    ' ウインドウハンドルを取得
    windowHandle = GetWindowHandle("ウインドウ名")
    
    ' 基準となる要素を取得
    Set rootElement = GetRootElement(windowHandle)
    
    ' 実行対象の要素を取得
    Set targetElement = FindElement(rootElement, "AutomationId", "実行対象の要素のAutomationId")
    
    ' 要素に対してクリック操作を実行
    Call ClickElement(targetElement)
End Sub

・要素のValue値を取得
・実行パターン=可能な操作
(第一引数,要素名,要素のコントロールタイプ,第四引数,第五引数,第六引数,第七引数,実行パターン:可能な操作,第九引数:実行値)
・第三引数、第六引数:コントロールタイプ
 1.AppBar 2.Button 3.Calendar 4.CheckBox 5.ComboBox 6.Custom 7.DataGrid
・第四引数、第七引数:何番目の要素か
 1st、2nd、3rd
・第五引数
 Nochange(元)、Decrement(前)、Increment(後)
・第八引数:対応するコントロールパターンの例
 1.lnvoke(Button,Hyperlink,SplitButton)
 2.Toggle(CheckBox)
 3.ExpandCollapse(ComboBox)
 4.SetValue(Edit)
 5.SelectionItem(RadioButton)
 6.Text(Text)
 7.Click(Button ,Edit)
 8.Focus(Button ,Text)
 9.Scroll(Document ,Window)
 10.GetValue(Edit)
・ManipulateUIElementを呼び出して、特定のUI要素を操作するパターンをテストするサブルーチン

「オートメンションエラー」について調査したところ、おそらく「Automation Error」のことを指していると思われます。Excel VBAにおける「Automation Error」は、主に次のような原因で発生します:

  1. ライブラリまたは参照が欠落している場合:VBAコードが特定のライブラリまたは参照を必要としているが、それらが見つからない場合にこのエラーが発生します。ExcelのVBAエディタで[ツール]メニューの[参照設定]を選択し、必要な参照がチェックされていることを確認してください。

  2. オブジェクトが存在しない場合:存在しないオブジェクトにアクセスしようとしたときにもこのエラーが発生します。オブジェクトの存在を確認し、必要な場合は適切に初期化してください。

  3. メモリ不足:メモリが不足していると、このエラーが発生する可能性があります。不要なアプリケーションを閉じてメモリを解放し、再試行してみてください。

  4. コードの構文やロジックの問題:VBAコード自体に問題がある場合も、このエラーが発生します。コードを見直し、必要な場合は修正してください。

UIAutomationを使ったスクロールに関してエラーが出る場合、上記のチェックポイントを参考に原因を特定してみてください。それでも解決しない場合は、具体的なエラーメッセージやコードの一部を教えていただけると、より具体的なアドバイスが可能となります。

あなたが提供してくれた情報を基に、エラーが発生する原因を探ります。

まず、ManipulateUIElement関数はUI Automationを用いてWindowsアプリケーションのUI要素を操るためのものです。この関数の中でScrollの操作を行っている部分は以下のようなコードです:

    'Scroll操作
    ElseIf Operation = "Scroll" Then
        Set ScrollPattern = Element.GetCurrentPattern(UIA_ScrollPatternId)
        If ScrollPattern Is Nothing Then
            Debug.Print "スクロールパターンをサポートしていません。"
            ErrorFlag = True
            GoTo ExitFunc
        Else
            ScrollPattern.Scroll ScrollAmountX, ScrollAmountY
        End If
    End If

このコードから、ScrollPatternNothingの場合、つまりUI要素がスクロールパターンをサポートしていない場合にエラーメッセージを表示しています。

したがって、エラーの原因は以下の可能性が考えられます:

  1. UI要素がスクロールパターンをサポートしていない
  2. ScrollPattern.Scroll ScrollAmountX, ScrollAmountYの部分で何らかのエラーが発生している

具体的なエラーメッセージ(Err.Number & ":" & Err.Description)を教えていただければ、より具体的な原因を特定することができます。また、操作対象のアプリケーションやそのUI要素がスクロール操作をサポートしているかどうかを確認すると、問題解決に役立つ情報が得られるかもしれません。

了解しました。Ctrl+AとCtrl+Cのキー操作をVBAでシミュレートするコードを提供します。

以下、そのコードです:

Sub CopyAll()
    ' Ctrl + A (全選択)
    Application.SendKeys "^{A}"
    ' 少し待つ
    Application.Wait (Now + TimeValue("0:00:01"))
    ' Ctrl + C (コピー)
    Application.SendKeys "^{C}"
End Sub

このコードは、まずCtrl+A(全選択)をシミュレートし、その後1秒待ってからCtrl+C(コピー)をシミュレートします。

ただし、SendKeysメソッドはあくまでシミュレートであるため、実行中に他のキー操作が行われると予期しない結果を生じる可能性があります。また、使用するアプリケーションや環境により動作が異なることもありますので、ご注意ください。

なお、VBAでデータを選択しコピーする場合、通常はRangeオブジェクトとCopyメソッドを使用することが一般的です。例えば、ワークシートの全データをコピーするには次のようにします:

Sub CopyAll()
    ' 全データ選択
    Worksheets("Sheet1").Cells.Select
    ' コピー
    Selection.Copy
End Sub

以上、ご参考になれば幸いです。何か他にご質問がありましたら、お気軽にお申し付けください。

リートン回答
了解しました。すでにクリップボードにコピーされているデータをExcelシートに貼り付けるVBAコードを以下に示します。

Sub PasteData()
    ' A1セルに貼り付け
    Worksheets("Sheet1").Range("A1").PasteSpecial Paste:=xlPasteValues
End Sub

このコードは、"Sheet1"のA1セルにクリップボードのデータを貼り付けます。PasteSpecialメソッドを使用しており、xlPasteValuesを指定しているため、値のみが貼り付けられます。

なお、貼り付けるセルやシート名は適宜変更してください。

ただし、このコードはExcelがクリップボードのデータを解釈できる形式であることを前提としています。Webページから直接コピーしたデータによっては、正しく貼り付けられない場合もありますのでご注意ください。

また、コピーと貼り付けを一連の操作として行いたい場合は、上記のコードを前回提供したコードと組み合わせて使用することも可能です。

以上、ご参考になれば幸いです。他に何かご質問がありましたら、お気軽にお申し付けください。

繰り返し処理 リートン回答

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3