9.図形描画


9-1 直線の描画

(1)座標系と直線
 VBAでは,ExcelのSheet上に図形を描画することができる.Sheet上の座標系は,図9-1に示すような左上端を原点とする座標系である.この座標系では,y方向の下向きが正となっている.
       図9-1
 アクティブなシートに直線を描画するためには,
ActiveSheet.Shapes.AddLine( xs, ys, xe, ye ).Select
を利用する.ここで,(xs,ys)は始点のポイント座標,(xe,ye) は終点のポイント座標である.

プログラム例9-1:図9-1のように始点(0,0)から終点(50,100)までアクティブなシートに直線を描画するプログラムを作成する.

(2)線の色を変える
 線の色を変えるには,
.Line.ForeColor.RGB = RGB(red, green, blue)
 を用いる.red, green, blue はRGBの赤,緑,青の値を表す整数で,0~255の範囲の値を指定する.RGBと色の関係を表9-1に示す.
表9-1 RGBの値と色
red green blue
0 0 0
0 0255
0255 0
シアン 0255255
255 0 0
マゼンダ255 0255
黄色 255255 0
255255255

プログラム例9-2:図9-1の直線の色を赤にする場合のプログラムを作成する.

(3)線の太さを変える
 線の太さは以下のwdの値を変えて調整する.
.Line.Weight = wd

プログラム例9-3:図9-1の直線の太さを太くした場合のプログラムを作成する.

(4)線の種類を変える
 線の種類は,以下のtypeの値によって指定する.
.Line.DashStyle = type
 直線の種類として表9-2のものが標準的に用意されている.
表9-2 線の種類
定数説明
msoLineSolid 実線 1
msoLineSquareDot 点線(角)2
msoLineRoundDot 点線(丸)3
msoLineDash 破線 4
msoLineDashDot 1点鎖線 5
msoLineDashDotDot 2点鎖線 6
msoLineDashLongDash 長破線 7
msoLineDashLongDashDot長鎖線 8

プログラム例9-4:図9-1の直線を波線で描画する場合のプログラムを作成する.

プログラム例9-5:線の色や,太さ,種類を変える場合は, With ~ End Withの間に続けて記述する.ここでは,線の書式を一括して設定する場合のプログラムを作成する.

9-2 オートシェイプ

(1)オートシェイプの描画
 Excelをはじめとして,Office製品には図形描画のために,図9-2に示すようなオートシェイプが用意されている.
       図9-2
 VBAでは,これらの図形を指定して描画することが可能である.アクティブなシートにオートシェイプを描画するためには
ActiveSheet.Shapes.AddShape( type,xl,yt,w,h).Select
を用いる.typeはオートシェイプの種類を指定する値で,例えば
msoShapeOval 円(楕円)
msoShapeRectangle 矩形
などがある.また,(xl, yt) はオートシェイプの左上のポイント単位の位置,wとhはオートシェイプの幅と高さ(ポイント単位)である.

プログラム例9-6:楕円をアクティブシートに描画する場合のプログラムを作成する.

(2)線の書式設定
 線の色,太さ,種類を変更するためには,9-1の直線で説明した方法を用いればよい.

プログラム例9-7:楕円の線種を変更するプログラムを作成する.

(3)塗りつぶしの書式設定定
 オートシェイプの塗りつぶしの色を変更することもできる.

プログラム例9-8:プログラム例9-6の楕円内部を赤色で塗りつぶすプログラムを作成する.

 前景色を以下のように番号で指定することもできる.
.Fill.ForeColor.SchemeColor = col
colは色の指定の番号で,0(黒), 1(白), 2(赤),3(緑),4(青),5(黄),6(紫),7(シアン)を表す.なお,
.Fill.Transparency = tr
を指定すると,色の透明度を指定することができる.tr の値は,0.0(不透明)~1.0(透明)で1.0を指定すると塗りつぶしが行われない.

9-3 ポイント座標系とユーザー座標系

 図形を実際に描画する場合,図9-3に示すように,シートの左上端を原点とする(X-Y)座標系が用いられる.この座標系では,Y方向の下向きが正となっている.一方,一般的には,図B-3の(X-Y)座標系のように,Y方向の上向きを正とするグラフがほとんどである.
         図9-3
 いま,図9-3のように,左上端が(50,10)で,幅と高さが(400,300)ポイントの領域に,原点を矩形領域の左下端とする横方向幅4,高さ方向幅20のグラフを作成することを考える.ただし,グラフはY方向上向きを正とする.
(スケールの設定)
 グラフの描画を行うに当たり,ユーザー座標系の値をポイント座標系の値に変換しなければならない.図9-3の例では,ユーザー座標の幅4をポイント座標系の幅400に,また,高さ20を300に対応させている.したがって,横方向のスケールScale_Xと高さ方向のスケールScale_Yは
Scale_X = 400/4, Scale_Y = 300/20

(原点の平行移動)
 ポイント座標系の原点とユーザー座標系の原点は300ポイント(高さ)分だけ平行移動している.また,Y方向の正の向きも逆転している.この点を考慮するとユーザー座標系(X-Y)とポイント座標系(x-y)の関係は次のようになる.

x = X_org + X*Scale_X, y = Y_org - Y*Scale_Y
ただし,X_org = 50, Y_org = 300 + 10 である.

9-4 折れ線グラフの描画系

 折れ線を描画する方法はいくつかあるが,ここでは,AddLineを用い,2点間を直線で結んで折れ線を作成する.

プログラム例9-9:図9-4に描画するデータをもとに折れ線グラフを描画するプログラムを作成する.A 列が横軸,B 列が縦軸の値である.

       図9-4

9-5 ラベルの表示

 ラベルを表示するためには,以下のAddLabelメソッドを利用する.
AddLabel(Orientation,Left,Top,Width,Height)
  Orientation : ラベル内のテキストの向きを指定する.
      msoTextOrientationHorizontal (横書き)
      msoTextOrientationVertical  (縦書き)
  Left, Top : ラベルの左上端のポイント座標値
  Width, Height : ラベルの幅と高さ(ポイント単位)
 文字列や,文字列の書式を指定する場合,以下のように指定する.
With ActiveSheet.Shapes.AddLabel(Orientation,Left,Top,Width,Height).TextFrame
 .Characters.Text = 描画する文字列(文字列型)
 .Characters.Font.FontStyle = "標準" "太字" "斜体" "太字 斜体" のいずれか
 .Characters.Font.Name = "MS Pゴシック" などのFontの種類
 .Characters.Font.Size = フォントのサイズ(例:14)
 .Characters.Font.Color = フォントの色(例:RGB(255, 0, 0))
 .Characters.Font.Underline = 下線(例:xlUnderlineStyleSingle)
End With

プログラム例9-10:「ラベル」という文字列をポイント座標系(10,100)の位置にMS Pゴシック,太字,斜体,でサイズ14ポイント,赤色,下線付きで描画するプログラムを作成する.