2009-07-13 16 views
23

私は、Excelシート(エクセル2007)にSQLクエリの結果をつかむためにどのように私を示しているMSDNからVBAのコードスニペットをコピーしています:へのアクセスSQLデータベース

Sub GetDataFromADO() 

    'Declare variables' 
     Set objMyConn = New ADODB.Connection 
     Set objMyCmd = New ADODB.Command 
     Set objMyRecordset = New ADODB.Recordset 

    'Open Connection' 
     objMyConn.ConnectionString = "Provider=SQLOLEDB;Data Source=localhost;User ID=abc;Password=abc;" 
     objMyConn.Open 

    'Set and Excecute SQL Command' 
     Set objMyCmd.ActiveConnection = objMyConn 
     objMyCmd.CommandText = "select * from myTable" 
     objMyCmd.CommandType = adCmdText 
     objMyCmd.Execute 

    'Open Recordset' 
     Set objMyRecordset.ActiveConnection = objMyConn 
     objMyRecordset.Open objMyCmd 

    'Copy Data to Excel' 
     ActiveSheet.Range("A1").CopyFromRecordset (objMyRecordset) 

End Sub 

私はすでにマイクロソフトが追加されましたActiveX Data Objects 2.1リファレンスとしてのライブラリ。そしてこのデータベースはアクセス可能です。

実行時エラー3704:私はこのサブルーチンを実行すると

は今、それがエラーを持っているオブジェクトを閉じたときに操作が許可されていません。声明では

ActiveSheet.Range("A1").CopyFromRecordset (objMyRecordset) 

任意のアイデアなぜですか?

ありがとうございました。

+0

ヘルプ:列ヘッダーは、レコードセットのフィールドコレクションを反復処理し、名前を挿入/フィールド名をリストします!私は同じエラーが発生しているが、以下の解決策は役に立たなかった:http://stackoverflow.com/questions/1682717/vba-adodb-run-time-error-3704 – Steven

答えて

20

接続文字列に初期カタログを追加しました。また、ADODB.Command構文を廃止して、独自のSQL文を作成し、その変数のレコードセットを開くことにしました。

これが役に立ちます。

Sub GetDataFromADO() 
    'Declare variables' 
     Set objMyConn = New ADODB.Connection 
     Set objMyRecordset = New ADODB.Recordset 
     Dim strSQL As String 

    'Open Connection' 
     objMyConn.ConnectionString = "Provider=SQLOLEDB;Data Source=localhost;Initial Catalog=MyDatabase;User ID=abc;Password=abc;" 
     objMyConn.Open 

    'Set and Excecute SQL Command' 
     strSQL = "select * from myTable" 

    'Open Recordset' 
     Set objMyRecordset.ActiveConnection = objMyConn 
     objMyRecordset.Open strSQL    

    'Copy Data to Excel' 
     ActiveSheet.Range("A1").CopyFromRecordset (objMyRecordset) 

End Sub 
+2

それは私のために働いた、ありがとう、追加することを忘れないでくださいMicrosoft ActiveX Data Objects 2.1への参照、私は2.6版を追加しました。また、最後に接続を閉じる必要はありませんか? objMyRecordset.Closeのような? –

0

これは適切な接続文字列ですか?
SQL Serverインスタンスはどこにありますか?

上記で指定した接続文字列を使用してSQL Serverに接続できることを確認する必要があります。

EDIT:レコードセットのStateプロパティが開いているかどうかを確認します。
また、レコードセットを開く前に、CursorLocationプロパティをadUseClientに変更します。

1

私は、ソフトウェアの関連ビットがなく、メモリからコードが間違っているように見えます。コマンドを実行していますが、RecordSetが捨てられます。objMyCommand.Executeが返されます。

私がやるだろう:

Set objMyRecordset = objMyCommand.Execute 

を...そして "オープンレコード" の部分を失います。

15

提案された変更:コマンドのExecuteメソッドをオブジェクト起動しないでください

  • RecordsetオブジェクトのSourceプロパティをCommandオブジェクトに設定します。
  • パラメータなしでRecordsetオブジェクトのOpenメソッドを呼び出します。
  • CopyFromRecordsetの呼び出しでRecordsetオブジェクトのかっこを削除します。
  • は実際にあなたの変数を宣言:)

改訂コード:

Sub GetDataFromADO() 

    'Declare variables' 
     Dim objMyConn As ADODB.Connection 
     Dim objMyCmd As ADODB.Command 
     Dim objMyRecordset As ADODB.Recordset 

     Set objMyConn = New ADODB.Connection 
     Set objMyCmd = New ADODB.Command 
     Set objMyRecordset = New ADODB.Recordset 

    'Open Connection' 
     objMyConn.ConnectionString = "Provider=SQLOLEDB;Data Source=localhost;User ID=abc;Password=abc;"  
     objMyConn.Open 

    'Set and Excecute SQL Command' 
     Set objMyCmd.ActiveConnection = objMyConn 
     objMyCmd.CommandText = "select * from mytable" 
     objMyCmd.CommandType = adCmdText 

    'Open Recordset' 
     Set objMyRecordset.Source = objMyCmd 
     objMyRecordset.Open 

    'Copy Data to Excel' 
     ActiveSheet.Range("A1").CopyFromRecordset objMyRecordset 

End Sub 
+0

+1はカッコを削除します。不必要なカッコがオブジェクト参照と組み合わされて、奇妙なVBAエラーが発生するようです。 – barrowc

+0

この例は私のために働いてくれてありがとう! – nekomatic

+0

これは古いスレッドだとわかっていますが、上記のコードを修正してテーブルヘッダーを取得する方法があるのだろうかと疑問に思っていましたか? – firedrawndagger

0

を(あなたは、SQL Serverにしている場合)、ストアドプロシージャの先頭にset nocount onを追加します。私はちょうど私自身の仕事でこの問題を解決しました。それは"1203 Rows Affected"のような中間結果によって引き起こされ、私が使用しようとしていたRecordsetにロードされています。

0

@firedrawndagger:

Dim myRS as ADODB.Recordset 
Dim fld as Field 
Dim strFieldName as String 

For Each fld in myRS.Fields 
    Activesheet.Selection = fld.Name 
    [Some code that moves to next column] 
Next 
関連する問題