Domanda

Come faccio ad avere una finestra di dialogo Apri file di Access 2010 a 64 bit? Normalmente avrei uso il controllo comune di dialogo, ma che è a 32 bit e non può essere utilizzato con Access 2010 a 64 bit.

È stato utile?

Soluzione 4

Questo ragazzo ha uno strumento che genera il codice che è a 64 bit compatibile per l'apertura di un file. E 'freeware.

http://www.avenius.de/en/index.php? prodotti: IDBE_Tools

Questa era l'unica cosa che ha funzionato.

Altri suggerimenti

È possibile utilizzare il costruito nel finestra di dialogo file. E 'lì dal 2003 l'accesso.

Dim f    As FileDialog 
Set f = Application.FileDialog(msoFileDialogFilePicker) 
f.Show 
MsgBox "file choose was " & f.SelectedItems(1) 

È possibile associare in ritardo, se lo si desidera:

sopra esigenze: Microsoft Office 14.0 libreria di oggetti

Se si rimuove il riferimento alla libreria di oggetti 14,0, allora quanto segue codice funzionerà senza alcun riferimento:

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

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

Quindi, al di sopra lavori in fase di esecuzione o edizione regolare a partire dal 2003, e lavora anche per 32 o 64 bit edizioni di accesso 2010.

Non ho mai usato un controllo per la finestra di dialogo file aperto in quanto è solo un wrapper per la chiamata API comunque. chiamare il file standard di Windows finestra di dialogo Apri / Salva dialogo Inoltre non ci può essere la distribuzione e versioning problemi con i controlli in modo da faccio del mio meglio per evitare di loro.

Stavo lavorando con questo problema per un po 'lungo ...

tutto quello che hai detto sopra funziona ma c'è un ultimo pezzo da aggiungere ... sotto la dichiarazione CON OFN è necessario modificare

.lStructSize = Len(ofn)

a

.lStructSize = LenB(ofn)

E poi tutto funziona.

Prima di tutto, il "CommonDialog Class" non ha nemmeno sembrano lavorare su una versione a 32 bit di Office. Dà lo stesso errore OleDb. Come uno dei commentatori fa notare, questo non è il controllo che si dovrebbe usare. E mentre ci potrebbe essere un altro controllo ActiveX è possibile utilizzare, non c'è davvero alcuna garanzia che sarà disponibile su ogni macchina che si desidera distribuire il database on. La mia casella dev dispone di Visual Studio 6, VS 2008 e VS 2010 su di esso, oltre a Office e altri programmi, i quali forniscono ActiveX DLL che un utente tipico non si poteva pretendere di avere. Inoltre, molte di queste librerie non sono ridistribuibile, o pongono ostacoli installazione unici che non può essere semplicemente vale la pena.

Di gran lunga, la soluzione più universale semplice è quella di chiamare la finestra di dialogo Apri dalla API di Windows. E 'situato in Comdlg32.dll, che è disponibile su ogni versione di Windows che potrebbe eventualmente essere designando , e non impone alcuna dipendenze comdlg32.ocx. Inoltre fornisce prestazioni migliori rispetto all'utilizzo di un controllo ActiveX perché non richiede un modulo aggiuntivo per essere caricato in memoria.

Il codice che è necessario non è molto complicato sia. È necessario fornire una dichiarazione per la funzione GetOpenFileName , che crea l'Open la finestra di dialogo. Si prende un singolo parametro, un'istanza della OPENFILENAME struttura contenente informazioni utilizzato per inizializzare la finestra di dialogo, oltre a ricevere il percorso del file selezionato dall'utente. Così avrete anche bisogno di fornire una dichiarazione di tale struttura. Il codice in VBA sarebbe simile a questa:

