Access (VBA)

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

 
(Windows 11 Pro : Access 2021)
dlookupで範囲を指定する
投稿日時: 25/11/14 17:40:01
投稿者: miyama2305

T集計決算書のテーブルに以下のデータが並んでいます。
コード/勘定科目/前月残高/借方/貸方/残高
1111/現金-----/10000---/5000/2000/17000 流動資産
1122/売掛金---/2000----/1000/500-/2500  流動資産
1211/建物-----/100000-/------/-----/100000 固定資産
2111/支払手形/100000/100000/----/0    流動負債
2112/買掛金--/50000-/52000--/35000/33000---流動負債
2114/未払金--/6000---/25000--/30000/11000---流動負債
2115/未払費用/1500---/3000---/2500--/1000---−流動負債
2212/長期借入金/250000/150000/500000/600000-固定負債
3111/資本金----/600000/---------/--------/600000--純資産
4111/売上------/660000/---------/150000/810000--売上
6212/給料------/210000/110000/---------/320000--経費
20000/--------/12000/6000----/2500---/19500---流動資産合計
20001/--------/100000/---------/---------/100000---固定資産合計
20002/--------/157500/180000/67500---/45000----流動負債合計
20003/--------/250000/150000/500000--/600000--固定負債合計
20004/--------/600000/--------/----------/600000---純資産合計
20005/--------/600000/--------/150000--/810000---売上合計
20006/--------/210000/110000/----------/320000---経費合計
上記データから、流動負債の科目は2111から2115です。
合計の20000〜20006のコードは、データがなくても表示されます。
仮に流動負債のデータがない場合を想定して、20002のコードを削除
するVBAを作りました。
If DLookup("残高", "T集計決算書", "コード BETWEEN 2111 AND 2115") = 0 Then
Set rs = CurrentDb.OpenRecordset("T集計決算書")
Do Until rs.EOF
If rs!コード = 20002 Then
rs.Delete
End If
rs.MoveNext
Loop
rs.Close
このコードは2111〜2115の範囲で残高のデータがあれば削除しないと考えて
作りましたが、20002が削除されました。たぶんですが、2111の残高が0のため
削除されたと思います。
ご指導お願いします。
 
 
 
 

回答
投稿日時: 25/11/14 19:41:54
投稿者: sk

引用:
dlookupで範囲を指定する

今回のような場合、DLookup 関数を使用するべきではないでしょう。
 
引用:
流動負債の科目は2111から2115

引用:
If DLookup("残高", "T集計決算書", "コード BETWEEN 2111 AND 2115") = 0 Then

・上記の条件に該当するレコードが[T集計決算書]に 2 件以上存在する場合、
 DLookup 関数はそれらのうちのいずれか 1 件のレコードを参照して
 そのレコードのフィールド[残高]の値を返すが、実際にどのレコードが
 参照されるかを予見、特定することは事実上不可能である
 
引用:
コード/勘定科目/前月残高/借方/貸方/残高

引用:
2111/支払手形/100000/100000/----/0

・DLookup 関数によって(たまたま)参照されたレコードの[残高]の値が 0 であれば、
 DLookup 関数の戻り値も 0 となる。
 (よって、前述の If ステートメントにおける条件式の結果は True となる)
 
引用:
流動負債のデータがない場合

・前述の条件に該当するレコードが 0 件だった場合、
 DLookup 関数の戻り値は Null となる。
 
・前述の条件に該当するレコードが 1 件以上であり、かつ
 DLookup 関数によって参照されたレコードの[残高]の値が Null であれば、
 DLookup 関数の戻り値も Null となる。
 
・もし[T集計決算書]の全てのレコードにおいて[残高]の値が Null にならないことが
 保証されていないのであれば、上記の 2 つの状態を DLookup 関数の戻り値によって
 区別することは不可能である。
 
したがって、DLookup 関数によって「レコードの有無」を判定することは
あまり適切ではありません。
 
このような場合は、DLookup 関数ではなく DCount 関数を使用して
レコード件数を取得するようになさればよいでしょう。

投稿日時: 25/11/15 11:52:21
投稿者: miyama2305

sk様 ありがとうございます
>DLookup 関数ではなく DCount 関数を使用して
>レコード件数を取得するようになさればよいでしょう。
解りました。 DCount 関数を使用して作成します

投稿日時: 25/11/15 13:53:22
投稿者: miyama2305

DLookupをDcountに変更すればよかったようです
 
sk様 ありがとうございます[/b]