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 文件对话框崩溃的主要内容,如果未能解决你的问题,请参考以下文章
如何使用文件对话框将文件路径保存在字符串中,使用 Access VBA?