Access VBAでのADODB.CONNECTIONの書き方

このQ&Aのポイント
  • Access VBAでのADODB.CONNECTIONの書き方を効率化する方法はありますか?
  • Accessのフォームにボタンがあり、それぞれのボタンをクリックするとテーブルの更新・追加・削除を行います。現在は各ボタンのイベント毎にADODB.CONNECTIONのコードを書いていますが、効率的な書き方はありますか?
  • ADODB.CONNECTIONのコードを各ボタンのイベント毎に重複して書くのは無駄だと感じています。効率的な書き方や代替方法があれば教えてください。
回答を見る
  • ベストアンサー

各ボタン毎にADODB.CONNECTIONと書く

各ボタン毎にADODB.CONNECTIONと書いています AccessでVBAを書いています。 Formが3つあるとします。 ・Form1 ・Form2 ・Form3 各フォームにボタンが3個あるとします。 ・Btn1 ・Btn2 ・Btn3 各ボタンをクリックすると、テーブルの更新・追加・削除等の振る舞いをします。 そこで問題が、私は各ボタンのイベント毎に、下記のようなコードを必ず書いています。 フォームが3つ、ボタンが3つの計9つのイベントに書いています。 Dim objADOCON As ADODB.Connection Dim objADORS As ADODB.Recordset Set objADOCON = Application.CurrentProject.Connection Set objADORS = New ADODB.Recordset objADORS.Open "T", objADOCON, adOpenDynamic, adLockOptimistic objADORS.Close objADOCON.Close Set objADORS = Nothing Set objADOCON = Nothing 書いているうちに、同じ事を書いているので無駄のような気がしてきました。 これを解決するには何か良い方法はないでしょうか? 自分で書いていて無駄だなと思っています・・・

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

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

Connectionを開きっ放しにして置くと排他や競合で問題が発生する可能性が高いので、 必要な時だけ開き終わったらすぐ閉じるのが原則かと思います。 細かく書いてゆくのが基本かと考えますが 標準モジュールに Sub myOpenCn・・・ Sub myCloseCn・・ のようなものを作成して 各ボタンには Call myOpenCn 処理・・・・ Call myCloseCn のようにしておけば良いのでは?

mellow91
質問者

お礼

モジュール化すればいいのですね!ありがとうございます!

