EXCEL VBAからACCESSのクエリを開く方法とエラーの解決方法

このQ&Aのポイント
  • EXCEL VBAでACCESSのクエリを開くマクロを実行すると、レコードが見つかりませんというエラーが表示されます。
  • ACCESS単体でクエリを実行すると、約3万件のヒットがありますが、EXCELマクロから実行するとデータが取得できません。
  • マクロの内容を確認しましたが、どこに問題があるのか特定できません。何が原因でレコードが見つかりませんというエラーが発生しているのか教えていただけませんか?
回答を見る
  • ベストアンサー

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ヶ所だけです。

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

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

原因は、 >回答:クエリは >Like "15*" >のひとつだけです。 です。Accessではワイルドカードは「*」ですが、 Access以外でADOを使う場合は、「%」を使います。 したがって、Accessのクエリで、 Like "15*' を  Like "15%" のようにするか、あるいはExcelの側で、たとえば、 strSQL = "select * from テーブル名 where (テーブル名.番号) like "15%"" のようにして、これをレコードソースとして、 rs.Open strSQL, ActiveConnection:=db として、データをExcelに取り込みます。このときはAccessは 手直しをする必要はありませんが(たぶん)。

3620313
質問者

お礼

何度も回答いただきありがとうございます。 助かりました。 *と%、気をつけたいと思います。 同じ様な間違いの参考になればと思います。

3620313
質問者

補足

Like "15%" で解決できました。 access単独では開けていたので???でした。

その他の回答 (5)

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

書き忘れましたが、No5で  strSQL は変数宣言をしておいてください。 Dim strSQL as String です。

  • freetaka
  • ベストアンサー率53% (106/197)
回答No.4

少し気になりますね If rs.EOF Then MsgBox "抽出した結果、レコードが見つかりません。" Else ' レコードをシートへ貼り付ける Range("A1").CopyFromRecordset rs End If の部分をif文だけコメントアウトし MsgBox rs.RecordCount Range("A1").CopyFromRecordset rs のみにした場合は 実行時エラーが発生したりしないなら レコードのカウントが「-1」にもかかわらず シートに結果が表示されたりはしませんか? またはカウントが「-1」で表示されないかですが アクセス側でクエリを実行した場合に 正しくデータ検索できるのであれば エクセル側で実行した場合に実行できない理由が データ側またはクエリ内にあるかもしれませんね そうなるとクエリやテーブル構造も公開していただかないと VBAだけで解決は難しいかもしれません というか回答が難しいです

3620313
質問者

お礼

回答ありがとうございます。

3620313
質問者

補足

回答No.5にて解決できました。

  • freetaka
  • ベストアンサー率53% (106/197)
回答No.3

rs.Open Source:="TEHAI", ActiveConnection:=db ↓ rs.Open "TEHAI", db, adOpenStatic ではどうでしょう? もしだめであれば件数の多いデータベースであれば データベースの最適化修復を実施すると 稀に実行できなかったものが 実行できることもあります そちらも試してみてください

3620313
質問者

お礼

回答ありがとうございます。

3620313
質問者

補足

rs.Open "TEHAI", db, adOpenStatic 実施結果 現象変わらずNGです。 もしだめであれば件数の多いデータベースであれば データベースの最適化修復を実施すると 稀に実行できなかったものが 実行できることもあります そちらも試してみてください 実施結果 現象変わらずNGです。

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

No1です。 クエリは、普通の選択クエリですか? 何か、抽出条件とかSQL文が複雑な構文に なっているとか、というものでもありませんか? どうしても、Excelから取り出せないとなると、 Accessから送り出したほうがいいかもしれませんが、それでは 仕事が遅れますかね。 あるいは、いっそのことAccessのクエリのSQL文を Excelに書き込む、つまり strSQL = "select * from クエリ名" これを、AccessのクエリのSQL文に置き換える ということです。 もう一つは、MS QueryをExcelで起動してAccessから 取り出す、つまりBookの「データ」→「外部データの取り込み」 →「新しいデータベース、クエリ」からAccesのクエリ、あるいは テーブルを指定してデータを確保するという方法ですが。

3620313
質問者

お礼

回答ありがとうございます。

3620313
質問者

補足

