Dim x as Database



  • Dim x as Database
    di resmeralda data: 22/05/2014 09:08:54

    Buongiorno a tutti. Vi illustro il mio problema.
    Ho scritto un'applicazione in VBA su Excel 2003 che sfrutta il componente Dao350.dll per far si che dichiarando una variabile (Dim o Global, nel caso specifico) come "Database" (vedi titolo), l'app riesca ad aprire un file Access (creato sempre con versione 2003) nel quale scrivere/leggere i dati (funzioni Edit e Update)
    Riporto l'esempio:
    Dim db as Database
    Set db=opendatabase("c:Archivio.mdb")
    Come accennato, funzionava tutto perfettamente fino alla versione di Office 2010.
    Passando ad Office 2013, quindi Excel 2013 ed Access 2013, rilevo l'errore 429 proprio nella riga "Set db= .........".
    Ho provato a registrare più volte la libreria (regsrv32 dao350.dll), sia la versione 350 che la 360, oltre che ad accertarmi che sia presente nei riferimenti del VBA, ma l'errore persiste.
    Quello che vi chiedo è se esiste un metodo non troppo complesso per ottenere lo stesso risultato, evitando di aprire il database con la funzione "Set db=........" e riuscire comunque ad eseguire funzioni di Edit ed Update.
    Un grazie a tutti.
     
    Global DB as Database
    Global RS as Recordset
    
    Set DB = OpenDatabase("c:Archivio.mdb") 'Errore 429
    
    Set RS = DB.OpenRecordset("Clienti")



  • di lepat (utente non iscritto) data: 22/05/2014 10:45:26

    allega file e database e provo a vedere se ci capisco qualcosa



  • di Vecchio Frac data: 23/05/2014 20:22:42

    Che sistema operativo è? Windows Vista? A 32 o 64 bit?
    Forse non hai i permessi per leggere e scrivere su c:.
    Hai spostato il database in una cartella diversa, accessibile all'utente, ad esempio sul desktop?

    Io ho provato il file Excel che hai allegato e funziona su Seven con Excel 2003.
    Magari adesso faccio una prova in macchina virtuale con Excel 2010.





  • di Vecchio Frac data: 23/05/2014 20:29:16

    Esito della prova con Excel 2010: nessun problema rilevato.
    File Access in cartella radice C:, addirittura, senza che Excel battesse ciglio.
    Non sono in grado di provare Excel 2013, non so se ci sono incompatibilità tra DAO e questa nuova versione di Excel.





  • di lepat (utente non iscritto) data: 23/05/2014 23:28:06

    sul 2013 funziona, ma da Strumenti, Riferimenti devi abilitare le librerie
    microsoft DAO 3.6 object ....
    microsoft Data Access Components ...



  • di Vecchio Frac data: 24/05/2014 14:50:50

    cit. " devi abilitare le librerie"
    ---> Bè sì, giusto. Mai dare niente per scontato ^_^




  • Dim x as Database
    di resmeralda (utente non iscritto) data: 26/05/2014 17:21:53

    Innanzitutto ringrazio tutti quanti per la considerazione. Voglio solo formulare dei chiarimenti in base alle vs. risposte.
    La procedura funziona benissimo su Excel 2003 così come su Excel 2010, ma genera il problema evidenziato su Excel 2013.
    In Excel 2013 tutte le librerie (DAO 3.5, DAO 3.6 e Microsoft Access Library 15.0) sono state caricate ed attivate con il risultato che conoscete.
    Per ora, per ovviare al problema, ho dovuto reinstallare anche Excel ed Access 2003 che uso insieme al pacchetto Office 2013.
    Io credo che ci sia un problema di compatibilità tra le medesime librerie usate tra i due pacchetti Office, anche se su Internet non sono ancora riuscito a trovare la conferma a questo.
    Grazie ancora a tutti.



  • di lepat (utente non iscritto) data: 26/05/2014 18:01:18

    Non so che dirti, io ho utilizzato il tuo codice ed il tuo file su Excel 2013 e funziona dopo aver abilitato le librerie di cui sopra



  • di lepat (utente non iscritto) data: 26/05/2014 18:04:54

    per essere più preciso ho utilizzato questo
     
    Sub b()
    Call DAOCopyFromRecordSet("C:UsersuserDesktopdb1.mdb", "tabella1", Range("A1"))
    End Sub
    
    Sub DAOCopyFromRecordSet(DBFullName As String, TableName As String, TargetRange As Range)
    Dim db As Database, rs As Recordset
    Dim intColIndex As Integer
        Set TargetRange = TargetRange.Cells(1, 1)
        Set db = OpenDatabase(DBFullName)
        Set rs = db.OpenRecordset(TableName, dbOpenTable) ' all records
        For intColIndex = 0 To rs.Fields.Count - 1
            TargetRange.Offset(0, intColIndex).Value = rs.Fields(intColIndex).Name
        Next
        TargetRange.Offset(1, 0).CopyFromRecordset rs
        Set rs = Nothing
        db.Close
        Set db = Nothing
    End Sub