Microsoft Access 掲示板

SQLの型が一致ませんエラー / 3

11 コメント
views
3
hiroton 2026/02/05 (木) 19:10:42 f6bcb@f966d

良いか悪いかだと、うーん、ちょっとだけ、よくないですかねぇ
Eのテーブルは、変更があったものだけ、ではなく、履歴としてすべてを記録するようにすると余計な存在有無チェックがなくなるのでいろいろとはかどります(Dlookupを使うにせよ、SQLで全部やるにせよ高速化になります)


特定日のデータを期間の設定(開始日、終了日)から見つけ出す作業は、ACCESSでは特に苦手とする部類だと思います。モジュール化して対応しようとすると、どうしても「DLookupは遅い」のボトルネックに引っかかる形になるので、SQLを駆使してクエリ一つに書き上げるというのが一般的な回答になるんじゃないでしょうか?(SQLを直接記述するんでそもそもACCESSレベルでは一般的ではない)

遅い早いに関しては個人の感覚によるところなので、実際に運用する件数n件に対して、処理時間yでそれが、実運用に耐える/耐えない時間であるという評価基準が必要になります
それによって、手法のシンプルさ(メンテナンス性)と実処理時間のバランスが取れるように、最適な回答が変わってくるでしょう


自分はSQLゴリゴリ書くのはあまり得意ではないので、そっちの方向は他の人に任せます(お願いします)
VBAの話をするのであれば、まずは質問にあるところで、

このモジュールでいくつかの値(支払条件テキスト、締め実日等)も同じパターンで値を抽出している

これは、遅くなる原因としてかなりの比重がありそうです

Dlookup("ID")
Dlookup("支払条件テキスト")
Dlookup("締め実日等")
Set dbs = CurrentDb
Set rs = dbs.OpenRecordset("~")
id = rs!ID
支払条件 = rs!支払条件テキスト
締め実日 = rs!締め実日
rs.Close

上記Dlookupだけで処理した場合はDlookupのボトルネック+検索捜査が3回発生するのに対し、下記、レコードセットを取得した処理では、ボトルネック部分が1回、捜査処理も1回でそのほかのデータ取得は一瞬で終わります
先に挙げたリンク先でも、こういう処理をしたいならSQL文を使ったほうが良いと言っていますね
特に、一つのレコードから複数のフィールドの値を参照したいのであればDlookupの出番はないです

もう少し、VBAの高度な話をすると、

Set dbs = CurrentDb

これにかかる時間が相当にありそうだ、と、先に挙げたリンク先に指摘があります。オリジナル関数の呼び出し事(実処理のレコード数分だけ)実行しているとこれもボトルネックになるので、これをやらないように組むということもできます

オリジナル関数の外で変数を用意しておく

Public dbs As Database
Public rs As Recordset

Sub Init()
  Set dbs = CurrentDb
End Sub

Function オリジナル関数()
  Set rs = dbs.OpenRecordset("~")

Init関数を事前にどこかで1度だけ呼び出して、「ボトルネックになるDatabaseオブジェクトの生成」を1回のみにするなんて方法も考えられるでしょう

先に挙げたように、許容点はどこか?という話になるので、詳しい解説は抜きにしてひとまずこのくらいにしておきます

通報 ...