0

Visual Basic を使用して、Autodesk Inventor のマクロを作成しています。ファイル ダイアログを呼び出すマクロを作成しました。以下のコードを参照してください。ユーザーがファイル名にピリオドとそれに続くゼロより大きい数字を入力した場合を除いて、すべて正常に機能します。

たとえば、ユーザーが testfile.test をボックスに入れて [OK] をクリックするとします。.FileName を使用してそこに何を入れるかを尋ねると、「testfile.test」と表示されます。私がすべきように。

ただし、ユーザーが testfile.1 または testfile.10 または testfile.1mdksj などを入力すると、ピリオドの直後に 0 より大きい数値が続く限り、"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 が空白に戻り、名前にピリオドがある場合は左から FIRST ピリオドからすべてが切り捨てられます。

Windows 10 で何が変わったのかよくわかりませんが、私のハックはほとんど破壊されました。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 with a period in the filename は拡張子を返しません

編集

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

于 2012-07-26T14:51:12.163 に答える