VBAファイルダイアログ.FILENAMEファイル名の終わりから.1
質問
Visual Basicを使用してAutodesk Inventor用のマクロを書く。ファイルダイアログを呼び出すマクロを作成しました。以下のコードを参照してください。ユーザーがファイル名を期間内に入力し、その後0を超える数字を入力した場合以外はすべて機能します。
たとえば、ユーザーがBoxにtestFile.testを置き、OKにヒットします。私がそこに置かれたものを尋ねるとき.filename、私は "testfile.test"を取得します。私のように。
しかし、ユーザがTestFile.1またはTestFile.10またはTestFile.1mdksjまたは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
.
更新:
私は次の「ハック」をやり遂げました。
.
Windows 7以降のWindows 10ではかなりうまく機能しました。残念ながら、Windows 10 Creative Updateはファイルダイアログがどのように機能するかを変更したようです。上記のコードでは、名前に期間がない場合はフルネームが空白になっており、名前に期間があった場合は最初の期間からすべてが切り捨てられます。
oFileDlg.fileName = sFname & "."
oFileDlg.ShowSave
fullName = Left$(oFileDlg.fileName, Len(oFileDlg.fileName) - 1)
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リファレンスを参照してください。
記事はまた、さらなる光を当てることができます。ファイル名のピリオドを持つSaveAsダイアログが を返しません。
編集
Autodeskのマニュアルを確認した後、私の意見では、困難で不快な作業、私の意見では、実際にはMultiDottedExtensionsをサポートしていないようです。しかし、私は非常に密接に適応したことをvbaexpressに関数を見つけました。機能を使用するには、CHUTTORY不適切な文字を含む文字列をフィルタリングするために使用できます。 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のブログには、推奨されていませんが、再帰的なバージョンも含まれています。
この場合のスペースを別の文字でファイル名として使用する文字列をフィルタリングできます。ただし、あなたが楽しいと思われる他のキャラクターを使うことができます。
一般的に、バージョン管理または同様の目的のために期間を使用しようとしている場合、Inventorはあなたをさせないでしょう、私はそのようなアンダースコア、そのような指示を提供することができる別のキャラクターまたは文字のセットに行くことを強く助言するでしょう。 _ "、番号付けシステム、" 001 "、" 002 "、レタリングシステム、" AAA "、" AAB "、またはあなたの焦点に理にかなっているものは何でも。
あなたがアプリケーションをユーザーフレンドリーにするだけでは、私は彼らを望むファイルタイプに保存する前に入力された文字列のフィルタリングを提案し、ピリオドフィルタリングが悲しみを与えるならば、保存ダイアログからの文字列のフィルタリングを区切ります。それは余分なステップを追加するかもしれませんが、あなたのユーザーに不要な余分な手間を描くことなく、Pesky無効な文字を除外する最も簡単な方法であるかもしれません。
〜jol