Поздно, как обычно, но, надеюсь, лучшее решение ...
Public Function GetSaveFilename() As String
Dim Dialog As FileDialog: Set Dialog = Application.FileDialog(msoFileDialogSaveAs)
With Dialog
.InitialFileName = CurrentProject.Path & "\*.ext"
.FilterIndex = 2
.Title = "Save As"
If .Show <> 0 Then
GetSaveFilename = .SelectedItems(1)
End If
End With
End Function
Как это работает?
Как известно, вы можете , а не напрямую устанавливать фильтры для msoFileDialogSaveAs. Однако, если вы установите InitialFileName в «* .ext», то это будет принудительно расширяться. Фильтр по-прежнему будет отображать «Все файлы», однако он не будет показывать файлы, если у них нет указанного вами расширения.
Результат
Если вы удалите «* .ext» и просто напишите «test», например, полученное имя файла будет «test.ext», так что оно фактически вынудит это расширение.
Это не идеально, но очень просто и достигает желаемого результата, не прибегая к вызовам API для тех, кто менее опытен с кодом.
Предостережения
Это работает только для одного внутреннего абонента за раз, например "* .Csv". Если вам нужно отфильтровать несколько расширений, например, изображения, то вам придется прибегнуть к использованию вызовов API.