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

时间:2013-04-05 11:44:42

标签: sql vba excel-vba vbscript adodb

我在这里和谷歌搜索但我仍然无法解决我的问题。我试图在我的.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 & "]"

2 个答案:

答案 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