エクセルVBAでPostgreSQLに接続する方法

このQ&Aのポイント
  • エクセルVBAでPostgreSQLに接続する方法について、初心者がわかるように説明します。
  • エクセルからPostgreSQLに接続し、データの取得や挿入を行う方法について説明します。
  • 接続テストを行い、SELECT文でデータを取得し、INSERT文でデータを挿入する方法を示します。
回答を見る
  • ベストアンサー

エクセルvbaでpostgresに接続をしようと思っています。

エクセルvbaでpostgresに接続をしようと思っています。 vba、postgres、sql初心者です。 今エクセルからデータベースにアクセスする方法について勉強しています。 いろいろなサイトを参考にしているのですが、いまひとつ理解が出来ていません。 今のところ下記のプログラムでデータの取得は出来たのですが、 同様にconnectionオブジェクトのexcuteからinsertのsqlを流したところ うまくいきませんでした。 必要な分野が全部初心者レベルですので、多分いろいろ間違っていると思うのですが、 どこが間違っているのかわかりません。 1.どこが間違っているのでしょうか? 2.それから接続の確立や、データの取得方法がなんだかいろいろあるようなのですが、   どのような流れ、方法でやるよう覚えるのがいいのでしょうか? 質問内容が漠然としていてすみません。わからない部分がわからないと言う状態ですので、 これが精一杯です。申し訳ないのですがどなたか初心者にもわかるようご説明をお願いします>< 環境はwindowsXP,office2003,postgres8.4です。 '***** 接続テスト(select) ******** Sub postgresConnectTest() Dim adoCON As New ADODB.Connection 'コネクションを開く adoCON.Open "Provider=PostgreSQL;Data Source=localhost;location=postgres",_ "postgres", "postgres" 'データ取得 Dim adoRec As ADODB.Recordset Set adoRec = adoCON.Execute("select * from employee where name like '%田%'") '結果の表示 Do Until adoRec.EOF MsgBox adoRec.Fields(1).Value adoRec.MoveNext Loop 'レコードセットのクローズ adoRec.Close 'コネクションのクローズ adoCON.Close End Sub '****** 接続テスト(insert) ******* Sub postgresInsertTest() Dim adoCON As New ADODB.Connection 'コネクションを開く adoCON.Open "Provider=PostgreSQL;Data Source=localhost;location=postgres", _ "postgres", "postgres" 'sql流す adoCON.Execute ("insert into employee values('00008','fujita'," & CDate(DateSerial(2010, 10, 1)) & ",38,'001'") 'コネクションのクローズ adoCON.Close End Sub

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

  • ベストアンサー
  • tohru999
  • ベストアンサー率49% (76/154)
回答No.1

adoCON.Execute ("insert into employee values('00008','fujita'," & CDate(DateSerial(2010, 10, 1)) & ",38,'001'") を adoCON.Execute ("insert into employee values('00008','fujita',to_date('20101001','YYYYMMDD'),38,'001'") に変更したらどうでしょう? (postgresは未経験のため、ハズしている可能性アリ...)

mfhanaane
質問者

お礼

ご回答ありがとうございます。 SQLでは日付への変換はそのようになるのですね。ありがとうございます。 よく考えてみれば確かにCDateではおかしいですね。vbaで使うシリアル値を貰っても データベースは困りそう・・(^^;) それで、早速いただいたSQLで試してみたところ、残念ながらやはり成功しませんでした。 エラーメッセージも文字化けしてるし、何が悪いのかさっぱり・・・・TT とりあえずpostgresのsqlをもう少しぐぐって見ます。 どうもありがとうございました。

mfhanaane
質問者

補足

すみません、成功しました! 単純な記述ミスでした。 <修正前のSQL> "insert into employee values('00008','fujita',to_date('20101001','YYYYMMDD'),38,'001'" <修正後のSQL> "insert into employee values('00008','fujita',to_date('20101001','YYYYMMDD'),38,'001');" 最後の閉じ括弧とセミコロンが抜けてました! データベースに直にSQLを流してみてわかりました。 先にこっちをしてみるべきでした><。 SQLに関する手詰まりはとりあえず解決しました。どうもありがとうございました。

その他の回答 (1)

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.2

PostGres は存じませんが >adoCON.Execute ("insert into employee values('00008','fujita'," & CDate(DateSerial(2010, 10, 1)) & ",38,'001'") ~employee (番号名,氏名,日付,・・・) values~ のようにフィールド名?カラム名?PostGresだと何というのだろう?が必要ではありませんか? あと、WHERE句が無いので全部置き換わってしまうような。 SQLで出来ることはSQLで、出来ないものに関してはレコードセットを・・でしょうか。 カテゴリを、技術者向けPCのその他のデータベースかPostgres辺りで相談されたほうが良かったかも。 ※うまく行かなかったでは、こちらに何も伝わらないので具体的に。

