2015-06-18

PowerShellでExcelを操作する - 罫線の操作編 -

PowerShellでは、Excelファイル(エクセル 拡張子xls、xlsx、xlsm等)を操作することもできます。

Excelファイルは、Officeソフトの中でも特に使用頻度が高く、業務で毎日使用しているという人も少なくないと思います。

そんな毎日使用するものだからこそ、定型業務をPowerShellで自動化していきましょう!!



Excel操作 9回目の今回は「PowerShellでExcelを操作する - 罫線の操作編 -」です。

前回は「下線」でしたが、今回は「罫線」です。
⇒ 前回の記事はこちら 【PowerShellでExcelを操作する - 下線の操作編 -


<前準備>

・C:\TESTフォルダ内に、AAA.xlsxのExcelファイルを作成しておいてください。
 AAA.xlsxの内容は空のままでOKです。



それでは早速、例文を記述していきます。



---------ここから-------------------------------------------------------------------------------------

# Excel操作 罫線の操作編


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

# 可視化しない
$excel.Visible = $false

# 既存のワークブックを開く場合
$book = $excel.Workbooks.Open("C:\TEST\AAA.xlsx")

# ワークシートを番号で指定し、接続する
$sheet = $excel.Worksheets.Item(1)

# 指定したセルに文字列を入力
$sheet.Cells.Item(2,3) = "PowerShellで作成"

# 罫線を使用する前の宣言 (罫線の種類)
$LineStyle = "microsoft.office.interop.excel.xlLineStyle" -as [type]

# 罫線の種類を指定
$sheet.cells.item(2,3).borders.LineStyle = $LineStyle::xlDashDotDot

# 罫線を使用する前の宣言 (罫線の太さ)
$Weight = "microsoft.office.interop.excel.xlBorderWeight" -as [type]

# 罫線の太さを指定
$sheet.cells.item(2,3).borders.Weight = $Weight::xlMedium

# 列幅を自動調整する
$range = $sheet.usedRange
$range.EntireColumn.AutoFit() | out-null

# 上書き保存
$Book.Save()

# Excelを閉じる
$excel.Quit()

# プロセスを解放する
$excel = $null
[GC]::Collect()

---------ここまで-------------------------------------------------------------------------------------

上記内容をコピーし、PowerShell ISEに貼り付けて、実行してみてください。

処理完了後、C:\TESTフォルダ内のAAA.xlsxを開くと、画像のように入力されると思います。


セルC2に罫線が適用されています。


それでは1行ずつ解説していきます。
(コマンドが記述してある部分だけを数えて1行目、2行目…としています)


<解説>

◆1行目~5行目
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false
$book = $excel.Workbooks.Open("C:\TEST\AAA.xlsx")
$sheet = $excel.Worksheets.Item(1)
$sheet.Cells.Item(2,3) = "PowerShellで作成"

この5行についてはもはやお馴染みですね。
内容がわからない場合は【PowerShellでExcelを操作する - 基礎編 -】をご覧ください。


◆6行目
$LineStyle = "microsoft.office.interop.excel.xlLineStyle" -as [type]

6行目では、Microsoft.Office.Interop.Excel クラスのxllineStyle 列挙型というものを使用します。
この宣言は「LineStyle」つまり罫線の種類を選択しますよと宣言しています。


◆7行目
$sheet.cells.item(2,3).borders.LineStyle = $LineStyle::xlDashDotDot

7行目では、罫線の種類を「DashDotDot」に指定しています。
指定できる罫線の種類は次の7種類です。

 <罫線の種類>
   xlContinuous     実線
   xlDashDot      一点鎖線
   xlDashDotDot    二点鎖線
   xlDouble       二重線
   xlSlantDashDot    斜線
   xlDash        破線
   xlLineStyleNone   線なし



◆8行目
$Weight = "microsoft.office.interop.excel.xlBorderWeight" -as [type]

8行目では6行目と同様に、罫線の太さを選択できるようにする為、 xlBorderWeight 列挙型の使用を宣言しています。


◆9行目
$sheet.cells.item(2,3).borders.Weight = $Weight::xlMedium

9行目では、罫線の太さを「Medium」に指定しています。
指定できる罫線の太さは次の4種類です。

 <罫線の太さ>
   xlHairline    極細
   xlThin         細
   xlMedium    中
   xlThick        太


            ※極細と細の見分けがつきにくいので、画像を大きめにしています。


◆10行目・11行目
$range = $sheet.usedRange
$range.EntireColumn.AutoFit()

10行目・11行目はオマケでつけました。
この2行は、シート内で使用されている列の列幅を自動調整しています。

過去記事でも取り上げましたが、行はRow、列はColumnです。
⇒過去の記事はこちら 【PowerShellでExcelを操作する - 行・列の操作編 -


◆12行目~15行目
$book.Save()
$excel.Quit()
$excel = $null
[GC]::Collect()

この4行については割愛させていただきます。
内容がわからない場合は【PowerShellでExcelを操作する - 基礎編 -】をご覧ください。


解説は以上です。


今回ご紹介した内容の使いどころとしては、ブックAからブックBへデータをコピーしたした際、ブックBで表形式にしたい場合などに有効かと思います。

以前紹介しましたブック間のコピーと組み合わせて使用すると、より作業効率が向上するのではないかと思います。
⇒過去の記事はこちら 【PowerShellでExcelを操作する - ブック間のコピー編 -


=======================================================================
本投稿に関する疑問や質問には可能な限りお答えさせていただきます。
お気軽にコメントやメールをお送りください。
(リクエストも歓迎します)
メール:tkk-powershell@gmail.com
また、間違いのご指摘・アドバイス等も歓迎いたします。
=======================================================================
Google+、Twitterで更新情報をお届けしています!
ぜひフォローをお願い致します!           
=======================================================================
スポンサーリンク


3 件のコメント:

  1. いつもありがとうございます。
    私の環境(windws10/Office2016)ですと、border.LineStyleでエラーと
    なります。borders.LineStyle で回避しました。
    border.Weightも同じです。

    返信削除
    返信
    1. 匿名様

      ご指摘、ありがとうございました。
      仰る通り、「borders」とするのが正となります。

      早速、記事の修正を行いました。

      削除
  2. セル範囲の特定の部分、
    例えば、xlInsideHorizontalやxlInsideVertical などの罫線は、
    どう指定するのでしょうか?


    $range.borders($xxx).Weight = ...

    のような書き方ではエラーになってしまいました。

    返信削除

疑問・質問・リクエスト お気軽にどうぞ (^O^)/