Диалоговое окно файла VBA .FileName удаляет .1 из конца имени файла

StackOverflow https://stackoverflow.com//questions/11657234

  •  11-12-2019
  •  | 
  •  

Вопрос

Я использую 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

ОБНОВЛЯТЬ:

В итоге я применил следующий «хак», чтобы все работало во время менструации:

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

Некоторое время это работало нормально в Windows 7, а затем в Windows 10.К сожалению, обновление Windows 10 Creative, похоже, изменило работу диалогового окна файла.В приведенном выше коде полное имя вернется пустым, если в имени не было точек, и обрежет все, начиная с ПЕРВОЙ точки слева, если в имени была точка.

Я не совсем уверен, что изменилось в 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.supportmultidottedextensions.aspx#Y129

Эта статья SO также может пролить дополнительный свет: Диалоговое окно «Сохранить как» с точкой в ​​имени файла не возвращает расширение.

РЕДАКТИРОВАТЬ

После проверки документации autodesk (на мой взгляд, это сложная и неприятная задача) поддержка MultidottedExtensions действительно отсутствует.Однако я нашел в VBAExpress функцию, которую очень тщательно адаптировал.Эту функцию можно использовать для фильтрации строк, содержащих недопустимые символы.В блоге Джимми Пенья есть отличная функция именно для такой цели: 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», система букв «ААА», «ААВ» или любая другая, которая имеет для вас смысл.

Если вы просто делаете приложение удобным для пользователя, я бы предложил фильтровать введенные строки перед их сохранением в нужном типе файла и отделить фильтрацию строк от диалогового окна сохранения, если фильтрация по точкам вас огорчает.Это может добавить дополнительный шаг, но это может быть лучший и самый простой способ отфильтровать надоедливые недопустимые символы, не создавая ненужных дополнительных проблем для ваших пользователей.

~ ДЖОЛ

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top