2024/09/14

Notes - Excel 連携:#38)名前アイコン生成 ②

名前を表示したアイコン作成の 2 回目です。今回は前回説明できなかった xMakeIcon 関数についてまとめます。


メインルーチン

以下がアイコン作成のメインルーチンです。Worksheet オブジェクトとアイコンのサイズ(ピクセル)、表示する名前が引数です。

Function xMakeIcon(voSheet As Variant, ByVal viPixcel As Integer, ByVal vsName As String) As Variant
   Dim oIcon As Variant
   Dim dPoint As Double

   'ピクセル -> ポイント
   dPoint = PixcelToPoint(viPixcel-1)

   '画像にするための Chart オブジェクト作成
   Set oIcon = xAddChart(voSheet, dPoint)

   '背景(楕円)
   Call xAddOval(oIcon, dPoint)

   '名前(テキスト)
   Call xAddText(oIcon, dPoint, vsName)

   Set xMakeIcon = oIcon
End Function

処理の流れは、

  1. 画像として保存するため Chart オブジェクトを作成
  2. アイコンの背景となる円を作成
  3. 名前(テキスト)を表示

となっており、各処理はサブ関数化しています(詳細は後述)。戻り値は作成したアイコンのオブジェクトです。

なお、Excel でオートシェイプなどを作る際は、単位がポイントとなるので、初めにライブラリの関数を使用して変換しています。

   dPoint = PixcelToPoint(viPixcel-1)

ちなみに端数処理の関係かはわかりませんが 1 ピクセル大きく出力されたので、1 引いています。


Chart オブジェクト作成

xAddChart 関数については、『#36)帳票を画像で保存』とほぼ同じです。ただ、今回は正方形であることからサイズの引数が 1 つになっています。また、画像の背景を透明にするため、塗りつぶしを非表示にしています。

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

   'Chart を作成(Shape オブジェクト)
   Set oShape = voSheet.Shapes.AddChart2( , , , , vdPoint, vdPoint)
   With oShape
      '背景は透明
      .Fill.Visible = False
      .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


背景(楕円)の作成

xAddOval 関数で、背景となる円を追加しています。前回紹介した AddShape メソッドを使用しています。作成するオートシェイプは  msoShapeOval、楕円です。

Function xAddOval(voIcon As Variant, ByVal vdPoint As Double)
   Dim oOval As Variant

   '楕円の作成(Shape オブジェクト)
   Set oOval = voIcon.Chart.Shapes.AddShape(msoShapeOval, 0, 0, vdPoint, vdPoint)
   With oOval
      .Line.Visible = False
      '背景色の設定
      .Fill.Visible = True
      .Fill.ForeColor.RGB = RGB(128, 128, 255)
   End With
End Function


オブジェクト構造

上記の 2 つの関数を紹介しました。それぞれのオブジェクト作成において、違和感は感じなかったでしょうか?

   Set oShape = voSheet.Shapes.AddChart2( , , , , vdPoint, vdPoint)

   Set oOval = voIcon.Chart.Shapes.AddShape(msoShapeOval, 0, 0, vdPoint, vdPoint)

そうなんです。どちらも、Shapes オブジェクトのメソッドを使用していますが、その親となるオブジェクトが違います。AddChart2 は Worksheet、AddShape は AddChart2 で作成された Chart オブジェクトとなっています。

図式化すると次のような感じとなります。

Chart オブジェクトにも Shapes オブジェクトが存在しており、そこから AddShape を実行しています。これにより追加したオートシェイプは Chart オブジェクトの上に作成されることとなります。

次回説明する名前(テキスト)も同様の構成となります。オブジェクトの配置に着目して整理すると次のようなになります。

構造が複雑になりますので、だらだらしたコードを書くと現在位置を見失いがちになります。適切に関数化したり、変数名を明確に付ける、コメントをしっかり記述するなど工夫をしましょう。後日見直したときに混乱する元となります。


続きは次回

少し長くなってきたので、残りの名前(テキスト)を作成する関数 xAddText は次回とします。


前回 Notes - Excel 連携 次回


0 件のコメント:

コメントを投稿