Access (VBA)

Access VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Access 2016)
VBAで線を引くというコードの使い方
投稿日時: 20/08/26 17:34:14
投稿者: UUU

ネットで検索すると
 
Private Sub 詳細_Print(Cancel As Integer, PrintCount As Integer)
 
  '線の太さを変更する。
  Me.DrawWidth = 11
 
  '線を引く。
  Me.Line (100, 100)-(200, 200)
 
End Sub
 
を使って線を書く、と書いてありました
レポートを作成して標準モジュールにコピペして実行をしましたが
『マクロ』というダイヤログがでて、マクロ名を入力する以外のことができませんでした
 
EXCELのときは実行を押せばVBA処理が行われていたのですがACCESSでは違うのでしょうか?
実行されれば、詳細に線が引かれるということですよね?

回答
投稿日時: 20/08/26 17:49:32
投稿者: sk

引用:
レポートを作成して標準モジュールにコピペして実行

標準モジュールではなくレポートモジュールに記述した上、
そのレポートを印刷プレビューで開いて下さい。

投稿日時: 20/08/26 18:18:34
投稿者: UUU

表示されました
普通に線を書くように配置するようなことはできないのですか?
 
DrawWidthがどの数値でどのくらいで印刷されるか見たいのですが
詳細に10本ほど線を引いてDrawWidthを試すにはどのように記述したらよいでしょうか?

回答
投稿日時: 20/08/27 10:10:55
投稿者: sk

引用:
普通に線を書くように配置するようなことはできないのですか?

何を以て「普通」とおっしゃっているのかは分かりかねますが、
レポートの Line メソッドは
「細い棒状の物体(オブジェクト)を作って
それを白い紙の上に置いて罫線のように見立てる」
ような操作には該当しません。
 
複雑で動的な描画処理を必要としない(ただ一定の長さの線が引ければよい)場合は
直線コントロールや四角形コントロールなどを使用なされば良いでしょう。
 
引用:
DrawWidthがどの数値でどのくらいで印刷されるか見たいのですが
詳細に10本ほど線を引いてDrawWidthを試す

(レポートモジュール)
-----------------------------------------------------------------
Private Sub 詳細_Print(Cancel As Integer, PrintCount As Integer)
     
    Const sngHorizontalInterval As Single = 10
     
    Dim lngCnt As Long
    Dim sngLeft As Single
    Dim sngTop As Single
    Dim sngWidth As Single
    Dim sngHeight As Single
     
    Me.ScaleMode = 6
    Me.FontName = "MS ゴシック"
    Me.FontSize = 8
    Me.ForeColor = RGB(0, 0, 0)
 
    For lngCnt = 1 To 10
        Me.DrawWidth = lngCnt
        sngLeft = Me.ScaleLeft + (sngHorizontalInterval * (lngCnt - 1))
        sngTop = Me.ScaleTop
        sngWidth = sngLeft
        sngHeight = Me.ScaleHeight / 2
        Me.Line (sngLeft, sngTop)-(sngWidth, sngHeight)
         
        Me.CurrentX = sngLeft
        Me.CurrentY = sngHeight + 0.5
        Me.Print Me.DrawWidth & "px"
    Next
     
End Sub
-----------------------------------------------------------------
 
とりあえず、以上のようなコードを記述してみて下さい。

投稿日時: 20/08/27 19:04:55
投稿者: UUU

ありがとうございました
印刷して確認することができました
 
細めの線を1px と 太めは7px がちょうどよさそうでした
 
レポートで任意の位置にこれらを配置するにはどのようにしたらよいでしょうか?
レコードがない場合は縮小印刷するフィールドを含みますがそのように細かいしては不可能ですか?
 
 
見出し
______________ 7px
フィールド1
フィールド2
______________ 1px
フィールド1
______________ 1px
フィールド1
フィールド2
______________ 1px
 
としたいです

回答
投稿日時: 20/08/28 09:53:36
投稿者: sk

引用:
レポートで任意の位置にこれらを配置するにはどのようにしたらよいでしょうか?

「任意の位置」が、それぞれのセクションにおける
どの座標(始点、終点)に当たるのか、それを求めるには
どうすればよいか(基準や算出方法)次第。
 
引用:
レコードがない場合は縮小印刷するフィールドを含みます

引用:
見出し
______________ 7px
フィールド1
フィールド2
______________ 1px
フィールド1
______________ 1px
フィールド1
フィールド2
______________ 1px

・ページヘッダーセクションの下端に太さ 7px の横罫線を目いっぱい引く。
 
