投稿者 魔界の仮面弁士  (社会人) 投稿日時 2021/12/28 21:44:34
VBA7 な Access VBA が前提のようですが、API 宣言が結構間違っていませんか?
LongPtr にすべきところが Long になってたり、
Any に対して Win32/Win64 判定の無いまま  「ByVal 0&」 が無条件に渡されていたり…。


> 約3000件程度を上限に、bitmapに描画できないエラーになりました。
コードは斜め読みしただけでまだ試していないため、
どこでどういうエラーが出たのか分かりませんし、
描画エラーの要因も掴んではいませんが、ひとまず気になったところから。


> MyPen = CreatePen(PS_SOLID, 2, RGB(255, 0, 0))
> Call SelectObject(MyDC1, MyPen)
> Call Rectangle(MyDC1, f2, f1, f2 + 3, f1 + 3)
> Call DeleteObject(MyPen)
MyDC1 で選択中のペンオブジェクトを削除してはまずいのではないでしょうか。
処分前に、最初のオブジェクトに復元しておいた方がよろしいかと。
https://ja.stackoverflow.com/questions/33072/


> Dim MyDC0, MyDC1 As Long
VBA の文法だと、上記は
 Dim MyDC0 As [既定の型]  ' 初期設定では As Variant 相当
 Dim MyDC1 As Long
の意味になってしまいます。両方を Long にしたいのであれば
 Dim MyDC0&, MyDC1 As Long
または
 Dim MyDC0 As Long, MyDC1 As Long
と書きます。ただし本来は LongPtr とすべきですね。


> Private Const PS_SOLID = 0
これも As Long を付けるべきです。
動作に影響は無いものの、現状だと「Integer 型」の定数あるいは
「内部処理形式が 整数型(Integer) な値を持った Variant 型」の定数になってしまいそう。


> Dim rs As Recordset
> Dim db As DAO.Database
As ADODB.Recordset と混同しないためにも
As DAO.Recordset にした方が良いですね。

> Set rs = db.OpenRecordset(Sql, dbOpenDynaset)
> rs.MoveFirst
> Do Until rs.EOF
MoveFirst が明示的に呼ばれていますね。

処理系によっては、意図的に MoveFirst が必要になる場合もありますが
(oo4o で ORADYN_NO_MOVEFIRST フラグが立っている場合など)、
DAO の Text I-ISAM では関係無いような…。

自分ならここは
 Set rs = db.OpenRecordset(Sql, dbOpenForwardOnly, dbReadOnly)
 Do Until rs.EOF
にしますね。編集するわけでも無いので、カーソルも前方参照モードを選択。