ADO Connection を再利用する方法

このQ&Aのポイント
  • ADO Connection を再利用するための方法を紹介します。
  • VB .NET 2005 での ADO Connection の再利用に関するエラーについて解決方法を探っています。
  • VB.NET で ADO Connection を再利用する際にエラーが発生し、解決策を模索しています。
回答を見る
  • ベストアンサー

ADO Connection を再利用する方法

【環境】 OS:Windows Server 2003 DB:SQL Server 2005 言語:VB .NET 2005 現在、Windows2000Server + SQLServer2000 + VB6の環境を 上記の環境に移行しております。 ADO Connectionの再利用で 「手動または分散トランザクションモードのため、新規接続を作成できません」 というエラーが発生します。 いろいろと検索してみたのですが、解決せず、お力をお貸しいただきたいと思って投稿させていただきます。 現在のコードは、 -------------------------------------------- Public adoCn As ADODB.Connection Public adoRs As ADODB.Recordset Public Sub pfAutoClosed()  If fGet印刷ジャーナルファイルRecordset() = True Then    '*********************    'トランザクションの開始    '*********************    adoCn.BeginTrans()    '印刷ジャーナルファイルのロック    sMySQL = "SELECT * FROM 印刷ジャーナルファイル WITH (TABLOCKX)"    adoCn.Execute(sMySQL, , ADODB.CommandTypeEnum.adCmdText)    '職員表マスタのロック    sMySQL = "SELECT * FROM 職員表マスタ WITH (TABLOCKX)"    adoCn.Execute(sMySQL, , ADODB.CommandTypeEnum.adCmdText) <---- ここでエラー発生    adoRs.MoveFirst()    Do Until adoRs.EOF      iKubun = nz(adoRs.Fields("区分").Value)      '*****************      '1.職員表マスタの作成      '*****************      'SQLステートメントを作成      sMySQL = "INSERT INTO 職員表マスタ (~以下省略)"      adoCn.Execute(sMySQL, , ADODB.CommandTypeEnum.adCmdText)      '**************************      '2.更新区分に更新フラグを設定      '**************************      sMySQL = "UPDATE 印刷ジャーナルファイル " & "SET 更新区分 = 1 (~以下省略)"      adoCn.Execute(sMySQL, , ADODB.CommandTypeEnum.adCmdText)      adoRs.MoveNext()    Loop    adoCn.CommitTrans() 'トランザクション処理のコミット    adoRs.Close()    adoRs = Nothing  endif End Sub '***************************************** '印刷ジャーナルファイルのレコードセットを取得 '***************************************** Private Function fGet印刷ジャーナルファイルRecordset() As Boolean   adoRs = New ADODB.Recordset   With adoRs     .let_Source("SELECT * FROM 印刷ジャーナルファイル " & "WHERE 発行区分 = 1 AND 更新区分 = 0")     .let_ActiveConnection(adoCn)     .CursorType = ADODB.CursorTypeEnum.adOpenKeyset     .LockType = ADODB.LockTypeEnum.adLockPessimistic     .Open()   End With   If adoRs.EOF Then     fGet印刷ジャーナルファイルRecordset = False   Else     fGet印刷ジャーナルファイルRecordset = True   End If End Function -------------------------------------------- となっています。 pfAutoClosed関数内で、同じadoCnを使用しての2度目のSELECT文が実行できません。 ADO Connectionの再利用ができないということで、「Close」をしてくださいという記述を参考にもしたのですが、解決しておりません。 トランザクション開始位置も変更してみたのですが、だめでした。 VB->VB.NETへのアップグレードウィザードを使用したのですが、移行以前のVB6のバージョンではエラーなく動作します。 間違っている点をご指南いただければと思います。 よろしくお願いいたします。

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

  • ベストアンサー
  • kero_mio
  • ベストアンサー率90% (94/104)
回答No.1

