Excel VBA运行和导出Access查询

3
我有以下代码,用于在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

对于最后一个查询,我想要导出并保存输出结果,但是遇到了错误提示:属性未找到。我尝试将DoCmd更改为TransferSpreadsheet,将acFormalXLS的格式类型更改以防止转换问题,但仍无法成功完成。我需要将此代码放入模块中而不是保留在表格本身吗?有什么想法/帮助吗?


我不使用Access,但我可以看出你正在使用latebinding与Access。在这种情况下,你是否声明了ACCESS常量?Const acOutputQuery As Long = 1Const acExportQualityPrint as Long = 0 - Siddharth Rout
我之前并没有想过要这样做,也不知道该怎么做。为什么我需要做那些事情呢?只是为了自己的学习而已...不过我找到了一个成功的解决方法。我决定将这些查询字符串放在Access宏中一起运行,然后使用acApp.DoCmd.RunMacro来运行它。这样做成功地实现了我想要的一切,虽然我采取了不同的方向,但最终达到了正确的目的。 - Nate
1
acOutputQueryacExportQualityPrint是ACCESS常量。Excel不会理解它们。请将我在上面评论中提供的代码放在您的代码顶部。 - Siddharth Rout
他们有做出任何不同吗? - Siddharth Rout
1个回答

2

西德哈斯(Siddharth)发现了这个陈述中的问题:

acApp.DoCmd.OutputTo acOutputQuery, "QRY_HIGH", "ExcelWorkbook(*.xlsx)", OutputFile, _
    False, "", , acExportQualityPrint

如果没有引用Access对象库,Excel将不知道Access常量acOutputQueryacExportQualityPrint

您最好在模块的声明部分添加Option Explicit,然后从VB编辑器的主菜单中运行Debug->Compile。当您这样做时,我怀疑您会发现类似于以下行的问题...

acApp.DoCmd.OpenQuery "QRYDELETE_PS_ROLE_NAMES", acViewNormal, acEdit

Excel对Access常量acViewNormalacEdit一无所知。但是,如果您的意图是执行“操作”查询(INSERTUPDATEDELETE等),那么这些常量未被识别是好事。否则,您将会在设计视图中打开这些查询而不是执行它们。

考虑采用另一种方法...

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接