4

我在这里和谷歌上搜索过,但我仍然无法解决我的问题。我正在尝试在我的.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 Script Host 版本 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 & "]"
4

2 回答 2

3

编辑:请换行

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 DB 引擎是否可以看到DATA 范围

您需要阅读如何使用 ADO/OLE DB 访问 Excel 数据

首先,要了解如何引用您的 DATA 命名范围,请在 Excel 中打开 MS Query 并查询工作表

请参阅此站点:使用 MS Query 将 Excel 视为关系数据源

请参阅以下链接:

请记住,在 Excel 的 VB 编辑器中的 Excel VBA 中的工作方式与在 VBScript 中的工作方式不同,因为没有类型声明,也没有 Intellisense。

于 2013-04-05T16:02:11.133 回答
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
于 2013-07-08T11:41:31.937 回答