・詳細セクション(印刷時拡張/印刷時縮小が適用された状態)の下端に
 太さ 1px の横罫線を目いっぱい引く。
 
といったことをなさりたいのであれば、例えばレポートモジュールに
次のようなコードを記述なさればよろしいでしょう。
 
(レポートモジュール)
------------------------------------------------------------
Private Sub ページヘッダーセクション_Print(Cancel As Integer, PrintCount As Integer)
 
    Dim sngLeft As Single
    Dim sngTop As Single
    Dim sngWidth As Single
    Dim sngHeight As Single
     
    Me.ScaleMode = 1
     
    sngLeft = Me.ScaleLeft
    sngTop = Me.Height - 5
    sngWidth = sngLeft + Me.ScaleWidth
    sngHeight = sngTop
     
    Me.ForeColor = RGB(0, 0, 0)
    Me.DrawWidth = 7
    Me.Line (sngLeft, sngTop)-(sngWidth, sngHeight)
 
End Sub
 
Private Sub 詳細_Print(Cancel As Integer, PrintCount As Integer)
 
    Dim sngLeft As Single
    Dim sngTop As Single
    Dim sngWidth As Single
    Dim sngHeight As Single
      
    Me.ScaleMode = 1
      
    sngLeft = Me.ScaleLeft
    sngTop = Me.Height - 5
    sngWidth = sngLeft + Me.ScaleWidth
    sngHeight = sngTop
         
    Me.ForeColor = RGB(0, 0, 0)
    Me.DrawWidth = 1
    Me.Line (sngLeft, sngTop)-(sngWidth, sngHeight)
 
End Sub
------------------------------------------------------------

投稿日時: 20/08/28 18:19:43
投稿者: UUU

ありがとうございました
大変勉強になりました
 
やってみたのですが一部の線が正常に表示されません
・ヘッターとの仕切り線の左端の下部分がかけてしまう
・詳細の奇数レコードと偶数レコードで線の幅が変わってしまう(微妙に詳細の一番下にラインがない)
・レコードの仕切り線の太さを50にしてみたら顕著に太さが違う(太くなっている線は支点の左上がかけている)
画像をアップしました
https://imgur.com/vKXKqky
 
といった状態です
ACCESS自体の設定やレイアウトの配置の問題なのでしょうか?
度々の質問恐縮です

回答
投稿日時: 20/08/31 10:07:31
投稿者: sk

引用:
・ヘッターとの仕切り線の左端の下部分がかけてしまう

引用:
・レコードの仕切り線の太さを50にしてみたら
 顕著に太さが違う(太くなっている線は支点の左上がかけている

Line メソッドによって描画された線の端が
直角ではなく円形で処理されるためです。
 
「セクション全体を横断する横罫線」の線端の丸みに限って言えば、
例えば始点の x 座標を描画領域よりも左に(マイナス座標)、
終点の x 座標を描画領域よりも右に( ScaleWidth プロパティの
値よりも大きい数値)に設定することで改善が見込めるでしょう。
 
引用:
・詳細の奇数レコードと偶数レコードで線の幅が変わってしまう
(微妙に詳細の一番下にラインがない)

DrawWidth プロパティに用いられている単位はピクセルです。
 
ピクセルは印刷ではなくモニター上に表示する画像の 1 つの点を
示す単位であるため、それぞれの解像度の違いにより、画面上での長さと
印刷上での長さとの間には、どうしても多少の誤差が生じ得ます。
 
また、レポートの Height プロパティに用いられている単位は
twip であり、これも画面上の長さを示す単位です。
 
上記と同様の理由により、各々のセクションの高さが微妙にずれ、
描画領域の端ぎりぎりに描かれるはずの線(の一部)が
実際の描画領域(または印刷領域)からはみ出てしまう、
いったことが起こり得ます。
 
引用:
sngLeft = Me.ScaleLeft
sngTop = Me.Height - 5
sngWidth = sngLeft + Me.ScaleWidth
sngHeight = sngTop

そのため、私が例示したコードでは直線の y 座標を
セクションの下端よりほんのわずか上になるようにしていますが
(それもあくまで私の環境でテストした限りにおいて
概ね気にならない程度の調整でしかない)、
線をより太くされるのであれば、そのことを踏まえた上で
それぞれの座標の調整を行なう必要があるでしょう。
 
いずれにせよ、Access のレポートにおける線描処理に関しては
それほど高い精度を期待できませんので、ある程度のところで
妥協せざるを得ないと思います。

投稿日時: 20/09/03 18:22:20
投稿者: UUU

大変勉強になりました
ありがとうございました