• ベストアンサー

Access VBA 全クエリ 繰り返し

Access VBAについてお尋ねさせていただきます。 Access VBAを利用して、以下の繰り返し処理を実行したいです。 (1):レコードの有無にかかわらず、すべてのクエリの名称だけを配列に取得する繰り返し処理 (2):レコードの有無にかかわらず、すべてのクエリを開き、各クエリのレコード件数を配列に取得する処理 どのように記述すればよろしいでしょうか?

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

  • ベストアンサー
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.1

少し時間がたっていますが、回答が ついていないので回答しておきます。 以前、似たような質問に回答していますが、 https://okwave.jp/qa/q8013313.html このコードを少し手直ししてみました。 配列はVariant型とLong型が混在しますがそのまま にしておきます。 なお、対象とするクエリは選択クエリとクロス集計クエリ としておきます。アクションクエリなどははずします。 Sub cmdRecCount()   Dim db As DAO.Database   Dim qdf As DAO.QueryDef   Dim myQdfName As Variant   Dim strSQL As String   Dim i As Long   Dim j As Long   Dim k As Long   Dim myRsCount() As Long   Set db = CurrentDb   'クエリ名     ReDim myQdfName(i)     For Each qdf In db.QueryDefs       If Left(qdf.Name, 1) <> "~" Then         '選択クエリとクロス集計クエリを選ぶ         If qdf.Type = 0 Or qdf.Type = 16 Then           ReDim Preserve myQdfName(i)           myQdfName(i) = qdf.Name           i = i + 1         End If       End If     Next qdf     If i = 0 Then       MsgBox "対象となるクエリは存在しません"       Exit Sub     End If     'レコード件数     ReDim myRsCount(k)     For j = LBound(myQdfName) To UBound(myQdfName)       ReDim Preserve myRsCount(k)       myRsCount(k) = funcRecCount(myQdfName(j))       'イミディエイトウィンドウに出力して確認       Debug.Print myQdfName(j) & " ----- " & myRsCount(k)       k = k + 1     Next j   Set qdf = Nothing   db.Close: Set db = Nothing End Sub 'レコード件数を求める関数 Private Function funcRecCount(ByVal strQueryName As String) As Long   Dim db As DAO.Database   Dim rs As DAO.Recordset   Dim strSQL As String   strSQL = "SELECT COUNT(*) AS RecCnt FROM " & strQueryName   Set db = CurrentDb   Set rs = db.OpenRecordset(strSQL)   funcRecCount = rs!RecCnt   rs.Close: Set rs = Nothing   db.Close: Set db = Nothing End Function 分からないところがあれば補足してください。

