Newsgroup: it.comp.lang.visual-basic
Titolo: [?] help: (molti) xls -> (una sola tabella) mdb

per semplificare la vita ad alcuni colleghi, ho fatto l'errore di fargli
immettere delle tabelle con excel anziche' con access.
ora mi trovo circa 100-150 xls, che dovrei importare in un'unica tabella di
un mdb 97. svariate centinaia di righe...
nb: non ho mai fatto connessioni a db excel.
ho speranza di cavarmela con un ciclo che si legga tutti gli xls di una dir
e me li importi lui, oppure devo rassegnarmi a un copia+incolla, o nel
migliore dei casi a importare a manina in access foglio per foglio ?
tia, pal

>migliore dei casi a importare a manina in access foglio per foglio ?
Con le tabelle collegate di Access puoi allegare uno dei fogli excel (spero che siano tutti uguali!) e poi da codice puoi modificare al volo la stringa di connessione (e' la proprieta' connect di tabledef - dopo averla modificata devi chiamare il metodo RefreshLink) magari dentro un codice dopo che hai letto il contenuto di una directory dove hai i .xls. A questo punto lanci una query che accoda in una tabella.
Antonio

grazie mille intanto.
ovviamente si assomigliano *molto*, anzi *moltissimo* ma *non* sono proprio
tutti uguali :) c'e' stata un po' di -- diciamo -- italica creativita' nello
strutturarli. cercavo di nascondere questo particolare, cui d'altronde non
dispero di riuscire a porre rimedio abbastanza in fretta :)
credo di avere capito, salvo una cosa: mai usato una tabella collegata.
da dove parto, ovvero, che mi guardo ? oggetto db, tabledefs e simili ?
(vb5/dao)
rigrazie e ciao, a.
"Antonio Donatiello"


>(vb5/dao)
Io pensavo che essendo una cosa che fai una tantum potresti fare tutto direttamente nei moduli Access.
Comunque:
- in access collega una dei fogli execl;
- guarda nelle proprieta' della tabella il formato della stringa di connessione alla tabella dato che poi andrai a modificarla dinamicamente;
- da codice usa TableDefs che e' una collection proprieta' di database per puntare la TableDef della tabella collegata
   dim db as database, td as 
 
   set db = currentdb()
   set td = db.tabledefs("nome_della_tabella_collegata)")
- all'interno del ciclo che legge la directory vai a cambiare la proprieta' connect e fai refreshlink
   td.connect = ....... quello che hai capito ci deve andare :-)
   td.refreshlink.
- esegui una query che accoda nella tua tabella Access
   docmd.openquery "nomequery"
Ciao
Antonio

rigrazie antonio, provo.
ciao, a.


Premetto, non ho mai utilizzato l'oggetto excel ma se
    1) prendi tutti i file in un array ( con la funzione dir leggi i nomi).
    2) Instanzi un oggetto excel e apri i files
            Set xl = CreateObject("Excel.workbook")
            Workbooks.Open "File1.xls"
    3) Attraverso l'oggetto xl arrivi all'oggetto sheets
                    (dim sh as Excel.Worksheet)
                    set sh = xl.sheets(0)
     4) sh č il tuo foglio; per i suoi metodi e le proprietą guarda
sull'help se no mi licenziano :)
ciao Maurizio

 migliore dei casi a importare a manina in access foglio per foglio ?
Ipotizziamo una situazione ideale:
le Cartelle di lavoro di Excel (da adesso: WBK), sono tutte in un solo Disco
e nella stessa Cartella; in tale Cartella ci sono tutte e soltanto le WBK da
convertire e ogni WBK contiene uno o piu` Fogli di lavoro (WSH), ciascuno
contenente un solo Elenco (tabella) con origine in A1, con lo stesso numero
di colonne e sempre nello stesso ordine. Allora potresti partire da qualcosa
del genere:
Const strWbksPath$ = "c:\wbkspath\"
Dim objFSO  As Scripting.FileSystemObject
Dim objFile As Scripting.File
Dim xlWbk   As Excel.Workbook
Dim xlWsh   As Excel.Worksheet
Dim xlRow   As Excel.Range
Dim xlRng   As Excel.Range
Dim l&
Set objFSO = New Scripting.FileSystemObject
With objFSO
  For Each objFile In .GetFolder(strWbksPath).Files
    With objFile
      If Right$(.Name, 4) = ".xls" Then
        Debug.Print .Name
        Set xlWbk = GetObject(strWbksPath & .Name)
        With xlWbk
          For Each xlWsh In .Worksheets
            With xlWsh
              Debug.Print .Name
              For Each xlRow In .Range("A1").CurrentRegion.Rows
                If xlRow.Row > 1 Then
                  For Each xlRng In xlRow.Cells
                    With xlRng
                      Debug.Print .Column, .Value
' Se l'ordine dei campi della tabella e` lo stesso dei fogli:
' rst.Fields.Item(.Column - 1).Value = .Value
' Altrimenti, nell'ipotesi di 3 campi:
' Select Case .Column
' Case 1
'   rst.Fields.Item("Campo3").Value = .Value
' Case 2
'   rst.Fields.Item("Campo2").Value = .Value
' Case 3
'   rst.Fields.Item("Campo1").Value = .Value
' Case Else
' End Select
                      Set xlRng = Nothing
                    End With
                  Next
                  Set xlRow = Nothing
                End If
              Next
            End With
            Set xlWsh = Nothing
          Next
          Call .Close
        End With
        Set xlWbk = Nothing
      End If
    End With
    Set objFile = Nothing
  Next
End With
Set objFSO = Nothing
--
Ciao.
Maurizio