VBAを使用してSQLServerからストアドプロシージャをプルしようとしています。サーバーから基本的なSQLコードを取得できますが、ストアドプロシージャで複雑なコードを使用しようとすると、エラー91:オブジェクト変数またはブロック変数が設定されていません。これを正しく実行するために何を設定する必要があるかを判断できませんでした。
パラメーターなしで実行され、パラメーターのコードがリストされていないストアード・プロシージャー。このフォーラムの他のトピックのパラメータコードを試しましたが、変更はありません
cmd行を削除し、SQLコード(SELECT * FROM Table)に対してのみ実行すると機能しました
Sub ConnectSQL()
Dim conn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim cmd As ADODB.Command
Dim sConnString As String
'Create Connection String
sConnString = "Provider=SQLOLEDB;Data Source=ServerName;" & _
"Initial Catalog=DatabaseName;" & _
"User ID=ID;" & _
"Password=Password;" & _
"Integrated Security=SSPI;"
'Create Connection and Recordset Objects
Set conn = New ADODB.Connection
Set rs = New ADODB.Recordset
'Open Connection and Execute
conn.Open sConnString
cmd.ActiveConnection = conn
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "Paint558Ranking"
Set rs = cmd.Execute
'Check If Data
If Not rs.EOF Then
'Transfer Result
Sheets("Sheet1").Range("A1").CopyFromRecordset rs
'Close record
rs.Close
Else
MsgBox "Error: No Records Returned.", vbCritical
End If
'Clean Up
If CBool(conn.State And adStateOpen) Then conn.Close
Set conn = Nothing
Set rs = Nothing
End Sub
「オブジェクト[またはブロックあり]変数が設定されていません」は、VBAの他の言語の「null参照例外」に相当します。これはnull
、オブジェクトの参照が、またはVBA用語であるときに、オブジェクトのメンバーにアクセスしようとすると発生するエラーですNothing
。
それがまさにここで起こっていることです:
cmd.ActiveConnection = conn
cmd
オブジェクトが宣言されたが、初期化されていませんでした。問題を修正するためにクラスのインスタンスにSet
それを:New
ADODB.Command
Set cmd = New ADODB.Command
cmd.ActiveConnection = conn
エラーメッセージの「Withblock」の部分は、With
ブロック構文を示しています。
Dim cmd As ADODB.Command
With cmd ''<< error 91 here
'...
End With
ローカル変数を宣言しなくWith New
ても、オブジェクト参照をWith
ブロックに保持させるために使用できます。
With New ADODB.Command
'...
End With
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加