2024/09/11

Notes - Excel 連携:#36)帳票を画像で保存

Notes から Excel を操作する方法について紹介する連載『Notes - Excel 連携』の 36 回目です。前回までの帳票作成のプログラムを利用して、変わり種の機能を紹介します。それは、Excel のワークシートを画像として保存する方法です。

この機能は、ワークシートを画像に変換する機能と画像ファイルとして保存する機能を組み合わせて、実現します。まずはそれぞれの機能を確認しましょう。


ワークシートを画像に変換

Excel の操作でセルの範囲をクリップボードにコピーします。貼り付けるときの形式に[図]を指定すると画像として貼りつく機能があります。

VBA にもこれと同等の機能があります。その命令は Range オブジェクトの CopyPicture メソッドです。このメソッドを実行すると Range オブジェクトの範囲が画像としてクリップボードに入ります。

Range.CopyPicture メソッド (Excel)


画像ファイルとして保存するには

グラフの右クリックメニューには[図として保存]があり、グラフを画像ファイルとして保存することができます。

VBA では Chart オブジェクトの Export というメソッドとして利用できます。

Chart.Export メソッド (Excel)


帳票を図として保存

それでは、この 2 つの機能を利用して、帳票を画像として保存しましょう。『#33)帳票を PDF で保存』で作成したエージェントをベースに修正を加えます。

まず、今回のメイン関数となる帳票を図として保存する機能を実現する xSaveAsPicture を作成します。引数は、帳票が存在するシートオブジェクトと明細の行数、そして保存するファイル名です。

Function xSaveAsPicture(voSheet As Variant, ByVal viDoc As Integer, ByVal vsFileName As String)
   Dim oRange As Variant
   Dim s As String
   Dim oShape As Variant

   '画像に変換するエリアを取得
   s = GetRangeString(2, 2, xciHeaderRows + viDoc + 1, 9)
   Set oRange = voSheet.Range(s)

   '図として保存(クリップボードへ)
   oRange.CopyPicture

   '画像にするための Chart オブジェクト作成
   Set oShape = xAddChart(voSheet, oRange.Width, oRange.Height)

   '貼り付け場所はここ
   oShape.Select

   '図として貼り付け
   oShape.Chart.Paste

   '画像として保存
   oShape.Chart.Export vsFileName

   'Chart オブジェクト削除
   oShape.Delete
End Function

まず、帳票全体を表す Range オブジェクトの範囲文字列を変数 s に取得しています。ヘッダ行の行数 xciHeaderRows と引数の明細行数を使用して選択範囲を動的に決定しています。

その後は、プログラム内のコメントの通りです。Range オブジェクトとして取得して、クリップボードに画像としてコピー、グラフ(Chart オブジェクト)を作成し、そこに貼り付けて画像として保存しています。


Chart オブジェクトの作成

上記関数では xAddChart 関数で Chart オブジェクトを作成する処理を行っています。

#19)グラフ関連オブジェクトまとめ』でまとめたように、Shapes オブジェクトの AddChart2 メソッドで Chart オブジェクトを追加します。ただ、このメソッドの戻り値は Shape オブジェクトで Chart オブジェクトはそのプロパティであることがポイントです。

Function xAddChart(voSheet As Variant, ByVal vdWidthPt As Double, ByVal vdHeightPt As Double) As Variant
   Dim oShape As Variant

   'Chart を作成(Shape オブジェクト)
   Set oShape = voSheet.Shapes.AddChart2( , , , , vdWidthPt, vdHeightPt)
   With oShape
      '背景を白に
      .Fill.Visible = True
      .Fill.ForeColor.RGB = RGB(255, 255, 255)
      .Line.Visible = False

      'グラフのオブジェクトを削除
      On Error Resume Next
      .Chart.ChartTitle.Delete
      .Chart.Legend.Delete
      .Chart.Axes(xlCategory).Delete
      .Chart.Axes(xlValue).Delete
      .Chart.Axes(xlValue).MajorGridlines.Delete
   End With

   Set xAddChart = oShape
End Function

今回 Chart オブジェクトは、画像として保存するためだけに使用しており、グラフとしては全く利用しません。ですが、AddChart2 メソッドで Chart を作成した場合、シートの状態によって自動でグラフタイトルや凡例などのオブジェクトが作成されることがあります。そこで、この関数では、不要なものを順に削除しています。ただ、オブジェクトが作成されていない場合、エラーとなりますので、 On Error Resume Next でエラーを無視するようにしています。


エージェントの修正

仕上げに、エージェントの Initialize を修正します。前回の PDF で保存する機能は不要なのでコメントアウトし、代わりに今回作成した関数 xSaveAsPicture をコールします。

最後に Excel シートを画面に表示させ終了しています。

  ・・・
   '印刷設定
   Call xPageSetup(oSheet)

   '作成した帳票を PDF で保存
   'oXls.DisplayAlerts = False
   'Call oXls.Workbooks(1).ExportAsFixedFormat(xlTypePDF, "E:\Notes-Excel#33.pdf")
   'Call oXls.Workbooks(1).Close()


   '画像として保存
   Call xSaveAsPicture(oSheet, iDoc, "E:\Notes-Excel#36.png")

   'Excel を UI に表示
   oXls.Visible = True
End Sub


まとめ

実行すると指定した場所に帳票が画像として保存されます。前回の PDF と同様に内容を修正されたくない場合に利用できます。

#32 で Excel 形式、#33 で PDF、そして今回は画像として保存する方法をまとめました。さまざまな形式に対応できるようになるとアプリの自由度が増しますね。


前回 Notes - Excel 連携 次回


0 件のコメント:

コメントを投稿