• ベストアンサー

ADOでテーブルのフィールド「A」の「0000」の数を数えたい。

エクセルVBAからアクセスへ Set con = New ADOdb.Connection con.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ACCESSファイル名 Set Rs = New ADOdb.Recordset Rs.Open テーブル名, con, adOpenKeyset, adLockOptimistic Debug.Print Rs.RecordCount Set Rs = Nothing Set con = Nothing とエクセルVBAにコードを記述していますが思いどおりにいきません。 Debug.Print Rs.RecordCount しかわからなく これだとレコードの数しか数えられませんでした。 テーブルのフィールド「A」には「0000」が複数あります。 これを数えるにはどうすればいいのでしょうか? もっといいやり方があれば教えてくださいませ。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • tazukadan
  • ベストアンサー率68% (15/22)
回答No.2

惜しいです、もうひとひねり。 Rs.Open テーブル名, con, adOpenKeyset, adLockOptimistic の、テーブル名のところを Rs.Open "SELECT * FROM テーブル名 WHERE A='0000'", con, adOpenKeyset, adLockOptimistic と、変えてあげれば、RecordCountでレコード数が取得できます。 ""の中は、「テーブル名のA項目が'0000'のものを抽出する」という意味のSQL文です。 参考までに・・・↓ ------------------------------------------------------------ A1さんのCOUNT関数を使ったSQLを使うとこうなります。 Set con = New ADOdb.Connection con.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ACCESSファイル名 Set Rs = New ADOdb.Recordset Rs.Open "SELECT COUNT(*) AS CNT FROM テーブル名 WHERE フィールドA = '0000'", con, adOpenKeyset, adLockOptimistic Debug.Print Rs!CNT ←これが件数! Set Rs = Nothing Set con = Nothing と、なります。

sdfdfadgh
質問者

お礼

大変参考になりました。ご回答ありがとうございます。

その他の回答 (1)

  • pkh4989
  • ベストアンサー率62% (162/260)
回答No.1

以下を参考にしてください。 http://dell-support.okwave.jp/qa4357176.html   Dim Sql     As String   Dim wCnt    As Integer   '   Call Db接続   '   Sql = "SELECT COUNT(*) AS CNT FROM テーブル名 WHERE フィールドA = '0000'"   Set ADRS = ADCN.Execute(Sql)   wCnt = ADRS.Fields("CNT")    '←件数   ADRS.Close   '   Call Db切断

sdfdfadgh
質問者

お礼

大変参考になりました。ご回答ありがとうございます。

