【サンプル】Excelのワークシート一覧から対象シートを選ぶ選択ボックスをPowerShellでつくってみた。【踊ってみた同好会(仮)】
過去の投稿にさまざまなPowerShellでオリジナルの待機ボックス、チェックボックス、選択ボックスがあります。
これらを参考にさせていただきながら、Excelのワークシート一覧を表示させる選択ボックスを作ってみました。
作業を頼まれたとき、もらったファイルのワークシート名に空白を付けたままの人、結構いまして、対象ワークシートを、臨時的に変数一覧で入力したりして、作業すると、その空白のトラップに引っ掛かり、シート名を修正して、などという手直しがたびたび発生したのが作成のきっかけです。
過去のPowerShell関連の代表的な投稿をまず、ご紹介いたします。
【サンプル】独自の待機ボックスを作ってみました (kenjiさんの投稿)
PowerShell利用でオリジナルインプットボックスが作成できないか (sakaさんの投稿)
【サンプル】 PowerShell利用オリジナルインプットボックス (sakaさんの投稿(完成品))
選択ボックスの選択候補を都度設定 (asaさんの質問に対するkenjiさんの回答)
参考にしたサイトはこちら
sakaさん投稿のオリジナルインプットボックスをベースに、中身をリストボックスに変え、リストボックスの内容は、標準ライブラリの「Excel操作((シート数取得)」をスクリプト変更して、シート名を取得し、PowerShellのコマンド文の一部にしています。
出来上がりのイメージはこちら
シートを選択したいファイル名を設定、一覧から選択したシート名を変数に格納します。
下のようなフローで、取得したシート名を待機ボックスに表示してみます。
↓サンプルのシート見出し↓
↓表示される選択ボックス↓
↓取得結果↓
↓Cancelを選ぶと、変数にはCancelが格納されます。↓
また、何も選択しなくてもOKがクリックできてしまいます。変数はカラになりますので、分岐などでの処理が必要になるかもしれません。
・・・・・・
以下、スクリプトの内容です。
まず、標準ライブラリ「Excel操作(シート数取得)」の以下のスクリプトを変更します。スクリプト最後のほう、
' ====日付のシート名を検索する====================================================
sheetMax = ExcelWorkBook.Sheets.Count
SetUMSVariable $シート数$, sheetMax
これらを次のように変更します。
For i = 1 to ExcelWorkBook.Sheets.Count
cmd2 = cmd2 & "[void] $listBox.Items.Add('" & ExcelWorkBook.Sheets(i).Name & "');"
Next
標準ライブラリ「Excel操作(シート数取得)」のスクリプト最後の行の「Set filePath = Nothing」のさらに下に、つぎのスクリプトを追加します。
cmd1 ="powershell.exe -command """ & _
"Add-Type -AssemblyName System.Windows.Forms;" & _
"$form=New-Object System.Windows.Forms.Form;" & _
"$form.Startposition='CenterScreen';" & _
"$form.FormBorderStyle='FixedSingle';" & _
"$form.ControlBox=$false;" & _
"$form.Text='選択';" & _
"$form.Size = New-Object System.Drawing.Size(350,300);" & _
"$form.StartPosition = 'CenterScreen';" & _
"$label=New-Object System.Windows.Forms.Label;" & _
"$label.Location = New-Object System.Drawing.Point(10,10);" & _
"$label.Size = New-Object System.Drawing.Size(330,20);" & _
"$label.Text='対象シート名を選択してください';" & _
"$OKButton=New-Object System.Windows.Forms.Button;" & _
"$OKButton.Location='85,200';" & _
"$OKButton.Size='75,30';" & _
"$OKButton.Text='OK';" & _
"$OKButton.DialogResult=[System.Windows.Forms.DialogResult]::OK;" & _
"$CancelButton=New-Object System.Windows.Forms.Button;" & _
"$CancelButton.Location='170,200';" & _
"$CancelButton.Size='75,30';" & _
"$CancelButton.Text='Cancel';" & _
"$CancelButton.DialogResult=[System.Windows.Forms.DialogResult]::Cancel;" & _
"$listBox = New-Object System.Windows.Forms.ListBox;" & _
"$listBox.Location = New-Object System.Drawing.Point(10,30);" & _
"$listBox.Size = New-Object System.Drawing.Size(310,150);"cmd3 ="$form.Controls.Add($label);" & _
"$form.Controls.Add($listBox);" & _
"$form.Controls.Add($OKButton);" & _
"$form.Controls.Add($CancelButton);" & _
"$form.AcceptButton=$OKButton;" & _
"$form.CancelButton=$CancelButton;" & _
"$form.Topmost=$True;" & _
"$OKButton.Add_Click({Write-Host $listBox.SelectedItem});" & _
"$CancelButton.Add_Click({Write-Host 'Cancel'});" & _
"[void]$Form.ShowDialog();"""' ====ばらばらの文章を連結
cmd = cmd1 & cmd2 & cmd3Set objShell = WScript.CreateObject("WScript.Shell")
Set objExec = objShell.Exec(cmd)
Do While objExec.Status = 0
WScript.Sleep 300
LoopSetUMSVariable $取得したシート名$, objExec.StdOut.ReadLine
Set objExec = Nothing
Set objShell = Nothing
実は、やっと、完成までこぎつけたあたりで、kenjiさん作の選択ボックスを見つけまして、リストの追加のあたりが、すごくスマートなんですが、私のは泥臭い感じになってます。
今回これで、PowerShellとだいぶ距離が縮まった感じしてます。
シナリオ共有にもアップロードしてみました。興味ありましたらご覧ください。
(ご利用&スクリプト変更につきましては、自己責任でよろしくお願いいたします。)