困っていますよろしくお願いします。
やりたいことなのですが、accessテーブルのレコードをカレントレコードと次のレコードと言ったように1レコードずつ比較して、すべてのフィールド値が2つのレコード間で同じであればレコードの削除、1つでも値がちがえば削除しないと言うプログラムを組みたいと思っています。(2つのレコードの各フィールドの値を比較し違いがあればそのレコードを残したいので別テーブルへの追加でもかまいません)
下記のプログラムのようにDLookup関数を使用し"商品"のように1フィールドであれば次のレコードとの比較が可能なのですが、DLookup関数を使って複数フィールドを次のレコードと比較することが出来るのでしょうか?
また、出来ないのであればほかにどのような比較方法があるのでしょうかお助けくださいよろしくお願いします。(IDフィールドはオートナンバーです)
Dim a As String
Dim b As String
Dim c As String
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Set cn = CurrentProject.Connection
Set rs = New ADODB.Recordset
rs.Open "T_履歴", cn, adOpenKeyset, adLockOptimistic
rs.MoveFirst
a = rs!ID
Do Until rs.EOF
b = DLookup("商品", "T_履歴", "ID = " & a)
c = DLookup("商品", "T_履歴", "ID = " & a + 1)
If b = c Then
rs.Delete
Else
rs.Delete
rs.MoveNext
End If
a = a + 1
rs.MoveNext
Loop
rs.Close: Set rs = Nothing
cn.Close: Set cn = Nothing
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
カレントと次に限定した動きで良いでしょうか。
言葉だけで伝えるには、私には難しいのでコードを記述します。
「カレントと次」 の表現されていますが、提示するコードでの考え方は、
「前とカレント」としており、カレントを削除する/しない としています。
以下、テーブル「T1」のサンプルとします。
id が 5, 6 の field2 は NULL
id が 7, 8 の field2 は ""
とした時、
idfield1field2
1aaaabbbb
2aaaabbbb
3aaaabbbb
4aaaabbbb
5aaaa
6aaaa
7aaaa
8aaaa
9aaaacccc
↓ 以下 Sample1 を1回実行
id = 2 を削除した時点で、カレント/次の関係が無くなるので
リセットした状態で id = 3 を覚える処理になっています。
idfield1field2
1aaaabbbb
3aaaabbbb
5aaaa
7aaaa
9aaaacccc
↓ 以下 Sample1 をさらに1回実行
テキスト系のフィールドでは、NULL と "" は同じ、
数値系のフィールドでは、NULL と 0 は同じとしています。
idfield1field2
1aaaabbbb
5aaaa
9aaaacccc
以下、処理記述サンプル(一例)になります。
(どんどん修正していってください)
' 前のデータを覚えておくもの
Dim vData() As Variant
Dim bStock As Boolean
' 削除対象か判別、対象なら True を返す
Private Function CheckData(fld As ADODB.Fields) As Boolean
Dim i As Integer
CheckData = False
If (bStock = True) Then
For i = 1 To UBound(vData)
If (Nz(vData(i)) <> Nz(fld(i))) Then
CheckData = True
Exit For
End If
Next
CheckData = Not CheckData
End If
bStock = False ' ★
If (CheckData = False) Then
For i = 1 To UBound(vData)
vData(i) = fld(i)
Next
bStock = True
End If
End Function
Private Sub Sample1()
Dim rs As New ADODB.Recordset
rs.Open "T1", CurrentProject.Connection, adOpenForwardOnly, adLockOptimistic
ReDim vData(1 To rs.Fields.Count - 1)
bStock = False
While (Not rs.EOF)
If (CheckData(rs.Fields)) Then rs.Delete
rs.MoveNext
Wend
rs.Close
End Sub
※
レコードセットで得られる id は、1つ目にあるものと限定しています。
(id 以外を比較対象に)
※
カレント/次の関係に限定せずに、連続して同じものがあるか処理する時には
上記 ★ 部分をコメントにしてください。
動きは以下の様になります。
idfield1field2
1aaaabbbb
2aaaabbbb
3aaaabbbb
4aaaabbbb
5aaaa
6aaaa
7aaaa
8aaaa
9aaaacccc
↓ 以下 Sample1 を1回実行
idfield1field2
1aaaabbbb
5aaaa
9aaaacccc
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- Access(アクセス) DoCmd.SearchForRecord が動かない時の解決方法 3 2022/07/22 15:31
- Access(アクセス) docmd.gotorecordを起動するには 5 2022/06/17 15:20
- PHP クエリObjectをforeachで回す時に、次のレコードへ移動せずに次のレコードを取得したい 2 2022/07/28 15:29
- Access(アクセス) チェックボックスにチェックが入った後の挙動 1 2022/08/21 12:39
- Access(アクセス) アクセスの更新クエリでカレントレコードのみ更新したい 1 2022/06/02 23:32
- その他(データベース) 更新クエリをリンクデータベーステーブルに実行し実行時エラー3362固有インデックスに重複する値が含ま 1 2022/09/21 11:44
- Access(アクセス) 実行時エラー3131 FROM 句の構文エラーです について 7 2022/06/13 15:45
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- SQL Server ACCESSで表が作りたく、そのためのSQL文や設定方法を教えてください。 1 2022/08/15 12:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excelのマクロについて教えてく...
-
Vba 実数および実数タイプの変...
-
ユーザーフォームに別シートか...
-
VBA レジストリの値の読み方に...
-
エクセルVBAについて
-
VBA listBoxから
-
ExcelのVBAコードについて教え...
-
VBA 複数条件の分岐処理の上手...
-
ExcelのVBAです。フォルダ内の...
-
VBAの計算で@が出てしまう件
-
VB.net(VB)で、フォームにExcel...
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
VBAの質問になります Userform内で
-
VBAの質問になります メッセー...
-
Excel マクロについての相談
-
Vba SelStart、SelLen教えてく...
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel VBA 定義されたプロージ...
-
Excel-VBAのmsgBox()の不思議
-
【VBA】マクロの入ったファイル...
-
VBA 複数条件の分岐処理の上手...
-
現在のブックを閉じないで、マ...
-
VBAで各列の"+"と"o"の合計数を...
-
VBAに詳しい方教えてください。
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
ユーザーフォームに別シートか...
-
エクセルのマクロについて教え...
-
ExcelVBA シート名を複数セルか...
-
エクセルのマクロについて教え...
-
VBA listBoxから
-
Excelのマクロについて教えてく...
-
エクセルのマクロについて教え...
おすすめ情報