mfhanaane
質問者

お礼

ご回答ありがとうございます。 ネット上でカラム名は省略できるという記述を見つけたので、SQLがあまり長いのも読みにくいかと思い、 今回は省略した形にしてみました。きちんとした説明をつけなくてごめんなさい。 私自身が初心者なので、専門用語もあまり知りませんし、難しい言葉で教えていただいても 理解が出来ないかもしれないと思ってこちらに投稿しましたが、やっぱりそちらで相談したほうが よいのですね><。・・・もうすこし話が理解できるようまでがんばります。

mfhanaane
質問者

補足

他の方のお礼の補足にも書きましたが、とりあえずSQLの部分にミスがあったことがわかりました。 ども、お騒がせいたしました。 後、わからない部分は接続の確立方法とその流れについてです。 なぜ、接続に必要なパラメータの設定方法がいろいろあるの? なぜ、sqlを注入するのがconnectionだったりrecordsetだったりするの? などなど、疑問は山積みです。 この先はもう少し勉強をして技術者向けの方で質問してみます。

関連するQ&A

  • PostgresのViewをExcelのVBAでレコード取得できない

    はじめまして。mady1234と申します。 Postgresを利用した社内ツールを作成しています。 Postgresのテーブルからレコード取得は出来ますが、Viewからの取得が出来ません。エラーが発生します。 実行時エラー'-2147467259(8004005)': 環境はサーバーはVine4.2 Postgres8.3 クライアントのOSはXP Excelは2003です。 色々と検索しましたが、テーブルのレコード取得の方法はあってもビューは見つけれませんでした。 ご教授の程、宜しくお願いいたします。 --------------------------以下、VBAの記述です-------------------  Dim row1,col1, as integer row1=1 col1=1 Dim adoCON As New ADODB.Connection Dim adoRS As ADODB.Recordset Set adoCON = New ADODB.Connection adoCON.CommandTimeout = 0 adoCON.ConnectionString = "DSN=PostgreSQL30;" & _ "uid=postgres;" & _ "pwd=;" adoCON.Open Set adoRS = New ADODB.Recordset adoRS.Source = " SELECT * from View1;" adoRS.ActiveConnection = adoCON adoRS.CursorType = adOpenKeyset adoRS.LockType = adLockOptimistic adoRS.Open Do Until adoRS.EOF Worksheets("sheet1").Cells(row1, col1).Value = adoRS!usuryou adoRS.MoveNext row1 = row1 + 1 Loop adoRS.Close adoCON.Close Set adoRS = Nothing Set adoCON = Nothing

  • ADO1とADO2は意味は同じですか?

    Private Sub ADO1() Dim cn As New ADODB.Connection cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source= " & CurrentProject.FullName cn.Close: Set cn = Nothing End Sub Private Sub ADO2() Dim cn As ADODB.Connection Set cn = New ADODB.Connection cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source= " & CurrentProject.FullName cn.Close: Set cn = Nothing End Sub は、 Dim cn As ADODB.Connection Set cn = New ADODB.Connection を簡素化したものが Dim cn As New ADODB.Connection になるのでしょうか?

  • Excel VBA について教えて下さい

    Excel VBA でAccess接続します 今までは Sub aaa() Set cn = CreateObject("ADODB.Connection") cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=aaa.mdb;" End Sub のように使っていましたが(単一プロシージャ) Set cn = CreateObject("ADODB.Connection") の部分をパブリックにして Sub bbb() cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=aaa.mdb;" End Sub 別のプロシージャからも、使えるためには パブリックにするための方法を教えて下さい

  • ExcelでDBにInsertするには?

    ExcelからAccessデータを追加する際にInsertを使うと思うのですが自力で調べ他のですがうまく登録できません? SQLは全くの素人なので間違いだらけでしょうが、ご指南よろしくお願いします あとテーブル名は全角でも大丈夫でしょうか?(書籍・ネット上ではどれもアルファベットのみでしたので) Sub Macro3() Dim objDB As New ADODB.Connection Dim rcsTB As New ADODB.Recordset Dim StrSQL As String Dim hizuke As Date, id As Integer objDB.Open _ "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=C:\aaa.mdb;" rcsTB.ActiveConnection = objDB hizuke = Date id = 1280 StrSQL = "Insert Into bbb (日付,職員ID) values(hizuke,id)" objDB.Close Set objDB = Nothing End Sub

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

  • 【VBA】アタッチとデタッチについての認識

    VBAを勉強中の者です。カテ違いならすいません。 ******************************************************* Sub test1() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = New ADODB.Connection Set rs = New ADODB.Recordset cn.Open "Provider=SQLOLEDB;Data Source=localhost\SQLEXPRESS; " & _ "Initial Catalog=" & データベース名 & ";" & _ "Integrated Security=SSPI" rs.Open "テーブル1", cn, adOpenStatic, adLockOptimistic MsgBox rs.RecordCount rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub ******************************************************* このコードで アタッチは「Set cn = New ADODB.Connection」、 デタッチは「cn.Close: Set cn = Nothing」 になりますか? ご教授よろしくお願い致します。

  • 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 /------------------------------------------------/

  • エクセルVBAでアクセスのテーブルを操作

    アクセスのテーブルを名前を変えて保存したいのですが、エラー「2486:アクションを実行出来ない。」のメッセージが発生してしまいます。 構文は、以下の通りです。 Sub test() Dim ACC As Object Dim ACCC As ADODB.Connection Dim ACCR As ADODB.Recordset Dim SQL As String Set ACC = Access.Application Set ACCC = New ADODB.Connection Set ACCR = New ADODB.Recordset Const ACCpath = "D:\DB.mdb" SQL = "SELECT * FROM [dammy]" '接続し開く ACCC.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & ACCpath ACCR.Open SQL, ACCC, adOpenStatic, adLockOptimistic ACCR.MoveFirst If ACCR.Fields("日付").Value < DateSerial(Year(Now), 1, 1) Then ACC.DoCmd.CopyObject , "dammy(" & Year(Now) - 1 & "年)", acTable, "dammy" ACC.DoCmd.RunSQL "DELETE [dammy].* FROM [dammy];" End If End Sub エラー発生箇所は、IF文の中です。 対処方法を教えて下さい。 宜しくお願いします。

  • Excel VBA ADODB

    「Excel VBA ADODB」の本を手元にして、Excelのデータ処理を勉強しております。 以下の2つの例では、旨くいきますが、次の3番目では、エラーとなります。delete は、使えないのでしょうか? Const DATA_SOURCE = "Data Source=人事データ.xls;" Const DATA_SOURCE販売管理データ = "Data Source=販売管理データ.xls;" Const DATA_SOURCE商品マスタ = "Data Source=商品マスタ.xls;" Const ExProperties = "Extended Properties=Excel 8.0;" Sub SELECT文によるテーブル結合() ' 570 Dim myConn As New ADODB.Connection Dim myRS As New ADODB.Recordset Dim myField As Field, i As Long myConn.Open ConnectionString:="Provider=Microsoft.Jet.OLEDB.4.0; " & _ DATA_SOURCE販売管理データ & ExProperties ThisWorkbook.Activate Worksheets("570").Activate myRS.Open Source:="SELECT 売上No, 売上.商品コード, 商品名, 単価, 数量 FROM 売上 INNER JOIN 商品マスタ ON 売上.商品コード=商品マスタ.商品コード;", _ ActiveConnection:=myConn i = 1 For Each myField In myRS.Fields Cells(1, i).Value = myField.Name i = i + 1 Next myField Range(Cells(1, 1), Cells(1, i - 1)).Interior.ColorIndex = 35 Range("A2").CopyFromRecordset Data:=myRS myRS.Close: Set myRS = Nothing myConn.Close: Set myConn = Nothing End Sub Sub INSERT文によるレコード追加() ' 571 Dim myConn As New ADODB.Connection Dim myCmd As New ADODB.Command Dim myField As Field, i As Long myConn.Open ConnectionString:="Provider=Microsoft.Jet.OLEDB.4.0; " & _ DATA_SOURCE & ExProperties ThisWorkbook.Activate With myCmd .ActiveConnection = myConn .CommandText = "INSERT INTO 社員マスタ VALUES(11, '石川俊介', '大阪', 25);" .Execute ''' 追加は、範囲の下にデータがあってはいけない。 ''' 追加後、範囲名は広がらない。 ' .CommandText = "UPDATE 社員マスタ SET 所属支店='東京' WHERE 社員No=5;" End With Set myCmd = Nothing myConn.Close: Set myConn = Nothing End Sub Sub DELETE文によるレコード削除() ' 573 Dim myConn As New ADODB.Connection Dim myCmd As New ADODB.Command myConn.Open ConnectionString:="Provider=Microsoft.Jet.OLEDB.4.0; " & _ DATA_SOURCE & ExProperties ThisWorkbook.Activate With myCmd .ActiveConnection = myConn .CommandText = "DELETE FROM 社員マスタ WHERE 社員No=6;" .Execute End With Set myCmd = Nothing myConn.Close: Set myConn = Nothing End Sub

  • ADO 「認証に失敗しました」

    ADOでデータベースに接続したいのですが ”実行時エラー -2147217843(80040e4d) 認証に失敗しました。” になります。 コードは Sub ado() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset cn.Open "Provider = Microsoft.ACE.OLEDB.12.0;Data Source" & CurrentProject.FullName ★ rs.Close cn.Close Set rs = Nothing Set cn = Nothing End Sub です。 ★ 印の所でエラーになります。 宜しくお願いいたします。

専門家に質問してみよう