2024/09/13

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

ノーツでは、さまざまなシーンで画像が利用できます。設計では、アプリケーションのアイコンに始まり、ナビゲータ、アウトラインやアクションボタンのアイコン、フォームや表の背景画像など、文書ではリッチテキストに貼り付けたり添付したり、多岐にわたります。

ただ、UI からは画像を利用できるのですが、プログラムからの利用は不得手としています。その補完に Excel を使用する事例を紹介します。今回題材にするのは次のような画像の生成です。最近よく見かける名前を表示したアイコンですね。

せっかく手作りするのですから、4 文字まで対応したいと思います。これなら、薬師丸さんや小比類巻さんも安心ですね。


画像の作成方法

アイコンの作成法は次の通りです。

  1. 正方形のグラフ(Chart)をシートに作成する
  2. そのグラフに合わせた円をを描き、色を付ける
  3. 円の上に名前を上下左右でセンタリングして表示

アイコンのイメージができあがったら、前回 の方法を追加って Chart を画像として保存します。Chart 上に配置したオブジェクトを含めて画像ファイルに保存してくれます。


具体的な作業に入る前に、必要な VBA の主な機能を確認しましょう。


円の作画

グラフ(Chart オブジェクト)を作成するには Shapes オブジェクトの AddChart2 メソッドを使用しました。円の追加も同様に Shapes オブジェクトから行います。メソッドは AddShape です。

Shapes.AddShape メソッド (Excel)

このメソッドは各種オートシェイプを作成することができ、1 つ目の引数でその種類を指定します。指定できる値は MsoAutoShapeType 列挙に定義されています。

MsoAutoShapeType 列挙 (Office)

たくさんの定義がありますが、今回使用するのは 9 の msoShapeOval、楕円となります。


テキストの追加

テキストの追加も Shapes オブジェクトから行います。メソッドは AddLabel です。

Shapes.AddLabel メソッド (Excel)

このメソッドの最初の引数は、ラベル内のテキストの向きとなっており MsoTextOrientation 列挙で定義されています。

MsoTextOrientation 列挙 (Office)

今回は 1 の msoTextOrientationHorizontal、横書きを使用します。


定数の追加

まずは、上記定数をライブラリに定義します。この連載で作成してきた lsXls ライブラリを開き、(Declarations) に以下を追加します。

'MsoAutoShapeType 列挙 (Office)
Public Const msoShapeOval = 9 '楕円

'MsoTextOrientation 列挙 (Office)
Public Const msoTextOrientationHorizontal = 1 '横方向


エージェントの作成

新規でエージェントを作成します。メインルーチンは次の通りです。アイコンに表示するテキストを sName、アイコンのサイズを iPixel に指定します。

Option Declare
Use "lsXls"

Sub Initialize
   Dim oXls As Variant
   Dim oSheet As Variant
   Dim oIcon As Variant
   Dim sName As String
   Dim iPixel As Integer

   Set oXls = CreateObject("Excel.Application")

   Call oXls.Workbooks.Add
   Set oSheet = oXls.Workbooks(1).WorkSheets(1)

   sName = "喜連瓜破"
   iPixel = 64

   'アイコン作成
   Set oIcon = xMakeIcon(oSheet, iPixel, sName)

   '画像として保存
   Call xSaveAsPicture(oIcon, "E:\" & sName & ".png")

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

xMakeIcon 関数は Worksheet 上にアイコンを作成し、そのオブジェクト(Shape オブジェクト)を返します。この実体はグラフ(Chart)で、その中に円とテキストがセットされているということになります。この中身については、次回に解説します。

最後にその Shape オブジェクトを画像ファイルとして保存する関数 xSaveAsPicture をコールしています。Export しているだけなので、関数化する必要はないかもしれませんね...

Function xSaveAsPicture(voIcon As Variant, ByVal vsFileName As String)
   voIcon.Chart.Export vsFileName
End Function


次回の予告

途中にも記載しましたが、アイコンを作成する xMakeIcon 関数については次回に解説します。少しクセのある部分がありますので詳しく解説します。


前回 Notes - Excel 連携 次回


0 件のコメント:

コメントを投稿