(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)までアクティブなシートに直線を描画するプログラムを作成する.
①「1-5節(1)」 の①~⑩の手順でコマンドボタンを作成し,コードウィンドウを表示する.
②(プログラム例9-1 )を入力する.
③ Excel表示ボタンでシートを表示し,デザインモードを解除する.
④ コマンドボタンをクリックすると,図9-1のように直線が描画される.
(プログラム例9-1)
Private Sub CommandButton1_Click()
ActiveSheet.Shapes.AddLine(0, 0, 50, 100).Select
End Sub
(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 0 255
緑 0 255 0
シアン 0 255 255
赤 255 0 0
マゼンダ 255 0 255
黄色 255 255 0
白 255 255 255
プログラム例9-2: 図9-1 の直線の色を赤にする場合のプログラムを作成する.
①「1-5節(1)」 の①~⑩の手順でコマンドボタンを作成し,コードウィンドウを表示する.
②(プログラム例9-2 )を入力する.このプログラムでは,
アクティブシートに線を引く命令に対して,With~End Withにより,
その線分のカラー属性を指定している.
③ Excel表示ボタンでシートを表示し,デザインモードを解除する.
④ コマンドボタンをクリックすると,以下のように解析結果が表示される.
(プログラム例9-2)
Private Sub CommandButton1_Click()
With ActiveSheet.Shapes.AddLine(0, 0, 50, 100)
.Line.ForeColor.RGB = RGB(255, 0, 0)
End With
End Sub
(プログラム例9-2の結果)
(3)線の太さを変える
線の太さは以下のwdの値を変えて調整する.
.Line.Weight = wd
プログラム例9-3: 図9-1 の直線の太さを太くした場合のプログラムを作成する.
①「1-5節(1)」 の①~⑩の手順でコマンドボタンを作成し,コードウィンドウを表示する.
②(プログラム例9-3 )を入力する.このプログラムでも,アクティブシートに線を引く命令に対して,With~End Withにより,その線分の太さを指定している.
③ Excel表示ボタンでシートを表示し,デザインモードを解除する.
④ コマンドボタンをクリックすると,以下のように解析結果が表示される.
(プログラム例9-3)
Private Sub CommandButton1_Click()
With ActiveSheet.Shapes.AddLine(0, 0, 50, 100)
.Line.Weight = 5
End With
End Sub
(プログラム例9-3の結果)
(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 の直線を波線で描画する場合のプログラムを作成する.
① 「1-5節(1)」 の①~⑩の手順でコマンドボタンを作成し,コードウィンドウを表示する.
② (プログラム例9-4 )を入力する.このプログラムでも,アクティブシートに線を引く命令に対して,With~End Withにより,その線分の種類を指定している.
③ Excel表示ボタンでシートを表示し,デザインモードを解除する.
④ コマンドボタンをクリックすると,以下のように解析結果が表示される.
(プログラム例9-4)
Private Sub CommandButton1_Click()
With ActiveSheet.Shapes.AddLine(0, 0, 50, 100)
.Line.DashStyle = msoLineDash
End With
End Sub
(プログラム例9-4の結果)
プログラム例9-5: 線の色や,太さ,種類を変える場合は, With ~ End Withの間に続けて記述する.ここでは,線の書式を一括して設定する場合のプログラムを作成する.
①「1-5節(1)」 の①~⑩の手順でコマンドボタンを作成し,コードウィンドウを表示する.
②(プログラム例9-5 )を入力する.
③ Excel表示ボタンでシートを表示し,デザインモードを解除する.
④ コマンドボタンをクリックすると,以下のように解析結果が表示される.
(プログラム例9-5)
Private Sub CommandButton1_Click()
With ActiveSheet.Shapes.AddLine(0, 0, 50, 100).Line
.ForeColor.RGB = RGB(255, 0, 0)
.Weight = 5
.DashStyle = msoLineDash
End With
End Sub
(プログラム例9-5の結果)
(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: 楕円をアクティブシートに描画する場合のプログラムを作成する.
①「1-5節(1)」 の①~⑩の手順でコマンドボタンを作成し,コードウィンドウを表示する.
②(プログラム例9-6 )を入力する.
③ Excel表示ボタンでシートを表示し,デザインモードを解除する.
④ コマンドボタンをクリックすると,以下のように解析結果が表示される.
(プログラム例9-6)
Private Sub CommandButton1_Click()
ActiveSheet.Shapes.AddShape(msoShapeOval,50,20,50,100).Select
End Sub
(プログラム例9-6の結果)
(2)線の書式設定
線の色,太さ,種類を変更するためには,9-1の直線で説明した方法を用いればよい.
プログラム例9-7: 楕円の線種を変更するプログラムを作成する.
①「1-5節(1)」 の①~⑩の手順でコマンドボタンを作成し,コードウィンドウを表示する.
②(プログラム例9-7 )を入力する.ここでは,アクティブシートに楕円を描く命令に対して,With~End Withにより,その線分の属性を指定している.
③ Excel表示ボタンでシートを表示し,デザインモードを解除する.
④ コマンドボタンをクリックすると,以下のように解析結果が表示される.
(プログラム例9-7)
Private Sub CommandButton1_Click()
With ActiveSheet.Shapes.AddShape(msoShapeOval,50,20,50,100)
.Line.ForeColor.RGB = RGB(255, 0, 0)
.Line.Weight = 5
.Line.DashStyle = msoLineDash
End With
End Sub
(プログラム例9-7の結果)
(3)塗りつぶしの書式設定定
オートシェイプの塗りつぶしの色を変更することもできる.
プログラム例9-8: プログラム例9-6 の楕円内部を赤色で塗りつぶすプログラムを作成する.
①「1-5節(1)」 の①~⑩の手順でコマンドボタンを作成し,コードウィンドウを表示する.
②(プログラム例9-8 )を入力する.
③ Excel表示ボタンでシートを表示し,デザインモードを解除する.
④ コマンドボタンをクリックすると,以下のように解析結果が表示される.
(プログラム例9-8)
Private Sub CommandButton1_Click()
With ActiveSheet.Shapes.AddShape(msoShapeOval,50,20,50,100)
.Fill.ForeColor.RGB = RGB(255, 0, 0)
End With
End Sub
(プログラム例9-8の結果)
前景色を以下のように番号で指定することもできる.
.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 に示すように,シートの左上端を原点とする(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 である.
折れ線を描画する方法はいくつかあるが,ここでは,AddLineを用い,2点間を直線で結んで折れ線を作成する.
プログラム例9-9: 図9-4 に描画するデータをもとに折れ線グラフを描画するプログラムを作成する.A 列が横軸,B 列が縦軸の値である.
図9-4
①「1-5節(1)」 の①~⑩の手順でコマンドボタンを作成し,コードウィンドウを表示する.
②(プログラム例9-9 )を入力する.前回の終点座標を今回の始点座標になるように
入れ替えを行いながら,直線を描画することで,折れ線が描かれている.
③ Excel表示ボタンでシートを表示し,デザインモードを解除する.
④ コマンドボタンをクリックすると,以下のように解析結果が表示される.
(プログラム例9-9)
Private Sub CommandButton1_Click()
Dim XY(2, 5)
For i = 1 To 5
XY(1, i) = Cells(i, 1).Value
XY(2, i) = Cells(i, 2).Value
Next i
Scale_X = 400 / 4
Scale_Y = 300 / 20
X_org = 50
Y_org = 300 + 10
ActiveSheet.Shapes.AddShape(msoShapeRectangle,50,10,400,300).Select
xs = X_org + XY(1, 1) * Scale_X
ys = Y_org - XY(2, 1) * Scale_Y
For i = 2 To 5
xe = X_org + XY(1, i) * Scale_X
ye = Y_org - XY(2, i) * Scale_Y
ActiveSheet.Shapes.AddLine(xs, ys, xe, ye).Select
xs = xe
ys = ye
Next i
End Sub
(プログラム例9-9の結果)
ラベルを表示するためには,以下の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ポイント,赤色,下線付きで描画するプログラムを作成する.
①「1-5節(1)」 の①~⑩の手順でコマンドボタンを作成し,コードウィンドウを表示する.
②(プログラム例9-10 )を入力する
③ Excel表示ボタンでシートを表示し,デザインモードを解除する.
④ コマンドボタンをクリックすると,以下のように解析結果が表示される.
(プログラム例9-10)
Private Sub CommandButton1_Click()
With ActiveSheet.Shapes.AddLabel(msoTextOrientationHorizontal, _
10, 100, 10, 10).TextFrame
.Characters.Text = "ラベル"
.Characters.Font.FontStyle = "太字 斜体"
.Characters.Font.Name = "MS Pゴシック"
.Characters.Font.Size = 14
.Characters.Font.Color = RGB(255, 0, 0)
.Characters.Font.Underline = xlUnderlineStyleSingle
End With
End Sub
(プログラム例9-10の結果)