問題の原因だと思われる箇所が2つあります。 ・fGet印刷ジャーナルファイルRecordsetで定義しているadoRsの  レコードセットがCloseされていない ・adoCn.BeginTrans()の開始が早すぎる。  adoCn.Execute(sMySQL, , ADODB.CommandTypeEnum.adCmdText)の  後に、adoCn.BeginTrans()すべきです。 なので、纏めると Public adoCn As ADODB.Connection Public adoRs As ADODB.Recordset Public Sub pfAutoClosed()  If fGet印刷ジャーナルファイルRecordset() = True Then    '印刷ジャーナルファイルのロック    sMySQL = "SELECT * FROM 印刷ジャーナルファイル WITH (TABLOCKX)"    adoCn.Execute(sMySQL, , ADODB.CommandTypeEnum.adCmdText)    '職員表マスタのロック    sMySQL = "SELECT * FROM 職員表マスタ WITH (TABLOCKX)"    adoCn.Execute(sMySQL, , ADODB.CommandTypeEnum.adCmdText) <---- ここでエラー発生    adoRs.MoveFirst()    'トランザクションの開始は、ここから行う    adoCn.BeginTrans()    Do Until adoRs.EOF      iKubun = nz(adoRs.Fields("区分").Value)      '*****************      '1.職員表マスタの作成      '*****************      'SQLステートメントを作成      sMySQL = "INSERT INTO 職員表マスタ (~以下省略)"      adoCn.Execute(sMySQL, , ADODB.CommandTypeEnum.adCmdText)      '**************************      '2.更新区分に更新フラグを設定      '**************************      sMySQL = "UPDATE 印刷ジャーナルファイル " & "SET 更新区分 = 1 (~以下省略)"      adoCn.Execute(sMySQL, , ADODB.CommandTypeEnum.adCmdText)      adoRs.MoveNext()    Loop    adoCn.CommitTrans() 'トランザクション処理のコミット    adoRs.Close()    adoRs = Nothing  endif End Sub '***************************************** '印刷ジャーナルファイルのレコードセットを取得 '***************************************** Private Function fGet印刷ジャーナルファイルRecordset() As Boolean   adoRs = New ADODB.Recordset   With adoRs     .let_Source("SELECT * FROM 印刷ジャーナルファイル " & "WHERE 発行区分 = 1 AND 更新区分 = 0")     .let_ActiveConnection(adoCn)     .CursorType = ADODB.CursorTypeEnum.adOpenKeyset     .LockType = ADODB.LockTypeEnum.adLockPessimistic     .Open()   End With   If adoRs.EOF Then     fGet印刷ジャーナルファイルRecordset = False   Else     ' 必ずCloseする     adoRs.Close()     fGet印刷ジャーナルファイルRecordset = True   End If   ' Nothingを必ず入れる   Set adoRs = Nothing   ' または、 Set文なしで、adoRs = NothingでもOKかも? End Function ご参考になれば、幸いです。

sarah_pico
質問者

補足

回答ありがとうございます。 参考にさせていただき、試してみました。 1.fGet印刷ジャーナルファイルRecordsetで定義しているadoRsの  レコードセットがCloseされていない   →これについてはadoRsの値をpfAutoClosed()で使用している    ため、fGet印刷ジャーナルファイルRecordset()内でClose    することができません。    実際には、pfAutoClosed()のEnd Sub3行前でCloseして    います。 2.adoCn.BeginTrans()の位置を変更する   →adoCn.Execute(sMySQL, , ADODB.CommandTypeEnum.adCmdText)    の後にadoCn.BeginTrans()を変更した場合、    一つ目のadoCn.Execute(sMySQL, , ADODB.CommandTypeEnum.adCmdText)    のところでフリーズしてしまい動かなくなります。 ややこしくて申し訳ありませんが、見落としている点ありましたらご教授ください。 それと、印刷ジャーナルファイルと職員表マスタのロックが必要なのですが、このようなSELECT文の発行以外での実現方法はあるのでしょうか。

その他の回答 (1)

  • kero_mio
  • ベストアンサー率90% (94/104)
回答No.2

