iissue已解决] - 感谢新问题,定义Fields/RecordsWAS为什么我不能在Excel 2013中使用VBA程序中的DAO

问题描述:

请参考我最新的评论,因为我还有一个关于列名/重新分配标题的跟进问题行。谢谢! KDL!iissue已解决] - 感谢新问题,定义Fields/RecordsWAS为什么我不能在Excel 2013中使用VBA程序中的DAO


OK,我能打开“数据库”,所以我可以设置使用DAO记录集的查询,我已经找到了如何定义一个命名的范围,所以我有可以作为的行为变量“字段名称”。我遇到了VBA代码的问题,即将命名范围插入到SELECT SQL语句中。这是我仍然有问题的代码的相关部分

BEGIN CODE '*************************** ******* 昏暗分贝为DAO.DATABASE 昏暗RST作为DAO.Recordset

昏暗refRngItemSKU作为Excel.Range 昏暗LastRowAsIngeger作为整型 昏暗INVENTORYTABLE作为字符串 昏暗strSelectRS作为字符串

'************************

Las tRowAsInteger = 1764 '值在代码为现在设置,将式后,使动态

集refRngItemSKU = ThisWorkbook.Worksheets( “供应商清单”)范围( “A11:A” & LastRowAsInteger)。

' ******* NOTE当我插入refRngItemSKU.select时,选择正确的单元格范围**********

INVENTORYTABLE =“D:\ My Documents \ Leavers Switches And More \ INVENTORY \ COLLECTIONS AND DISTRIBUTOR INVENTORY \ Model Train Inventory - Updated 6-7-2017.xlsm“

Set db = DBEngine.OpenDatabase(INVENTORY TABLE,FALSE,FALSE, “Excel的12.0;”)

strSelectRS = “SELECT * FROM [供应商库存$] WHERE [refrngitemsku $] IS NOT NULL”

设置RST = db.OpenRecordset(strSelectRS)

'****************************************** END of CODE

现在,所有代码的最后一行工作。当它到达“Set rst”行时,Error 3061出现。错误状态为“太少参数,预期1”。当我处于调试模式时,我注意到“refrngitemsku”变量没有在实际值应该显示的“strSelectRS”字符串中返回一个值。所以在纠正语法的任何帮助,所以我可以返回一个值,即。 refrngItemSKU变量应该返回的单元格的实际范围。再次感谢你。对不起,我不得不编辑我的问题,但评论部分不允许输入足够的字母。对于版主,我感谢您对我的帖子的耐心等待。但我渴望得到答案,到目前为止,这个论坛是唯一一个愿意回答我的问题的论坛!再次感谢。

肯L.


张贴在先 好消息!感谢使用ACEDAO.DLL的建议,似乎解决了第一个问题,但是新的问题已经出现。我无法在Excel 2013-64中找到使用DAO的方法,使用SQL查询各种表。看来我无法定义“字段”和“记录”,即列是“字段”,行是“记录”。尽管当我在记录集上做记录计数时,它显示了有数据的记录总数。但是,当我尝试识别列(即场)以设置要选择记录的条件时,出现语法错误。任何帮助将不胜感激,并再次感谢所有的帖子,他们都有帮助,因为它使我的谷歌具体条款找到解决方案,我目前的项目!谢谢你,谢谢你,谢谢你!

肯大号 原贴: 我一直在使用谷歌找到,没有运气一个明确的答案搜索。尝试使用DAO语言“OpenDatabase”时,我不断收到错误代码429,因此我可以使用SQL语言在一个Excel 2013工作簿中搜索各种工作表。我正在运行Windows 7-64和Office 2013 64位。从我所读到的内容来看,微软似乎不再支持DAO,甚至ADO看起来也不再受到微软人员的青睐。只要有一种方法可以使用类似的功能根据特定的标准找到特定的记录,修改某些记录,创建其他记录并在记录之间移动,我真的不关心我是否不能再使用DAO(即.movefirst,.movelast等)。如果有不同的VBA语言可用于我的软件的64位版本,我会学习它。

我宁愿不使用工作簿,工作表函数,并使用IF-THEN语句遍历整个表,试图找到与我正在查找的条件相匹配的某些“记录”。它的工作,但它乏味,我宁愿使用SQL类型的语言。

我意识到使用MS Access会更合适,但我更喜欢使用Spreadsheet格式。我想要做的是编写一个VBA程序,将某些单元格值转换为某种格式,然后转换为csv文件以上传到我的网上商店的网站。该文件是我的库存表,其中有大量的计算/公式。如果我不需要,我宁可不使用MS Access。

