我在这里和谷歌搜索但我仍然无法解决我的问题。我试图在我的.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 公司。保留所有权利。
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 & "]"
答案 0 :(得分:3)
编辑: 请更改行
ws.Range("B2:AX2") = "MyRange"
带
activeworkbook.Names.Add Name:="myRange", RefersTo:="B2:AX2"
我认为这将正确创建名称DATA。
不幸的是,如果没有保存工作簿,它仍然可能无效,因为JET OLE DB提供程序/数据库引擎适用于磁盘上的文件,不在内存中
在这里,我认为您可能需要动态创建 Schema.ini 文件来定义所需的列。
请记住,JET希望在列中查看数据,因此如果要跳过列,则可能需要在架构文件中定义 ,即使这意味着您必须在运行时动态编写模式
此处的另一点是,可以通过在MS Excel中使用MS Query运行查询来检查/调试您的geeting错误,以查看JET数据库引擎是否可以查看 DATA范围
您需要了解如何使用ADO / OLE DB
访问Excel数据首先,要了解如何引用您的DATA命名范围,在Excel中打开MS Query并查询工作表
请参阅此网站:Use MS Query to Treat Excel As a Relational Data Source
请参阅以下链接:
请记住,在Excel的VB编辑器中Excel VBA中有效的方法在VBScript中的工作方式不同,因为没有Type声明,也没有Intellisense。
答案 1 :(得分:1)
工作可能无法预测,有时我们必须返回并修改,修复,重复使用代码。它发生在今天。我已经回去并重现了我的代码并让它第一次运行。当我发布这个问题,查看错误的行或程序或奇怪的东西时,我一定是做错了什么。以下代码运行完美
它:
- 打开工作簿
- 与工作簿建立连接以检索记录集中的数据
- 打开与数据库的连接并执行样本插入语句
运行代码后,我检查了临时数据库,已经插入了值,所以我可以确认这是我最初提出的问题的解决方案。
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