MS Access VBA 修改 Excel 工作表而不写入 Drive
Posted
技术标签:
【中文标题】MS Access VBA 修改 Excel 工作表而不写入 Drive【英文标题】:MS Access VBA modify Excel sheet without writing to Drive 【发布时间】:2017-07-11 14:17:51 【问题描述】:不确定此修复是否可行,但值得一试。
我的 Access 数据库中有一个 VBA 模块,用于将一些查询结果导出到预先存在的 Excel 工作表中。我在 C: 驱动器中创建一个新工作表并用查询结果填充它没有问题。但我需要能够修改现有的 Excel 工作表。
该数据库将被同一公司的许多用户使用。他们将下载一个包含数据库的 zip 文件和一些 Excel 表格,其中包含引用这些表格的表格和图表。这些表将由 Access 的查询结果填充。
主要问题是,使用我当前的代码,我收到运行时错误 3011
,其中 Access 找不到查询 tempQ1
。这是我的代码:(对不起,如果它很乱)
Sub QueryExport()
Dim db As DAO.Database
Dim tempQ1 As DAO.QueryDef
Dim tempQ2 As DAO.QueryDef
Dim totalFindingsQuery As String
Dim breakdownFindingsQuery As String
Dim query1Name As String
Dim query2Name As String
query1Name = "tempQ1"
query2Name = "tempQ2"
Set db = CurrentDb
totalFindingsQuery = "<SQL QUERY>"
breakdownFindingsQuery = "<SQL QUERY>"
Set tempQ1 = db.CreateQueryDef(query1Name, totalFindingsQuery)
Set tempQ2 = db.CreateQueryDef(query2Name, breakdownFindingsQuery)
'filepath will change to variable to accomodate various users
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, queryName1, "C:\Documents\ <etc.>", True
DoCmd.DeleteObject acQuery, "tempQ1"
DoCmd.DeleteObject acQuery, "tempQ2"
End Sub
我查看了这个https://social.msdn.microsoft.com/Forums/office/en-US/8cac5693-a620-4511-8784-2659904d6481/transfertext-runtime-error-3011?forum=accessdev 并发现我认为我的问题是——查看我的 C: 驱动器的属性时,我只检查了“特殊权限”,我认为我没有写权限.由于公司政策,我无法更改此设置(我的用户也无法更改),因此我需要弄清楚如何在不需要写入权限的情况下修改本地驱动器上的 Excel 工作表。这甚至可能吗?
提前致谢
【问题讨论】:
请说明完整的错误信息。 -- AFAIK,您不能使用DoCmd.TransferSpreadsheet acExport
编辑现有文件,它总是会创建一个新文件。 -- 如果你不能写一个文件夹,你就不能在那里导出。但我不确定这是你的实际问题。
实际的错误文本是——“MS Access 数据库引擎找不到对象“tempQ1”。确保对象存在并且正确拼写它的名称和路径。如果是“tempQ1”不是本地对象,请检查您的网络连接或联系服务器管理员。”我应该使用什么命令来编辑现有文件?我想我可以写入该文件夹,因为在使用 TransferSpreadsheet cmd 创建新工作表之前我没有遇到问题
创建变量wb
是否有意义,它等于我要修改的工作表,然后执行类似wb.Range("A1").copyfromrecordset rs
的操作,其中我将我想要的查询设置为等于rs
,一个记录集?
重新阅读你的代码,试着把db.QueryDefs.Refresh
放在db.CreateQueryDef
和DoCmd.TransferSpreadsheet
之间
我还是不太明白你的问题。您应该对 Access 数据库所在的文件夹具有写入权限,否则将无法打开它。没有写权限就不能修改文件,但是没有写权限也不能运行Access,所以你应该把它放在某个地方。
【参考方案1】:
嗯,发现了你的错误,这是一个简单的错误:
在DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, queryName1, "C:\Documents\ <etc.>", True
中,将queryName1
替换为query1Name
。
为了将来参考,在任何模块中包含 Option Explicit 以避免变量拼写错误
【讨论】:
该死,很容易看到却很容易错过...我的 Option Explicit 标准简介: -- 将Option Explicit
放在每个模块的顶部。它强制执行变量声明并在编译时报告未声明或拼写错误的变量/常量。要在新模块中自动启用此功能,请在 VBA 编辑器中设置 Require Variable Declaration 选项。这确实是 VBA 开发的必备。
感谢您的回复...实际上我的实际代码中的名称是正确的,我编辑了我发布了很多的代码以删除公司 IP 内容,然后出错了。我最终通过删除TransferSpreadsheet
命令找到了解决方案,打开 Excel,打开工作簿,打开必要的工作表,将每个查询设置为记录集,然后设置 workbook.Range().copyfromrecordset
好吧,只要<etc,>
以filename.xlsx
结尾,您的代码就是有效且有效的以上是关于MS Access VBA 修改 Excel 工作表而不写入 Drive的主要内容,如果未能解决你的问题,请参考以下文章
使用 vba 将 MS Access 查询输出到 Excel
使用 VBA 将 MS Access 记录集导出到 Excel 中的多个工作表/选项卡会生成只读文件
如何使用sql语句和vba将数据从MS-Access导入excel power查询?