Access 2007 VBAでファイルを開く(またはファイル選択)ダイアログを表示するにはどうすればよいですか?
Excelと同じようにApplication.GetOpenFileNameを使用しようとしましたが、この関数はAccessには存在しません。
Renaud Bompuisの回答に対する私のコメントは台無しになりました。
実際には、遅延バインディングを使用でき、11.0オブジェクトライブラリへの参照は必要ありません。
次のコードは参照なしで機能します。
Dim f As Object
Set f = Application.FileDialog(3)
f.AllowMultiSelect = True
f.Show
MsgBox "file choosen = " & f.SelectedItems.Count
上記はランタイムでもうまく機能することに注意してください。
Access 2007では、Application.FileDialog
。
Accessドキュメントの例を次に示します。
' Requires reference to Microsoft Office 12.0 Object Library. '
Private Sub cmdFileDialog_Click()
Dim fDialog As Office.FileDialog
Dim varFile As Variant
' Clear listbox contents. '
Me.FileList.RowSource = ""
' Set up the File Dialog. '
Set fDialog = Application.FileDialog(msoFileDialogFilePicker)
With fDialog
' Allow user to make multiple selections in dialog box '
.AllowMultiSelect = True
' Set the title of the dialog box. '
.Title = "Please select one or more files"
' Clear out the current filters, and add our own.'
.Filters.Clear
.Filters.Add "Access Databases", "*.MDB"
.Filters.Add "Access Projects", "*.ADP"
.Filters.Add "All Files", "*.*"
' Show the dialog box. If the .Show method returns True, the '
' user picked at least one file. If the .Show method returns '
' False, the user clicked Cancel. '
If .Show = True Then
'Loop through each file selected and add it to our list box. '
For Each varFile In .SelectedItems
Me.FileList.AddItem varFile
Next
Else
MsgBox "You clicked Cancel in the file dialog box."
End If
End With
End Sub
サンプルにあるように、Microsoft Access 12.0 Object Library(VBE IDE> Tools> Referencesメニューの下)への参照があることを確認してください。
アルバートがすでに言ったことに加えて:
このコード(さまざまなサンプルのマッシュアップ)は、SaveAsダイアログボックスを持つ機能を提供します。
Function getFileName() As String
Dim fDialog As Object
Set fDialog = Application.FileDialog(msoFileDialogSaveAs)
Dim varFile As Variant
With fDialog
.AllowMultiSelect = False
.Title = "Select File Location to Export XLSx :"
.InitialFileName = "jeffatwood.xlsx"
If .Show = True Then
For Each varFile In .SelectedItems
getFileName = varFile
Next
End If
End With
End Function
上記と同様のソリューションがあり、ファイルを開く、保存する、選択するために機能します。それを独自のモジュールに貼り付け、作成したすべてのAccess DBで使用します。コードが示すように、Microsoft Office 14.0 Object Libraryが必要です。私が思うにもう一つのオプション:
Public Function Select_File(InitPath, ActionType, FileType)
' Requires reference to Microsoft Office 14.0 Object Library.
Dim fDialog As Office.FileDialog
Dim varFile As Variant
If ActionType = "FilePicker" Then
Set fDialog = Application.FileDialog(msoFileDialogFilePicker)
' Set up the File Dialog.
End If
If ActionType = "SaveAs" Then
Set fDialog = Application.FileDialog(msoFileDialogSaveAs)
End If
If ActionType = "Open" Then
Set fDialog = Application.FileDialog(msoFileDialogOpen)
End If
With fDialog
.AllowMultiSelect = False
' Disallow user to make multiple selections in dialog box
.Title = "Please specify the file to save/open..."
' Set the title of the dialog box.
If ActionType <> "SaveAs" Then
.Filters.Clear
' Clear out the current filters, and add our own.
.Filters.Add FileType, "*." & FileType
End If
.InitialFileName = InitPath
' Show the dialog box. If the .Show method returns True, the
' user picked a file. If the .Show method returns
' False, the user clicked Cancel.
If .Show = True Then
'Loop through each file selected and add it to our list box.
For Each varFile In .SelectedItems
'return the subroutine value as the file path & name selected
Select_File = varFile
Next
End If
End With
End Function
私はジョンMがOPの質問に最もよく答えていることに同意します。明示的には述べられていませんが、明らかな目的は選択されたファイル名を取得することですが、他の答えはカウントまたはリストを返します。ただし、この場合はmsofiledialogfilepickerの方が適している可能性があることを付け加えます。すなわち:
Dim f As object
Set f = Application.FileDialog(msoFileDialogFilePicker)
dim varfile as variant
f.show
with f
.allowmultiselect = false
for each varfile in .selecteditems
msgbox varfile
next varfile
end with
注:multiselectがfalse(1つのアイテムのみが選択される)であるため、varfileの値は同じままです。ループの外側でその値を使用して、同様に成功しました。ただし、おそらくジョンMが行ったように実行することをお勧めします。また、フォルダピッカーを使用して、選択したフォルダを取得できます。私は常にレイトバインディングを好みますが、オブジェクトはデフォルトのアクセスライブラリにネイティブであると思うので、ここでは必要ないかもしれません