VBAに拡張性がないかもと思って、最近は、PowerShellにはまっております。
この間の投稿では、VBAのユーザーフォームみたく呼び出せないかとトライだ。
先ず、ネットで色々ググってみて、呼び出せると分かって来てサンプルを作成。
このコードを紹介しましたが、ならばフォームを複数開いたりする場合のお話。
コードの記述では、フォームを開いて”OK”ボタンを押すと、フォームは消える。
それは画面上のことで、メモリーには残されると言うのが、分かって来ました。
つまり、最初のフォームでOKして、次もくり返している内に、挙動が怪しい。
先ず圧縮したいファイルを入力して、圧縮ファイル名を入力すると言う流れね。
これは、簡単にzipファイルを作ると言うコードを勉強がてらに作った分けだ。
おかしいなと思って調べると、メモリーに残ったフォームは消去が必要でした。
このコマンドはちゃんと存在して、VBAの”Unload”コマンドみたいな感じだ。
それで、作ったサンプルコードでは、終わり際でメモリーから解放しています。
それと、変数にも、その役割を終わらせるコードがあるので、追加しておいた。
というわけで、PowerShellは一挙手一投足に記述を書くので、結構面倒です。
一応、圧縮はできている感じですが、ファイルサイズが4MB近いと圧縮できなったりするので、実用には程遠い感じもしたりして、PowerShell制覇は、かなり長い道のりなのだと実感する自分なのでした。
<参考コード>
※次は、Compress-Archive.batで保存し、ps1ファイルと同じホルダに格納。
PowerShell -ExecutionPolicy RemoteSigned -WindowStyle Hidden .\Compress-Archive.ps1
このバッチファイルを最初に実行させてください。
※次は、Compress-Archive.ps1で保存
# ユーザーフォーム呼び出し入力(ZIPファイルのフルパス入力)
Add-Type -AssemblyName System.Windows.Forms # アセンブリ読み込み
Add-Type -AssemblyName System.Drawing
$form = New-Object System.Windows.Forms.Form # フォーム作成
$form.Text = "圧縮したいファイル"
$form.Size = New-Object System.Drawing.Size(280,200)
$form.StartPosition = "Manual"
$form.Location = "100,100"
$OKButton = New-Object System.Windows.Forms.Button #OKボタン設定
$OKButton.Location = New-Object System.Drawing.Point(40,120)
$OKButton.Size = New-Object System.Drawing.Size(75,30)
$OKButton.Text = "OK"
$OKButton.DialogResult = "OK"
# 列挙子名:None, OK, Cancel, Abort, Retry, Ignore, Yes, No
$CancelButton = New-Object System.Windows.Forms.Button #キャンセルボタン
$CancelButton.Location = New-Object System.Drawing.Point(130,120)
$CancelButton.Size = New-Object System.Drawing.Size(75,30)
$CancelButton.Text = "Cancel"
$CancelButton.DialogResult = "Cancel"
# 列挙子名:None, OK, Cancel, Abort, Retry, Ignore, Yes, No
$label = New-Object System.Windows.Forms.Label # ラベルの設定
$label.Location = New-Object System.Drawing.Point(10,30)
$label.Size = New-Object System.Drawing.Size(250,20)
$label.Text = "フルパスでファイル名(拡張子付)で入力してください"
$textBox = New-Object System.Windows.Forms.TextBox #入力ボックス設定
$textBox.Location = New-Object System.Drawing.Point(10,70)
$textBox.Size = New-Object System.Drawing.Size(245,50)
$form.AcceptButton = $OKButton # キー・ボタン関係
$form.CancelButton = $CancelButton
$form.Controls.Add($OKButton) # ボタン等をフォーム追加
$form.Controls.Add($CancelButton)
$form.Controls.Add($label)
$form.Controls.Add($textBox)
# フォームを表示させ、その結果を受け取る
$result = $form.ShowDialog()
# 結果による処理分岐
if ($result -eq "OK") {
$x = $textBox.Text
$x
} # 変数に値が渡される
#別フォーム(zipファイル名付け)呼び出し
Add-Type -AssemblyName System.Windows.Forms # アセンブリ読み込み
Add-Type -AssemblyName System.Drawing
$form = New-Object System.Windows.Forms.Form # フォーム作成
$form.Text = "圧縮後のファイル名"
$form.Size = New-Object System.Drawing.Size(300,200)
$form.StartPosition = "Manual"
$form.Location = "100,100"
$OKButton = New-Object System.Windows.Forms.Button #OKボタン設定
$OKButton.Location = New-Object System.Drawing.Point(40,120)
$OKButton.Size = New-Object System.Drawing.Size(75,30)
$OKButton.Text = "OK"
$OKButton.DialogResult = "OK"
# 列挙子名:None, OK, Cancel, Abort, Retry, Ignore, Yes, No
$CancelButton = New-Object System.Windows.Forms.Button #キャンセルボタン
$CancelButton.Location = New-Object System.Drawing.Point(130,120)
$CancelButton.Size = New-Object System.Drawing.Size(75,30)
$CancelButton.Text = "Cancel"
$CancelButton.DialogResult = "Cancel"
# 列挙子名:None, OK, Cancel, Abort, Retry, Ignore, Yes, No
$label = New-Object System.Windows.Forms.Label # ラベルの設定
$label.Location = New-Object System.Drawing.Point(10,30)
$label.Size = New-Object System.Drawing.Size(280,20)
$label.Text = "フルパスでファイル名(zip拡張子付)で入力してください"
$textBox = New-Object System.Windows.Forms.TextBox #入力ボックス設定
$textBox.Location = New-Object System.Drawing.Point(10,70)
$textBox.Size = New-Object System.Drawing.Size(245,50)
$form.AcceptButton = $OKButton # キー・ボタン関係
$form.CancelButton = $CancelButton
$form.Controls.Add($OKButton) # ボタン等をフォーム追加
$form.Controls.Add($CancelButton)
$form.Controls.Add($label)
$form.Controls.Add($textBox)
# フォームを表示させ、その結果を受け取る
$result = $form.ShowDialog()
# 結果による処理分岐
if ($result -eq "OK") {
$x1 = $textBox.Text
$x1
} # 変数に値が渡される
$mainForm.Dispose() # スクリプトの実行が終了したらフォームを解放
Compress-Archive -Path $x -DestinationPath $x1 #ファイル圧縮保存
Remove-Variable x
Remove-Variable x1 # 変数の解除