web-dev-qa-db-ja.com

Access 2007 VBAで「ファイルを開く」ダイアログを表示する方法

Access 2007 VBAでファイルを開く(またはファイル選択)ダイアログを表示するにはどうすればよいですか?

Excelと同じようにApplication.GetOpenFileNameを使用しようとしましたが、この関数はAccessには存在しません。

34
jwoolard

Renaud Bompuisの回答に対する私のコメントは台無しになりました。

実際には、遅延バインディングを使用でき、11.0オブジェクトライブラリへの参照は必要ありません。

次のコードは参照なしで機能します。

 Dim f    As Object 
 Set f = Application.FileDialog(3) 
 f.AllowMultiSelect = True 
 f.Show 

 MsgBox "file choosen = " & f.SelectedItems.Count 

上記はランタイムでもうまく機能することに注意してください。

45

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メニューの下)への参照があることを確認してください。

19
Renaud Bompuis

アルバートがすでに言ったことに加えて:

このコード(さまざまなサンプルのマッシュアップ)は、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
3
John M

上記と同様のソリューションがあり、ファイルを開く、保存する、選択するために機能します。それを独自のモジュールに貼り付け、作成したすべての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
2
MarkII

私はジョン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が行ったように実行することをお勧めします。また、フォルダピッカーを使用して、選択したフォルダを取得できます。私は常にレイトバインディングを好みますが、オブジェクトはデフォルトのアクセスライブラリにネイティブであると思うので、ここでは必要ないかもしれません

0
akw