2015-10-05 35 views
0

後來我發現了一段代碼,它允許我調用opendialog來打開或保存文件。我下載了Access 2013,下面的代碼不會產生錯誤。但它沒有提供開放的對話框。轉換打開對話框的VBA代碼爲64位

Option Compare Database 
Option Explicit 

'***************** Code Start ************** 
'This code was originally written by Ken Getz. 
'It is not to be altered or distributed, 
'except as part of an application. 
'You are free to use it in any application, 
'provided the copyright notice is left unchanged. 
' 
' Code courtesy of: 
' Microsoft Access 95 How-To 
' Ken Getz and Paul Litwin 
' Waite Group Press, 1996 
' 
'http://www.mvps.org/access/api/api0001.htm 

Type tagOPENFILENAME 
    lStructSize As Long 
    hwndOwner As Long 
    hInstance As Long 
    strFilter As String 
    strCustomFilter As String 
    nMaxCustFilter As Long 
    nFilterIndex As Long 
    strFile As String 
    nMaxFile As Long 
    strFileTitle As String 
    nMaxFileTitle As Long 
    strInitialDir As String 
    strTitle As String 
    Flags As Long 
    nFileOffset As Integer 
    nFileExtension As Integer 
    strDefExt As String 
    lCustData As Long 
    lpfnHook As Long 
    lpTemplateName As String 
End Type 

Declare PtrSafe Function aht_apiGetOpenFileName Lib "comdlg32.dll" _ 
    Alias "GetOpenFileNameA" (OFN As tagOPENFILENAME) As Boolean 

Declare PtrSafe Function aht_apiGetSaveFileName Lib "comdlg32.dll" _ 
    Alias "GetSaveFileNameA" (OFN As tagOPENFILENAME) As Boolean 
Declare PtrSafe Function CommDlgExtendedError Lib "comdlg32.dll"() As Long 

Global Const ahtOFN_READONLY = &H1 
Global Const ahtOFN_OVERWRITEPROMPT = &H2 
Global Const ahtOFN_HIDEREADONLY = &H4 
Global Const ahtOFN_NOCHANGEDIR = &H8 
Global Const ahtOFN_SHOWHELP = &H10 
' You won't use these. 
'Global Const ahtOFN_ENABLEHOOK = &H20 
'Global Const ahtOFN_ENABLETEMPLATE = &H40 
'Global Const ahtOFN_ENABLETEMPLATEHANDLE = &H80 
Global Const ahtOFN_NOVALIDATE = &H100 
Global Const ahtOFN_ALLOWMULTISELECT = &H200 
Global Const ahtOFN_EXTENSIONDIFFERENT = &H400 
Global Const ahtOFN_PATHMUSTEXIST = &H800 
Global Const ahtOFN_FILEMUSTEXIST = &H1000 
Global Const ahtOFN_CREATEPROMPT = &H2000 
Global Const ahtOFN_SHAREAWARE = &H4000 
Global Const ahtOFN_NOREADONLYRETURN = &H8000 
Global Const ahtOFN_NOTESTFILECREATE = &H10000 
Global Const ahtOFN_NONETWORKBUTTON = &H20000 
Global Const ahtOFN_NOLONGNAMES = &H40000 
' New for Windows 95 
Global Const ahtOFN_EXPLORER = &H80000 
Global Const ahtOFN_NODEREFERENCELINKS = &H100000 
Global Const ahtOFN_LONGNAMES = &H200000 

Function TestIt() 
    Dim strFilter As String 
    Dim lngFlags As Long 
    strFilter = ahtAddFilterItem(strFilter, "Access Files (*.mda, *.mdb)", _ 
        "*.MDA;*.MDB") 
    strFilter = ahtAddFilterItem(strFilter, "dBASE Files (*.dbf)", "*.DBF") 
    strFilter = ahtAddFilterItem(strFilter, "Text Files (*.txt)", "*.TXT") 
    strFilter = ahtAddFilterItem(strFilter, "All Files (*.*)", "*.*") 
    MsgBox "You selected: " & ahtCommonFileOpenSave(InitialDir:="C:\", _ 
     Filter:=strFilter, FilterIndex:=3, Flags:=lngFlags, _ 
     DialogTitle:="Hello! Open Me!") 
    ' Since you passed in a variable for lngFlags, 
    ' the function places the output flags value in the variable. 
    Debug.Print Hex(lngFlags) 
End Function 

Function GetOpenFile(Optional varDirectory As Variant, _ 
    Optional varTitleForDialog As Variant) As Variant 
