我正在使用Visual Basic来编写Autodesk Inventor的宏。我创建了一个调用文件对话框的宏,请参阅下面的代码。除了用户使用句点中的文件名和数字之后,一切都适用于罚款。 例如,如果用户在框中放入testfile.test并命中OK。当我要求他们在那里使用的东西时使用.filename,我得到“testfile.test”。就像我应该一样。 但是,如果用户将testfile1或testfile.10或testfile1.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 Creative Update似乎更改了文件对话框的工作原理。使用上面的代码,如果名称中没有句点,FullName会返回空白,并且如果名称中有一个时段,则将从左侧的第一个时段截断所有内容。

我并不肯定在Windows 10中改变了什么,但它几乎摧毁了我的黑客。在创意更新工作之前,Windows 7仍然适用于罚款和Windows 10。我最终做了以下事情,让一切都在上面提到的Windows版本中再次工作。

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

有帮助吗?

解决方案

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

SupportMultiDottedExtensions = True
.

此设置旨在允许使用虚线扩展 - 这意味着在文件名中使用句点。请参阅此MSDN文档和信息的参考: http://msdn.microsoft.com/en-us/library/system.windows.forms.filedialog.support multidottideDextensions.aspx#y129

所以文章也可以进一步揭示: saveas对话框,文件名中的句号不会返回扩展

编辑

检查autodesk文档后 - 在我看来,难以愉快的任务 - 确实似乎没有支持多级段义。但是,我确实在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“,”AAB“,或任何对您的焦点有意义。

如果您只是使应用程序友好,我会建议过滤在将它们保存在所需的文件型之前输入的字符串,如果周期过滤给您悲伤,则将字符串的过滤分开。它可能会添加一个额外的步骤,但它可能是过滤淘汰讨厌无效字符的最佳和最简单的方法,而不为您的用户创建不必要的额外麻烦。

〜jol

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top