名前を表示したアイコン作成の 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 |
処理の流れは、
- 画像として保存するため Chart オブジェクトを作成
- アイコンの背景となる円を作成
- 名前(テキスト)を表示
となっており、各処理はサブ関数化しています(詳細は後述)。戻り値は作成したアイコンのオブジェクトです。
なお、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 件のコメント:
コメントを投稿