Private Type OPENFILENAME
    lStructSize As Long
    hwndOwner As Long
    hInstance As Long
    lpstrFilter As String
    lpstrCustomFilter As String
    nMaxCustFilter As Long
    nFilterIndex As Long
    lpstrFile As String
    nMaxFile As Long
    lpstrFileTitle As String
    nMaxFileTitle As Long
    lpstrInitialDir As String
    lpstrTitle As String
    flags As Long
    nFileOffset As Integer
    nFileExtension As Integer
    lpstrDefExt As String
    lCustData As Long
    lpfnHook As Long
    lpTemplateName As String
End Type

Private Declare Function GetOpenFileName Lib "comdlg32.dll" _
    Alias "GetOpenFileNameA" (ByRef lpofn As OPENFILENAME) As Long

Ci sono anche un paio di costanti si può passare come bandiere per personalizzare il comportamento della finestra di dialogo. Per completezza, ecco la lista completa:

Private Const OFN_ALLOWMULTISELECT As Long = &H200
Private Const OFN_CREATEPROMPT As Long = &H2000
Private Const OFN_ENABLEHOOK As Long = &H20
Private Const OFN_ENABLETEMPLATE As Long = &H40
Private Const OFN_ENABLETEMPLATEHANDLE As Long = &H80
Private Const OFN_EXPLORER As Long = &H80000
Private Const OFN_EXTENSIONDIFFERENT As Long = &H400
Private Const OFN_FILEMUSTEXIST As Long = &H1000
Private Const OFN_HIDEREADONLY As Long = &H4
Private Const OFN_LONGNAMES As Long = &H200000
Private Const OFN_NOCHANGEDIR As Long = &H8
Private Const OFN_NODEREFERENCELINKS As Long = &H100000
Private Const OFN_NOLONGNAMES As Long = &H40000
Private Const OFN_NONETWORKBUTTON As Long = &H20000
Private Const OFN_NOREADONLYRETURN As Long = &H8000&
Private Const OFN_NOTESTFILECREATE As Long = &H10000
Private Const OFN_NOVALIDATE As Long = &H100
Private Const OFN_OVERWRITEPROMPT As Long = &H2
Private Const OFN_PATHMUSTEXIST As Long = &H800
Private Const OFN_READONLY As Long = &H1
Private Const OFN_SHAREAWARE As Long = &H4000
Private Const OFN_SHAREFALLTHROUGH As Long = 2
Private Const OFN_SHAREWARN As Long = 0
Private Const OFN_SHARENOWARN As Long = 1
Private Const OFN_SHOWHELP As Long = &H10
Private Const OFS_MAXPATHNAME As Long = 260

E per comodità, ho avvolto tutta questa confusione dentro di una funzione di supporto che è possibile chiamare dall'interno di VBA. Si accetta come parametri le proprietà avrete più comunemente necessario impostare per la finestra di file aperto, maniglie chiamando l'API di Windows stesso, e ritorna poi o il percorso completo del file selezionato dall'utente, o una stringa vuota (vbNullString) se il utente fa clic sul pulsante Annulla. È possibile verificare il valore di ritorno nel codice chiamante per determinare quale corso di azione da intraprendere.

'This function shows the Windows Open File dialog with the specified
' parameters, and either returns the full path to the selected file,
' or an empty string if the user cancels.
Public Function OpenFile(ByVal Title As String, ByVal Filter As String, _
    ByVal FilterIndex As Integer, ByVal StartPath As String, _
    Optional OwnerForm As Form = Nothing) As String

    'Create and populate an OPENFILENAME structure
    'using the specified parameters
    Dim ofn As OPENFILENAME
    With ofn
        .lStructSize = Len(ofn)
        If OwnerForm Is Nothing Then
            .hwndOwner = 0
        Else
            .hwndOwner = OwnerForm.Hwnd
        End If
        .lpstrFilter = Filter
        .nFilterIndex = FilterIndex
        .lpstrFile = Space$(1024) & vbNullChar & vbNullChar
        .nMaxFile = Len(ofn.lpstrFile)
        .lpstrFileTitle = vbNullChar & Space$(512) & vbNullChar & vbNullChar
        .nMaxFileTitle = Len(.lpstrFileTitle)
        .lpstrInitialDir = StartPath & vbNullChar & vbNullChar
        .lpstrTitle = Title
        .flags = OFN_FILEMUSTEXIST
    End With

    'Call the Windows API function to show the dialog
    If GetOpenFileName(ofn) = 0 Then
        'The user pressed cancel, so return an empty string
        OpenFile = vbNullString
    Else
        'The user selected a file, so remove the null-terminators
        ' and return the full path
        OpenFile = Trim$(Left$(ofn.lpstrFile, Len(ofn.lpstrFile) - 2))
    End If
