VBA 文件对话框 .FileName 从文件名末尾删除 .1

Posted

技术标签:

【中文标题】VBA 文件对话框 .FileName 从文件名末尾删除 .1【英文标题】:VBA File Dialog .FileName removing .1 from end of file name 【发布时间】:2012-07-24 07:51:41 【问题描述】:

我正在使用 Visual Basic 为 Autodesk Inventor 编写宏。我创建了一个调用文件对话框的宏,请参见下面的代码。一切正常,除非用户将文件名放入一个句点和一个大于零的数字。

例如,如果用户将 testfile.test 放入框中并点击确定。当我询问他们使用 .FileName 放在那里的内容时,我得到“testfile.test”。就像我应该的那样。

但是,如果用户输入 testfile.1 或 testfile.10 或 testfile.1mdksj 或任何大于零的数字,那么我将返回“testfile”。由于某种原因,期间和期间之后的所有内容都会被删除。

这是什么原因?这是 Visual Basic 中的错误还是我做错了什么?

'Set up the file dialog
Dim oFileDlg As FileDialog
' Create a new FileDialog object.
Call ThisApplication.CreateFileDialog(oFileDlg)
'Define the filter to select part and assembly files or any file.
oFileDlg.Filter = "All Files (*.*)|*.*"
'Define the part and assembly files filter to be the default filter.
oFileDlg.FilterIndex = 1
'Set the title for the dialog.
oFileDlg.DialogTitle = "Save File As"
'Tell the dialog box to throw up and error when cancel is hit by user
oFileDlg.CancelError = True

'Show the file dialog
On Error Resume Next
oFileDlg.ShowSave

'save the user specified file
Dim newFileName As String
newFileName = oFileDlg.FileName

更新:

我最终做了以下“破解”以使事情在处理期间仍然有效:

oFileDlg.fileName = sFname & "."
oFileDlg.ShowSave
fullName = Left$(oFileDlg.fileName, Len(oFileDlg.fileName) - 1)

这在 Windows 7 和 Windows 10 上运行了很长一段时间。不幸的是,Windows 10 创意更新似乎改变了文件对话框的工作方式。使用上面的代码,如果名称中没有句点,则 fullName 将返回空白,如果名称中有句点,则从左侧开始截断第一个句点。

我不太确定 Windows 10 发生了什么变化,但它几乎摧毁了我的 hack。 Windows 7 仍然可以正常工作,而创意更新之前的 Windows 10 可以正常工作。我最终执行了以下操作,以使一切在我上面提到的 Windows 版本中再次正常工作。

oFileDlg.fileName = sFname & ".00"
oFileDlg.ShowSave
fullName = Left$(oFileDlg.fileName, Len(oFileDlg.fileName) - 3)

【问题讨论】:

ThisApplication.CreateFileDialog(oFileDlg) 是做什么的? 来自 Autodesk Inventor 2012 COM API 参考:“创建新 FileDialog 对象的方法。FileDialog 对象类似于 Microsoft 常用对话框控件,允许您重复使用 Inventor 打开保存对话框。” 【参考方案1】:

这是一个 VB 属性,但它也可以扩展到 VBA。您是否尝试过设置保存设置以支持多点扩展?试试这样的:

SupportMultiDottedExtensions = True

此设置旨在允许使用点分扩展名 - 表示在文件名中使用句点。有关文档和信息,请参阅此 MSDN 参考:http://msdn.microsoft.com/en-us/library/system.windows.forms.filedialog.supportmultidottedextensions.aspx#Y129

这篇 SO 文章还可以进一步阐明:SaveAs Dialog with a period in the filename does not return extension

编辑

在检查了 Autodesk 文档后——在我看来,这是一项艰巨且令人不快的任务——似乎确实不支持 MultidottedExtensions。但是,我确实在 VBAExpress 上找到了一个我非常熟悉的函数。该函数可用于过滤包含不可接受字符的字符串。 Jimmy Pena 的博客有一个出色的功能来实现这样的目的:http://www.jpsoftwaretech.com/excel-vba/validate-filenames/。我只是在代码中添加了一个句号和一个替换:

'A function for filtering strings, with a focus on filenames.
Function FilterFileNameString(stringToScrub As String) As String
'Filters a filename string - or any string for that matter.
Dim FilteredString As String

  'A highly nested replace function.
  FilteredString = Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(stringToScrub, ".","|", ""), ">", ""), "<", ""), Chr(34), ""), "?", ""), "*", ""), ":", ""), "/", ""), "\", "") 

  'Returns filtered string.
  FilterFileNameString = FilteredString 
End Function

Jimmy Pena 的博客也包含递归版本,尽管他不推荐这样做。

您可以过滤任何字符串以用作具有另一个字符的文件名 - 在这种情况下为空格。但是,您可以使用下划线或您认为令人愉快的任何其他字符。

一般来说,如果您尝试使用句点进行版本控制或类似目的,而发明者不允许您这样做,我强烈建议您使用可以提供此类指示的另一个字符或一组字符,例如下划线“ _”、编号系统、“001”、“002”、字母系统、“AAA”、“AAB”,或任何对您的注意力有意义的东西。

如果您只是使应用程序易于使用,我建议在将输入的字符串保存为所需的文件类型之前对其进行过滤,如果句点过滤让您感到悲伤,则将字符串的过滤与保存对话框分开。它可能会增加一个额外的步骤,但它可能是过滤掉讨厌的无效字符的最佳和最简单的方法,而不会给您的用户带来不必要的额外麻烦。

~JOL

【讨论】:

我尝试添加 oFileDlg.SupportMultiDottedExtensions = True 并且对象不支持该属性。对于带有 FileDialog 对象的 Inventor VBA,它似乎不是一个选项。 我已经更新了我的答案以添加过滤功能,因为发明者似乎没有明确支持多点扩展 - 尽管我发现他们的发明者 API 对象文档......简洁:) 感谢您的精彩回答!当我第一次发现这个错误时,我建议用更明智的东西替换句点,就像你建议的那样,但只是抱怨而已。我将不得不找出他们更喜欢哪个,从现在到时间结束的额外停留,或者改变当前的“标准”。再次感谢您的帮助,很高兴看到其他人发现 Autodesk 的文档很少。 没问题 =) 很高兴知道有人与我一样对处理 Autodesk 文档感到沮丧。祝你改变当前的标准好运——确保他们不会强迫你去做一些实际上不可能的事情;)

以上是关于VBA 文件对话框 .FileName 从文件名末尾删除 .1的主要内容,如果未能解决你的问题,请参考以下文章

excel vba做出一个打开文件对话框:

在 VBA 中使用文件对话框

MFC读取文件中利用CFileDialog类打开文件,出现对话框后,点击取消出现问题

从 Access 2010 VBA 打开 Excel 2010 文件

MS Access VBA 文件对话框崩溃

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