Excel上のフォームコントロールのチェックボックスの状態を取得する、PowerShellのサンプルコードを紹介します。
操作対象Excelファイル
PowerShellから操作するチェックボックス入りのExcelファイルです。
Book1.xlsx
下記画像の1行目3列目のアイコンのチェックボックスを使用しています。
細かいことを書くとこんな状態ですがさらっと読めばよいです。
- オブジェクト名「Check Box 1」~「Check Box 5」の、チェックボックスを5つ追加しています。
- チェックボックスはグループ化されています。
- チェックボックスはフォームコントロールです。※ActiveXコントロールではありません。
単一のチェックボックスの状態の取得
ソースコード
「りんご」のチェックボックスの状態を取得して、表示してみます。
「りんご」のオブジェクト名は「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")
# チェックボックスの状態取得
write-host($sheet.CheckBoxes("Check Box 1").Value)
[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
実行結果
りんごのチェック状態が出力されました。
チェックオフなので、「-4146」が出力されます。
チェックオンだと、「1」が出力されます。
ループしてチェックボックスを取得(foreach文)
ソースコード
foreach文を使用して、チェックが付いたチェックボックスのCaptionを取得します。
$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){
if ($sheet.CheckBoxes($checkbox.Name).Value -eq 1){ # CHECK ON
write-host($sheet.CheckBoxes($checkbox.Name).Caption)
}
}
[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文を使用して、チェックが付いたチェックボックスのCaptionを取得します。
$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
if ($sheet.CheckBoxes($checkboxName).Value -eq 1){ # CHECK ON
write-host($sheet.CheckBoxes($checkboxName).Caption)
}
}
[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
実行結果
こちらも同様に、果物だけにチェックして取得しました。
実行前
実行後
同じ結果です。
参考情報
環境
下記の環境で作成・実行しております。
No. | 環境 | バージョン |
---|---|---|
1 | OS | Windows10 |
2 | PowerShell | 5.1 |
以上です。
コメント