Сопоставить тип файла диалога SaveAs2 с Application.FileDialog

Допустим, вам нужна кнопка, которую пользователь может щелкнуть и сохранить копию текущего файла в формате PDF( Документация):

Application.ActiveDocument.SaveAs2 fileName:="fileName.pdf", FileFormat:=wdFormatPDF

Это работает нормально, пользователь получает диалоговое окно сохранения, выбирает местоположение и файл сохраняется, однако некоторые вещи не верны:

Отображаемый тип не соответствует указанному в VBA. Как это можно исправить? Он по-прежнему сохраняется как тип "PDF" без проблем, даже после отображения "DOCX" в качестве типа файла в раскрывающемся списке "Сохранить как тип". Также файл "fileName.pdf" не помещается в поле "Имя файла", как будто диалоговое окно не знает о параметрах, установленных в коде VBA (на эту же проблему также ссылаются в этом посте).

ОБНОВЛЕНИЕ 1

После второго взгляда на мой код я теперь понимаю, что метод SaveAs2 не отображал диалоговое меню, правильную версию кода (упрощенно) можно описать так:

Dim selected As String: selected = Application.FileDialog(msoFileDialogSaveAs).Show()
Dim filePath As String

If selected <> 0 Then
    filePath = Application.FileDialog(msoFileDialogSaveAs).SelectedItems(1)
    Application.ActiveDocument.SaveAs2 fileName:=Split(filePath, ".")(0), FileFormat:=wdFormatPDF
End If

Итак, реальный вопрос (я полагаю) заключается в том, как заставить "Application.FileDialog" отображать правильный тип, который вы хотите сохранить в раскрывающемся меню "Сохранить как тип", и на него уже ответил @PatricK. Спасибо всем за помощь, я прошу прощения за первоначальный запутанный характер этого вопроса.

1 ответ

Решение

Я удивлен SaveAs2 принесет вам подсказку, чтобы быть честным - только новый документ и .Save принесет вам эту подсказку.

Если вы хотите получить что-то похожее на это приглашение, вы используете Application.FileDialog с типом msoFileDialogSaveAs.

Используйте этот код ниже (возможно, как AddIn подходит больше):

Option Explicit

Sub MySaveAs()
    Dim oPrompt As FileDialog, i As Long, sFilename As String
    Set oPrompt = Application.FileDialog(msoFileDialogSaveAs)
    With oPrompt
        ' Find the PDF Filter from Default Filters
        For i = 1 To .Filters.Count
            'Debug.Print i & " | " & .Filters(i).Description & " | " & .Filters(i).Extensions
            ' Locate the PDF filter
            If InStr(1, .Filters(i).Description, "PDF", vbTextCompare) = 1 Then
                .FilterIndex = i
                Exit For
            End If
        Next
        ' Change the title and button text
        .Title = "Saving """ & ActiveDocument.Name & """ to PDF format"
        .ButtonName = "Save to PDF"
        ' Default name
        .InitialFileName = ActiveDocument.Name
        ' Show the Prompt and get Filename
        If .Show = -1 Then
            sFilename = .SelectedItems(1)
            Debug.Print "Final filename: " & sFilename
            ' Save the file as PDF
            ActiveDocument.SaveAs2 sFilename, wdFormatPDF
        End If
    End With
    Set oPrompt = Nothing
End Sub

Пример скриншота:
ResultingFileDialogBox

Другие вопросы по тегам