Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在VBScript中的sql字符串中使用excels命名范围_Sql_Vba_Excel_Vbscript_Adodb - Fatal编程技术网

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

在VBScript中的sql字符串中使用excels命名范围,sql,vba,excel,vbscript,adodb,Sql,Vba,Excel,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" 因此,我尝试了引用命名范围数据的不同变体,但运气不佳。

我在这里和谷歌上搜索过,但我仍然无法解决我的问题。我试图在我的
.vbs
文件中等效地使用excel的命名范围。下面的内容在excel中的VBA中工作,但我无法使其在
*.vbs
文件中工作

ThisWorkbook.Sheets(1).Range("A1:B" & Range("B" & Rows.Count).End(xlUp).Row).Name = "DATA"
strSql = "SELECT * FROM DATA"
因此,我尝试了引用命名范围
数据的不同变体,但运气不佳。
这就是我现在拥有的:

Set rng = ws.Range("A1:B2")
rng = "DATA"    
strSql = "SELECT * FROM DATA"
涉及到一些不同的变化:使用参数ByVal,使用rng代替数据(字符串类型),
SELECT*FROM“&rng,等等..

运行时出现错误消息:

Microsoft(R)Windows脚本主机版本5.8版权所有(C)Microsoft 版权所有

C:\Users\admin\Desktop\updatesourcebl.vbs(119,5)Microsoft JET database e引擎:Microsoft JET数据库引擎找不到 对象“DATA”。请确保该对象存在并且您拼写正确 它的名称和路径名正确

非常感谢您的帮助

临时解决方案: 我使用了两个参数和行号,可能不是最好的解决方案-但它是有效的!公平地说,我看不出它有什么错

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"

我认为这将正确地创建名称数据

不幸的是,如果不保存工作簿,它可能仍然无法工作,因为JET OLE DB Provider/DB Engine在磁盘上的文件而不是内存中工作

在这里,我认为您可能需要动态创建一个Schema.ini文件来定义所需的列

请记住,JET希望在列中看到数据,因此如果有要跳过的列,则可能需要在架构文件中定义它们,即使这意味着您必须在运行时动态写入架构

这里的另一点是,可以通过在MS Excel中使用MS query运行查询来检查/调试您正在查找的错误,以查看JET DB引擎是否可以查看数据范围

您需要了解如何使用ADO/OLEDB访问Excel数据

首先,要了解如何引用名为range的数据,请在Excel中打开MS Query并查询工作表

请参阅本网站:

请参阅以下链接:

  • 在Excel用户MVP网站上

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

工作可能是不可预测的,有时我们必须返回并修改、修复、重用前一段时间的代码。今天发生了这种情况。我回去重新生成了我的代码,并让它在f第一次。当我发布这个问题时,我一定是做错了什么,看到了错误的行或过程,或者是一些奇怪的东西。下面的代码运行得很好。
它:
-打开工作簿
-建立与工作簿的连接以检索记录集中的数据
-打开与数据库的连接并执行示例插入语句
运行代码后,我检查了临时数据库,插入了值,因此我可以确认这是我最初提出的问题的工作解决方案。

选项显式
Private Const adUseClient=3
尺寸xl、wb、ws、fPath、rng
fPath=“C:\Users\admin\Desktop\Book1.xlsm”
调用OpenFile()
调用InsertRecordset()
调用CloseFile()
私有子OpenFile()
Set xl=CreateObject(“Excel.Application”)
xl.Visible=False
设置wb=xl.Workbooks.Open(fPath)
设置ws=wb.Sheets(1)
端接头
私有子文件()
wb.Saved=True
wb.关闭
xl.退出
设置wb=Nothing
设置xl=无
端接头
私有子InsertRecordset()
strCon=“Provider=Microsoft.Jet.OLEDB.4.0;数据源=“&wb.fullname&”;扩展属性=“Excel 8.0”;HDR=否;IMEX=1“;"
尺寸cn、rs、strCon、strSql、cn2
ws.Range(“A1:B2”).Name=“数据”
strSql=“从数据中选择*
Set cn=CreateObject(“ADODB.Connection”)
Set rs=CreateObject(“ADODB.Recordset”)
cn.开放式strCon
rs.开放式strSql,中国
设置cn2=CreateObject(“ADODB.Connection”)
用cn2
.CursorLocation=adUseClient
.Open“驱动程序={SQL Server};服务器=氦\PRI;数据库=临时;UID=管理员;PWD=密码“
.CommandTimeout=0
先走一步
做而不做
.Execute“INSERT INTO TEMPORARY.dbo.TEMP_TABLE([TEMP_COLUMN])值(“&rs.Fields(1)和“)”
下一个
环
以
"密切联系",
rs.Close
设置rs=无
cn.Close
设置cn=Nothing
cn2.关闭
设置cn2=无
端接头

如果前两行完全按照VBScript编写的方式运行,那么它将不起作用,因为常量
xlUp
不是在Excel外部定义的。您需要将其替换为实际值(可以使用Excel中的对象浏览器找到)(VB编辑器中的F2)。这将有助于使用您正在使用的完整VBscript更新您的问题。Tim,我知道您将如何使用它-请您进一步解释一下我如何使用(覆盖)Excel.Direction类,或者如何将xlUp声明为常量(它不能像用Const xlUp=-4162(&HFFFFEFBE)的值声明常量那样简单。)我在下面的回答中添加了另一个建议,一个问题是创建命名范围的代码不起作用,即使它起作用了,JET也无法看到它,除非保存工作簿,这就是为什么需要架构文件(Schema.ini)是的-您只需声明一个常量,或直接在代码中使用该值。Philip,感谢您提供的链接。我已经阅读了文章,但不幸的是,我没有发现它非常有用。大部分内容是我已经知道的,或者不适用于我的问题。我不能使用MS Query,因为假设我打开的文件是每天都在变化,文件的结构与RDB一样的设计并不接近
activeworkbook.Names.Add Name:="myRange", RefersTo:="B2:AX2"