我在Excel中使用此代码将表导出到SQL Server表
Sub ExportToSQLServer()
Dim cnn As New ADODB.Connection, rst As New ADODB.Recordset
Dim sConn As String, sSQL As String
sConn = "Provider=SQLOLEDB.1;" & _
"Integrated Security=SSPI;" & _
"Persist Security Info=True;" & _
"Initial Catalog=ES_RTR_Staging;" & _
"Data Source=sqlnode23;" & _
"Use Procedure for Prepare=1;" & _
"Auto Translate=True;" & _
"Packet Size=4096;" & _
"Use Encryption for Data=False;" & _
"Tag with column collation when possible=False"
cnn.Open sConn
'Code here to set up ES_RTR_Staging table prior to import of new data (all works fine)
'// this is where I am having a problem with correct syntax to reference a table named "tblTempFD" on
'a sheet named "TempFcast" (both tab name and code name the same for that sheet)
sSQL = "INSERT INTO " & sTblID & _
" SELECT * FROM tblTempFD"
cnn.Execute sSQL
'// also tried
sSQL = "INSERT INTO " & sTblID & _
" SELECT * FROM [TempFcast$] tblTempFD"
cnn.Execute sSQL
'// Error is "Invalid Object Name"
End Sub
我无法获得引用Excel表的正确语法,非常感谢任何帮助或指针。
[TempFcast$]
正在尝试调用evaluate函数。当你把这样的标识符括起来时,你调用它的对象会查看它是否有一个成员ID为-5的函数(DISPID_EVALUATE)。如果它找到一个,它会将括号的内容作为后期绑定调用传递给该函数,以确定它是什么
在这种情况下,您在工作表(如果它在Worksheet
模块中)、工作簿(如果它位于ThisWorkbook
中)或Excel.Application
(如果它处于标准模块中)上隐式调用DISPID_EVAUATE。
工作表实际上有一个映射到Evaluate
函数的DISPID_EVAUATE成员。如果您的代码在工作表模块中,则相当于:
Me.Evaluate("TempFcast$")
这是Worksheet.Evaluate
的垃圾输入,因此您会得到一个运行时错误2015。
Excel.Workbook
-没有DISPID_EVALUATE成员,因此它返回到Application
对象。这意味着它相当于:
Application.Evaluate("TempFcast$")
这也是Application.Evaluate
的垃圾输入,它实际上将调用传递给ActiveSheet.Evaluate("TempFcast$")
。
所以,长话短说,除非您打算调用.Evaluate
,否则不要在Excel中使用外部调用(括号内)语法。即使您确实打算调用.Evaluate
,也应该出于这个原因调用.Evaluate
。解决方案是只删除括号并显式使用Name
属性。