MS Access VBA 文件对话框崩溃

Posted

技术标签:

【中文标题】MS Access VBA 文件对话框崩溃【英文标题】:MS Access VBA File Dialog Crashing 【发布时间】:2017-09-12 14:10:37 【问题描述】:

从 MS Access 我生成了几个 MS Access 工作簿。通过以下代码,我获得了所有工作簿的所需保存位置。几天前,以下代码可以正常工作。现在它突然失败,没有错误号。 MS Access 崩溃,我收到重新启动 MS Access 的提示,并且自动为我正在处理的 MS Access 项目创建一个备份文件。

奇怪的是,如果我使用调试器单步执行代码,它就可以正常工作。它根本无法全速运行。

更新 1: 如果我摔倒了,save_location 电话就可以了。

Private Sub make_report()
' TODO#: Change to late binding when working
    Dim strSaveLocation as string
    Dim xl as Excel.Application
    dim wb as Excel.Workbook

    strSaveLocation = save_location("G:\Group2\Dev\z_report")

    Set xl=New Excel.Application
        ' do workbook stuff
        With xl
            strSaveLocation = strSaveLocation & "\report_name.xlsx"
            wb.SaveAs strSavelLocation, xlOpenXMLWorkbook
        End With    ' xl
    Set xl=nothing
End Sub

如果我像这样调用save_location 函数,它会突然使MS Access 崩溃。它不会抛出错误或任何东西。它只是崩溃。

Private Sub make_report()
' TODO#: Change to late binding when working
    Dim strSaveLocation as string
    Dim xl as Excel.Application
    dim wb as Excel.Workbook

    Set xl=New Excel.Application
        ' do workbook stuff
        With xl
            ' the call to save_location is inside of the xl procedure
            strSaveLocation = save_location("G:\Group2\Dev\z_report")
            strSaveLocation = strSaveLocation & "\report_name.xlsx"

            wb.SaveAs strSavelLocation, xlOpenXMLWorkbook
        End With    ' xl
    Set xl=nothing
End Sub

通过将save_location 调用移动到Excel.Application 工作字符串中,它会失败。我不明白为什么。

Private Function save_location(Optional ByVal initialDir As String) As String
On Error GoTo err_trap
    Dim fDialog As Object
    Dim blMatchIniDir As Boolean
    Set fDialog = Application.FileDialog(4)  ' msoFileDialogFolderPicker
        With fDialog
            .Title = "Select Save Location"
            If NOT (initialDir=vbnullstring) then
                .InitialFileName = initialDir
            End If
            If .Show = -1 Then
                ' item selected
                save_location = .SelectedItems(1)
            End If
        End With
    Set fDialog = Nothing
exit_function:
    Exit Function
err_trap:
    Select Case Err.Number
        Case Else
            Debug.Print Err.Number, Err.Description
            Stop
            Resume
    End Select
End Function
尝试的操作: 反编译项目并重新编译 创建新的 MS Access 项目并导入所有对象 压缩和修复 重置所有引用 注意事项: 我正在使用客户的系统和 我不知道有任何系统更新 客户的系统是一个通过 VMWare 的虚拟桌面 Office 2013 Windows 7 专业版

【问题讨论】:

似乎您正在使用后期绑定,但正在使用 MsoFileDialogType 枚举。尝试用4(文字值)替换msoFileDialogFolderPicker。这将使代码不依赖于正确的引用。 @ErikvonAsmuth 我已经用4 替换了msoFileDialogFolderPicker,但它仍然突然失败。这是一个很好的收获,我很感激。 你能打印initaldir并验证它是否有效吗? 如果所有其他方法都失败并且客户端变得非常不耐烦,您可以切换到基于 API 的方法:cpearson.com/excel/browsefolder.aspx(是的,它比您现有的函数多一点代码......) @ErikvonAsmuth initalDir 是一个 const 设置为 G:\Group4\Dev\z_reports 用于测试,如果我使用调试器单步执行代码但全速失败,则代码可以工作。 【参考方案1】:

虽然我不确定这是否是特定问题 - 但如果是这种情况,它会与任何 VBA 混淆。检查文件夹名称和文件名是否有撇号。虽然 windows 允许这样做,但在 VBA 中将看到一个撇号作为注释,并使其崩溃。让客户引导您浏览他选择的确切文件,以确认文件名或文件夹名称中没有撇号字符。

【讨论】:

以上是关于MS Access VBA 文件对话框崩溃的主要内容,如果未能解决你的问题,请参考以下文章

使用 MS Access VBA 更改标签的默认标题

在 Access VBA 中使用浏览文件对话框

如何使用文件对话框将文件路径保存在字符串中,使用 Access VBA?

从 Access 2010 VBA 打开 Excel 2010 文件

Access 97中如何使用VBA浏览文件?

ACCESS 2007 - 如何从 VBA 打开选择窗口对话框