2024/11/20

Notes - Excel 連携:#49)凡例の配置

#41)グラフの調整』から開始した ”使える” グラフにするための調整作業のシリーズです。今回は凡例の操作を行います。

前回までで習得した座標系の知識を利用して、凡例の配置を行います。設定の仕様は次の通りです。

  • フォントサイズは基準のフォントサイズとする
  • 幅はプロットエリア右側の空白に合わせる
  • 高さはサブタイトルと同じ(基準フォントサイズ × 1.5)
  • プロットエリアと凡例の底辺をそろえる


凡例の操作

VBA で凡例を操作するには Chart オブジェクトLegend プロパティ を使用して Legend オブジェクト を取得します。

また、グラフ内に凡例があるか判定するには HasLegend プロパティ を使用します。

Legend オブジェクトには、配置を指定する TopLeft、サイズを表す HeightWidth プロパティが存在します。Format プロパティで ChartFormat オブジェクト が取得でき、このオブジェクトに TextFrame2 プロパティがあります。TextFrame2 オブジェクトが取得できれば、テキストボックスと同様の操作でフォントの指定ができますね。


凡例を配置する関数

前回までオブジェクトの配置の方法や座標系について紹介しました。そして、凡例のオブジェクトと操作は上記の通りです。これらを活用して、どのようなコードを書くべきか想像してみましょう。

いかがですか?

仕様通りに凡例を配置する関数 xSetLegend を紹介します。

Function xSetLegend(voShape As Variant)
   Dim oLegend As Variant
   Dim oPlot As Variant

   If voShape.Chart.HasLegend = True Then
      '凡例が存在
      Set oLegend = voShape.Chart.Legend '凡例を取得
      Set oPlot = voShape.Chart.PlotArea 'プロットエリアを取得

      'フォントサイズの設定
      oLegend.Format.TextFrame2.TextRange.Font.Size = xcdFontSize

      '調整前にいったん左上に移動
      oLegend.Left = 0
      oLegend.Top = 0

      '位置とサイズの指定
      oLegend.Left = oPlot.InsideLeft + oPlot.InsideWidth
      oLegend.Width = voShape.Width - oLegend.Left - 4
      oLegend.Height = xcdFontSize * 1.5
      oLegend.Top = oPlot.InsideTop + oPlot.InsideHeight - oLegend.Height
   End If
End Function

凡例の配置を調整する前に位置を左上に移動しています。これは、凡例の現在位置にかかわらず希望のサイズを確実にセットするためです。以前お伝えした通り、グラフのエリアからはみ出ると自動で調整され、希望通り配置されないことがあります。これを抑制するためです。こうしておけば、設定の順序をいちいち意識する必要はないですね(回転はしない前提)。

位置とサイズの指定について補足します。

まず、Left はプロットエリアの右端と同じ位置ですので、プロットエリアの開始位置(InsideLeft)と幅(InsideWidth) を足しているだけです。

凡例の幅は、グラフエリアの幅(voShape.Width)からプロットエリアの幅(=凡例の Left)を引いています。これだけでは左マージンの 4 ポイントが考慮できていないので、それを差し引いています。

凡例の高さ(Top)は、プロットエリアの高さ(oPlot.InsideTop + oPlot.InsideHeight)から凡例エリアの高さを差し引いて決定しています。


まとめ

メインルーチンで、作成した関数をコールすれば今回の作業は完了です。

Sub Initialize
         ・・・
   'Y軸ラベルの生成
   Call xSetLabelY(oShape, "ユーザ数")

   '凡例の設定
   Call xSetLegend(oShape)

   oXls.Visible = True
End Sub

修正後に作成されるグラフは次のようになります。なかなかいい感じになりましたね。

次回は最後の仕上げを行い、グラフを完成させます。


前回 Notes - Excel 連携 次回


0 件のコメント:

コメントを投稿