関連するQ&A

  • レコードセットで得た結果をサブフォームに出力したい

    こんにちは。Access 2010のフォームについてお教え頂けないでしょうか。 下記URLのようにForm1があります。 http://kie.nu/yHO Form1には下記のオブジェクトがあります。 ・テキストボックス tb1 ・ボタン b1 ・サブフォーム sf1 またテーブルが1つあります。 ・テーブル T1 やりたいこと: テキストボックスにキーワードを入力して検索ボタンを押すと、検索結果がサブフォームに表示されるようにしたい。 条件: VBAでやりたい。 そこで下記のコードを書いてみました。 Private Sub cmd_exe_Click() Dim objADOCON As ADODB.Connection Dim objADORS As ADODB.Recordset Dim SQL As String Set objADOCON = Application.CurrentProject.Connection Set objADORS = New ADODB.Recordset SQL = "select * from T1 where keyword = '" & tb1 & "'" objADORS.Open SQL, objADOCON, adOpenKeyset, adLockOptimistic ここまではできて、無事にレコードセットも取得することができました。 しかし、ここでつまってしまって、どのように結果をサブフォームに出力していいのかわかりません。 こちらお教え頂けないでしょうか。宜しくお願いします。

  • ACCESSでレコード数の取得の仕方

    Aテーブルのレコード数を取得しようと思い、次のPGを考えました。(Aテーブルには10件のデータが入っています。)ですが、「-1」という数値が返ってきます。なぜでしょうか? Dim objADOCON As ADODB.Connection Dim objADORS As ADODB.Recordset Dim strSQL As String Set objADOCON = Application.CurrentProject.Connection strSQL = "SELECT * FROM Aテーブル" Set objADORS = objADOCON.Execute(strSQL) MsgBox objADORS.RecordCount , vbOKOnly, "レコード数"

  • Access VBAでのデータ抽出の仕方

    Access VBAでのデータ抽出の仕方 Access VBAでデータを抽出して、テキストボックスにデータを配置したいと思います。 Formにtxt1~txt10までのテキストボックスが10個あります。 テーブルからデータを引っ張ってきてレコードセットにいれます。 Dim objADOCON As ADODB.Connection Dim objADORS As ADODB.Recordset Dim strSQL As String Dim SQL As string SQL = "Select * from Table1" Set objADOCON = Application.CurrentProject.Connection Set objADORS = objADOCON.Execute(SQL) これでレコードセットを取得しました。このレコードセットは「ID」列があり、プライマリーキーを設定しています。またZAIKOという列もあります。 ID=001の時、在庫は100 ID=002の時、在庫は200 といったように条件を絞って、テキストボックスに値を入れたいと思います。 objADORS.Filter = "[ID] = '001'" txt1.value = objADORS!ZAIKO objADORS.Filter = "[ID] = '002'" txt2.value = objADORS!ZAIKO ..... を10回繰り返せば条件毎に値がセットするのはわかります。 ただし、あまりスマートなやり方ではなく、もっといい方法があるんじゃないかと思うのですが考えつきません。 何か良い方法、手段がありましたらお教え下さい。 よろしくお願いします。

  • 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しなくてもメモリの開放は行われているのでしょうか? アドバイスよろしくお願いいたします。

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

    Access ADO RecordSetについて質問です。 Openイベントでフォームにレコードセットを挿入しています。 その際のフォームにはレコードセットをコントロールソースとしてテキストボックスが10個ほどあります。 しかし、テキストボックスを修正しようとしても、入力が出来ません。 レコードセットの作り方が悪いのか、フォームがおかしいのかわかりません。 流れとしては、帳票フォームより、単票フォームを呼び出し、IDでSQLを発行し、レコードセットを挿入しています。 その単票フォームは修正フォームとして更新したいのですが、入力が出来ず困っています。 詳しい方や同じ事で悩んだ方のアドバイスよろしくお願いいたします。 Private Sub Form_Open(Cancel As Integer) Call SetRecordSet("SELECT * FROM T_Agent WHERE ID =" & Me.OpenArgs, Me) End Sub Public BackEndCn As ADODB.Connection Public BackEndRs As ADODB.Recordset Public Sub SetRecordSet(strSQL As String, FormName As Form) Set BackEndCn = New ADODB.Connection Set BackEndRs = New ADODB.Recordset BackEndCn.ConnectionString = DbPass BackEndCn.Open BackEndRs.Open strSQL, BackEndCn, adOpenKeyset, adLockOptimistic Set FormName.Recordset = BackEndRs BackEndRs.Close: Set BackEndRs = Nothing BackEndCn.Close: Set BackEndCn = Nothing End Sub

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

  • ADO オブジェクトの渡し方

    こんにちは。ADOについてお教えください。 フォームをロード時に接続プロシージャと切断プロシージャを走らせたいと思います。 ConnectDatabaseを呼び出しは成功しますが、CloseDatabase呼び出しには失敗します。 スコープの問題で、rs、cnのオブジェクトが無い為だと思います。 ConnectDatabaseで作成されたcn、rsオブジェクトを別の関数で処理するにはどのようにコードをかけばよろしいでしょうか?宜しくお願い致します。 Private Sub Form_Load() Call ConnectDatabase Call CloseDatabase End Sub Module1 ------------------ sub ConnectDatabase() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = New ADODB.Connection Set rs = New ADODB.Recordset 処理~~~~ end sub sub CloseDatabase() rs.Close cn.Close Set rs = Nothing Set cn = Nothing end sub

  • Access VBA フォームに表示したい

    Access2000で、帳票フォームにSQLの値を表示させたいのですが、 以下のコードだとフォーム上に最後のレコードしか表示されません。 取得したデータを正しく表示するにはどうしたらよいでしょうか。 ・フォームのtext1のコントロールソースにfld1と書く 以外の方法でできますか? できればすべて非連結で、作成したいです。 (本当はフォームのrecordsourceも設定したくないのですが それは無理でしょうか?) よろしくお願いいたします。 Private Sub Form_Load() Dim conn As Connection Dim rs As ADODB.Recordset Dim strSql As String Set conn = CurrentProject.Connection Set rs = New ADODB.Recordset strSql = "select * from table1" rs.Open strSql, conn, adOpenKeyset, adLockOptimistic, adCmdText Me.RecordSource = strSql rs.MoveFirst Do Until rs.EOF me!text1 = rs!fld1 rs.MoveNext Loop rs.Close Set rs = Nothing conn.Close Set connn = Nothing End Sub

  • VBA 抽出条件でデータ型が一致しません

    Access 2003について教えて下さい。環境はWin XPです。 Table1 ID(メモ型),日付(日付/時刻型 書式 日付(S)) 001,2012/08/10 002,2012/08/10 Form1 フォームにはテキストボックス、 txt_Dateがあります。 書式は日付(S)です。 ここには、yyyy/mm/ddの形式で値を打ち込む、またはカレンダーから選択します。 同じくボタン、btn_exeがあります。 これをクリックすると処理がはじまります。 Dim getDate As Date Dim strSQL As String Dim objADOCON As ADODB.Connection Dim objADORS As ADODB.Recordset getDate = txt_Date.Value strSQL = "select * from Table1 where 日付 = '" & getDate & "'" objADORS.Open strSQL, objADOCON, adOpenKeyset, adLockOptimistic 質問1. where 日付 = '" & getDate & "'" でやると下記のメッセージが表示されます。 抽出条件でデータ型が一致しません where 日付 = " & getDate でやると、エラーメッセージは起こりません。 何故このようなメッセージが表示されるのでしょうか? 質問2. Table1には2012/08/10というデータが日付フィールドに存在します。 where 日付 = " & getDate ではエラーメッセージが出ないので、 次のレコードセット取得時、レコード取得件数が0件です。 条件文が上手くいっていないような気がします。なぜでしょうか? ちなみに、 strSQL = "select * from Table1 では問題なくレコードセットを取得できています。 宜しくお願いします。

  • 【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」 になりますか? ご教授よろしくお願い致します。