2024/11/15

Notes - Excel 連携:#48)オブジェクトの回転と配置

#41)グラフの調整』から開始した ”使える” グラフにするための調整作業です。今回は Y 軸ラベルの設定を行います。

Y 軸ラベルは通常のテキストボックスを 90° 左に回転させ PlotArea の右端に配置します。オブジェクトのサイズは、プロットエリアの Y 軸に合わせ、文字を中央揃えにします。


オブジェクトの回転

テキストボックスをはじめ Shape オブジェクトには Rotation というプロパティがあり、オブジェクトの回転を表します。正の値を設定すると右(時計)回り、負の値で左回りに回転します。

まずはこのプロパティをテストします。100 × 15 ポイントのテキストボックスを座標 (0, 0) に作成し左に 90° 回転してみます。

   Set oText = xCreateTextBox(voShape)
   '配置の設定
   oText.Left = 0
   oText.Top = 0
   oText.Width = 100
   oText.Height = 15

   '左に 90° 回転
   oText.Rotation = -90

結果を確認すると回転処理はできていたのですが、オブジェクトサイズが小さくなったような気がします。そこで、サイズをメッセージボックスで表示させてみました。すると、幅が 61.5 と小さくなっているうえ、座標(Left と Top)が 19.25 と動いています。

まず、回転はオブジェクトの中心の座標を中心に実行されます。今回で言うと (50, 7.5) となります。左に 90° 回転するとオブジェクトがプロットエリアからはみ出ます(紫部分)。この部分が Excel の機能で自動的に調整され、残った部分が 61.5 ということですね。

オブジェクトの座標(Left と Top)はというと、調整されたオブジェクトの回転をもとに戻すとわかります。オブジェクトの長さは 61.5 ポイントだったので中心はその半分、そして、上部に 4 ポイントのマージンがあるので、中心座標は (50, 26.75) となります。回転を戻したオブジェクトの左上が Left と Top になり、Left は幅の半分 30.75、Top は高さの半分 7.5 を中心座標から差し引くと (19.25, 19.25) となります。

このように、はみ出た分の自動調整により中心位置がずれ、それに引きずられてオブジェクトの配置(Left と Top)が動いたということになります。


回転操作の注意点

かなり詳細な説明をしましたが、ここまで座標系や挙動を理解しておくと、今後様々なシーンで迷うことなく操作できるはずです。

回転操作の注意点をまとめると次の通りです。

  • 回転はオブジェクトの中心が起点
  • 回転した結果、はみ出た分は自動調整される
  • 自動調整が発生すると中心位置が変わり、オブジェクトの座標も変わる
  • オブジェクトの位置(Left、Top)やサイズ(Width、Height)は回転しない状態の値

Y 軸ラベルの作成と配置

オブジェクトの回転が理解できたので、グラフに Y 軸ラベルを配置する関数を作成します。

Function xSetLabelY(voShape As Variant, ByVal vsLabel As String)
   Dim oText As Variant
   Dim dW As Double
   Dim dH As Double
   Dim d As Double

   'Y 軸用テキストボックス
   Set oText = xCreateTextBox(voShape)

   With oText.TextFrame2
      'フォーマットの設定
      .TextRange.Font.Size = xcdFontSize 'フォントサイズ
      .TextRange.ParagraphFormat.Alignment = msoAlignCenter '水平方向に中央揃え
      'テキスト
      .TextRange.Text = vsLabel
   End With

   'サイズのセット
   dW = voShape.Chart.PlotArea.InsideHeight 'プロットエリアの高さ
   dH = xcdFontSize * 1.5 'フォントサイズの1.5倍
   oText.Width = dW
   oText.Height = dH

   '回転してもPlotAreaからはみ出ないよう位置を調整
   d = dW / 2
   d = d - dH / 2
'オブジェクトの高さの半分 上へ
   d = d + voShape.Chart.PlotArea.InsideTop '上のマージン分下げる
   oText.Top = d

   '回転
   oText.Rotation = -90

   '左端に移動
   d = dW / 2 - dH / 2 '左への移動量
   d = d + 4 'マージンも詰める
   Call oText.IncrementLeft(-d)
End Function

この関数のポイントは 2 点です。

まず、Y 軸ラベルの幅は、プロットエリアの高さに合わせています。プロットエリアにそろえて配置して、文字を中央揃えするだけなので、計算が比較的簡単となります。

もう一点は、回転後 PlotArea からはみ出ないよう、事前にに位置を調整している点です。また、この操作と同時に、回転後の高さがプロットエリアにぴったり合うよう調整しています。プロットエリアの高さ(= テキストラベルの幅)とマージン(InsideTop)を利用、回転の中心は Top 座標よりオブジェクトの高さ(Height)の半分下にずれることも考慮してオブジェクトを配置しています。

回転後、オブジェクトを左端に寄せています。移動量は、オブジェクトの幅や高さ、マージンの 4 ポイントを使って厳密に計算しています。Excel の自動調整を活用するのであれば、厳密な計算をせず、大きめの値をセットするだけでもかまいません(意図が見えなくなるので推奨しませんが...)。


最後にメインルーチンから作成した関数をコールすれば Y 軸ラベルの作業は完了です。

Sub Initialize
         ・・・
   'タイトルエリアの生成
   Call xSetTitle(oShape, "ユーザ数の推移", "Server01/Domino")

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

   oXls.Visible = True
End Sub


前回 Notes - Excel 連携 次回


0 件のコメント:

コメントを投稿