VBAでACCESSデータベースを操作する方法

このQ&Aのポイント
  • PowerPoint2007でVBAを学んでいる方におすすめのACCESS2007のデータベース操作方法です。
  • VBAのコードで、ACCESS2007のデータベースに接続し、SQL文を実行して結果を取得する方法を解説します。
  • TextBox1のテキストに、SQLで実行した結果を表示するための記述方法について説明します。
回答を見る
  • ベストアンサー

お世話になっております。

お世話になっております。 現在PowerPoint2007のVBAの勉強をしております。 DBにACCESS2007を使用しております。 Private Sub TextBox1_Change() Dim con As New ADODB.Connection Dim rs As New ADODB.Recordset Dim connectionString As String '接続文字列の設定------------------------------------------------------ connectionString = "provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=C:\Documents and Settings\デスクトップ\table.mdb" con.connectionString = connectionString '接続 con.Open 'SQL文を実行(RecordSETで受け取ります)-------------------------------- Set rs = con.Execute("SELECT * FROM table2") TextBox1.Text = ????? '接続を閉じる---------------------------------------------------------- con.Close Exit Sub End Sub こちらがVBAのコードです。 TextBox1.Text = ????? の部分にSQLで実行した 結果を入れたいのですがどのようにすればいいのか わかりません。 解る方、参考になるHP等ありましたら教えていただければ 幸いです。 何卒よろしくお願いします。

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

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

参考として、アクセスVBAでは 「社員2 クエリ」が正しく表示されるアクセスのクエリとして フォームにリストボックス(リスト0)とコマンドボタン(コマンド2)が貼り付けてあって Private Sub コマンド2_Click() Me.リスト0.RowSource = "社員2 クエリ" Me.リスト0.ColumnCount = 5 '列数 End Sub を入れておくと、ボタンをクリックすると「社員2 クエリ」の結果の明細が、リストボックスのアイテムに表示される。テスト済み。 アクセスではこのようにSQLの結果を指定するような仕組みも備わっている。 ーー そもそも、SQLの実行結果は、検索結果が複数ある場合も該当レコード全部を一体として表示されたりするものです。 ーー しかし世の中では、その結果についてレコードごとに処理したいニーズは多い。カーソル処理というニーズです。 http://msdn.microsoft.com/ja-jp/library/cc389735.aspx このニーズに対しては、SQLでADOを開くと、ADOがそれに相応しい働きをしてくれる。 逆にADOではリストボックスなどのアイテムの明細を1行ずつセットしないといけないということです。 私の場合は社員2という.mdbがあります。 質問のコードを使って Sub test16() Dim con As New ADODB.Connection Dim rs As New ADODB.Recordset Dim connectionString As String '接続文字列の設定------------------------------------------------------ connectionString = "provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=C:\Documents and Settings\xxxx\xxxxxxx\社員2.mdb" con.connectionString = connectionString '接続 con.Open 'SQL文を実行(RecordSETで受け取ります)-------------------------------- Set rs = con.Execute("SELECT * FROM 社員2") rs.MoveFirst While Not rs.EOF MsgBox rs.Fields(1) rs.MoveNext Wend rs.Close con.Close Set rs = Nothing Set con = Nothing End Sub を実行する(テスト済み)と、氏名(私の場合、社員2のテーブルの社員2の場合Fields(1)は氏名)が表示されます。 これを質問者の場合に変えてやってみて納得してください。 ーー この先にやることは、テキストボックスの文字列TextBox1.Text を レコードのフィールドの値&復帰改行 で作ってください。 上記Msgboxの行が TextBox1=textBox1&rs.Fields(1)&vbCrLf になる。 テキストボックスのプロパティはマルチラインをTrueにしておく必要があると思います。 ーーー そのほかに、リストボックスのアイテムなどを、配列に値を入れて、その配列をRowSourceに指定する方法もあるようだが、略。

rizaruto
質問者

お礼

回答ありがとうございます。 問題が解決し、前に進めそうです。 改行しないといけないのはすっかり 忘れていました。細々としたご指摘 ありがとうございました。

その他の回答 (1)

  • 0909union
  • ベストアンサー率39% (325/818)
回答No.1

>Set rs = con.Execute("SELECT * FROM table2") 良くわかりません。これは何かのサンプルを見て書いたと思いますが、そこに記述されていなかったのでしょうか? とりあえず、RSにセットされる物は、”レコードセット”です。この言葉がわかるような参考書を買ってよんでください。それでないと、だぶんわからないでしょう。と言うのも、ここまで記述して質問してくるという事は、RDBMSとOLE DBとADOがわからずに質問しています。 あなたがわからないといっている技術は「ADO」です。その参考書を買って、レコードセットの意味を勉強してください。 一応本家のリファレンスサイトを示します。英語サイトの方が本家なので詳細に説明があります。日本語では、ない物もあります。 http://msdn.microsoft.com/ja-jp/library/cc364264(v=MSDN.10).aspx http://msdn.microsoft.com/en-us/library/ee663264(v=VS.85).aspx