End Function

Wow che ha finito per essere a lungo. Ci sono un sacco di dichiarazioni che dovrete copiare e incollare in un modulo, ma l'interfaccia è in realtà hanno a che fare con è sorprendentemente semplice. Ecco un esempio di come si potrebbe effettivamente utilizzare questo nel codice per visualizzare la finestra di file aperto e ottenere il percorso di un file:

Public Sub DoWork()
    'Set the filter string (patterns) for the open file dialog
    Dim strFilter As String
    strFilter = "Text Files (*.txt)" & vbNullChar & "*.txt*" & vbNullChar & _
                "All Files (*.*)" & vbNullChar & "*.*" & vbNullChar & vbNullChar

    'Show the open file dialog with the custom title, the filters specified
    ' above, and starting in the root directory of the C: drive.
    Dim strFileToOpen As String
    strFileToOpen = OpenFile("Choose a file to open", strFilter, 0, "C:\")

    'See if the user selected a file
    If strFileToOpen = vbNullString Then
        MsgBox "The user pressed the Cancel button."
    Else
        MsgBox "The user chose to open the following file: " & _
               vbNewLine & strFileToOpen 
    End If
End Sub

La parte più lunga della scrittura e testare questa soluzione è stata in realtà cercando di trovare il modo di aprire l'editor VBA e scrivere una macro in Access. Il nastro potrebbe essere una grande invenzione per le persone che usano il menu principale per "Paste" e "Salva", ma che dolore. Passo tutto il giorno usando il software, e non riesco ancora a trovare roba. [/ Rant]

mi mancava dettaglio di accesso a 64 bit. E 'molto improbabile che si dovrebbe essere in esecuzione, ma se siete, ecco un articolo per la vostra considerazione che spiega come si deve modificare la vostra chiamata API al lavoro - è necessario utilizzare il nuovo tipo di dati puntatore lungo:

compatibilità tra i 32-bit e 64-bit Le versioni di Office 2010

Se si modifica il codice API di conseguenza, dovrebbe funzionare bene su 64-bit di accesso.

Ma si dovrebbe davvero chiedersi perché si sta utilizzando a 64-bit di accesso. In realtà non è affatto consigliato da MS che l'uso chiunque a 64 bit di Office meno che non abbiano motivi specifici perché ne hanno bisogno (come ad esempio la necessità di utilizzare la memoria aggiuntiva che prevede, in particolare per le cose come complessi modelli di foglio di calcolo di Excel). L'accesso non è sicuramente una delle applicazioni che i benefici molto dalla conversione a 64-bit.

discussione dettagliata del soggetto:

In breve, la maggior parte delle persone non dovrebbero essere in esecuzione a 64 bit di Office, proprio per la ragione che hai incontrato -. Che provoca il codice legacy con dipendenze esterne sui componenti e le API a 32 bit a fallire

Sono appena stato alle prese con risoluzione di questo problema in una versione a 64 bit di Excel 2013.

Una combinazione di ...

  1. Utilizzando il tipo di dati LongPtr per 3 elementi (hwndOwner, hInstance, lpfnHook) nella struttura OPENFILENAME passato a GetOpenFileNameA
  2. sostituendo la funzione Len con la funzione LenB quando ottenere la dimensione della struttura OPENFILENAME (come detto da Max Albanese)

... ha fatto il trucco, grazie alla guida documentato qui: https: // gpgonaccess. blogspot.co.uk/2010/03/work-in-progress-and-64-bit-vba.html

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top