関連するQ&A

  • Access VBA クエリパラメーターについて

    Access VBA についてご質問させていただきます。 AccessVBAにてフォームを起動したときに、ユーザーで作成したクエリにおいて各クエリのデータ件数を取得するプログラムを作成いたしました。 '各クエリの件数をカウントする処理 Public Sub Data_Count() 'カウント用変数を宣言して、初期化する Dim i, j As Integer: i = 0: j = 11: b = 0: Dim rs As Recordset: Dim str(1) As String Dim Fname As Form: Set Fname = Forms!F99_メイン Dim mydb As Database: Set mydb = CurrentDb 'クエリ名・エクセル名用配列を初期化する Erase QName: Erase EName: Erase Count 'クエリの数だけ繰り返す For Each myqer In mydb.QueryDefs If Left(myqer.name, 1) = "Q" And Left(myqer.name, 3) <> "Q0_" Then 'クエリ名用変数の要素数を変更し、クエリ名を格納する ReDim Preserve QName(i): QName(i) = myqer.name 'エクセル用変数の要素数を変更し、エクセルファイル名を格納する ReDim Preserve EName(i): EName(i) = QName(i) & ".xlsx" '件数用配列の要素数を変更する ReDim Preserve Count(i) 'クエリを開く Set rs = CurrentDb.OpenRecordset(QName(i)) 'クエリのレコードが0件の場合 If rs.EOF Then 'クエリの件数を保存する Count(i) = 0 'クエリのレコードが1件以上の場合 Else 'クエリの最終行に移動してクエリ件数を保存する rs.MoveLast: Count(i) = rs.RecordCount End If End If rs.Close i = i + 1 End If Next End Sub 上記のコードを実行してみたところ、ユーザーで作成したクエリを開く際に、 実行時エラー'3061':パラメーターが少なすぎます。1を指定してください。というエラーが発生してしまいました。 どのように修正すればよろしいでしょうか?

  • Access2002でクエリからVBAへの読み込み

    10個程前の質問で「Access2000でテーブルをVBAからテーブルを読み込む方法・・・」というのがありますが、私も同じ状況で3日程悩んでいたのですが、この記事を見て指示通りで解決しました。 本題の私の質問ですが、テーブルをVBAに読み込めるのでしたらクエリもVBAへ読み込めるのでしょうか? (1)クエリ→VBA→クエリ (2)クエリ→VBA→テーブル 記述の仕方を教えてください。Access2002です。

  • ExcelからAccessのクエリを呼び出したい

    約20,000レコードほどのデータを一気にExcelのVBA上の選択SQLでEditとUpdateで処理しようと思ったのですが、一気に処理できるレコード数に制約があるようでエラーになりました。 Access内のクエリだとOKみたいですがExcelからAccessのクエリを呼び出す方法がわかりません。 どうしたらいいのでしょうか? よろしくお願いします。 バージョンは2002です。

  • エクセルからアクセスのテーブルやクエリのレコード数を取得することは可能でしょうか?

    エクセルもアクセスも起動している状態で、エクセル側でマクロを実行してアクセスのとあるテーブルやクエリのレコード数を取得したいのですがどうしていいのかわかりません。アクセス自体での取得方法もわかりません。SQLというのを使わないと不可能なのでしょうか? VBAで可能でしたらどういったコードを書けばいいのでしょうか? よろしくお願いします。

  • Access2000でVBAからパラメータクエリを実行

    Access2000でフォームからの値を参照して実行するクエリを作りました。 SQLで表すと、以下のようなものです。 クエリ名:test SELECT TEST.HAKKODTE FROM TEST WHERE (((TEST.HAKKODTE)=Format([Forms]![F_メニュー]![txtNyukinDate],"yyyymmdd"))); このクエリをダブルクリックで実行すると問題なく実行できます。 これを、VBAからレコードを参照したいと思い、 以下のように記述しました。 Dim cn As ADODB.Connection Set cn = CurrentProject.Connection Dim rs1 As ADODB.Recordset Set rs1 = New ADODB.Recordset Dim sqlstr As String sqlstr = "SELECT * FROM test;" rs1.Open sqlstr, cn, adOpenKeyset, adLockOptimistic しかし、Open処理で、「1つ以上の必要なパラメータの値が設定されていません」 というエラーになってしまいます。 VBAを実行するときに、[Forms]![F_メニュー]![txtNyukinDate]に きちんと値は入力されています。 これを実行する方法はあるでしょうか?

  • アクセス2000でVBAを使ってクエリを実行したいのです

    Access2000でVBAを使っています。 Docmdでクエリを実行させたいのですが、 DoCmd.OpenQuery stDocName1, acNormal, acHidden とするとクエリの実行結果が表示されます。 クエリだけ実行されて実行結果を非表示にする方法は ありますでしょうか? Form1のコマンドボタンを押下後、クエリが実行されて 別のFormにデータ表示させたいので、なるべくクエリの実行結果を表示させたくないのです。 よろしくお願いいたします

  • ACCESS【更新クエリの中断ができない】

    ACCESS初心者です。質問がわかりにくかったらすみません。 ACCESSの更新クエリで、レコードのカンマをスペースに置き換える式を作りました。 クエリを実行すると、 ”更新クエリを実行すると、テーブルのデータが更新されます” と、メッセージが表示され”はい”で次に進むと ”*件のレコードが更新されます。”と正確な件数が表示されます。 ただ、ここでやはり中断したいと思い、”いいえ”を選択しても、 レコードは更新されてしまいます。何故でしょうか?教えてください。 ______________________ フィールド:     型名 テーブル:      データ統合 レコードの更新:  Replace([型名],","," ") 抽出条件:     Like"*,*"

  • Access クエリでできないことは?

    Accessの勉強をしていまして、だいたいひととおりはわかるのですが (VBAに関してはかじる程度です) SQLについて知りたいことがありますので、質問させてください。 Accessではクエリの裏でSQLが記述されているのは知っていますし、 簡単なクエリであればSQLを読むこともできます。 ただ、今後より深くSQLを勉強していくべきかどうか悩んでいまして・・・ 基本的には、クエリでできるならそれでいいと考えています。 ただ、たとえばユニオンクエリのようにSQLを直接記述しないとできないことも あるようですので、質問です。 SQLを記述しないとできないことというのは、他に何があるのでしょうか? かなり特殊なことであれば(パススルーとか?)ほとんど必要ないような気も していますが、普通に使っていて必要になるようなことで何かあるでしょうか? よろしくお願いします!

  • Access VBAでクエリーのレコード件数を取得したいのですが

    Access2003のVBAで次のような構文を用いてクエリーの該当レコード数を取得したいのですがうまく出来ません。 構文又は手法が間違っているのでしょうか。 Dim db As Database Dim rs As Recordset Dim cnt As Long Set db = CurrentDb Set rs = db.OpenRecordset("該当顧客リストクエリ", dbOpenTable) cnt = rs.RecordCount ※OpenRecordsetの行で「実行時エラー'3219'無効な処理です」と出てしまいます。 又、”該当顧客リストクエリ”では特定の抽出条件を設定して、”顧客リストテーブル”の一部を抽出するようにしています。

  • EXCEL vbaからACCESSのクエリを開く

    EXCEL2010 WEBを参照してEXCEL VBAでACCESSのクエリを開くマクロを流用しました。 下記がマクロの内容です。 Private Sub Import() Dim db As ADODB.Connection Dim rs As ADODB.Recordset 'ACCDBファイルに接続します Set db = New ADODB.Connection db.Provider = "Microsoft.Ace.OLEDB.12.0" db.Open "C:\work\TEHAI.accdb" 'レコードセットを開きます Set rs = New ADODB.Recordset 'Accessのクエリを開く rs.Open Source:="TEHAI", ActiveConnection:=db If rs.EOF Then MsgBox "抽出した結果、レコードが見つかりません。" Else ' レコードをシートへ貼り付ける Range("A1").CopyFromRecordset rs End If rs.Close Set rs = Nothing Set db = Nothing End Sub これを実行すると、 抽出した結果、レコードが見つかりません。 が表示されます。 ACCESS単体でTEHAIクエリを実行したら、約3万件くらいヒットします。 EXCELマクロから実行したらACCESSからデータをもってこられません。 なぜレコードが見つかりません、 となるのでしょうか? マクロのどこがおかしいのか、教えていただきたく。 ちなみに、もともとの内容から変更したのは db.Open "C:\work\TEHAI.accdb" rs.Open Source:="TEHAI", の2ヶ所だけです。

専門家に質問してみよう