Заранее установите поле «сохранить как тип» при использовании Application.FileDialog (msoFileDialogSaveAs) с MSAccess - PullRequest
10 голосов
/ 14 октября 2011

Я искал способ сделать это.

Я хочу открыть диалоговое окно Сохранить как, чтобы пользователь мог выбрать место для сохранения файла. Но, Я хочу, чтобы в поле «Сохранить как тип» было задано значение «Файл с разделенными запятыми значениями (* .csv)»

Проблема в том, что метод «Filter» не работает с «msoFileDialogSaveAs». Можно ли предварительно установить тип файла с помощью «Application.FileDialog (msoFileDialogSaveAs)»?

В настоящий момент, если я сохраняю файл с расширением .csv, а затем открываю его в excel, я получаю " Файл, который вы пытаетесь открыть xxx.csv, имеет другой формат, чем указанный в расширение файла ..."сообщение. Файл работает правильно, хотя.

 With Application.FileDialog(msoFileDialogSaveAs)
        .Title = "xxx"
        .AllowMultiSelect = False
        .InitialFileName = "xxx.csv"
        '.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*"
        result = .Show
        If (result <> 0) Then
            ' create file
            FileName = Trim(.SelectedItems.Item(1))
            fnum = FreeFile
            Open FileName For Output As fnum


            ' Write the csv data from form record set
            For Each fld In rs.Fields
               str = str & fld.Name & ", "
            Next

           ' Write header line
           str = Left(str, Len(str) - 2)   ' remove last semi colon and space
           Print #fnum, str
           str = ""

          ' Write each row of data
           rs.MoveFirst
          Do While Not rs.EOF             
            For i = 0 To 40
                str = str & rs(i) & ", "    ' write each field seperated by a semi colon
            Next i
            str = Left(str, Len(str) - 2)   ' remove last semi colon and space
            Print #fnum, str
            str = ""
            rs.MoveNext
           Loop

        ' close file
        Close #fnum
        End If
  End With

Чем Вы!

Ответы [ 4 ]

9 голосов
/ 15 апреля 2015

Поздно, как обычно, но, надеюсь, лучшее решение ...

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», то это будет принудительно расширяться. Фильтр по-прежнему будет отображать «Все файлы», однако он не будет показывать файлы, если у них нет указанного вами расширения.

Результат

msoFileDialogSaveAs Result

Если вы удалите «* .ext» и просто напишите «test», например, полученное имя файла будет «test.ext», так что оно фактически вынудит это расширение.

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

Предостережения

Это работает только для одного внутреннего абонента за раз, например "* .Csv". Если вам нужно отфильтровать несколько расширений, например, изображения, то вам придется прибегнуть к использованию вызовов API.

5 голосов
/ 15 августа 2013

Как писал Майк и по предложенной ссылке;чтобы выбрать фильтр по умолчанию, вы можете:

Sub Main()
    Debug.Print userFileSaveDialog("unicode", "*.txt")
End Sub

Function userFileSaveDialog(iFilter As String, iExtension As String)

    With Application.FileDialog(msoFileDialogSaveAs)
        Dim aFilterIndex As Long: aFilterIndex = 0&

        For aFilterIndex = 1& To .Filters.Count
            If (InStr(LCase(.Filters(aFilterIndex).Description), LCase(iFilter)) > 0) _
                And (LCase(.Filters(aFilterIndex).Extensions) = LCase(iExtension)) Then

                .FilterIndex = aFilterIndex
                Exit For

            End If
        Next aFilterIndex

        If CBool(.Show) Then
            userFileSaveDialog = .SelectedItems(.SelectedItems.Count)
        Else
            End
        End If
    End With

End Function
2 голосов
/ 14 октября 2011

Как указано, он FileDialog подсказывает, что msoFileDialogSaveAs не поддерживается.

Вы можете принудительно установить расширение CSV на FileName, когда диалог выгружается;

FileName = getCSVName(FileName)
...
Function getCSVName(fileName As String) As String
   Dim pos As Long
   pos = InStrRev(fileName, ".")
   If (pos > 0) Then
       fileName = Left$(fileName, pos - 1)
   End If
   getCSVName = fileName & ".CSV"
End Function

Если Excel не нравится ваш CSV, проверьте, есть ли какие-либо значения, которые вам нужно заключить в кавычки, чтобы избежать перевода строки / / (/446464/mozhete-li-vy-kodirovat-cr-lf-v-faily-csv)

И вместо этого паттерна;

For i = 0 To 40
   str = str & rs(i) & ", "    ' write each field seperated by a semi colon
Next i
str = Left(str, Len(str) - 2)   ' remove last semi colon and space

вы можете;

dim delimiter as string
...
For i = 0 To 40
   str = str & delimiter & rs(i)  ' write each field seperated by a semi colon
   delimiter = ","
Next 
0 голосов
/ 13 марта 2013

http://msdn.microsoft.com/en-us/library/office/aa219834(v=office.11).aspx

Используйте filterindex, чтобы выбрать желаемое расширение из списка по умолчанию (запустите диалоговое окно и просмотрите список до вашего расширения), или измените коллекцию фильтра saveas, как описано на странице, наMSDN.Фильтры нельзя изменить в экземпляре filedialog, только до этого с помощью объекта filedialogfilters через Application.FileDialog (msoFileDialogSaveAs) .Filters.Затем они доступны в экземпляре.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...