関連するQ&A

  • ADOでアクセスのレコードに複数のフィルタをかけるには?

    Sub ADO() Set cn = New ADODB.Connection cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & アクセスファイル名 Set rs = New ADODB.Recordset rs.Open "テーブル1", cn, adOpenKeyset, adLockOptimistic rs.Filter = ("フィールド1 = " & "'" & 変数1 & "'") rs.Filter = ("フィールド2 = " & "'" & 変数2 & "'") Debug.Print rs.RecordCount Set rs = Nothing Set cn = Nothing End Sub だと最終的にはフィールド2のフィルタ後の個数しか取得できません。 rs.Filter = ("案件CD = " & "'" & 案件CD & "'" And "プロセス = " & "'" & プロセス & "'") だと「型が一致しません」になります。 どうすれば変数1と変数2のフィルタ後のレコードの個数を取得できるのでしょうか? ご教授よろしくお願い致します。

  • adoのループについて カレントレコードについて

    adoのFor i = 1 To rs.RecordCountについて質問があります。 Sub test() Dim i As Long Dim MyFileName As String Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset MyFileName = CurrentProject.FullName cn.Open "Provider = Microsoft.ACE.OLEDB.12.0;" & "Data Source= " & MyFileName rs.Open "Tテーブル", cn, adOpenKeyset, adLockOptimistic For i = 1 To rs.RecordCount Debug.Print rs.Fields(0).Value rs.MoveNext Next rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub これを実行した時に、テーブルには、1,2,3・・・という値が入っていて、 イミディエイドウインドウにも1,2,3・・・と順番に取得されるのですが、 For i = 1 To rs.RecordCountを実行した時は、強制的にrs.MoveFirstされるのでしょうか? For i = 1 To rs.RecordCount rs.MoveFirst Debug.Print rs.Fields(0).Value rs.MoveNext Next これと同じ意味なのでしょうか? RecordCount プロパティ (ADO) のヘルプを見ましたが、この件に関する記述は探せませんでした。 ご回答よろしくお願いします。

  • ACCESS ADOのMovePreviousについて

    毎度お世話になっております。 ACCESS2003を使用しています。 ACCESS ADOにて、レコードセットがeofになった後、 MovePreviousをし、MoveNextをし、 さらにもう一度MovePreviousをすると、 最終レコードの一つ前に戻ってしまいます。 テーブル1 フィールド1 フィールド2    1     あ    2     い    3     う    4     え    5     お コード Sub test()   Dim cn As New ADODB.Connection   Dim rs As New ADODB.Recordset   Set cn = CurrentProject.Connection   rs.Open "select * from テーブル1 order by フィールド1", cn, adOpenDynamic, adLockReadOnly   Do Until rs.EOF    rs.MoveNext   Loop   rs.MovePrevious   Debug.Print rs.Fields("フィールド1").Value   rs.MoveNext   rs.MovePrevious   Debug.Print rs.Fields("フィールド1").Value   rs.Close: Set rs = Nothing   cn.Close: Set cn = Nothing End Sub 一度目のdebug.printは5に、 二度目のdebug.printは4になります。 このような仕組みなのでしょうか。 ご教授お願いいたします。

  • 参照設定にチェックを入れないでADOを使いたい

    アクセス2003です。 テーブル1にテキスト型のフィールド1を作り、数レコードをサンプルで入れました。 そしてVBE画面で Sub test() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source= " & CurrentProject.FullName rs.Open "テーブル1", cn, adOpenKeyset, adLockOptimistic MsgBox rs.RecordCount rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub としたらレコード件数が取得できました。 質問は ツール→参照設定の Microsoft ActiveX Data Objects 2.8 Library にチェックをいれなくても VBAコードだけで参照設定できたような気がするので そのコードを教えてくいただけませんか? アドバイスよろしくお願いします。

  • VBSでADOを使ってaccessのテーブルに接続

    VBSでADOを使ってaccessのテーブルに接続する方法は? Sub ADO_test() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source= " & "D:\【Access】サンプル.mdb" rs.Open "テーブル1", cn, adOpenKeyset, adLockOptimistic MsgBox "test成功です" rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub をACCESSVBAで実行すると成功しますが 全く同じコードをメモ帳に貼り付けてtest.vbsで保存し、ダブルクリックすると、 行:3 文字:11 エラー:ステートメントの末尾が不正です。 コード:800A0401 のエラーになります。 VBAは少しわかるのですが、VBSに関しては初心者です。 どこを修正すればコードが通るのか教えてください。

  • ADOでエクセルからSQL Serverへデータを移行するには

    エクセルvbaのADOを使って、 SQL Serverの「test」という名のデータベースの「Table_1」に 新規レコードを追加する事はできますか? エクセルからアクセスには Sub test() Dim データベース名 As String Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = New ADODB.Connection Set rs = New ADODB.Recordset cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & データベース名 rs.Open "Tテーブル1", cn, adOpenKeyset, adLockOptimistic rs.AddNew rs.Fields("フィールド1") = データ rs.Update rs.Close cn.Close Set rs = Nothing Set cn = Nothing End Sub で移行しています。 これをエクセルからSQL Serverへ移行させるにはどうすればいいのでしょうか? よろしくお願いします。

  • なぜrs.Move i ではダメなのでしょうか?

    access2003です。 テーブル1には、 フィールド1 あ い う え お が入っています。 Sub test() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim i As Long Set cn = CurrentProject.Connection rs.Open "テーブル1", cn, adOpenKeyset, adLockOptimistic For i = 0 To rs.RecordCount rs.Move i Debug.Print rs.Fields(0).Value Next rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub をすると、 あ い え とイミディエイトウインドウに表示されるのですが Debug.Print rs.Fields(0).Value の部分で 「実行時エラー'3021' BOFとEOFのいずれかTRUEになっていか、または現在のレコードが削除されています。 要求された操作には、現在のレコードが必要です。」 となります。 その時のiの値は、3です。 rs.MoveFirst For i = 1 To rs.RecordCount Debug.Print rs.Fields(0).Value rs.MoveNext Next にすると、 あ い う え お が取得されます。 なぜrs.Move i ではダメなのでしょうか? 理由を教えてください。

  • rs.MoveFirst

    アクセスvbaです。 Sub Sample() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim i As Long Set cn = CurrentProject.Connection rs.Open "Tテーブル", cn, adOpenKeyset, adLockOptimistic rs.MoveFirst '←これいらない? For i = 1 To rs.RecordCount rs.MoveNext Next rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub このようなコードの場合 rs.MoveFirst はあってもなくても変わらないですか?

  • 【ADO】「Filter」を使うか「WHERE」を使うか

    こんばんは。 アクセス2003です。 「Filter」を使うか「WHERE」を使うかべきかわからないので教えてください。 Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Sub test1() cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & アクセスファイル名 rs.Open "SELECT * FROM Tテーブル WHERE 'フィールド1'='りんご", cn, adOpenKeyset, adLockOptimistic rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub Sub test2() cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & アクセスファイル名 rs.Open "SELECT * FROM Tテーブル", cn, adOpenKeyset, adLockOptimistic rs.Filter = "フィールド1 = " & "'" & "りんご" & "'" rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub 以上のふたつのステートメントは Tテーブルのフィールド1にりんごの文字が入力されているレコート゛を抽出します。 いくつかこのような動作をするプログラムを書くのですが どちらのほうがコート゛として適していますか? WHEREを使うtest1の方がコート゛が短くなるからいいのでしょうか? というのもいつかこのファイルを引き継ぐので他人が見てもわかりやすくしたいです。 よろしくお願い致します。

  • アクセス ADO レコードの件数がおかしい

    アクセスADOでクエリの行数を取得したいのですが クエリが200行でも100行でも必ず12が返ります。 クエリ1は、一度12行の時にadoで数を取得し、その時は、正しく12が返ったのですが、 行数が変わっても12が返ります。 コードは、 Sub Sample() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection rs.Open "SELECT * FROM クエリ1", cn, adOpenStatic, adLockPessimistic Debug.Print rs.RecordCount rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub です。 Debug.Print DCount("*", "クエリ1") だと、正しいレコード数が取得されるのですが、ADOだとおかしいです。 クエリ1のSQL文は、 SELECT Q_作業用.* FROM Q_作業用; のように、別のクエリを持ってきています。 何が原因なのでしょうか? よろしくお願いします。

専門家に質問してみよう