EXCELマクロでpostgreSQLのデーターベーステーブルに接続してフィルタをかける方法

このQ&Aのポイント
  • EXCELマクロを使用して、postgreSQLのデーターベーステーブルに接続し、フォームに入力した値でフィルタをかけた結果をEXCELシートに転記する方法を教えてください。
  • ACCESSでVBAを使用したことはありますが、EXCELのマクロやSQLの扱いには慣れていません。どなたか教えていただけると助かります。
  • 現在、以下のコードを標準モジュールに書いて、Callで呼び出しています。
回答を見る
  • ベストアンサー

EXCELマクロのSQL文での引用符の使い方

EXCELで社外サーバーにある、postgreSQLのデーターベーステーブルに接続し、テーブルにフォームに入力した値でフィルタをかけた結果をシートに転記するマクロを作ろうと思っています。 ACCESSではVBE扱ったことありますが、EXCELはほとんど経験なく、特にSQL(クエリ)の扱いが良く分からず、エラーの連続です。 いろんな、事例をググったのですがどうしても解決できす、どなたかお教えできないでしょうか? 以下標準モジュールに書き込み、Callで呼び出しています。 Sub tbl_copy() Dim QT As QueryTable Dim MySql As String Dim oCoN As New ADODB.Connection Dim oRS As ADODB.Recordset Dim day1 As Variant Dim day2 As Variant Dim s_num As Variant day1 = form1.date1 day2 = form1.date2 s_num = form1.NUMBER oCoN.Open "Driver={PostgreSQL Unicode}; Server=***.***.***.***; Database=DB001; UID=*****; PWD=*******; Port=****;" MySql = " select start_date, end_date, name, place, note from schedule" & _ " where owner_id LIKE s_num and (start_date Between #"" & day1 & ""# AND #"" & day2 & ""#) " & _ " order by start_date ASC; " Set oRS = New ADODB.Recordset oRS.Open MySql, oCoN, adOpenStatic, adLockReadOnly, adCmdText ’ここでエラー! Set QT = ActiveSheet.QueryTables.Add(Connection:=oCoN, Destination:=Range("A3")) QT.name = "MyQuery" QT.Refresh oRS.Close oCoN.Close Set oRS = Nothing Set oCoN = Nothing End Sub SQL文の書き方がまずいのかな?と思うのですが、ご教授願えれば幸いです。

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

  • ベストアンサー
  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.2

>お手数掛けて申し訳ないんですが、s_numが数値型の場合はどのように囲めばいいのかご教授いただければ幸いです。 s_numが数値型? じゃあ、owner_idも数値型なんでしょうか。 LIKEは文字列型しか使えませんよ。 LIKEではなく、=を使うとしたら、そのまま&でつなげるだけです。 " where owner_id = " & s_num & " and・・・・・・;"

thunder-sg
質問者

お礼

s_numは整数型のデータなのですが、整数型の宣言をすると「型が違います」エラーが出てたので、文字列扱いにして作業していました。 件局、文字列では「データが無い」というエラーが出たので、整数型にしてVal関数でうまく行きました。 以下、変更箇所 Dim s_num As Integer s_num = Val(form1.NUMBER) MySql = " select start_date, end_date, name, place, note from schedule" & _ " where owner_id = '" & s_num & "' and (start_date Between '" & Format(day1, "yyyy/m/d") & "' AND '" & Format(day2, "yyyy/m/d") & "') " & _ " order by start_date ASC; " Set QT = ActiveSheet.QueryTables.Add(Connection:=oRS, Destination:=Range("A3"))'ここ(コネクションの指定)もまちがってた。 この度は、ありがとうございました。 どうも片手間でやってると進歩が無く、なんとか時間を割いてレベルアップしたいと思います。 また、お手数掛けることがあるかもしれませんが、よろしくお願いします。

その他の回答 (1)

  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.1

