Save with msoFileDialogFilePicker

excel, vba

Solution

Like I mentioned in the comments, you can use `Application.GetSaveAsFilename`

The syntax is

`expression.GetSaveAsFilename(InitialFilename, FileFilter, FilterIndex, Title, ButtonText)`

And here is an example to use it

Sub Sample()
    Dim Ret

    Ret = userFileSaveDialog_OneFilterOnly("My Special Files", "Sid", "An Example")

    MsgBox Ret
End Sub

Function userFileSaveDialog_OneFilterOnly(iFilter As String, _
                                          iExtension As String, _
                                          Optional iTitle As String)
    Dim Ret

    Ret = Application.GetSaveAsFilename(fileFilter:=iFilter & _
                                                    " (*." & _
                                                    iExtension & _
                                                    "), *." & iExtension, _
                                                    Title:=iTitle)

    If Ret <> False Then userFileSaveDialog_OneFilterOnly = Ret
End Function

In Action

Problem

I've already searched a lot on that subject and I've tried many things. In fact, I need to ask user to save as a custom type that is not available within the `msoFileDialogSaveAs` filters. I know I could save as, let's say, `*.txt` and then change the extension before save. I did this and it worked but when the user enter the name of the file in a folder already containing other files of the custom type, the user won't see the existing custom files list because the active filter is not of that type. Therefore, I was wondering if there was a way to use `msoFileDialogFilePicker` to save as a custom type by typing the name of the file. Here is what is could look like: ``` Function userFileSaveDialog_OneFilterOnly(iFilter As String, _ iExtension As String, _ Optional iTitle As String) With Application.FileDialog(msoFileDialogFilePicker) '(msoFileDialogSaveAs) .Filters.Clear .Filters.Add iFilter, iExtension .AllowMultiSelect=False .ButtonName "Save" .Title = iTitle If CBool(.Show) Then userFileSaveDialog_OneFilterOnly = .SelectedItems(.SelectedItems.Count) Else End If End With End Function ``` Thanks for the help!

Original source