macro importazione file



  • macro importazione file
    di stefanmi (utente non iscritto) data: 18/08/2013 15:41:16

    stavo provando a fare un esercizio su un libro, per importare un file da acces in excel, con la macro del libro funziona ma se cambio percorso per prendere il file mi da errore, come mai?

    il file del libro è nel percorso
    K: visual_basic_esempiOrders
    l'altro
    K: documentifile_di_accesfatture

    grazie
     
    Sub TabelFromExternal()
        Dim l As ListObject
        Dim q As QueryTable
        Dim s As String
    Workbooks.Add
    s = ThisWorkbook.Path & "..Orders.accdb"
    
    s = "OLEDB;Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & s
    Set l = ActiveSheet.ListObjects.Add(xlSrExternal, s, , xlYes, ActiveCell)
    Set q = l.QueryTable
    q.CommandType = xlCmdTable
    q.CommandText = "Orders"
    q.Refresh
    end Sub



  • di stefanmi (utente non iscritto) data: 18/08/2013 22:56:18

    adesso l'indirizzo lo prende, ma mi si blocca sull'ultima riga "refresh" qualcuno puo' spiegarmi il motivo? grazie
     
    Sub TableFromExternal()
        Dim l As ListObject
        Dim q As QueryTable
        Dim s As String
    Workbooks.Add
       s = ThisWorkbook.Path & "..fatture_2009-10-07.mdb"
       s = "OLEDB;Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & s
    Set l = ActiveSheet.ListObjects.Add(xlSrcExternal,s,,xlYes,ActiveCell)
    Set q = l.QueryTable
        q.CommandType = xlCmdTable
        q.CommandText = "fatture_2009-10-07"
        q.Refresh
    End sub



  • di HarryBosch data: 18/08/2013 23:16:49

    La routine funziona bene.
    Tieni presente che l'istruzione
    ThisWorkbook.Path
    recupera il percorso del file Excel e quindi, il file Access, dovrà essere necessariamente all'interno di questa stessa cartella o di una sottocartella. Comunque dici che questa parte l'hai risolta.

    Il refresh non ti funziona perché probabilmente, all'interno del file Access, non hai nessuna tabella o query nominata in questo modo: "Orders"
    Ovviamente, se vuoi recuperare i dati, dovrai assegnare lo stesso nome dell'oggetto in questione.




  • di stefanmi (utente non iscritto) data: 19/08/2013 00:04:12

    quindi in questa riga deve esserci il nome della tabella non del file?

    q.CommandText = "fatture_2009-10-07"

    la tabella si chiama "fatture"



  • di HarryBosch data: 19/08/2013 21:00:51

    Esatto. Il nome del file è già inserito all'interno del percorso "s" e tale file viene referenziato dall'istruzione
    OLEDB .... source:= & s
    la variabile s conterrà la stringa di connessione al database di origine.

    In ComandText associa il nome della tabella che vuoi importare, quindi nel tuo caso
    q.CommandText = "fatture"



  • di stefanmi (utente non iscritto) data: 19/08/2013 21:20:22

    eppure con questa registrata funziona
     
    Sub importa_file()
    '
    ' importa_file Macro
    '
    
    '
        Workbooks.Add
        With ActiveSheet.ListObjects.Add(SourceType:=0, Source:=Array( _
            "OLEDB;Provider=Microsoft.ACE.OLEDB.12.0;Password="""";User ID=Admin;Data Source=K:documentifile_di_accesfatture_2009-10-07.mdb;Mode=S" _
            , _
            "hare Deny Write;Extended Properties="""";Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet OLEDB:Database Password="""";Je" _
            , _
            "t OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=0;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1" _
            , _
            ";Jet OLEDB:New Database Password="""";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy" _
            , _
            " Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False;Jet OLEDB:Support Complex Data=False" _
            , ";Jet OLEDB:Bypass UserInfo Validation=False"), Destination:=Range("$A$1")). _
            QueryTable
            .CommandType = xlCmdTable
            .CommandText = Array("fatture")
            .RowNumbers = False
            .FillAdjacentFormulas = False
            .PreserveFormatting = True
            .RefreshOnFileOpen = False
            .BackgroundQuery = True
            .RefreshStyle = xlInsertDeleteCells
            .SavePassword = False
            .SaveData = True
            .AdjustColumnWidth = True
            .RefreshPeriod = 0
            .PreserveColumnInfo = True
            .SourceDataFile = "K:documentifile_di_accesfatture_2009-10-07.mdb"
            .ListObject.DisplayName = "Tabella_fatture_2009_10_07"
            .Refresh BackgroundQuery:=False
        End With
        Range("A2").Select
    End Sub
    



  • di stefanmi (utente non iscritto) data: 19/08/2013 21:21:34

    invece con questa mi si incanta all'ultima riga anche modificando come mi hai detto
     
    Sub importazione()
    
    Dim l As ListObject
    Dim q As QueryTable
    Dim s As String
    Workbooks.Add
       s = ThisWorkbook.Path & "..fatture_2009-10-07.mdb"
       s = "OLEDB;Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & s
    Set l = ActiveSheet.ListObjects.Add(xlSrcExternal, s, , xlYes, ActiveCell)
    Set q = l.QueryTable
    q.CommandType = xlCmdTable
    q.CommandText = "fatture"
    q.Refresh
    
    End Sub
    



  • di HarryBosch data: 19/08/2013 23:24:55

    Beh, se l'ultima routine è così come l'hai scritta per forza non funziona, il percorso non è lo stesso!
    s = ThisWorkbook.Path & "..fatture_2009-10-07.mdb"
    non equivale a
    Source=K:documentifile_di_accesfatture_2009-10-07.mdb

    Tra l'altro il registratore va bene ma bisognerebbe un attimo depurare il codice da inutili ridondanze.

    Prova con questo estratto... e vediamo se hai capito il discorso del percorso :)
     
    Sub importazione()
    
    Dim l As ListObject
    Dim q As QueryTable
    Dim s As String
    Workbooks.Add
       s = "K:documentifile_di_accesfatture_2009-10-07.mdb"
       s = "OLEDB;Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & s
    Set l = ActiveSheet.ListObjects.Add(xlSrcExternal, s, , xlYes, ActiveCell)
    Set q = l.QueryTable
    q.CommandType = xlCmdTable
    q.CommandText = "fatture"
    q.Refresh
    
    End Sub



  • di stefanmi (utente non iscritto) data: 19/08/2013 23:48:52

    grazie adesso funziona
    però volevo capire, siccome nel libro era spiegato di usare Thisworkbook perchè quella funziona e invece se cambio cartella non va?

    questa è quella del libro
     
    Sub IMPORT()
    '
    ' IMPORT Macro
    '
    
    '
        Workbooks.Add
        With ActiveSheet.ListObjects.Add(SourceType:=0, Source:=Array( _
            "OLEDB;Provider=Microsoft.ACE.OLEDB.12.0;Password="""";User ID=Admin;Data Source=K:visual_basic_esempiOrders.accdb;Mode=Share Deny Writ" _
            , _
            "e;Extended Properties="""";Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet OLEDB:Database Password="""";Jet OLEDB:Engine" _
            , _
            " Type=6;Jet OLEDB:Database Locking Mode=0;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New" _
            , _
            " Database Password="""";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Com" _
            , _
            "pact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False;Jet OLEDB:Support Complex Data=False;Jet OLEDB:Byp" _
            , "ass UserInfo Validation=False"), Destination:=Range("$A$1")).QueryTable
            .CommandType = xlCmdTable
            .CommandText = Array("Orders")
            .RowNumbers = False
            .FillAdjacentFormulas = False
            .PreserveFormatting = True
            .RefreshOnFileOpen = False
            .BackgroundQuery = True
            .RefreshStyle = xlInsertDeleteCells
            .SavePassword = False
            .SaveData = True
            .AdjustColumnWidth = True
            .RefreshPeriod = 0
            .PreserveColumnInfo = True
            .SourceDataFile = "K:visual_basic_esempiOrders.accdb"
            .ListObject.DisplayName = "Tabella_Orders.accdb"
            .Refresh BackgroundQuery:=False
        End With
        Range("H1").Select
    End Sub
    



  • di stefanmi (utente non iscritto) data: 19/08/2013 23:50:23

    questa quella semplificata, io avevo sostituito solo la cartella, quindi ho sbagliato bisogna inserire l'indirizzo giusto
     
    Sub TabelFromExternal()
        Dim l As ListObject
        Dim q As QueryTable
        Dim s As String
    Workbooks.Add
    s = ThisWorkbook.Path & "..Orders.accdb"
    s = "OLEDB;Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & s
        Set l = ActiveSheet.ListObjects.Add(xlSrExternal, s, , xlYes, ActiveCell)
        Set q = l.QueryTable
    q.CommandType = xlCmdTable
    q.CommandText = "Orders"
    q.Refresh
    
    End Sub
    



  • di HarryBosch data: 20/08/2013 10:19:56

    Allora, vediamo se riesco a farti capire :)
    La variabile "s" conterrà la stringa del percorso relativo al file Access. Nell'esempio del tuo libro viene impostata in questo modo:
    s = ThisWorkbook.Path & "..Orders.accdb"

    All'interno trovi quindi questa istruzione
    ThisWorkbook.Path
    di cui probabilmente ti sfugge il significato: ThisWorkbook significa "questa cartella", ovvero il file Excel dentro il quale ti trovi; il metodo Path ti fornisce il percorso di questo file Excel. Se il file Access si trova nella stessa cartella del file Excel, allora puoi utilizzare tale istruzione, aggiungendo il nome del file Access per completare il percorso:
    s = ThisWorkbook.Path & "fatture_2009-10-07.mdb"

    (o aggiungendo le relative sottocartelle)
    s = ThisWorkbook.Path & "sottocartellafatture_2009-10-07.mdb"

    Ma, se file Excel e Access sono in percorsi completamente diversi, allora tanto vale assegnare direttamente il percorso completo:
    s = "K:documentifile_di_accesfatture_2009-10-07.mdb"



  • di stefanmi (utente non iscritto) data: 20/08/2013 19:47:43

    grazie, spiegazione perfetta