7

過去の投稿にさまざまなPowerShellでオリジナルの待機ボックス、チェックボックス、選択ボックスがあります。
これらを参考にさせていただきながら、Excelのワークシート一覧を表示させる選択ボックスを作ってみました。

作業を頼まれたとき、もらったファイルのワークシート名に空白を付けたままの人、結構いまして、対象ワークシートを、臨時的に変数一覧で入力したりして、作業すると、その空白のトラップに引っ掛かり、シート名を修正して、などという手直しがたびたび発生したのが作成のきっかけです。

過去のPowerShell関連の代表的な投稿をまず、ご紹介いたします。

【サンプル】独自の待機ボックスを作ってみました  (kenjiさんの投稿)

PowerShell利用でオリジナルインプットボックスが作成できないか (sakaさんの投稿)

【サンプル】 PowerShell利用オリジナルインプットボックス (sakaさんの投稿(完成品))

選択ボックスの選択候補を都度設定 (asaさんの質問に対するkenjiさんの回答)

参考にしたサイトはこちら

PowerShellでユーザーフォームを作る - リストボックス編 -
PowerShellの基本

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 & cmd3

Set objShell = WScript.CreateObject("WScript.Shell")

Set objExec = objShell.Exec(cmd)
Do While objExec.Status = 0
WScript.Sleep 300
Loop

SetUMSVariable $取得したシート名$, objExec.StdOut.ReadLine

Set objExec = Nothing
Set objShell = Nothing

実は、やっと、完成までこぎつけたあたりで、kenjiさん作の選択ボックスを見つけまして、リストの追加のあたりが、すごくスマートなんですが、私のは泥臭い感じになってます。

今回これで、PowerShellとだいぶ距離が縮まった感じしてます。

シナリオ共有にもアップロードしてみました。興味ありましたらご覧ください。

(ご利用&スクリプト変更につきましては、自己責任でよろしくお願いいたします。)

Zawawa 質問の編集
回答とコメントは、会員登録(無料)で閲覧できるようになります。