PowerShellでExcelを操作するサンプル。「起動、シート追加、セル編集、保存」

コンピュータ

PowerShellスクリプトからExcelを起動しワークシートを追加しセルに値をセットした後ファイルを保存します。

スクリプト

<#
.SYNOPSIS
Excelを操作するサンプル
<CommonParameters> はサポートしていません

.DESCRIPTION
Excelで新しいワークブックを作成し、シートを追加セルに値を代入し保存します。

.EXAMPLE
PS>Sample-Excel.ps1 [xlsxファイルパス]

.PARAMETER XlsxPath
作成するxlsxファイルのパス
#>

param(
    [string]$XlsxPath = (Join-Path ([Environment]::GetFolderPath("MyDocuments")) "Sample-Excel.xlsx")
)

$ErrorActionPreference = "STOP"

function Sapme-Excel
{
    param(
        [Parameter(ValueFromPipeline=$true,Mandatory=$true)]
        [string]
        $XlsxPath
    )

    process {
        $Excel = New-Object -ComObject Excel.Application # Excel起動
        $Excel.Visible = $True

        # ワークブックの初期処理
        $XlsxExits = Test-Path -LiteralPath $XlsxPath # ファイルの存在確認
        if ($XlsxExits) {
            # ファイルが有る
            $Workbook = $Excel.Workbooks.Open($XlsxPath) # ワークブックを開く
        } else {
            # ファイルが無い
            $Workbook = $Excel.Workbooks.Add() # ワークブックを作成
        }

        # ワークシートの初期処理
        $SheetName = "HOGE"
        $Sheet = $Workbook.Worksheets | ? { $SheetName -eq $_.Name } # ワークシート名HOGEを取り出す
        if(-not($Sheet)) {
            # シート無し
            $Sheet = $Workbook.Worksheets.Add() # ワークシートを作成
            $Sheet.Name = $SheetName
        }

        # セルに値をセット
        $Sheet.Range("A1").Value = "Foo" # A1形式
        
        # R1C1形式
        for($x=1; $x -le 8;$x++) {
            for($y=1; $y -le 8;$y++) {
                $Sheet.Cells.Item(2+$x, $y) = "(x=${x},y=${y})" # A1は1,1
            }
        }


        # ワークブックを保存
        if ($XlsxExits) {
            # ファイルが有る
            $Workbook.Save() # 上書き保存
        } else {
            # ファイルが無い
            $Workbook.SaveAs($XlsxPath) # 名前を付けて保存
        }

        $Excel.Quit() # Excelを終了
        $Excel = $Null
        [System.GC]::Collect() # ガーベージコレクト
    }
}
Sapme-Excel $XlsxPath

結果

説明

VBAでやっていることをPowershellに書き直しただけですが内容の割にコードが長くなってしまいました。
VBAはExcelのマクロですのでExcel内から呼び出すことが前提です。外部スクリプトからExcelを操作する場合まずExcelを起動させる必要があります。起動させてしまえばあとはVBAと同じことをpowersehllで書き直すだけで良いです。

コメント