' Here's an example that gets an Access database name. 
Dim strFilter As String 
Dim lngFlags As Long 
Dim varFileName As Variant 
' Specify that the chosen file must already exist, 
' don't change directories when you're done 
' Also, don't bother displaying 
' the read-only box. It'll only confuse people. 
    lngFlags = ahtOFN_FILEMUSTEXIST Or _ 
       ahtOFN_HIDEREADONLY Or ahtOFN_NOCHANGEDIR 
    If IsMissing(varDirectory) Then 
     varDirectory = "" 
    End If 
    If IsMissing(varTitleForDialog) Then 
     varTitleForDialog = "" 
    End If 

    ' Define the filter string and allocate space in the "c" 
    ' string Duplicate this line with changes as necessary for 
    ' more file templates. 
    strFilter = ahtAddFilterItem(strFilter, _ 
       "Access (*.mdb)", "*.MDB;*.MDA") 
    ' Now actually call to get the file name. 
    varFileName = ahtCommonFileOpenSave(_ 
        OpenFile:=True, _ 
        InitialDir:=varDirectory, _ 
        Filter:=strFilter, _ 
        Flags:=lngFlags, _ 
        DialogTitle:=varTitleForDialog) 
    If Not IsNull(varFileName) Then 
     varFileName = TrimNull(varFileName) 
    End If 
    GetOpenFile = varFileName 
End Function 

Function ahtCommonFileOpenSave(_ 
      Optional ByRef Flags As Variant, _ 
      Optional ByVal InitialDir As Variant, _ 
      Optional ByVal Filter As Variant, _ 
      Optional ByVal FilterIndex As Variant, _ 
      Optional ByVal DefaultExt As Variant, _ 
      Optional ByVal FileName As Variant, _ 
      Optional ByVal DialogTitle As Variant, _ 
      Optional ByVal hwnd As Variant, _ 
      Optional ByVal OpenFile As Variant) As Variant 
' This is the entry point you'll use to call the common 
' file open/save dialog. The parameters are listed 
' below, and all are optional. 
' 
' In: 
' Flags: one or more of the ahtOFN_* constants, OR'd together. 
' InitialDir: the directory in which to first look 
' Filter: a set of file filters, set up by calling 
' AddFilterItem. See examples. 
' FilterIndex: 1-based integer indicating which filter 
' set to use, by default (1 if unspecified) 
' DefaultExt: Extension to use if the user doesn't enter one. 
' Only useful on file saves. 
' FileName: Default value for the file name text box. 
' DialogTitle: Title for the dialog. 
' hWnd: parent window handle 
' OpenFile: Boolean(True=Open File/False=Save As) 
' Out: 
' Return Value: Either Null or the selected filename 
Dim OFN As tagOPENFILENAME 
Dim strFileName As String 
Dim strFileTitle As String 
Dim fResult As Boolean 
    ' Give the dialog a caption title. 
    If IsMissing(InitialDir) Then InitialDir = CurDir 
    If IsMissing(Filter) Then Filter = "" 
    If IsMissing(FilterIndex) Then FilterIndex = 1 
    If IsMissing(Flags) Then Flags = 0& 
    If IsMissing(DefaultExt) Then DefaultExt = "" 
    If IsMissing(FileName) Then FileName = "" 
    If IsMissing(DialogTitle) Then DialogTitle = "" 
    If IsMissing(hwnd) Then hwnd = Application.hWndAccessApp 
    If IsMissing(OpenFile) Then OpenFile = True 
    ' Allocate string space for the returned strings. 
    strFileName = Left(FileName & String(256, 0), 256) 
    strFileTitle = String(256, 0) 
    ' Set up the data structure before you call the function 
    With OFN 
     .lStructSize = Len(OFN) 
     .hwndOwner = hwnd 
     .strFilter = Filter 
     .nFilterIndex = FilterIndex 
     .strFile = strFileName 
     .nMaxFile = Len(strFileName) 
     .strFileTitle = strFileTitle 
     .nMaxFileTitle = Len(strFileTitle) 
     .strTitle = DialogTitle 
     .Flags = Flags 
     .strDefExt = DefaultExt 
     .strInitialDir = InitialDir 
     ' Didn't think most people would want to deal with 
     ' these options. 
     .hInstance = 0 
     '.strCustomFilter = "" 
     '.nMaxCustFilter = 0 
     .lpfnHook = 0 
     'New for NT 4.0 
     .strCustomFilter = String(255, 0) 
     .nMaxCustFilter = 255 
    End With 
    ' This will pass the desired data structure to the 
    ' Windows API, which will in turn it uses to display 
    ' the Open/Save As Dialog. 
    If OpenFile Then 
     fResult = aht_apiGetOpenFileName(OFN) 
    Else 
     fResult = aht_apiGetSaveFileName(OFN) 
    End If 

    ' The function call filled in the strFileTitle member 
    ' of the structure. You'll have to write special code 
    ' to retrieve that if you're interested. 
    If fResult Then 
     ' You might care to check the Flags member of the 
     ' structure to get information about the chosen file. 
     ' In this example, if you bothered to pass in a 
     ' value for Flags, we'll fill it in with the outgoing 
     ' Flags value. 
     If Not IsMissing(Flags) Then Flags = OFN.Flags 
     ahtCommonFileOpenSave = TrimNull(OFN.strFile) 
    Else 
     ahtCommonFileOpenSave = vbNullString 
    End If 
