2024/11/06

Notes - Excel 連携:#46)テキストボックスの配置

前回紹介したように、グラフ上にテキストボックスを追加すると、座標 (0, 0) で作成したにも関わらず、左と上に少し隙間が空いてしまいます。

Set oText = voShape.Chart.Shapes.AddLabel(msoTextOrientationHorizontal, 0, 0, 50, 10)

今後、より詳細にオブジェクトの位置決めをするときに混乱しないよう挙動を確認します。


隙間のサイズ

まず、Excel のマクロの記録しながらテキストボックスに左上に移動してみました。すると、次のスクリプトが出力されました。

Sub Macro1()
   Selection.ShapeRange.IncrementLeft -4
   Selection.ShapeRange.IncrementTop -4
End Sub

IncrementLeft は、図形を指定したポイント数だけ水平方向に移動するメソッドです。マイナスの値を指定すると左、プラスの値で右に移動します。IncrementTop も同様の機能で、こちらは垂直方向に移動するメソッドです。Left や Top プロパティで位置を絶対的に設定するだけでなく、現在位置から相対的に移動できるんですね。

この結果より、左と上の隙間の幅は 4 ポイントであることがわかりました。


左上に配置するには

隙間の大きさがわかったので、左上ぎりぎりに配置する方法を確認します。

まず、テキストボックス作成時にマイナスの座標をセットしてみます。結果は、変わらず隙間が空いた状態となりました。

・・・   .Shapes.AddLabel(msoTextOrientationHorizontal, -4, -4, 50, 10)


次は、Left と Top プロパティに負の値を入れてみます。実行はしているようですが、結果の位置は変わりませんでした。


では先ほどの Increment* メソッドをテストします。座標 (0, 0) で作成したオブジェクトをそれぞれ -4 してみます。これで無事、左隅に移動することができました。

   'タイトルエリアの生成
   Dim oText As Variant
   Set oText = xCreateTextBox(oShape)
   oText.TextFrame2.TextRange.Text = "Test"

   Call oText.IncrementLeft(-4)
   Call oText.IncrementTop(-4)


座標系

上記のように、右上に寄せた状態で、オブジェクトの位置を確認すると -4 となっています。

   Call oText.IncrementLeft(-4)
   Call oText.IncrementTop(-4)

   Dim s As String
   s = "Left = " & CStr(oText.Left)
   s = s & Chr(10) & "Top = " & CStr(oText.Top)
   MsgBox s

グラフオブジェクトの幅は 500 ポイントでした。試しに座標 (0, 0) で作成し、幅を 492 ポイントに設定してみます。

   'タイトルエリアの生成
   Dim oText As Variant
   Set oText = xCreateTextBox(oShape)
   oText.TextFrame2.TextRange.Text = "Test"

   ' Call oText.IncrementLeft(-4)
   ' Call oText.IncrementTop(-4)


   oText.Width = 492

結果は以下のように、左右の隙間が同じになりました。


上記の結果より、Shape オブジェクトとその上に配置するテキストオブジェクトの関係は次の通りとなります。


まとめ

今回は、グラフオブジェクトの座標系に関して調査しました。Excel としてはオブジェクトのマージンとして 4 ポイント分確保し、そこを座標の起点としていることがわかりました。

Notes - Excel 連携:#42)PlotArea とサイズ』の「位置合わせの謎」のセクションで、PlotArea を左から 50 ポイント(約 66 ピクセル)にしても、54 ポイント(72 ポイント)になる原因が不明だと書きました。原因がわかりましたね。今回の検証で理解した 4 ポイントのマージン(約 5 ピクセル)ということだったのです。

上記は PlotArea の操作で、今回の検証はテキストボックスでしたが、位置の指定は同じです。Shape オブジェクト内の座標系はこれで統一されているようですね。

オブジェクトの配置やサイズの操作のポイントは 2 つです。

まず、4 ポイント分のマージンは利用できないわけではなく、 Increment* メソッドを使えば利用できます。ただし、Left や Top プロパティで、直接的にマイナスの値は指定できないようなので、注意が必要です。

もう一点は、今回の例でいうと Left と Top に -4 を指定しても、0 となったように、範囲外の値を指定してもエラーが発生しないことです。こちらは、 #42 でも触れましたが、プログラムを実行しても希望した通りの配置とならない場合、バグなのか、Excel が調整したのか、それがいつ(どの操作で)発生したのか判定しずらい点に注意が必要です。


前回 Notes - Excel 連携


0 件のコメント:

コメントを投稿