[英]Using a TableName instead of Named Range in Excel datasource SQL Query
[英]Using excels named range in a sql string in VBScript
我在这里和谷歌搜索但我仍然无法解决我的问题。 我试图在我的.vbs
文件中等效使用excel的命名范围。 以下工作在Excel中的VBA但我不能让它在*.vbs
文件中工作。
ThisWorkbook.Sheets(1).Range("A1:B" & Range("B" & Rows.Count).End(xlUp).Row).Name = "DATA"
strSql = "SELECT * FROM DATA"
所以,我尝试了不同的引用我的命名范围DATA
,没有运气。
这就是我现在拥有的:
Set rng = ws.Range("A1:B2")
rng = "DATA"
strSql = "SELECT * FROM DATA"
涉及一些不同的变化:使用参数ByVal,使用rng而不是DATA(字符串类型), SELECT * FROM " & rng, etc..
运行时的错误消息:
Microsoft(R)Windows脚本宿主版本5.8版权所有(C)Microsoft Corporation。 版权所有。
C:\\ Users \\ admin \\ Desktop \\ UpdateSourceTbl.vbs(119,5)Microsoft JET数据库引擎:Microsoft Jet数据库引擎找不到对象'DATA'。 确保对象存在,并正确拼写其名称和路径名称。
任何帮助非常感谢!
临时解决方案:我使用了2个带行号的参数,可能不是最好的解决方案 - 但它有效! 我不能认为这是公平的
Call createAndInsertRecordSet(wb.FullName, ws.Name, i+1, j-1)
Sub CreateAndInsertRecordSet(ByVal fullname, ByVal wsName, ByVal stRow, byVal enRow )
strSql = "SELECT * FROM [" & wsName & "$B" & stRow & ":AX" & enRow & "]"
编辑:请更改线路
ws.Range("B2:AX2") = "MyRange"
同
activeworkbook.Names.Add Name:="myRange", RefersTo:="B2:AX2"
我认为这将正确创建名称DATA。
遗憾的是,如果没有保存工作簿 ,它仍然可能无法工作,因为JET OLE DB提供程序/数据库引擎在磁盘上的文件上工作, 而不是在内存中工作
在这里,我认为您可能需要动态创建Schema.ini文件来定义所需的列。
请记住,JET期望在列中查看数据,因此如果要跳过列,那么可能需要在Schema文件中定义它们, 即使这意味着您必须在运行时动态编写模式
这里的另一点是,可以通过在MS Excel中使用MS Query运行查询来检查/调试您正在调整的错误,以查看JET数据库引擎是否可以看到 DATA范围
您需要阅读有关如何使用ADO / OLE DB访问Excel数据的信息
首先,要了解如何引用您的DATA命名范围,在Excel中打开MS Query并查询工作表
请参阅此站点: 使用MS Query将Excel视为关系数据源
看到以下链接:
记住,在Excel的VB编辑器中Excel VBA中有效的方法在VBScript中的工作方式不同,因为没有Type声明,也没有Intellisense。
工作可能无法预测,有时我们必须回过头来修改,修复,重用代码。 它发生在今天。 我已经回去并重现了我的代码并让它第一次运行。 当我发布这个问题,查看错误的行或程序或奇怪的东西时,我一定是做错了什么。 以下代码运行完美。
它:
- 打开工作簿
- 与工作簿建立连接以检索记录集中的数据
- 打开与数据库的连接并执行示例插入语句
运行代码后,我检查了临时数据库,已经插入了值,所以我可以确认这是我最初提出的问题的解决方案。
Option Explicit
Private Const adUseClient = 3
Dim xl, wb, ws, fPath, rng
fPath = "C:\Users\admin\Desktop\Book1.xlsm"
Call OpenFile()
Call InsertRecordset()
Call CloseFile()
Private Sub OpenFile()
Set xl = CreateObject("Excel.Application")
xl.Visible = False
Set wb = xl.Workbooks.Open(fPath)
Set ws = wb.Sheets(1)
End Sub
Private Sub CloseFile()
wb.Saved = True
wb.Close
xl.Quit
Set wb = Nothing
Set xl = Nothing
End Sub
Private Sub InsertRecordset()
strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & wb.fullname & ";Extended Properties=""Excel 8.0;HDR=NO;IMEX=1"";"
Dim cn, rs, strCon, strSql, cn2
ws.Range("A1:B2").Name = "DATA"
strSql = "SELECT * FROM DATA"
Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
cn.Open strCon
rs.Open strSql, cn
Set cn2 = CreateObject("ADODB.Connection")
With cn2
.CursorLocation = adUseClient
.Open "Driver={SQL Server};Server=HELIUM\PRI; Database=TEMPORARY; UID=admin; PWD=password"
.CommandTimeout = 0
rs.MoveFirst
Do While Not rs.EOF
.Execute "INSERT INTO TEMPORARY.dbo.TEMP_TABLE ( [TEMP_COLUMN] ) VALUES ('" & rs.Fields(1) & "')"
rs.MoveNext
Loop
End With
' Close connections
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
cn2.Close
Set cn2 = Nothing
End Sub
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.