感谢您提供任何帮助!

谢谢。

肯L.

+1

您可以发布您的代码? – ThunderFrame

+0

64位需要64位驱动程序。也许64位版本的Microsoft Access数据库引擎2010可再发行组件https://www.microsoft.com/en-us/download/details.aspx?id=13255 – Slai

您可以使用ADO:

Dim conn As New ADODB.Connection 
conn.Open("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\myFolder\myOldExcelFile.xls;Extended Properties=""Excel 8.0;HDR=YES"";") 
+0

我复制并粘贴上面的代码,替换文件名我是使用用于一个是在代码,当我运行该代码行,则出现下列错误: 编译错误未定义 用户定义类型。 ** SIGH ** 尽管感谢您的及时答复! Ken L. – Ken

+0

您应该添加对Microsoft ActiveX Data Objects库的引用,以便能够创建ADODB.Connection。这在菜单工具 - >参考中完成。 – jivko

包括到Microsoft Office 15.0 Access数据库引擎对象库的引用(即使用而不是喷气DAO AceDAO;删除任何引用到DAO 3.6 )

的openDatabase([文件路径],[独家],[只读],[连接字符串])

的openDatabase([文件路径],假,真“的Excel 12.0的Xml; HDR =咋S; “)

Excel的12.0 XML =的.xlsx

https://msdn.microsoft.com/en-us/library/office/ff965871(v=office.14).aspx#DataProgrammingWithAccess2010_DirectDAOExample

新增:

OpenRecordset(” SQL语句”,...)

在SQL语句:

  • 表格可以是SheetName $或SheetName $ -plus-range-specifie r或RangeName

  • 将一个$添加到表名的末尾(例如,工作表Sheet1 $)

  • 表(Excel列表)可能无法识别;您可能需要使用电池符号明确限定重叠区域名称(如A1:B10)

SQL例子(你可以在方括号括表和字段名称[]逃跑可能会发生冲突的字符,例如空格) :

SELECT * FROM [Sheet1$] WHERE ([Field Name in Brackets] = SomeNumericValue) 
SELECT * FROM [Sheet1$] WHERE ([Field Name in Brackets] = 'SomeTextValueInSingleQuote') 
SELECT * FROM [Sheet1$] WHERE ([Field Name in Brackets] = #SomeDateInHashTags#) 

语法帮助: https://msdn.microsoft.com/EN-US/library/office/dn123881.aspx

ADDED 2:

  • 您无法在VBA中将范围定义为变量,然后在SQL语句中传递该变量名称;范围必须在Excel工作簿本身中定义为命名范围(例如,在Excel或VBA代码中使用名称管理器对话框),然后在数据库引擎端,可以根据可用表名从SQL语句文本中查找该名称;

  • 您可以使用VBA创建使用类似定义/存储在一个名为范围:

ActiveWorkBook.Names.Add(名称:= “MyRangeForSQL”,引用关联:= “= A11:E1764” )

  • 如果第一行中没有字段名,那么你需要通过包括更改连接字符串,表示没有标题行“HDR =无;” ; Ace/Jet会创建一些默认字段名称:“F1” - 第一列,“F2” - 第二列,“F3” - 等等。例如

    strSelectRS = “SELECT * FROM [MyRangeForSQL],其中[F1] IS NOT NULL”

附加的3:

  • 可以随时别名中的(表)字段名SQL语句:[字段名] AS [FieldNameAlias]

strSelectRS =“SELECT [F1]作为[SKU],[F2]为[数量],[F3]作为[参考价格] FROM [MyRangeForSQL],其中[SKU ] IS NOT NULL“

  • 或许应该纪念这个问题的回答,让原有范围之外;好运
+0

这是可行的解决方案!从DAO 3.6改为ACEDAO我原来的帖子中不再有问题,但现在已经出现了新问题,看起来它们具有类似的性质,再一次出现了DAO和Excel 2013的问题。再次感谢! – Ken

+0

再次感谢!它看起来像我将需要使用范围语法,因为行1不是字段名称所在的位置,除非有一种方法可以在行1以外的行上定义行(即字段)名称。您的帮助应该让我去,但再次感谢!我以前是负责IT部门的一个体面的小型企业(拥有40台PC的小型网络,我也做了大量的定制编程,但那是15年前的事了,我的健康让我变得残疾,这段时间我不需要编程,所以我没有练习,而且自从那时起事情已经发生变化!) – Ken

+0

SQL的轻微问题,请参阅编辑的OP,这样我就可以在一篇文章中做到这一点,因为注释只允许如此多的字符THX – Ken