2024/09/15

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

名前を表示したアイコン作成の 3 回目です。今回は残りの名前(テキスト)を表示する関数 xAddText についてまとめます。


名前(テキスト)の作成

先に作成した関数を紹介します。細かな調整や新たなオブジェクト(プロパティ)が登場していますので順に解説します。

Function xAddText(voIcon As Variant, ByVal vdPoint As Double, ByVal vsName As String)
   Dim oText As Variant
   Dim dFont As Double
   Dim dMarginTop As Double
   Dim dMarginLR As Double
   Dim dSpace As Double

   '設定材料算出
   dFont = vdPoint / 3   '2行表示を想定し高さの 1/3
   dSpace = 0.6   '行間
   dMarginTop = dFont * (1 - dSpace)   '行間を詰めた分だけ上にずれる
   dMarginLR = vdPoint / 8   '少し詰めないと 3 文字入る

   'ラベル作成(Shape オブジェクト)
   Set oText = voIcon.Chart.Shapes.AddLabel(msoTextOrientationHorizontal, 0, 0, vdPoint, vdPoint)
   With oText.TextFrame2
      'ラベルの設定
      .VerticalAnchor = msoAnchorMiddle   '垂直に中央揃え
      'マージン
      .MarginLeft = dMarginLR
      .MarginRight = dMarginLR
      .MarginTop = dMarginTop
      .MarginBottom = 0
      'テキストの設定
      .TextRange.Font.Size = dFont   'フォントサイズ
      .TextRange.ParagraphFormat.Alignment = msoAlignCenter   '水平に中央揃え
      .TextRange.ParagraphFormat.SpaceWithin = dSpace   '行間
      'テキスト
      .TextRange.Characters.Text = vsName
      .TextRange.Characters.Font.Fill.ForeColor.RGB = RGB(255, 255, 255)
   End With
End Function


フォントサイズ

今回のアイコンでは、最大 2 行の表示を想定しています。アイコンは円でその中に入れるためには高さの 1/3 をフォントサイズとしました。引数で渡されるアイコンのサイズの単位は Point なので 3 で割るだけでフォントサイズとして使用できます。


テキストの配置

表示するテキストは縦横 2 文字ずつを想定しています。標準の設定では行間が広いので行間を詰めます。次の図は、左が標準の設定で、右が今回採用した 0.6 倍 の設定です。

以下は今回採用する設定(右側の設定)


マージンの設定

行間を詰めた場合、文字はその分上にずれます。これは垂直方向で中央ぞろえした場合でも同じです(要は中央揃えにならない)。そこで、行間のを詰めた分、上のマージンで補います。左がマージン 0、右が行間を詰めた 40%(1-0.6)をフォントサイズに合わせてマージンにセットした状態です。

また、左右のマージンが 0 だと 3 文字入ってしまうため、左右にマージンを設定します。

計算上は 1/3 をマージンにすればいいのですが、幅が広い文字がある可能性を想定し 1/4 とします。文字は水平方向で中央揃えとするので、左右同じ幅、1/8 を左右それぞれのマージンとします。


TextFrame2 オブジェクト

AddLabel メソッドでの戻り値は、これまでの AddChart2、AddShape メソッドと同じく、Shape オブジェクトです。実際のラベルのオブジェクトにアクセスするためには TextFrame2 プロパティ を使用します。

TextFrame2 オブジェクトのプロパティにマージンの設定と垂直揃えを設定する VerticalAnchor プロパティ が存在します。

セットできる値は MsoVerticalAnchor 列挙 に定義されています。思いのほか細かな設定がありますが、今回は 3 の msoAnchorMiddle を使用して、垂直方向に中央揃えさせます。


TextRange2 オブジェクト

フォントサイズや水平揃え、表示する文字の設定など上記以外の設定は、TextRange2 オブジェクトから行います。オブジェクトは、TextFrame2 オブジェクトのプロパティから取得します。なぜか TextRange プロパティ から TextRange2 オブジェクト が取得できます。ややこしいですね...

水平揃えは、ParagraphFormat プロパティ 経由で Alignment プロパティでセットするのですが、Microsoft Learn のリンクが途切れています。調べる限り ParagraphFormat プロパティは ParagraphFormat2 オブジェクト のようです。プロパティを確認すると  Alignment プロパティ があり、設定値は MsoParagraphAlignment 列挙 に定義されています。


Characters プロパティ

TextRange2 オブジェクト の Characters プロパティ の値は TextRange2 です。今回のコードだけでは判別しかねるのですが、これはテキスト内の一部分に対して文字色を変えるなど部分文字列に対応していからこのような構造になっていると想定します。

Excel のマクロの記録でベースとなる VBA を取得したのですが、その際に Characters プロパティを使用したコードが出力されました。今回は、その通り LotusScript に変換したのですが、構造を理解していると以下のように記述することも可能です。

         ・・・
      .TextRange.ParagraphFormat.SpaceWithin = dSpace '行間

      'テキスト
      .TextRange.Text = vsName
      .TextRange.Font.Fill.ForeColor.RGB = RGB(255, 255, 255)

      '.TextRange.Characters.Text = vsName
      '.TextRange.Characters.Font.Fill.ForeColor.RGB = RGB(255, 255, 255)

   End With
End Function


ライブラリの更新

ここまでで、プロパティに設定する定数がいくつかありましたので、ライブラリに追加します。lsXls ライブラリを開き、(Declarations) に以下を追加します。

'MsoVerticalAnchor 列挙 (Office)
Public Const msoAnchorMiddle = 3   '垂直方向に中央揃え

'MsoParagraphAlignment 列挙 (Office)
Public Const msoAlignCenter = 2   '中央揃え

なお、MsoParagraphAlignment 列挙 のページでは、中央寄せは 1 の msoAlignCenter と記載されています。そのまま実行すると左寄せになりました。実際には、2 を設定すると中央寄せとなりました。これが、Microsoft Learn の間違いなのかは判別できませんが、上記コードでは 2 で設定します。


まとめ

プログラムが完成したら、エージェントを実行してみましょう。指定したフォルダにアイコンファイルが作成されます。

アイコンのサイズは引数化しているので、お好みのサイズで作成してください。現時点では色合いは関数内で埋め込んでいるため固定ですが、引数に追加すれば好みの色で作成できますね。

今回紹介したプログラムでは、オートシェイプを利用しました。オートシェイプには多種多様な部品があります。今回の技を応用すればアイコンだけでなく、バナーなどさまざまな画像が作成できますね。

最後に、今回登場したオブジェクトの関係を整理しておきます。


前回 Notes - Excel 連携


0 件のコメント:

コメントを投稿