End Function 

Function ahtAddFilterItem(strFilter As String, _ 
    strDescription As String, Optional varItem As Variant) As String 
' Tack a new chunk onto the file filter. 
' That is, take the old value, stick onto it the description, 
' (like "Databases"), a null character, the skeleton 
' (like "*.mdb;*.mda") and a final null character. 

    If IsMissing(varItem) Then varItem = "*.*" 
    ahtAddFilterItem = strFilter & _ 
       strDescription & vbNullChar & _ 
       varItem & vbNullChar 
End Function 

Private Function TrimNull(ByVal strItem As String) As String 
Dim intPos As Integer 
    intPos = InStr(strItem, vbNullChar) 
    If intPos > 0 Then 
     TrimNull = Left(strItem, intPos - 1) 
    Else 
     TrimNull = strItem 
    End If 
End Function 
'************** Code End ***************** 
+1

[Application.FileDialog](https://msdn.microsoft.com/en-us/library/office/ff196794.aspx)是一個簡單的選擇。 – HansUp

+2

我會重新考慮使用Access 64位。使用它的原因很少,甚至微軟建議使用32位。主要是你正在處理非常大的數字。這裏有幾個鏈接。 https://msdn.microsoft.com/zh-cn/library/ee691831%28office.14%29.aspx?f=255&MSPPError=-2147217396 https://support.office.com/zh-cn/article/Choose- -32位或64位版本的Office-2dee7807-8f95-4d0c-b5fe-6c6f49b8d261?ui = en-US&rs = en-SG&ad = SG – AVG

回答

1

你應該能夠簡單的使用FileDialog打開你想要的HansUp提出任何對話框。

' Allows you to open any type of file dialog 
' 1 - open 
' 2 - save as 
' 3 - file picker 
' 4 - folder picker 
' Filters is a 2D array of filter options. Example: ReDim filters(0, 0 To 1) 
'             filters(0, 0) = "All Files" - Description 
'             filters(0, 1) = "*.*"  - Filter 
' separate filter conditions with a ; to include multiple filters in one option like "*.xlsx; *.xls; *.xlsm" ' 
Function FileDialog(Dialog As Integer, _ 
        Optional Multi As Boolean = False, _ 
        Optional Title As String = "File Dialog", _ 
        Optional filters As Variant) As Variant 
    Dim Dlg As Object 

    Set Dlg = Access.Application.FileDialog(Dialog) 
    Dim i As Integer 
    With Dlg 
     .Title = Title 
     If Dialog = 3 Then 
      If Not IsMissing(filters) Then 
       '.filters.Clear 
       For i = LBound(filters, 1) To UBound(filters, 1) 
        .filters.Add filters(i, 0), filters(i, 1) 
       Next 
      Else 
       .filters.Clear ' filters will be saved from last open 
       .filters.Add "All Files", "*.*" 
      End If 
     End If 
     .AllowMultiSelect = Multi 
     Dim varMulti As Variant 
     i = 0 
     Dim selectedFiles() As String 
     ' if true user picked a file, if false user clicked cancel 
     If .Show Then 
      If .AllowMultiSelect And .selectedItems.count > 1 Then 
       ReDim selectedFiles(0 To .selectedItems.count - 1) 
       For Each varMulti In .selectedItems 
        selectedFiles(i) = .selectedItems(i + 1) 
        i = i + 1 
       Next 
       FileDialog = selectedFiles 
      Else 
       FileDialog = .selectedItems(1) 
      End If 
     Else 
      Exit Function 
     End If 
    End With 

    'FileDialog = Dlg.selecteditems(1) 
End Function 
+0

據我瞭解,Application.FileDialog被引入對於Office 2010,我們仍然有一些裝有Office 2007的PC。感謝代碼! – Rick

+1

[Access 2007 Application.FileDialog Property](https://msdn.microsoft.com/en-us/library/bb213476(v = office.12).aspx) – HansUp