2011-07-20 5 views
5

テーブルのレコード数を取得しようとしていますが、countが17より大きい場合は、新しいテーブルを作成します。VBAを使用したAccessテーブルのレコード数

Dim rst As DAO.Recordset 
strSQL = "Select * from SKUS" 
Set rst = db.OpenRecordset(strSQL) 

If rst.RecordCount > 17 Then 
    Set tdf = db.CreateTableDef("161-0363") 

    Set fld = tdf.CreateField("SKUS", dbText, 30) 
    tdf.Fields.Append fld 

    Set fld = tdf.CreateField("Count", dbInteger) 
    tdf.Fields.Append fld 

    db.TableDefs.Append tdf 
End If 

このコードは、新しいテーブルを作成しませんが、私はこれにif文を変更すると、それが動作:

... 
If rst.RecordCount > 0 Then 
    Set tdf = db.CreateTableDef("161-0363") 
... 

そうでRecordCountは1を返して、私は思います。なぜこうなった?テーブルに18列あることは確かです。
誰も私を助けることができますか?

答えて

7

正確なカウントを取得するには、すべての行を移動するようにレコードセットを強制する必要があります。

... 
Set rst = db.OpenRecordset(strSQL) 

rst.MoveLast 
rst.MoveFirst 
If rst.RecordCount > 17 Then 
... 

あなたがあなたのスニペットで表示していないレコードセットで何かをやっている場合を除き、あなただけのドメインカウント機能を使用してレコード数のチェックを行うことで、あなたのコードを簡素化することができます:

これを試してみてください
If DCount("*", "SKUS") > 17 Then 
+1

ああはそれを得ました!私がMoveLastを追加したとき、それは働いた。ありがとう! – Shubham

+0

私はLinkedテーブルを使用していましたが、一旦.MoveLastを追加するとうまくいきました。 以前は.MoveLastを持っていなかったし、すべてのローカルテーブルで動作していましたが、リンクテーブルでは動作しませんでした。 私のテーブルには決して300を超えてはいけません。私はより多くのクエリを行う必要があることがわかりますvbaしかし、これは今のところ動作します。ありがとうございました。 – RazorSky

3

strsqlの問題は、文字列がパラメータクエリを表すとき、上記のコードは機能しません。以下の簡略化されて、私はコードでメーターを使用します。この場合

rs.movelast 
X = rs.recordcount 
Rs.movefirst 
Do until rs.eof 
    For i = 1 to X 
     If i<=17 then 
      Do things 
     Else 
      Do things 
     End if 
    Next i 
Loop 
+4

ループに 'rs.movenext'がありませんか? – LittleBobbyTables