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で書き直すだけで良いです。
コメント