VBAで直線・四角形を描く

 レポートには直線や四角形のコントロールがありますのでたいていはそちらで足りますが、VBAのLineメソッドで直線や四角形を描くこともできます。
 なお、以下の例ではページヘッダに描画するようにしていますので、ページヘッダのあるレポートを作っておくことが必要です(「レコードソースの値に基づく描画」を除く)。

直線の描画例

基本的な描画

f:id:accs2014:20190226140434p:plain:right:w600

 いきなりコードですけれども、ページヘッダのあるレポートを作り、レポートモジュールに次のように記します。

Option Compare Database

Private Sub ページヘッダーセクション_Format(Cancel As Integer, FormatCount As Integer)

    '1本目   点1x,点1y    点2x,点2y        赤色
    Me.Line (500, 1000)-(1000, 1500), RGB(255, 0, 0)
    
    '2本目   点1x, 点1y    点2x,点2y        緑色
    Me.Line (2000, 1000)-(3500, 1500), RGB(0, 255, 0)

End Sub

 このようにLineメソッドにより直線をひくことができます。始点、終点の2つの点の座標だけでも線は引けますが、ここでは線色も指定しています。
 座標はセクションの左上が起点(0,0)で、正の方向は右(x座標)及び下(y座標)です。単位はtwipです。
 線色は0(黒)から16777215(白)までの数値で指定することができます。この例のようにRGB関数を使うと指定が容易になります。

f:id:accs2014:20190226140414p:plain:right:w350

 印刷プレビューです。

Stepによる座標指定

 上記例と同様に、今度は次のように記します。

Private Sub ページヘッダーセクション_Format(Cancel As Integer, FormatCount As Integer)

    CurrentX = 1000
    CurrentY = 1000

    '1本目  左上基準   左上基準      赤色
    Me.Line (1500, 1500)-(2000, 2000), RGB(255, 0, 0)
    
    '2本目  CurrentX,Y基準   点1基準      緑色
    Me.Line Step(1500, 1500)-Step(500, 500), RGB(0, 255, 0)

End Sub

 1本目の直線は最初の例と同様に始点終点を指定しています。
 2本目は、始点の指定の際にStepを記すことにより、事前にCurrentX とCurrentYにより指定した座標を基準とする座標指定を行っています。また、同じく終点にもStepを記しています。これは始点を基準とする座標指定になります。
 1本目の直線も2本目の直線も、始点と終点の位置関係は同じ(座標の差はX,Yとも500)です。

f:id:accs2014:20190226140411p:plain:right:w350

 印刷プレビューです。

線種指定

 レポートのDrawStyleプロパティにより線種を指定することもできます。

Option Compare Database

Private Sub ページヘッダーセクション_Format(Cancel As Integer, FormatCount As Integer)

    'DrawStyleで線種指定 5は透明
    Me.DrawStyle = 0
    Me.Line (1000, 1000)-(1900, 1900)
    Me.DrawStyle = 1
    Me.Line (2000, 1000)-(2900, 1900)
    Me.DrawStyle = 2
    Me.Line (3000, 1000)-(3900, 1900)
    Me.DrawStyle = 3
    Me.Line (4000, 1000)-(4900, 1900)
    Me.DrawStyle = 4
    Me.Line (5000, 1000)-(5900, 1900)
    Me.DrawStyle = 5
    Me.Line (6000, 1000)-(6900, 1900)
    Me.DrawStyle = 6
    Me.Line (7000, 1000)-(7900, 1900)

End Sub

f:id:accs2014:20190226140409p:plain:right:w500

 印刷プレビューです。
 DrawStyleの値は左から順に0~6となっています。

線幅指定

 実例は省略しますがレポートのDrawWidthプロパティにより

Me.DrawWidth = 30

 といったように線幅を指定することが可能です。ただしちょっと太くすると線種の指定にかかわらず見た目が実線になってしまいますので注意してください。

四角形の描画例

線種指定

 直線と同じくLineメソッドにより四角形を描画することもできます。
 指定は簡単で、3つ目のパラメータ(色指定の次)として「B」と指定するだけで、始点と終点を対角とする、枠線が実線の四角形が描画されます。
 さらにここではレポートのDrawStyleプロパティにより線種を指定する例を見てみます。

Option Compare Database

Private Sub ページヘッダーセクション_Format(Cancel As Integer, FormatCount As Integer)

    'DrawStyleで線種指定 5は透明
    Me.DrawStyle = 0
    Me.Line (1000, 1000)-(1900, 1900), , B
    Me.DrawStyle = 1
    Me.Line (2000, 1000)-(2900, 1900), , B
    Me.DrawStyle = 2
    Me.Line (3000, 1000)-(3900, 1900), , B
    Me.DrawStyle = 3
    Me.Line (4000, 1000)-(4900, 1900), , B
    Me.DrawStyle = 4
    Me.Line (5000, 1000)-(5900, 1900), , B
    Me.DrawStyle = 5
    Me.Line (6000, 1000)-(6900, 1900), , B
    Me.DrawStyle = 6
    Me.Line (7000, 1000)-(7900, 1900), , B

