Access (VBA)

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

 
(Windows 10 Pro : Access 2016)
Seek検索で検出されない
投稿日時: 19/03/22 07:41:45
投稿者: ゴマゴマ

お世話になります。
まだ試作段階で実験しながら進めているところです。
 
追加用データが入っているT_テーブル2から、T_メインテーブルにこれから入れるデータを検出したいと思っています。両者には受注番号と行番がありどちらも二つ合わせてキーになっています。テーブル構造も同じです。T_テーブル2にはすでにT_メインテーブルに取り込んでいるデータも入っているので、受注番号と行番で判断し新規データのみ抜き出したいのです。
 
下記「←※」のとこで実行時エラーが発生し困っています。データを見ると両者に同じ受注番号と行番のデータはあるし、また_テーブル2にしかない新規データもあるのでIfで分岐した場合取込済みと新規の二種類のデータは存在しているのは間違いありません。なぜエラーが発生するのかご教示ください。
 

Option Compare Database
Option Explicit

Sub sai()

Dim cn As ADODB.Connection
Dim rs1 As ADODB.Recordset
Dim rs2 As ADODB.Recordset

Set cn = CurrentProject.Connection
Set rs1 = New ADODB.Recordset
Set rs2 = New ADODB.Recordset

rs1.Open "T_メインテーブル", cn, adOpenKeyset, adLockOptimistic, adCmdTableDirect
rs2.Open "T_テーブル2", cn, adOpenKeyset, adLockOptimistic, adCmdTableDirect

rs1.Index = "PrimaryKey" 'T_メインテーブルの受注番号と行番の二つでキー
Do Until rs2.EOF
 rs1.Seek Array(rs2(0),rs2(1)), adSeekFirstEQ '(0)受注番号 (1)行番
  Debug.Print rs1(0)&rs1(1) '←※ここで実行時エラーが出てrs1のEOFがtrueになってしまう
 If rs1.EOF Then
  Debug.Print rs1(0)&rs1(1)
 Else
  Debug.Print rs1(0)&rs1(1)
 End If
Loop

rs1.Close: Set rs1 = Nothing: rs2.Close: Set rs2 = Nothing: cn.Close: Set cn = Nothing

End Sub

 
以上

回答
投稿日時: 19/03/22 11:23:51
投稿者: sk

引用:
rs1.Open "T_メインテーブル", cn, adOpenKeyset, adLockOptimistic, adCmdTableDirect
rs2.Open "T_テーブル2", cn, adOpenKeyset, adLockOptimistic, adCmdTableDirect
 
rs1.Index = "PrimaryKey" 'T_メインテーブルの受注番号と行番の二つでキー

引用:
rs1.Seek Array(rs2(0),rs2(1)), adSeekFirstEQ '(0)受注番号 (1)行番
Debug.Print rs1(0)&rs1(1) '←※ここで実行時エラーが出てrs1のEOFがtrueになってしまう

rs1 の EOF プロパティが True を返しているのであれば、
rs1 のカレントレコードは[T_メインテーブル]のどのレコードも
参照しておらず、故にどのフィールドも参照しようがない
(ので実行時エラーが発生する)というだけの話では。
 
-----------------------------------------------------------------------
 
Do Until rs2.EOF
  '(0)受注番号 (1)行番
  Debug.Print rs2(0).Name & ":" & Nz(rs2(0).Value, "Null") & vbTab & _
              rs2(1).Name & ":" & Nz(rs2(1).Value, "Null")
  rs1.Seek Array(rs2(0), rs2(1)), adSeekFirstEQ
  If rs1.EOF Then
    Debug.Print "[T_メインテーブル]にはないよ"
  Else
    Debug.Print "[T_メインテーブル]にあるよ"
  End If
  rs2.MoveNext
Loop
 
-----------------------------------------------------------------------
 
引用:
追加用データが入っているT_テーブル2から、T_メインテーブルに
これから入れるデータを検出したいと思っています。
両者には受注番号と行番がありどちらも二つ合わせてキーになっています。
テーブル構造も同じです。
T_テーブル2にはすでにT_メインテーブルに取り込んでいるデータも
入っているので、受注番号と行番で判断し新規データのみ抜き出したいのです。

これ自体は追加クエリでも実現可能でしょう。

回答
投稿日時: 19/03/22 14:47:45
投稿者: Suzu

Do Until rs2.EOF
 rs1.Seek Array(rs2(0),rs2(1)), adSeekFirstEQ '(0)受注番号 (1)行番
  Debug.Print rs1(0)&rs1(1) '←※ここで実行時エラーが出てrs1のEOFがtrueになってしまう

 
引用:
テーブル2にしかない新規データもあるのでIfで分岐した場合取込済みと新規の二種類のデータは存在しているのは間違いありません。なぜエラーが発生するのかご教示ください。

 
 
すでにskさんが回答くださっていますが。。
 
つまり、
テーブル2にしかない「新規データ」これを、RS1の「T_メインテーブル」に対し
SEEKを行っても該当レコードは無し。つまり、EOFとなる。
 
EOFなので、skさんのおっしゃる様に参照できない。
 
 
参照しようとした段階でエラーとなるのですから
その後で、EOFの判定を行っても無意味ですよね。
意味わからずにコードをコピペしているだけなのでしょうか。
 
 
 
引用:
受注番号と行番で判断し新規データのみ抜き出したいのです。

 
その後に何を行いたいかにも依りますが
抜き出しだけなら不一致クエリを作成すれば良いですよね。

投稿日時: 19/03/22 15:10:25
投稿者: ゴマゴマ

sk様 Suzu様
 
早速にご回答ありがとうございます。
「テーブル2にしかない「新規データ」を〜」のことろで何となくわかっていない自分が分かってきたような気がします。
クエリの運用も検討してみます。
ありがとうございました。