>1.fGet印刷ジャーナルファイルRecordsetで定義しているadoRsの >レコードセットがCloseされていない >  →これについてはadoRsの値をpfAutoClosed()で使用している >   ため、fGet印刷ジャーナルファイルRecordset()内でClose >   することができません。 >   実際には、pfAutoClosed()のEnd Sub3行前でCloseして >   います。 どういうトランザクション単位で、処理したいのでしょうか? まずはそこからですね。 別に、adoRsは、pfAutoClosed()用と、fGet印刷ジャーナルファイルRecordset()用と 2種類のRecordsetを定義しても問題はないですよね? また、Connection(adoCn)についても同じことです。 「○○で使用しているからできません」ではなく、 「トランザクションの単位」がこうなっているから、ここは別けられないと いう説明がない限り、具体的な解決案を出せませんので、 SELECT系と更新(INSERT, UPDATE, DELETE)のトランザクションは どういうくくりで処理したいのでしょうか? そこを補足ください。 >2.adoCn.BeginTrans()の位置を変更する >  →adoCn.Execute(sMySQL, , ADODB.CommandTypeEnum.adCmdText) >   の後にadoCn.BeginTrans()を変更した場合、 >   一つ目のadoCn.Execute(sMySQL, , ADODB.CommandTypeEnum.adCmdText) >   のところでフリーズしてしまい動かなくなります。 フリーズするとは、どのような現象でしょうか?どのようなエラーが出ますか? また、先ほども申し上げた通り、処理したいトランザクションの単位がわからなければ、 adoCn.BeginTrans() の書く位置もまた変わってきますので、 「処理したいトランザクション単位」を教えてください。 ただ、見ている限り、SELECT系と更新系のConnection(adoCnを2種類)と トランザクション(adoCnを2種類用意するとトランザクションは別けられます)は わけてしまっても問題無いようには、見えます。 もう少し情報を精査して頂き、「エラーになるから」ではなく、最終的に何ができればいいのか? の情報をお寄せ頂けると幸いです。 よろしくお願いします。