MySql = " select start_date, end_date, name, place, note from schedule" & _ " where owner_id LIKE s_num and (start_date Between #"" & day1 & ""# AND #"" & day2 & ""#) " & _ " order by start_date ASC; " なぜ引用符を2つ続けているのでしょうか。1つだけでいいです。 s_numはVBAの変数ですから、SQLの中に含めることはできません。 s_numの型はLIKEを使っているから文字列なんでしょうね。引用符を2つ続けるのはここです。 MySql = " select start_date, end_date, name, place, note from schedule" & _ " where owner_id LIKE """ & s_num & """ and (start_date Between #" & day1 & "# AND #" & day2 & "#) " & _ " order by start_date ASC; "

thunder-sg
質問者

お礼

ご教授ありがとうございます。 早速試してみましたところ、値はうまく取得できているようです。 ※データが無いと実行時エラーが発生しましたが、これは別の問題なので。 お手数掛けて申し訳ないんですが、s_numが数値型の場合はどのように囲めばいいのかご教授いただければ幸いです。 <(_ _)><(_ _)><(_ _)>

関連するQ&A

  • SQL文の最後に「;」はいらないのでしょうか?

    VBAのADOについて質問です。 SQL文の最後には「;」を付けなくちゃいけないものだと思っているのですが ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ Private Sub test_Click() Dim CN As ADODB.Connection Dim RS As ADODB.Recordset Set CN = CurrentProject.Connection Set RS = New ADODB.Recordset SQL = "SELECT * FROM Tテーブル" ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ でも問題なくコードが動きました。 SQL文の最後に「;」はいらないのでしょうか? ちなみに SQL = "SELECT * FROM Tテーブル;" でもエラーになりませんでした。

  • VBAでのSQL文によるエラー

    よろしくお願いします。 現在VBAでMySQLに接続し、複数のselect文を実行した結果をcsv出力したいのですが、 select文にinto outfileを入れると、 「オブジェクトが閉じている場合は、操作できません」のようなメッセージが出てしまいます。 普通のselectや、where付のselectに変えたところ、このエラーは出ませんでした。 以下サンプルコードです。 Dim cnct As ADODB.Connection Dim slct01 As ADODB.Recordset Dim slct02 As ADODB.Recordset Dim cnstSTR As String Dim sql01 As String Dim sql02 As String '接続文字列 cnstSTR = "Driver={MySQL ODBC 5.1 DRIVER};"・・・(←接続文字列は省きます) Set cnct = New ADODB.Connection cnct.Open cnstSTR Set rs = cnct.Execute("select * from table01 into outfile " & "'C:/test/test01.csv'" & " FIELDS TERMINATED BY ',';"")←ここ Set ds = cnct.Execute("select * from table2" into outfile " & "'C:/test/test02.csv'" & " FIELDS TERMINATED BY ',';"") 'テーブルのクローズ slct01.Close slct02.Close 'データベースのクローズ cnct .Close Set slct01= Nothing Set slct02= Nothing Set cnct = Nothing やはりinto outfileが原因でしょうか。。。 ソースの修正や、csv出力で他にいい方法あったら教えてください!! よろしくお願いします!!!

  • ACCESS SQLで複数データ表示させるには?

    *************************************************** Private Sub Form_Load() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection mySQL = "select * from テーブル" rs.Open mySQL, cn, adOpenForwardOnly, adLockOptimistic ’コントロールに代入 Me.No = rs![No] Me.項目 = rs![項目] ・・・ End Sub *************************************************** こんな感じで、クエリでなくSQLで フォームにテーブルの全レコードを表示させたい場合、 どのようにすればよいのでしょうか? 上の文には、何が不足しているのでしょうか? http://www.accessclub.jp/ado/09.html を見ましたが、解決できませんでした。

  • エクセルVBAの処理速度アップについて

    以下のエクセルVBAを組んでいるのですが、処理の速度をあげたいです。 無駄な記述があると思うのですが、調べても試行錯誤しても、上手くいきません。 処理速度をあげる記述をご教示願います。よろしくお願い申し上げます。 ※別ファイルのAccessファイルをデータベースとして、「今年」テーブルと、「前年」テーブルそれぞれから条件抽出して、受注数量を合計させるものです。 ※SQLのVBAです。なお、実際ファイルのVBAは、以下記述の5倍量あります(内容は、セル範囲が違うだけで同じ。現在速度:約30秒)。 ※「配列」というのを活用すれば速くなるようなのですが、理解できませんでした。。。 ーーーー【以下、VBA】----------- Sub DSUM集計() Application.ScreenUpdating = False Dim db As ADODB.Connection Dim rs As ADODB.Recordset Dim mySQL As String Dim cmd As ADODB.Command Dim AA As Variant AA = "AND 営業箇所" & Range("C13") & " AND 拒 IS NULL AND 販売伝票 <" & Range("D13") & " AND 品名 " & Range("E13") & " AND 得意先名 " & Range("F13") & " AND 請求先名 " & Range("G13") & " AND 出荷先名 " & Range("H13") Set db = New ADODB.Connection db.Provider = "Microsoft.Ace.OLEDB.12.0" db.Open "\\▲▲▲\ACCESS.accdb" With Worksheets("補助計算") mySQL = " SELECT SUM(受注数量) FROM 今年 " mySQL = mySQL & "WHERE 納入期日=" & Range("B13") & AA Set rs = New ADODB.Recordset Set cmd = New ADODB.Command Set cmd.ActiveConnection = db cmd.CommandText = mySQL Set rs = cmd.Execute Range("I13").CopyFromRecordset rs mySQL = " SELECT SUM(受注数量) FROM 今年 " mySQL = mySQL & "WHERE 納入期日=" & Range("B14") & AA Set rs = New ADODB.Recordset Set cmd = New ADODB.Command Set cmd.ActiveConnection = db cmd.CommandText = mySQL Set rs = cmd.Execute Range("I14").CopyFromRecordset rs mySQL = " SELECT SUM(受注数量) FROM 前年 " mySQL = mySQL & "WHERE 納入期日=" & Range("K14") & AA Set rs = New ADODB.Recordset Set cmd = New ADODB.Command Set cmd.ActiveConnection = db cmd.CommandText = mySQL Set rs = cmd.Execute Range("M14").CopyFromRecordset rs    mySQL = " SELECT SUM(受注数量) FROM 前年 " mySQL = mySQL & "WHERE 納入期日=" & Range("K15") & AA Set rs = New ADODB.Recordset Set cmd = New ADODB.Command Set cmd.ActiveConnection = db cmd.CommandText = mySQL Set rs = cmd.Execute Range("M15").CopyFromRecordset rs rs.Close Set rs = Nothing Set db = Nothing Application.ScreenUpdating = True End With End Sub ーーーーーーーーーーーーーーーーーーーー 以上

  • SQL文のWHERE

    VB6.0 ACCESSで開発しています。 下記のように日付で検索をしているのですが 社員コードでも検索をしたいのですがうまくいきません。 rst.Source = "SELECT * FROM t_nyuryoku Where 日時 = '" & Text3.Text & "'の部分を rst.Source = "SELECT * FROM t_nyuryoku Where 日時 = '" & Text3.Text & "' AND 社員コード = '" & Label1.Caption & "' としたのですがうまく検索できません。 よくわかりません。 Dim cn As New ADODB.Connection Dim rst As ADODB.Recordset Set cn = New ADODB.Connection cn.ConnectionString = _ "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=C:\temp\db2.mdb" cn.Open Set rst = New ADODB.Recordset rst.Source = "SELECT * FROM t_nyuryoku Where 日時 = '" & Text3.Text & "' rst.ActiveConnection = cn rst.CursorType = adOpenStatic rst.LockType = adLockOptimistic rst.Open

  • ADO 「Set」は使ったほうがいいのでしょうか?

    Sub test1() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = New ADODB.Connection Set rs = New ADODB.Recordse End Sub Sub test2() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset End Sub この二つは同じ意味ですか? 「Set」は使ったほうがいいのでしょうか? よろしくお願いします。

  • 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へ移行させるにはどうすればいいのでしょうか? よろしくお願いします。

  • VB6の複数検索条件で連続検索が出来ないので教えて下さい

    下記のごとく、ADOデーターベースの複数アンド条件で検索をしているのですが、一番最初のレコードは検索されるのですが、次の検索をしようと思い、rs.movenextを実行しても次のレコードに飛んで検索をしてくれません。たった一度のみの検索となります。 連続検索を行いたいのですが分かりません。 どなたか、詳しい方がおられましたら宜しくお願い致します。 Public Sub Multi_find(ByRef oRs As ADODB.Recordset, sCriteria As String) Dim clone_rs As ADODB.Recordset Set clone_rs = oRs.Clone clone_rs.Filter = sCriteria If clone_rs.EOF Or clone_rs.BOF Then oRs.MoveLast oRs.MoveNext Else oRs.Bookmark = clone_rs.Bookmark End If clone_rs.Close Set clone_rs = Nothing End Sub

  • DataGridに表示されない

    VB6でMySQL4.1に接続して MySQL内にあるデータベース"sample"の テーブル"総合"をDataGridに表示したいのですが できません。 エラーメッセージは "実行時エラー '7004': 行セットにはブックマークを設定できません" とでます。 どうしたら表示されるのでしょうか? Private Sub form_load() Dim cn As ADODB.Connection 'オブジェクト Dim rs As ADODB.Recordset 'データベースに接続 Set cn = New ADODB.Connection 'データベース:Sheet1 cn.ConnectionString = "Provider=MSDASQL.1;" _ & "Data Source=sample" cn.Open 'レコードセットの取得 Set rs = New ADODB.Recordset rs.ActiveConnection = cn rs.Source = "総合" rs.CursorType = adOpenStatic rs.LockType = adLockOptimistic rs.Open Set DataGrid1.DataSource = rs 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しなくてもメモリの開放は行われているのでしょうか? アドバイスよろしくお願いいたします。

専門家に質問してみよう