rizaruto
質問者

お礼

回答ありがとございます レコードセット=SQLで抽出した表と捉えていました。 一応ADOを使っているということは把握しております (でないと参照設定ができないので) HPは参考にさせていただきます。 ありがとうございました。

関連するQ&A

  • recordsetが取得できなかった場合

    Access2003のVBAについて質問です。 recordsetが取得できなかった場合、どういった値が返されるのでしょうか? やりたい事は、recordsetが取得できた時、できなかった時でメッセージの表示を変えたいです。 ご教授よろしくおねがいします。 Public Sub Exsample() 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 クラス = 'TS'" RS.Open SQL, CN, adOpenKeyset, adLockOptimistic

  • Excel-VBAでMySQのレコード件数を得たい

    Excel-VBAでレンタルサーバーにあるMySQLのテーブルのレコード件数を得たいのですが、うまくいきません。 色々と調べて下記のようなコードにしたのですが、結果「-1」と表示されます。 レコードは1500件ほどあります。 Excel-VBAからテーブルにレコードを挿入したり、Excel-VBAにレコードをもってきたりはできますので、アクセス自体は問題ないと思います。 どうにも分からず困ってます、どなたか教えてください。 環境としては、Excel2000 WindowsXP MySQL5 ver5.xx です。 Sub testxx() Dim con As ADODB.Connection Dim rs As ADODB.Recordset Dim connectionString As String Dim kensu As Integer connectionString = "Driver={MySQL ODBC 5.1 DRIVER};" _ & " SERVER=xxxx.xxxx.jp;" _ & " DATABASE=xxxDB;" _ & " USER=xxxuser;" _ & " PASSWORD=xxxpass;" Set con = New ADODB.Connection con.Open connectionString sqlStr = "select * from LinkTable" Set rs = con.Execute(sqlStr) 'kensu:件数----------- kensu = rs.RecordCount MsgBox (kensu) 'kensu:件数----------- con.Close End Sub

  • 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でRecordsetオブジェクトをレコードソースに設定したい

    Access2000を使っています。リンクテーブルを使わずに、ODBCで繋いだDBのテーブルをフォームのレコードソースにセットしたいのですが、可能でしょうか。 宜しくお願いします。 Private Sub FormNoKansu() Dim cn as New ADODB.Connection Dim rs as New ADODB.Recordset Dim strSql as String 'ODBCでサーバーに接続 cn.ConnectionString = "ODBCでMySQLに..." ... strSql = "SELECT * FROM ..." rs.Open strSql, cn 'ここに[rs]を入れられたらと思っています Me.Recordset = "" End Sub

  • 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テーブル;" でもエラーになりませんでした。

  • オラクルのデータをAccessに追加 無限ループ

    前回、オラクルからデータを取り出し、Accessのテーブルに書き込みを教えて頂き、データ追加は出来たのですが、データ追加時に無限ループが発生しました。 【環境】 Oracle:10g Access:2010 Dim CON As New ADODB.Connection 'Oracle側コネクション Dim RS As ADODB.Recordset 'Oracle側レコードセット Dim SQL As String 'Oracle側SQL文 Dim i As Integer '処理用インクリメント Dim DT As Date '抽出日付変数(日付型) Dim sDT As String '抽出日付変数(テキスト型) Dim RS2 As ADODB.Recordset 'Access側レコードセット ◎現在の状況 Dim CON As New ADODB.Connection Dim RS As ADODB.Recordset Dim SQL As String Dim i As Integer 'DB接続定義 CON.Open "DSN=DNS名;UID=ユーザー名;PWD=パスワード;" 'SQL文 SQL = "SELECT " SQL = SQL & "カラム1," SQL = SQL & "カラム2," SQL = SQL & "カラム3" SQL = SQL & "FROM オラクルテーブル名 " SQL = SQL & "WHERE 抽出条件 " SQL = SQL & "AND 抽出条件" SQL = SQL & "GROUP BY カラム" SET RS = CON.EXCUTE(SQL) ’取得したレコード数表示 MsgBox "オラクル側のレコード数は: " & RS.RecordCount (1)↑↑↑オラクルから、抽出したレコード数表示 rs2.Open "新しいテーブル名", CurrentProject.Connection, adOpenKeyset, adLockOptimistic rs.MoveFirst Do Until rs.EOF rs2.AddNew rs2!カラム1 = rs!カラム1 rs2!カラム2 = rs!カラム2 rs2!カラム3 = rs!カラム3 rs2.Update rs2.Close: Set rs2 = Nothing rs.close: SET RS = Nothing con.close:SET CON=Nothing end sub 上記を実行したところ、いくら待っても処理がおわらず、強制終了をかけた所、新テーブルには、約150万件追加されてました。 (1)でオラクルから抽出した、レコード数を表示させてみた所、-1でした。 ◎疑問点、 -1ってありえない数値だと思うのですが。 ちなみに、オラクル側で同様のSQLを実行させた所、取得件数は48件でした。 上記について、ご存じの方がいらっしゃいましたら、アドバイスお願いいたします。

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

  • ExcelからAccessのテーブルの値の取得ができない

    Excel2003からAccess2003のDBの値を取得するVBAを作成中なのですが、 ExcelのフォームにてTextBox1に入力した社員番号からネットワーク接続されたサーバーにあるmdbファイルから値を取得する内容で 以下のエラーが表示されます。  「実行時エラー '-2147217904 (80040e10)':   1つ以上の必要なパラメータの値が設定されていません。」 デバッグをすると、「rs1.Open sql1, con」の箇所と指摘されます。 以下にコードを貼り付けますので、間違っている点のご指摘をお願いいたします。 Private Sub CommandButton2_click() Dim shainID As Long Dim constr As String '接続文字列の定義 Dim con As ADODB.Connection Dim rs1 As ADODB.Recordset If TextBox1.Value = "" Then MsgBox "社員番号を入力してください", vbOKOnly + vbCritical, "社員番号入力エラー" TextBox1.SetFocus Else shainID = TextBox1.Value Range("B13").Value = shainID 'Connectionの設定 Set con = CreateObject("ADODB.Connection") constr = "provider = Microsoft.Jet.OLEDB.4.0;Data Source = \\192.168.1.100\ShainDB\shaindb.mdb" 'DB接続 con.Open constr 'RecordSetの作成 Set rs1 = CreateObject("ADODB.Recordset") 'SQL sql1 = "select 社員漢字氏名,性別,生年月日,電話番号,住所 from 社員テーブル where 社員番号 = shainID" If sql1 = "" Then MsgBox "入力した社員番号の社員はいません。", vbOKOnly + vbCritical, "社員番号入力エラー" TextBox1.SetFocus Else 'SQLを実行して対象をRecordSetに入れる rs1.Open sql1, con Set rs1 = con.sql1 Range("B14").Value = 社員漢字氏名 Range("B15").Value = 性別 Range("B16").Value = 生年月日 Range("B17").Value = 電話番号 Range("B18").Value = 住所 Unload Me 'フォームを閉じる End If End If End Sub

  • VB6とSQL SERVER 2005のADO接続方法

    VB6とSQL SERVER 2005(Developer Edition)のADO接続方法がわかりません。 今までSQLSERVER2000で開発していたのですが、DBをSQLSERVER2005に 変更したところ接続できませんでした。 以下はSQLSERVER2000時のソースなのですが、 2005の場合ConnectionStringはどうやればいいのでしょうか? --------------------------------------- Dim rs As ADODB.Recordset Dim cn As ADODB.Connection Set rs = New ADODB.Recordset Set cn = New ADODB.Connection cn.ConnectionString = "Provider=SQLOLEDB.1;" & _ "User ID=" & strUsr & ";" & _ "Data Source=" & strSvr & ";" & _ "Password=" & strPass cn.CursorLocation = adUseClient cn.Open --------------------------------------- 初歩的な質問で申し訳ありませんがどなたかお助けください。

  • データ型が一致しない?

    エクセルのVBAでユーザーフォームから、アクセスのデータを取得して ユーザーフォームのテキストボックス、コンボボックスに取得させたデータ を表示させようとしています。 TextBox1に顧客IDを0001234のように7桁の数字を入力すると、アクセスの 「T_メイン」テーブルからIDが一致するレコードを取得して、フィールド「クライアント名」、 フィールド「営業所」、フィールド「担当者」のデータをテキストボックスや コンボボックスに表示させたいのです。 それで、以下のようなコードを記入しました。 Private Sub TextBox1_Change() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim SelCmd As String If Len(TextBox1.Value) = 7 Then Set cn = New ADODB.Connection cn.ConnectionString = "Provider=Microsoft.jet.OLEDB.4.0;" _ & "Data Source=D:\管理表.mdb" cn.Open SelCmd = "SELECT * FROM T_メイン " _ & "WHERE 顧客ID = " & TextBox1.text Set rs = New ADODB.Recordset rs.Open SelCmd, cn, adOpenKeyset, adLockOptimistic TextBox2.Value = rs!クライアント名 ComboBox2.Value = rs!営業所 ComboBox3.Value = rs!担当者 rs.Close Set rs = Nothing cn.Close Set cn = Nothing End If End Sub しかし、これを実行させると、 rs.Open SelCmd, cn, adOpenKeyset, adLockOptimistic の部分でエラーがでてしまいます。 「抽出条件でデータ型が一致しません」のエラーメッセージです。 アクセス側の顧客IDの部分はテキスト型ですし、TextBoxもテキスト ですから、一致しているのでないでしょうか? なぜなんでしょう? 参考書とかネットとか見様見真似でやってるので、ものすごく変な部分が あるのかもしれませんが、どうかご教授願います。