私はこれを行う方法をあちこち探しました。
[名前を付けて保存]ダイアログボックスを開いて、ユーザーがファイルを保存する場所を選択できるようにします。ただし、[ファイルの種類]フィールドを「カンマ区切り値ファイル(* .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
あなたより!
述べたように、彼は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
いつものように遅くなりますが、うまくいけばより良い解決策...
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"に設定すると、その拡張子が強制されます。フィルタには「すべてのファイル」と表示されますが、指定した拡張子が付いていない限り、ファイルは表示されません。
結果
たとえば、「*。ext」を消去して「test」と書くと、結果のファイル名は「test.ext」になるため、実際にはその拡張子が強制されます。
完璧ではありませんが、非常にシンプルで、コードの経験が少ない人のためにAPI呼び出しに頼ることなく目的の結果を達成します。
警告
これは、一度に1つの拡張機能に対してのみ機能します。 「* .csv」。複数の拡張子をフィルタリングする必要がある場合(例:画像の場合は、API呼び出しを使用する必要があります。
マイクが書いたように、そしてリンクから彼は提案しました。デフォルトで必要なフィルターを選択するには、次のことができます。
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
http://msdn.Microsoft.com/en-us/library/office/aa219834(v = office.11).aspx
Filterindexを使用して、デフォルトのリストから目的の拡張子を選択するか(ダイアログを起動し、リストを拡張子までカウントダウンします)、msdnにリンクされているページに記載されているようにsaveasフィルターコレクションを変更します。フィルタはfiledialogインスタンス内で変更できません。その前にのみ、Application.FileDialog(msoFileDialogSaveAs).Filtersを介してfiledialogfiltersオブジェクトを使用します。その後、インスタンス内で使用可能になります。