我有以下代码从Excel中启动Access数据库中的一系列查询。当这些查询在Access中自己运行时,它们可以正常工作并成功生成正确的文件,但是当我使用单击按钮将宏转换为在Excel中运行时,我遇到了一些问题。请参阅下面的代码:
Sub AccessImport()
Dim acApp As Object
Dim MyDatabase As String
Dim question As String
question = MsgBox(Prompt:="Are you sure you want to complete this action? Running this process is lengthy and could take a couple minutes to complete.", Buttons:=vbYesNo, Title:="Run SOD Matrix")
If question = vbYes Then
MyDatabase = "directory string"
OutputFile = "output string"
'open the database and apend the combination table to existing
Set acApp = CreateObject("Access.Application")
acApp.OpenCurrentDatabase (MyDatabase)
acApp.Visible = True
acApp.UserControl = True
acApp.DoCmd.SetWarnings False
acApp.DoCmd.OpenQuery "QRYDELETE_PS_ROLE_NAMES", acViewNormal, acEdit
acApp.DoCmd.OpenQuery "QRYDELETE_PS_ROLE_USER", acViewNormal, acEdit
acApp.DoCmd.OpenQuery "QRYDELETE_SOD_TBL", acViewNormal, acEdit
acApp.DoCmd.OpenQuery "QRYAPPEND_PS_ROLE_NAMES", acViewNormal, acEdit
acApp.DoCmd.OpenQuery "QRYAPPEND_PS_ROLE_USER", acViewNormal, acEdit
acApp.DoCmd.OpenQuery "QRYAPPEND_SOD_TBL", acViewNormal, acEdit
'acApp.DoCmd.OpenQuery "QRY_HIGH", acViewNormal, acEdit
acApp.DoCmd.OutputTo acOutputQuery, "QRY_HIGH", "ExcelWorkbook(*.xlsx)", OutputFile, _
False, "", , acExportQualityPrint
acApp.DoCmd.SetWarnings True
acApp.CloseCurrentDatabase
acApp.Quit
Set acApp = Nothing
Else
MsgBox ("Process has been cancelled.")
Exit Sub
End If
MsgBox ("Process has completed successfully.")
End Sub
对于最后一个用于导出和保存输出的查询,我遇到错误,告诉我Property is not found.
我尝试将DoCmd
更改为TransferSpreadsheet
,格式类型为acFormalXLS
以防止转换问题,但我仍然无法成功完成转换。我是否需要将此代码放在模块中而不是将其保留在工作表本身上?想法/帮助?
答案 0 :(得分:2)
Siddharth通过这一声明确定了问题:
acApp.DoCmd.OutputTo acOutputQuery, "QRY_HIGH", "ExcelWorkbook(*.xlsx)", OutputFile, _
False, "", , acExportQualityPrint
如果没有对Access对象库的引用,Excel将对Access常量acOutputQuery
和acExportQualityPrint
一无所知。
您最好将Option Explict
添加到模块的声明部分,然后从VB编辑器的主菜单运行Debug-> Compile。当你这样做时,我怀疑你会发现类似这样的问题......
acApp.DoCmd.OpenQuery "QRYDELETE_PS_ROLE_NAMES", acViewNormal, acEdit
Excel也不会对访问常量acViewNormal
和acEdit
一无所知。但是,如果您的意图是执行“操作”查询(INSERT
,UPDATE
,DELETE
等),那么这些常量无法识别是很好的。否则,您将在“设计视图”中打开这些查询,而不是执行它们。
考虑一种不同的方法......
Const dbFailOnError As Long = 128
'acApp.DoCmd.SetWarnings False ' leave SetWarnings on!
acApp.CurrentDb.Execute "QRYDELETE_PS_ROLE_NAMES", dbFailOnError
acApp.CurrentDb.Execute "QRYDELETE_PS_ROLE_USER", dbFailOnError