UI AutomationでExcelのセルを操作してみたかった(未完)
メモ程度。
https://t.co/icymtkNzUO.Automationの方のUI AutomationでExcelのセルが取得でき、
— いみひと (@nukie_53) November 8, 2019
ValuePattern(値の取得・設定が可能な特性)を持っていたので、VBAを介さず値を設定出来るのかな?と思ったけど、上手くいかないようで残念。
このツイートの内容の確認に使用したコード。
<# .Synopsis # UI Automation でExcelのセルの値を取得するサンプル ## 前提条件 - Excelを起動し、何かブックを開いていること - Windows 10 の Windows PowerShell ISE で実行すること #> # 実行に必要なアセンブリ類のロード using assembly UIAutomationClient using assembly UIAutomationTypes using assembly UIAutomationClientSideProviders using namespace System.Windows.Automation # Excelのウィンドウを取得。 # 今のデスクトップのルートの子どもから「XLMAIN」というクラス名の要素を探索。 [AutomationElement]$uiaXl = [AutomationElement]::RootElement.FindFirst( [TreeScope]::Children, [PropertyCondition]::new([AutomationElement]::ClassNameProperty, 'XLMAIN') ) # 取得したExcelのウィンドウ配下からテーブルとしての機能を持つ要素を探索。 [AutomationElement]$uiaCellTable = $uiaXl.FindFirst( [TreeScope]::Descendants, [PropertyCondition]::new([AutomationElement]::IsTablePatternAvailableProperty, $true) ) # テーブルとしての機能を使えるようにする。 [TablePattern]$ptnTable = $uiaCellTable.GetCurrentPattern([TablePattern]::Pattern) # 今見えている範囲の左上から3,3の位置の要素を取得する(行・列見出しも含めて数える/左上がA1でない場合はB2ではない)。 [AutomationElement]$uiaB2 = $ptnTable.GetItem(2, 2) <# 持っている機能の確認 PS > $uiaB2.GetSupportedPatterns() Id ProgrammaticName -- ---------------- 10002 ValuePatternIdentifiers.Pattern 10007 GridItemPatternIdentifiers.Pattern 10010 SelectionItemPatternIdentifiers.Pattern 10013 TableItemPatternIdentifiers.Pattern 10014 TextPatternIdentifiers.Pattern #> # 選択する機能 [SelectionItemPattern]$ptnSel = $uiaB2.GetCurrentPattern([SelectionItemPattern]::Pattern) $ptnSel.Select() # セルの選択は可能 # 値の取得・設定をする機能 [ValuePattern]$ptnVal = $uiaB2.GetCurrentPattern([ValuePattern]::Pattern) $ptnVal.Current.Value # セルに表示されている値を出力 <# SetValueでエラーは出ないけど表示に反映されない $ptnVal.SetValue('Hoge') $ptnVal.Current.Value # ここの値では反映されている #>