クエリは、普通の選択クエリですか? 何か、抽出条件とかSQL文が複雑な構文に なっているとか、というものでもありませんか? 回答:クエリは Like "15*" のひとつだけです。 参考 accessを使っているのは、あるサーバのview機能を使用して、テーブルの情報(A)をaccessに持ってくるからです。 Aは約130万件くらいあり、excelに持ってこれないので、 クエリを使用して、TEHAIクエリというのを作成しています。 これを実行すると約3万件くらいになっています。 strSQL = "select * from クエリ名" は、VBAで実施しましたが、現象かわらずです。 もう一つは、MS QueryをExcelで起動してAccessから 取り出す、つまりBookの「データ」→「外部データの取り込み」 →「新しいデータベース、クエリ」からAccesのクエリ、あるいは テーブルを指定してデータを確保するという方法ですが。 実施結果: この方法でaccessデータをexcelに持ってくることが出来ました(#^.^#) これでやってみます。 当初の内容が解決できていないので、もうしばらく情報待ちさせていただきます。

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

コードには問題はないと思いますが。 クエリの名前は大丈夫ですか? テーブルを指定した場合はどうなりますか? Excel側からSQL文でレコードをとってみたら どうなりますか?たとえば以下のように。 クエリの名前は実際に合わせてください。 あるいは、クエリをテーブルに置き換えてみてください。 Dim db As ADODB.Connection Dim rs As ADODB.Recordset Dim strSQL as String strSQL = "select * from クエリ名" 'ACCDBファイルに接続します Set db = New ADODB.Connection db.Provider = "Microsoft.Ace.OLEDB.12.0" db.Open "C:\work\TEHAI.accdb 'レコードセットを開きます Set rs = New ADODB.Recordset rs.Open strSQL, ActiveConnection:=db Range("A1").CopyFromRecordset rs rs.Close Set rs = Nothing Set db = Nothing

3620313
質問者

お礼

回答ありがとうございます。

3620313
質問者

補足

クエリの名前、大丈夫です。 テーブルだとexcelにデータ持ってくることが出来ます。 strSQL = "select * from クエリ名" を加えて実施しても現象同じでexcelにデータ持ってくることが出来ません。 実施結果まで

関連するQ&A

  • ACCESS VBA

    ACCESSで検索フォームを作りたいと思っています。 VBAを使って行きたいと思うのですが、うまくいきません。 希望としては、該当するレコードのデータを抽出したいです。 よろしくお願いいたします。 ※現段階でのソースを書いてみました。 最終的に行いたい処理とは違うのですが、根本的に間違っているようなので簡略化しました。 /------------------------------------------------/ Private Sub コマンド1_Click() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim sql As String '接続 Set cn = CurrentProject.Connection 'レコードセットを取得 Set rs = New ADODB.Recordset sql = "SELECT * FROM 従業員データ " & _ "WHERE 年齢=30" rs.Open sql, cn, adOpenDynamic, adLockReadOnly rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub /------------------------------------------------/

  • 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]に きちんと値は入力されています。 これを実行する方法はあるでしょうか?

  • VBAのfor next で繰り返しが出来ず・・・

    すいません1つ質問があります。 以前質問させて頂きましたが、ExcelのVlookupでACCESSのクエリを参照してレコードを取得したいです。 ADOでAccessのテーブルから持ってくることは出来ました。 が、繰り返しても最初の数字の9999しかもって来ません・・・。 下記が私の書いたコードとなります。 ExcelシートとACCESSテーブルを画像として添付します。 D2には9999、D3には55555・・・・と持ってくるようにしたいです。 原因と修正法を教えて頂ければ幸いです。 何卒よろしくお願いします。 Option Explicit Sub test() Dim db As ADODB.Connection Dim rs As ADODB.Recordset Dim strSQL As String Dim i As Long Dim Maxrow As Long Set db = New ADODB.Connection db.Provider = "Microsoft.ace.oledb.12.0" db.Open "C:\Users\Kei\Desktop\Test\Test.accdb" Set rs = New ADODB.Recordset rs.Open "Ship", db, adOpenStatic Maxrow = Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row For i = 2 To Maxrow strSQL = "select * from Ship where 商品名 =" & Cells(i, 1) & ";" Cells(i, 4) = rs!出荷数 Next i rs.Close db.Close Set db = Nothing Set rs = Nothing End Sub

  • Access ADOについて質問です。

    Access ADOについて質問です。 以下コードでレコードセットを返す関数を使用しています。 動作的には問題ないのですが、標準モジュール内のレコードセットをClose及びNothingしていないのが気になります。 Private Sub Form_Open(Cancel As Integer) Dim rs2 As ADODB.Recordset Set rs2 = New ADODB.Recordset Set rs2 = CreateRecordSet("SELECT * FROM T_Standard;") Set Me.Recordset = rs2 rs2.Close: Set rs2 = Nothing end sub '標準モジュール Public Function CreateRecordSet(strSQL As String) As ADODB.Recordset Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = New ADODB.Connection cn.ConnectionString = "provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=O:\標準DB\StandardBackEnd.mdb" cn.Open Set rs = New ADODB.Recordset rs.Open strSQL, cn, adOpenStatic, adLockReadOnly Set CreateRecordSet = rs ' rs.Close: Set rs = Nothing   ←この部分 ' cn.Close: Set cn = Nothing   ←この部分 End Function 標準モジュール内ではCloseやNothingしなくてもメモリの開放は行われているのでしょうか? アドバイスよろしくお願いいたします。

  • DAO エクセルvbaからアクセスのレコードの件数

    DAOで、エクセルvbaからアクセスのレコードの件数を取得したいのですが Dim ac As Object Dim db As DAO.Database Dim rs As DAO.Recordset Set ac = CreateObject("Access.Application") Set db = ac.DBEngine.OpenDatabase("D:\あああ.accdb", False, True) Set rs = db.OpenRecordset("SELECT * FROM Tマスタ WHERE masterkey like '*四*';") i = rs.RecordCount Debug.Print rs("masterkey") rs.Close: Set rs = Nothing db.Close: Set db = Nothing ac.Quit: Set ac = Nothing をすると、抽出するレコードが1000件でも、必ず1が返ります。 masterkeyフィールドは文字列型です。 なぜ実際はたくさんのレコードがあるのに、1が返るのでしょうか?

  • ACCESS VBA クエリを開く

    ACCESS初心者です。 VBAはEXCELで独学した程度の知識です。 フォームから受注納期を入力し、クエリを抽出。 クエリでレコード毎に製品票の印刷枚数を計算し レポートで各レコード毎に求められた印刷枚数分を 印刷させたいのですが・・・ クエリを開く段階でつまずいており困っています。 Private Sub コマンド23_Click() Dim db As DAO.database Dim rs As DAO.Recordset Dim qdf As DAO.QueryDef Set db = CurrentDb() Set qdf = db.QueryDefs("受注クエリ") With qdf .Parameters("納期") = Format(Forms![受注データ一覧]![納期], "yyyy/mm/dd") Set rs = .OpenRecordset .Close End With MsgBox rs![注文番号] rs.Close End Sub パラメータクエリの開き方、上記コードで問題ないでしょうか? そしてこのコードを実行した際 実行時エラー3421 データ型の変換エラーが発生しましたと表示されます。 ローカルウィンドウで 変数rs = nothingとなっており クエリのレコードが読み込めていないようです。 (Msgbox rs!注文番号はデータが読み込めたかテストするために コードを書いています。) どうぞ宜しくお願いいたします。

  • DAOでのコードをADOへ書き直し

    Access2003、WinXPです。 レコードセットの取得関係をDAOで書いていたのですが ADOに途中から変更しました。 変数宣言を Public db As DAO.Database ⇒Public cn As ADODB.Connection Public rs As DAO.Recordset ⇒Public rs As ADODB.Recordset Public Fld As DAO.field  ⇒Public Fld As ADODB.field レコードセット取得を Set db = CurrentDb      Set rs = db.OpenRecordset(strSQL) ↓ Set cn = CurrentProject.Connection Set rs = New ADODB.Recordset rs.Open strSQL, cn レコードセット クローズを Set rs = Nothing Set db = Nothing ↓ rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing としました。今のところ動いているようですが、 何か勘違い、気をつけないといけない事等ありますでしょうか・・・?

  • 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'無効な処理です」と出てしまいます。 又、”該当顧客リストクエリ”では特定の抽出条件を設定して、”顧客リストテーブル”の一部を抽出するようにしています。

  • Access VBA について

    Access2000 をXPで動かしています。 全く別のフォルダーに入れている ABC.mdb を使って、 \Seikyu というフォルダーにある 請求sys.mdb の テーブル「銀行マスター」から銀行名等を取りだそう としています。 Dim DB As ADODB.Connection Set DB = New ADODB.Connection DB.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=C:\Program Files\Seikyu\請求sys.mdb;" Set RS = New ADODB.Recordset RS.Open "銀行マスター", DB, adOpenKeyset, adLockOptimistic Me.T1 = RS!ID Me.T2 = RS!銀行名 Me.T3 = RS!口座 RS.Close DB.Close こうすると、 実行時エラー '3709': このコンテキストで閉じられているかあるいは無効です のエラーが表示されます。 どこが間違いなのでしょうか。

  • Accessでのデータベースの使用(VBA)

    Private Sub 実行_Click() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim StSQL As String Set cn = CurrentProject.Connection Set rs = New ADODB.Recordset strSQL = "INSERT INTO マスタ(コード) VALUES(コード) ;" rs.Open strSQL, cn, , adLockOptimistic '//前のコード(エラーになりました。) ' rs.Close 'cn.Close 'Set rs = Nothing 'Set cn = Nothing Set rs = Nothing: Close Set cn = Nothing: Close Accessを使用したvbaのコードの書き方について教えてほしいです。毎度Access の質問ばかりしてすみません。以下のコードはADOを使用してマスタというテーブルを読み込んで最後にrs.CloseでRecordSetを開放しようとしたのですが「オブジェクトが閉じている場合は、操作は許可されません。」というエラーメッセージが出てしまい原因がわかりませんでした。Openしていて開いているはずなのにエラーが出てしまい、 Set rs = Nothing: Closeに変えたら治りました。何故rs.Closeではエラーが出てしまったのでしょうか。 もう一つお聞きしたいです。 strSQL = "INSERT INTO マスタ(コード) VALUES(コード) ;"でコードという名前を付けたテキストボックスの値をマスタテーブルのコードの列に追加したいのですがテキストボックスの値の取り方が分かりません。(コード.Value)とやってみてもだめでした。どうやったらSQL文でテキストボックスの値をテーブルに追加できるんでしょうか。

専門家に質問してみよう