0

我正在使用 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

更新:

我最终做了以下“hack”以使事情在处理一段时间时仍然有效:

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

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

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

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

1 回答 1

0

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

SupportMultiDottedExtensions = True

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

这篇 SO 文章也可能会进一步阐明:文件名中带有句点的 SaveAs Dialog 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”,或者任何对你的焦点有意义的东西。

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

~乔尔

于 2012-07-26T14:51:12.163 回答