関連するQ&A

  • ADO接続によるストアド

    あまりDB接続などに詳しくないので、 うまく説明できないと思いますがご了承下さい。 環境は Win2000+VB6+SQLSERVER2000+ADO2.5 やりたいことは、 SQLSERVERに設定してあるストアドがあります。 そのストアドをVB上から呼び出し結果を得たいわけです。 ストアドは、1つのパラメータを与えることで、 そのパラメータの最大値を取得してきます。 そして、データベース内では最大値が+1されているというものです。 現在 Dim adoCon As ADODB.Connection Dim adoCmn As ADODB.Command Dim adoRs As ADODB.Recordset ''DBに接続 Call DB接続関数(adoCon) Set adoCmn = New ADODB.Command Set adoRs = New ADODB.Recordset adoCmn.ActiveConnection = adoCon adoCmn.CommandText = "EXEC ストアド名 'パラメータ'" adoRs.Open adoCmn という状態で、ストアド自体は動作することができました。 しかし、最大値を取得することができません。 adoRsにはきちんとレコードセットが返ってきてない感じです。 どうすれば、最大値を取得できるでしょうか?

  • エクセル ADO Filterでは一気に削除はできないのですか?

    カテ違いならすいません。 Tメインテーブルの番号フィールド(主キーではない為重複がある)に該当の番号があればそのレコードを削除するアクセスVBAを考えているのですが行き詰っています。 Public ADOrs As ADODB.Recordset Public cn As ADODB.Connection **************************************************** Sub 削除1() Set cn = New ADODB.Connection cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & CurrentProject.Name 番号 = Forms("フォーム1").Controls("番号").Value Set ADOrs = New ADODB.Recordset ADOrs.Open "SELECT * FROM Tメイン", cn, adOpenKeyset, adLockOptimistic ADOrs.Filter = "番号 = '" & 番号 & "'" ADOrs.Delete ADOrs.Update ADOrs.Close: Set ADOrs = Nothing cn.Close: Set cn = Nothing End Sub **************************************************** ↑これで もし、Tメインの番号フィールドに該当の番号が3レコート゛あれば全部一気にDelete出来るわけではないのですか? 一気にフィルタにかかっているレコードを削除できると思ってたのですが1レコート゛ずつのようです。 しかし **************************************************** Sub 削除2() Set cn = New ADODB.Connection cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & CurrentProject.Name 番号 = Forms("フォーム1").Controls("番号").Value Set ADOrs = New ADODB.Recordset ADOrs.Open "SELECT * FROM Tメイン", cn, adOpenKeyset, adLockOptimistic ADOrs.Filter = "番号 = '" & 番号 & "'" Do While ADOrs.RecordCount <> 0 'あるなら ADOrs.Delete ADOrs.Update '保存 Loop ADOrs.Close: Set ADOrs = Nothing cn.Close: Set cn = Nothing End Sub **************************************************** としたら 実行時エラー '-2147217887 (80040e21)': 複数ステップの OLE DB の操作でエラーが発生しました。各 OLE DB の状態の値を確認してください。作業は終了しませんでした。 のエラーになりました。 なので、 **************************************************** Sub 削除3() Set cn = New ADODB.Connection cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & CurrentProject.Name 番号 = Forms("フォーム1").Controls("番号").Value Set ADOrs = New ADODB.Recordset ADOrs.Open "SELECT * FROM Tメイン", cn, adOpenKeyset, adLockOptimistic ADOrs.Filter = "番号 = '" & 番号 & "'" Do While ADOrs.RecordCount <> 0 'あるなら ADOrs.Delete ADOrs.Update '保存 ADOrs.Close: Set ADOrs = Nothing Set ADOrs = New ADODB.Recordset ADOrs.Open "SELECT * FROM Tメイン", cn, adOpenKeyset, adLockOptimistic ADOrs.Filter = "番号 = '" & 番号 & "'" Loop ADOrs.Close: Set ADOrs = Nothing cn.Close: Set cn = Nothing End Sub **************************************************** と言うように1レコートずつまわしていくしかないのでしょうか? 削除3はプログラムとして少し変かな?と思うのですが どうでしょう? よろしくお願いします。

  • Excel VBA : Accessのデータを検索

    Excel VBA を使って、Accessのデータを検索したい。 除外テーブルには「管理ID」レコードが在り、ユニークな番号を登録してあります。 やりたいことは、除外テーブルの管理IDに在るであろう、"E003"の有無を確認したいと思います。 作ってみたソースコードは、以下の通り。 Private Sub aSearch_Click() DB.TableOpen ("db_name.mdb") 'Accessのファイル DB.FindRecode ("E003")  ' 検索対象文字列 DB.TableClose End Sub ------------------------------ここから、標準モジュール Public adoCn As ADODB.Connection Public adoRs As ADODB.Recordset Public fSql As String Public fRow As Integer 'データ ソースへの接続と、レコードセットへの接続 Sub TableOpen(ByVal mdb_name As String) Set adoCn = New ADODB.Connection 'データ ソースへの接続 adoCn.Provider = "Microsoft.Jet.OLEDB.4.0" 'Accessへ接続プロバイダ名 adoCn.Open mdb_name '接続するmdbファイル名" fSql = "select 管理ID from 除外テーブル" Set adoRs = New ADODB.Recordset 'レコードセットへの接続 adoRs.Open fSql, adoCn, adOpenKeyset, adLockReadOnly 'クエリーの実行 ' adoRs.Open "除外テーブル", adoCn, adOpenKeyset, adLockReadOnly 'クエリーの実行 End Sub 'レコード(管理ID)の検索 Function FindRecode(ByVal findName As String) As String adoRs.Find adoRs.Fields("管理ID") & "=" & findName     '← ここでエラーとなる  If adoRs.RecordCount = 0 Then MsgBox "該当するレコードは存在しません" FindRecode = "" Exit Function Else Do     ' Doループは、要らないかも??? Debug.Print adoRs.Fields("管理ID") & "/" & adoRs.Fields("登録日") adoRs.MoveNext Loop Until adoRs.EOF End If FindRecode = adoRs.Fields("管理ID") End Function 'データ ソースへの接続と、レコードセットを切断する Sub TableClose() adoRs.Close 'クエリーを閉じる adoCn.Close 'データ接続を閉じる Set adoRs = Nothing Set adoCn = Nothing End Sub ------------- ここまで データのソースから、検索する方法が良く判っておらず、Open / find の使い方はこれで良いのでしょうか。 以上、よろしくお願いします。

  • Access2007からADO接続にてEXCEL

    Access2007からADO接続してEXCELのシートにSELECT文を発行すると、 『[Microsoft][ODBC Excel Driver]選択された CollatingSequence は OS でサポートされていません。』のエラーが出ます。 SELECT文に条件を付けると上記エラーが発生します、条件なしの場合はエラーが発生しません。 エラーが発生してもデバッグで F8 で実行すると正常に条件付きでSELECTされます、 エラーは一回目のSELECTだけで、以降はエラーが発生しません。 対処の方法をお教え下さい。 よろしくお願いします。 (("Microsoft.Jet.OLEDB.4.0"を使用してもエラーが発生しました。)) (例) 'テンポラリファイルを取り込む Dim querydef As DAO.querydef Dim adoCON As New ADODB.Connection Dim adoRS As New ADODB.Recordset Dim strV As String Dim strQ As String 'ADOを使い読み込み専用モードでExcelファイルを扱う準備(オープン)をします adoCON.Open "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)}; " & _ "DBQ=" & "C:\test2014.xlsx" & ";" & _ "ReadOnly=True" 'SQLを実行(全件検索)   OK Set adoRS = adoCON.Execute("SELECT * FROM [Shite1$]") 'SQLを実行(条件付き検索) NGエラーが発生します。 Set adoRS = adoCON.Execute("SELECT * FROM [Shite1$] WHERE A = 7 ")

  • VB5+SQL2000での ** TRANSACTIONについて(ADO)

    環境:VB5(SP3)+SQL2000(SP1) VBで、BEGIN TRANSACTIONを定義し、その後更新用DBを更新する前に、ストアドプロシージャを利用せずDBを検索した場合、問題無く更新用DBへの更新に対して(ROLLBACK/COMMIT) TRANSACTION が効くのですが、ストアドプロシージャで検索した場合、(ROLLBACK) TRANSACTION が効きません。 分かりづらいですがサンプルを記します。 Function Test() Dim MyRs As New ADODB.Recordset Dim MyRs2 As New ADODB.Recordset : MyDB.Execute "BEGIN TRANSACTION TEST999",,adCmdText+adExecuteNoRecords : '(A)不具合未発生パターン 'レコードセットを開く 'このように、レコードセットを作成した場合問題なし。 MyRs.Open "SELECT * FROM TESTDB..テスト",MyDB,adOpenStatic '(B)不具合発生パターン 'ただし、上のSELECT文をストアドプロシージャで開いた場合、ROLLBACKが効かない 'レコードセットを開く(正常に(ROLLBACK)TRANSACTIONが動作せず、UpDate時にCommitしている) 'MyRs.Open "TESTDB..TEST001",MyDB,adOpenStatic : MyRs2.Open "SELECT * FROM TESTDB..更新テスト",MyDB,adOpenKeyset,adLockPessimistic If Err <> 0 Then 'Error処理 End If If MyRs2.EOF Then MyRs2.AddNew MyRs2![FLD1] = MyRs2![FLD1A] Else MyRs2![FLD1] = "TEST" End If MyRs2.UpDate 'ここは正常終了。(Err = 0) 'テスト用にエラー設定 Err = 1 if Err <> 0 then '(B)不具合発生パターンの場合、ROLLBACK をしても、DBに登録されてしまう。 MyDB.Execute "ROLLBACK TRANSACTION TEST999",,adCmdText+adExecuteNoRecords Exit Function End If MyRs.Close MyRs2.Close SmileDB.Execute "COMMIT TRANSACTION TEST999",,adCmdText+adExecuteNoRecords End Function

  • SQLの条件に変数を

    はじめまして。よろしくお願いします select文のwhere条件にidを指定したいのですがうまくいきません。 べつに変数を使用しなくてもよいのですが良い方法がありましたらご教授下さい Private Sub コマンド8_Click() Dim adoCON As ADODB.Connection Dim adoRS As ADODB.Recordset Dim no As interger no=me.id Set adoCON = Application.CurrentProject.Connection Set adoRS=adoCON.Execute("select varcodeno from varcode_tbl where id=no")strName = adoRS!varcodeno adoRS.Close adoCON.Close Set adoRS = Nothing Set adoCON = Nothing Me.jancode.Value = strName End Sub

  • アクセスVBA。ADO

    CSVから列を分割してテーブルにしたいかったので 下記のコードを記述しましたが、 Dim cn As ADODB.Connection Dim rs As New ADODB.Recordset Dim datacount As Long Set cn = New ADODB.Connection With cn .ConnectionString = "Provider=Microsoft.jet.OLEDB.4.0;Data Source=" & CurrentProject.Path & "\;" .Properties("Extended Properties").Value = "text;HDR=YES;" .Open End With Set rs = cn.Execute("SELECT * FROM 構成マスタ.csv") datacount = rs.Fields.Count For i = 0 To datacount strsql = "SELECT " & rs.Fields(i).Name & " INTO " & rs.Fields(i).Name & " FROM 構成マスタ.csv;" cn.Execute strsql Next i rs.Close cn.Close Set rs = Nothing Set cn = Nothing SQLを実行するところで、「日付エラー」となってしまいます。 データには特に日付等はないのでエラーになる原因がわかりません。 どなたかご教示いただけますでしょうか。

  • VBでAccessにSQL文を実行して値を取り出す

    下記のソースは、 UserIDとPasswordをDBと照らし合わせて、 そのUserが存在すればTrue、存在しなければFalse を返すというプログラムです。 しかし初めてDBに接続し、まったく右も左も分からない 状況なので処理的におかしな点を教えていただけないでしょうか。 またDB接続からSQL実行までの簡単な流れを教えていただけると助かります。 adoRs = ADODB.Recordset adoCn = ADODB.Connection adoCd = ADODB.Command Login.txtName.Text = 比較するユーザー名 Login.txtPass.Text = 比較するパスワード です。その他わかりにくい点があったら質問を お願いします。 Private Function Func_UserSerch() As Boolean Func_UserSerch = False On Error GoTo UserSerchError 'レコードセットの取得 With adoRs .ActiveConnection = adoCn .Source = "user" .CursorType = adOpenStatic .LockType = adOpenForwardOnly .Properties("IRowsetIdentity") = True .Open End With MySQL = "SELECT * FROM user " & _ "WHERE UserID = " & Login.txtName.Text & _ "AND Password = " & Login.txtPass.Text & ";" 'SQLの実行 With adoCd .ActiveConnection = adoCn .CommandType = adCmdStoreProc .CommandText = MySQL .Execute End With If adoRs.EOF = True And adoRs.BOF = True Then Func_UserSerch = False Else Func_UserSerch = True End If UserSerchError: MsgBox "SQL実行中にエラーが発生しました" End Function

  • エクセルVBA_ADO「ファイアホースモードの間はトランザクションを開

    エクセルVBA_ADO「ファイアホースモードの間はトランザクションを開始できない」 最近、エクセルVBAからSQLサーバーを編集するプログラムの勉強をはじめ、以下のサイトを読みながらテストプログラムを走らせています。 http://www.happy2-island.com/access/gogo03/capter00306.shtml そして、以下のようなコードを走らせて見ると、「ファイアホースモードの間はトランザクションを開始できません」とのエラーが出ます。 コードを以下に記します((2)トランザクションを開始します←ここで上記のエラーが出ます) Sub prcAdoSQLServerDB() Dim adoCON As New ADODB.Connection Dim adoRS As ADODB.Recordset '(1)ADOを使いSQL ServerのDBを開きます adoCON.Open "Driver={SQL Server};" & _ "server=aaa\db; database=a1; uid=a; pwd=a;" 'レコードセットの作成(SELECT文の実行) Set adoRS = adoCON.Execute("select * from 明細") 'レコード追加のSQLを定義(フィールド名省略すると、nullを入れようとする) strsql = "INSERT INTO 詳細 (得意先コード) Values(000010)" '(2)トランザクションを開始します adoCON.BeginTrans '(3)レコード追加のSQLを実行します adoCON.Execute strsql '(4)SQL実行結果の判定 If Err.Number = 0 Then '(5)SQLが正常終了したら追加を反映します adoCON.CommitTrans Else '(6)SQLが異常終了したら追加の破棄とエラー内容の表示をします adoCON.RollbackTrans End If End Sub 何が原因なのでしょうか。

  • 帳票フォームでカーソル移動

    帳票フォームでカーソル移動 お世話になります、帳票フォームでフォームヘッダーに非連結txtBoxを2つ置き(txt適用開始日、txt消費税率) 詳細にクエリのフィールドを表示させています。 下記コードでフォームのダブルクリック時にヘッダーのtxtBoxにレコードを表示させています、 その後カーソルをヘッダーの”txt消費税率”に移動させたく DoCmd.GoToControl "txt消費税率" Forms!フォーム名.txt消費税率.SetFocus Me!txt消費税率.SetFocus 色々試しては見たのですがカーソル移動してくれません! アドバイス宜しくお願いいたします。 Dim adoCN As ADODB.Connection   Dim adoRS As ADODB.Recordset Dim strSQL As String Set adoCN = Application.CurrentProject.Connection strSQL = " SELECT *" _ & " FROM ta02消費税" _ & " WHERE 摘要開始日= #" & Me!txt摘要開始日2 & "#" Set adoRS = adoCN.Execute(strSQL) If adoRS.EOF = False Then Me!txt摘要開始日.Value = adoRS("摘要開始日").Value Me!txt消費税率.Value = adoRS("消費税率").Value * 100 Else MsgBox "該当データがありません", vbOKOnly + vbExclamation, "消費税" Cancel = True Exit Sub adoRS.Close adoCN.Close Set adoRS = Nothing Set adoCN = Nothing End If DoCmd.GoToControl "txt消費税率" ←’タイミングも色々ずらして試したのですが・・・ Me!cmd登録.Visible = False Me!cmd削除.Visible = True End Sub