我正在尝试使用Excel VBA查询数据库并写入工作表。我对一个服务器/数据库的VBA代码工作得很好,但是当我尝试从另一个数据库中提取数据时,它会搞砸。
当我在这个数据库上运行它时,我收到一条错误,指出“当对象关闭时不允许操作”。在With mrs
行。我不明白为什么在我之前打开它之前对象是关闭的。
SQL查询包含nocount on
和ansi_warnings off
。
以下是相关的VBA代码:
Dim strFileContent As String
Dim massiveString As String
Sub runSelectedQueries()
Call runQuery(Sheet3, "dbp07", "OLBRET", "C:\Queries\query.sql")
End Sub
Private Sub runQuery(outputSheet As Worksheet, serverVar As String, databaseVar As String, queryLoc As String)
Dim sSQLQry As String
Dim ReturnArray
Dim Conn As New ADODB.Connection
Dim mrs As New ADODB.Recordset
Dim DBPath As String, sconnect As String
sconnect = "Provider=SQLOLEDB;driver={SQL Server}; server=" & serverVar & "; Integrated Security=SSPI; database=" & databaseVar & ";"
MsgBox (sconnect)
'run readFile sub
readAnyFile (queryLoc)
'parse SQL file into string
sSQLString = massiveString
Conn.Open sconnect
mrs.Open sSQLString, Conn
'write in the master record set (mrs) into a sheet
With mrs
For i = 1 To .Fields.Count
outputSheet.Cells(1, i) = .Fields(i - 1).Name
Next i
End With
outputSheet.Range("A2").CopyFromRecordset mrs
'Close Recordset
mrs.Close
'Close Connection
Conn.Close
End Sub
'reads any file as input (text) not binary using EOF, stripping the metadata at begining of a file
Sub readAnyFile(queryLoc As String)
Dim FileNum As Integer
Dim DataLine As String
massiveString = ""
FileNum = FreeFile()
Open queryLoc For Input As #FileNum
While Not EOF(FileNum)
Line Input #FileNum, DataLine ' read in data 1 line at a time
massiveString = massiveString + DataLine
Wend
massiveString = Right(massiveString, Len(massiveString) - 2)
MsgBox ("Read Successfully")
MsgBox (massiveString)
End Sub
当我调试并推出从文件中读取的SQL代码时,我得到了SQL Server Management Studio中的内容。 SQL语句在MS Query,Python和SQL Server Management Studio中运行正常,由VBA解析,所以我不认为这是问题,但我可以发布它。