web-dev-qa-db-ja.com

MS AccessでApplication.FileDialog(msoFileDialogSaveAs)を使用しているときに、[ファイルの種類]フィールドを事前設定します

私はこれを行う方法をあちこち探しました。

[名前を付けて保存]ダイアログボックスを開いて、ユーザーがファイルを保存する場所を選択できるようにします。ただし、[ファイルの種類]フィールドを「カンマ区切り値ファイル(* .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

あなたより!

12
pec

述べたように、彼はFileDialogヘルプがmsoFileDialogSaveAsはサポートされていないと述べています。

ダイアログがアンロードされるときに、FileNameにCSV拡張機能を強制できます。

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を好まない場合は、改行をエスケープするために引用する必要のある値があるかどうかを確認してください/ "(http://stackoverflow.com/questions/566052/can-you-encode-cr-lf-in-into -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 
2
Alex K.

いつものように遅くなりますが、うまくいけばより良い解決策...

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

どのように機能しますか?

よく知られているように、not msoFileDialogSaveAsに直接フィルターを設定できます。ただし、InitialFileNameを "* .ext"に設定すると、その拡張子が強制されます。フィルタには「すべてのファイル」と表示されますが、指定した拡張子が付いていない限り、ファイルは表示されません。

結果

msoFileDialogSaveAs Result

たとえば、「*。ext」を消去して「test」と書くと、結果のファイル名は「test.ext」になるため、実際にはその拡張子が強制されます。

完璧ではありませんが、非常にシンプルで、コードの経験が少ない人のためにAPI呼び出しに頼ることなく目的の結果を達成します。

警告

これは、一度に1つの拡張機能に対してのみ機能します。 「* .csv」。複数の拡張子をフィルタリングする必要がある場合(例:画像の場合は、API呼び出しを使用する必要があります。

10
Dave Williams

マイクが書いたように、そしてリンクから彼は提案しました。デフォルトで必要なフィルターを選択するには、次のことができます。

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
5
simpLE MAn

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

Filterindexを使用して、デフォルトのリストから目的の拡張子を選択するか(ダイアログを起動し、リストを拡張子までカウントダウンします)、msdnにリンクされているページに記載されているようにsaveasフィルターコレクションを変更します。フィルタはfiledialogインスタンス内で変更できません。その前にのみ、Application.FileDialog(msoFileDialogSaveAs).Filtersを介してfiledialogfiltersオブジェクトを使用します。その後、インスタンス内で使用可能になります。

0
Mike Gardner