End Sub

f:id:accs2014:20190226140405p:plain:right:w500

 印刷プレビューです。
 DrawStyleの値は左から順に0~6となっています。

塗りパターン指定

 レポートのFillStyleプロパティにより四角形内部の塗りのパターンを指定することもできます。
 また、これとは別に3つ目のパラメータを「BF」とすることで枠線と同じ色での塗りつぶしになります。

Option Compare Database

Private Sub ページヘッダーセクション_Format(Cancel As Integer, FormatCount As Integer)

    '1段目 FillStyleで塗りパターン指定 ここはB
    Me.FillStyle = 0
    Me.Line (1000, 1000)-(1900, 1900), , B
    Me.FillStyle = 1
    Me.Line (2000, 1000)-(2900, 1900), , B
    Me.FillStyle = 2
    Me.Line (3000, 1000)-(3900, 1900), , B
    Me.FillStyle = 3
    Me.Line (4000, 1000)-(4900, 1900), , B
    Me.FillStyle = 4
    Me.Line (5000, 1000)-(5900, 1900), , B
    Me.FillStyle = 5
    Me.Line (6000, 1000)-(6900, 1900), , B
    Me.FillStyle = 6
    Me.Line (7000, 1000)-(7900, 1900), , B
    Me.FillStyle = 7
    Me.Line (8000, 1000)-(8900, 1900), , B

    '2段目                         BFでベタ塗り指定
    Me.Line (1000, 2000)-(1900, 2900), , BF

End Sub

f:id:accs2014:20190226140402p:plain:right:w500

 印刷プレビューです。
 1段目のFillStyleの値は左から0~7となっています。

線幅・塗り色・塗りパターンの組み合わせ

 DrawWidthプロパティによる線幅指定、FillColorプロパティによる塗色指定、FillStyleプロパティによる塗りパターンを組み合わせた例です。

Option Compare Database

Private Sub ページヘッダーセクション_Format(Cancel As Integer, FormatCount As Integer)

    '線幅指定
    Me.DrawWidth = 30
    '塗り色指定
    Me.FillColor = RGB(191, 191, 191)
    'ベタ塗り指定
    Me.FillStyle = 0
    '             塗り色と異なる枠線色指定 BFだと枠線と同色
    Me.Line (1000, 1000)-(1900, 1900), RGB(63, 127, 127), B
    Me.Line (2000, 1000)-(2900, 1900), RGB(127, 63, 127), B
    Me.Line (3000, 1000)-(3900, 1900), RGB(127, 127, 63), B

End Sub

f:id:accs2014:20190226140443p:plain:right:w350

 印刷プレビューです。

レコードソースの値に基づく描画

f:id:accs2014:20190226140440p:plain:right:w500

 レコードソースになっているテーブルやクエリの値を参照し、その値に応じた図形を描画する例です。
 このようなテーブルをレコードソースとするレポートを作成し、人口の大きさに応じて横に伸びる四角形(横棒グラフ)を表示するものとします。

 レポートモジュールの内容は次のようになります。

Option Compare Database

Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)

    Me.FillStyle = 0
    Me.FillColor = RGB(0, 192, 192)
    Me.Line (5000, 350)-(5000 + 0.01 * Me.人口, 850), RGB(0, 192, 192), B

End Sub

 終点のx座標に「0.01 * Me.人口」という項を加えることで、人口が多いほど終点が右に伸びるようになっています。

f:id:accs2014:20190226140437p:plain:right:w400

 印刷プレビューです。
 人口の値に応じて幅が広がる四角形が描かれています。


 ただし、このような表示をする場合はテキストボックスに対する条件付き書式でデータバーを表示する方が簡単で便利です。

Lineメソッドの構文

expression.Line [Step] (始点x , 始点y) - [Step] (終点x, 終点y)[,色,四角形指定モード]

 expressionにはレポートオブジェクトを記します。
 Stepを記すことでCurrentX,CurrentYを基準とする座標の指定を行うことができます。省略するとセクション左上端が基準となります。
 座標の単位はtwipです(1in=1440twip。1cmは567twipに相当します)。
 色は0(黒)から16777215(白)までの値で指定します。上記例のようにRGB関数を用いるのが便利です。
 四角形指定モードは「B」とするとレポートのFillStyleプロパティに基づくパターンで塗りつぶしとなり、「BF」とすると枠線と同色でベタ塗りになります。