2012-07-25 25 views
0

末除去0.1我使用的Visual Basic编写的Autodesk Inventor宏。我创建了一个调用文件对话框的宏,参见下面的代码。一切正常,除非用户将文件名放在一个句号和一个大于零的数字之后。VBA文件对话框.FileName从文件名

例如,如果用户将在框中testfile.test和命中确定。当我询问他们使用.FileName时,我得到了“testfile.test”。就像我应该的。

然而,如果用户把testfile.1或testfile.10或testfile.1mdksj或什么,只要一个大于零的数直接跟我找回期“testfile的”。出于某种原因,在期间和期间之后的所有内容都将被删除。

,这是什么原因呢?这是一个视觉基础的错误还是我做错了什么?

'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 

UPDATE:

最后我做了下面的“黑客”,以使事情在处理一段时间仍然工作:

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

在今后相当一段时间的运行良好Windows 7和Windows 10.不幸的是,Windows 10 Creative更新似乎改变了文件对话框的工作方式。与上面的代码,全名会回来的空白,如果有在名称中没有时间,如果有在名称中期内会从左边截断了从第1期。

我真的不知道在Windows 10是什么改变了,但它几乎毁了我的黑客。在广告素材更新运行之前,Windows 7仍然可以正常运行,而Windows 10仍然正常运行我最终做了以下工作,以使我在上面提到的Windows版本中再次运行。

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

'ThisApplication.CreateFileDialog(oFileDlg)'做了什么? – Brad 2012-07-26 01:33:29

+0

从Autodesk Inventor 2012 COM API参考:“创建新的FileDialog对象的方法。FileDialog对象与Microsoft常用对话框控件相似,并允许您重新使用Inventor打开保存对话框。” – BlueBeardo 2012-07-27 13:58:36

回答

0

这是一个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

编辑

检查欧特克文档后 - 一个困难和不愉快的任务,在我看来, - 确实似乎不支持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 

吉米·佩纳的博客还包含一个递归版本为好,虽然他不推荐它。

你可以过滤任何字符串作为文件名与另一个字符 - 在这种情况下的空间。但是,您可以使用下划线或任何您认为愉快的其他角色。一般来说,如果你试图使用句点来进行版本控制或类似的目的,而发明者不会让你的话,我会强烈建议转到另一个可以提供这种指示的字符或字符集,比如下划线“_”,一个编号系统,“001”,“002”,一个字母系统,“AAA”,“AAB”,或任何有意义的焦点。

如果您只是使应用程序用户友好,我会建议过滤输入的字符串,然后将它们保存到所需的文件类型中,并且如果周期过滤给您带来悲伤,请将保存对话框中的字符串过滤分开。它可能会增加一个额外的步骤,但它可能是过滤出讨厌的无效字符而不会为用户造成不必要的额外麻烦的最好和最简单的方法。

〜JOL

+0

我尝试添加oFileDlg.SupportMultiDottedExtensions = True,并且该对象不支持该属性。它似乎不适用于具有FileDialog对象的Inventor VBA。 – BlueBeardo 2012-07-27 13:55:46

+0

我已经更新了我的答案,添加了过滤功能,因为它似乎并没有显示发明者明确支持多点扩展 - 尽管我发现他们的发明者API对象的文档是... terse :) – JackOrangeLantern 2012-07-27 14:55:41

+0

感谢您的真棒答案!当我第一次发现这个错误时,我建议用更合理的方式替换这些时间段,就像你所建议的那样,但是只能以嘟came声出现。我将不得不找出他们更喜欢哪一个,从现在开始直到时间结束,或者改变当前的“标准”。再次感谢您的帮助,很高兴看到有人发现Autodesk的文档很少。 – BlueBeardo 2012-07-30 18:11:44