繁体   English   中英

在VBScript中的sql字符串中使用excels命名范围

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM