LoginSignup
2
0

More than 3 years have passed since last update.

PoweShellでエクセルのワークシートに配置されたActiveX コントロールの状態を取得する

Posted at

ここを見よ
officeデベロッパーセンター - OLEObjects オブジェクト (Excel)
https://docs.microsoft.com/ja-jp/office/vba/api/excel.oleobjects

業務で使う大量のエクセルがあり、チェックボックスがON(True)の場合、特定の処理がしたかったのでPowerShellでつらつら。
しかしチェックボックスがActiveXコントロールのだったため悩む。
ActiveXがOLEObjectsっぽいことに気がついて行き着きました。

例文がほとんど
 Sheets("Sheet1").CheckBoxes(1)
等でフォームコントロール対象だったため1時間くらい悶々としてました。
VBAのお作法を知らないので余計にですね。

#ActiveXコントロールの CheckBox1 の状態取得
$isOn = $Targetsheet.OLEObjects("CheckBox1").object.value

OLEObjects("CheckBox1")からのobjectは自力では辿り着かなかったでしょう…

hoge.ps1
# Excelを操作する為の宣言
$excel = New-Object -ComObject Excel.Application

# 不可視化する
$excel.Visible = $false

# 既存のExcelファイルを開く
$TargetBook = $excel.Workbooks.Open("hoge.xlsx")

# シートを取得
$Targetsheet = $TargetBook.Worksheets.Item("シート名")

#CheckBox1 の状態取得
$isOn = $Targetsheet.OLEObjects("CheckBox1").object.value

if ($isOn){
    #何らかの処理
}

# 上書き保存
$TargetBook.Save()

# Excelを閉じる
$excel.Quit()

ちなみに下記のように適当にワークシート.チェックボックスで打ち込んでも何も表示されないだけでエラーは出ない。
これも混乱したもとでした。

[DBG]: PS Microsoft.PowerShell.Core\FileSystem::\\foo\bar>> $Targetsheet.CheckBox1

[DBG]: PS Microsoft.PowerShell.Core\FileSystem::\\foo\bar>> $Targetsheet.CheckBox1.name

[DBG]: PS Microsoft.PowerShell.Core\FileSystem::\\foo\bar>> $Targetsheet.CheckBox1.hight
2
0
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
2
0