LoginSignup
1
3

More than 3 years have passed since last update.

【PowerShell】エクセルブック(マクロ有効ブック)を一発で新規作成するスクリプト を作成したい

Last updated at Posted at 2019-12-22

1.この記事について

きっかけ

勉強のために色々とエクセルツールを作成していると、
マクロ有効エクセルブック(◯◯◯.xlsm)を新規作成したくなるときがある。

しかし、、、
Windows10のエクスプローラでフォルダを表示して
右クリで「新規作成(X)」を選択しても、
「Microsoft Excel ワークシート 」はあるが、マクロ有効ブックの項目はない。

要は、こういうこと(⇓)になってほしいが、実際はそうなっていない。
[画像はこちらから参照させていただきました。]
https://blog-imgs-91-origin.fc2.com/m/e/n/menushowdelay/45ere3.png

これを実現するためには、
レジストリをいじる必要があるらしい。
こちらの記事に詳細な方法があります。(ハゲでも使えるWindows:新規作成→ Excel ワークシート.xlsmファイル)

ただ、個人的にレジストリをいじるよりも、より汎用的な方法が望ましかったことと、
レジストリを操作して不具合が出るのが嫌だったので、
今回はPowershellスクリプトによって問題の解決を試みた。

※ソースコードはGithubに上げてます(後述)

2.やりたいこと

・現在のフォルダにマクロ有効ブックを新規作成する。
・ブックの名前を引数にとることもできるようなスクリプトが良い(指定しない場合はデフォルトの名前)。

3.使用したツール・環境

・Windows10
・Powershell 5.1
・Office2016

4.作成したコード

※※20191223追記※※

頂いたコメントを元に改良しました。
・コンソールウィンドウを閉じるときに当スクリプト実行中のプロセスのみ停止するようにした(他のpowershellプロセスの巻き添え防止)

make_excelBook_with_macro.ps1
Param(
    [string]$newBookName = 'newBook'   # 新しいマクロ有効ブック名.デフォルト:newBook
    )

try
   {
        #変数宣言
        $xlOpenXMLWorkbookMacroEnabled = 52 #COMオブジェクトの定数(混乱がないようにそれと同じ名前に)
        $isSucess = $False

        # Excelを操作する為の宣言
        $excel = New-Object -ComObject Excel.Application

        # 可視化しない(画面が出たり消えたりするとめんどくさい)
        $excel.Visible = $False

        #新規エクセルブックを作成する。
        $newBook = $excel.Workbooks.Add()

        # マクロ有効エクセルブックとして保存
        #作成場所はカレントディレクトリ
        $newBook.SaveAs( (Convert-Path .) + "\" + $newBookName + ".xlsm", `
                            $xlOpenXMLWorkbookMacroEnabled)

        #正常終了フラグ取得:SAVEASが正常終了していること
        $isSucess = $?

   }
   catch [Exception]
   {
       Write-Host "エラーが発生しました。"
       Write-Host "↓↓↓エラー詳細↓↓↓"
       $error[0] | Out-String | Write-Host
   }
   finally
   {
       Write-Host "プログラムを終了します..."
        # Excelを閉じる
        if ($excel -ne $null)
        {
            $excel.Quit()

            # プロセスを解放する
            if ($newBook -ne $null)
            {
                Remove-Variable excel,newBook
            }else{
                Remove-Variable excel
            }
        }
        #正常終了ならばPowershellを停止する(Powershellのウィンドウを閉じる)
        if ($isSucess)
        {

            # 当スクリプトを実行したコンソールウィンドウのみ閉じる(PIDは実行中のPowerShellのプロセスIDが設定される自動変数)
            Stop-Process -Id $PID
        }


   }

5.解説


引数は指定しても指定しなくても良いようにした。
指定したならば、わざわざ作成後にリネームする手間が省ける。


SaveAsをPowershellから使う際は、
VBAのときのように
COMオブジェクトの使用ができない(したがって入力補完も効かない)ので
公式リファレンスから調べてその値を指定した。


最後にPowershellのプロセスを停止するやり方は
わたしが以前投稿した記事のやつとおんなじやり方。
【PowerShell】今日の日付の名前のフォルダを作成するスクリプト - Qiita

したがって注意点も同じ。
追記により改善。

6.終わりに

ソースコードはGitHubに上げました。
CreateToolAndTest/make_excelBook_with_macro.ps1 at master · dede-20191130/CreateToolAndTest

なにか補足がありましたらコメントください。

1
3
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3