Excel上のフォームコントロールのチェックボックスの状態を変更する、PowerShellのサンプルコードを紹介します。
操作対象Excelファイル
PowerShellから操作するチェックボックス入りのExcelファイルです。
Book1.xlsx
下記画像の1行目3列目のアイコンのチェックボックスを使用しています。
細かいことを書くとこんな状態ですがさらっと読めばよいです。
- オブジェクト名「Check Box 1」~「Check Box 5」の、チェックボックスを5つ追加しています。
- チェックボックスはグループ化されています。
- チェックボックスはフォームコントロールです。※ActiveXコントロールではありません。
単一のチェックボックスの変更
ソースコード
「りんご」のチェックボックスについてONにしてみます。
「りんご」のオブジェクト名は「Check Box 1」なので、CheckBoxesに「Check Box 1」を指定します。
$excel = New-Object -ComObject Excel.Application
$book = $null
$excel.Visible = $false
$excel.DisplayAlerts = $false
$fileName = "Book1.xlsx"
$filePath = (Convert-Path .) + "/" + $fileName
$book = $excel.Workbooks.Open($filePath)
$sheet = $book.Sheets("Sheet1")
# 単一のチェックボックスを変更する場合
$sheet.CheckBoxes("Check Box 1").Value = $true
[void]$book.Save()
[void]$book.Close($false)
[void][System.Runtime.Interopservices.Marshal]::ReleaseComObject($book)
[void]$excel.Quit()
[void][System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel)
Pause
実行結果
「りんご」にチェックが付きました。
ループしてチェックボックスを変更(foreach文)
ソースコード
foreach文を使用して、チェックボックスをまとめて変更します。
※全部チェックONにします。
$excel = New-Object -ComObject Excel.Application
$book = $null
$excel.Visible = $false
$excel.DisplayAlerts = $false
$fileName = "Book1.xlsx"
$filePath = (Convert-Path .) + "/" + $fileName
$book = $excel.Workbooks.Open($filePath)
$sheet = $book.Sheets("Sheet1")
# グループ内のチェックボックスをまとめて変更する場合 foreach版
foreach($checkbox in $sheet.Shapes("Group1").GroupItems){
# 全てONにする
$sheet.CheckBoxes($checkbox.Name).Value = $true
}
[void]$book.Save()
[void]$book.Close($false)
[void][System.Runtime.Interopservices.Marshal]::ReleaseComObject($book)
[void]$excel.Quit()
[void][System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel)
Pause
実行結果
同じグループの全てのチェックボックスにチェックが付きました。
ループしてチェックボックスを変更(for文)
ソースコード
for文を使用して、チェックボックスをまとめて変更します。
※全部チェックONにします。
$excel = New-Object -ComObject Excel.Application
$book = $null
$excel.Visible = $false
$excel.DisplayAlerts = $false
$fileName = "Book1.xlsx"
$filePath = (Convert-Path .) + "/" + $fileName
$book = $excel.Workbooks.Open($filePath)
$sheet = $book.Sheets("Sheet1")
# グループ内のチェックボックスをまとめて変更する場合 for版
for($i=1; $i -le $sheet.Shapes("Group1").GroupItems.Count;$i++){
$checkboxName = "Check Box " + $i
$sheet.CheckBoxes($checkboxName).Value = $true
}
[void]$book.Save()
[void]$book.Close($false)
[void][System.Runtime.Interopservices.Marshal]::ReleaseComObject($book)
[void]$excel.Quit()
[void][System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel)
Pause
実行結果
for文でも同じ結果です。
同じグループの全てのチェックボックスにチェックが付きました。
参考情報
環境
下記の環境で作成・実行しております。
No. | 環境 | バージョン |
---|---|---|
1 | OS | Windows10 |
2 | PowerShell | 5.1 |
以上です。
コメント