Newsgroup: it.comp.appl.access
Titolo: creazione recordset da excel e accodamento dat a tabella

Ho la necessità di accodare ad una tabella presente in Access un file
excel. La directory del file .xls viene scelta dall'utente tramite una
finestra ottenuta dall'uso dell'oggetto FileDialog.
Riesco a creare il recordset da excel ma ottengo un messaggio di errore
nella fase di accodamento perché non è possibile trovare l'oggetto
tblExcel.
Riporto il codice per poi spiegarmi meglio:
   Dim fd As FileDialog
   Dim conExcel As ADODB.Connection
   Dim tblExcel As ADODB.Recordset
   Set fd = Application.FileDialog(msoFileDialogFilePicker)
   fd.Show
   Set conExcel = New ADODB.Connection
   Set tblExcel = New ADODB.Recordset
   conExcel.Provider = "Microsoft.Jet.OLEDB.4.0"
   conExcel.Properties("Data Source") = fd.SelectedItems(1)
   conExcel.Properties("Extended properties") = "Excel 8.0;HDR=Yes"
   conExcel.Open
   tblExcel.Open "Select * from [Foglio1$]", conExcel
'fino a questo punto è tutto ok, ma successivamente la procedura va in
errore
   DoCmd.RunSQL ("INSERT INTO DatiCompleti SELECT * FROM tblExcel")
Immaginavo che una volta creato il recordset da excel (appunto
tblExcel), potessi trattarlo come una normale tabella del db, ma così
non è poiché la RunSql cerca tblExcel tra le tabelle del database e
non la trova. Come posso risolvere il problema?
Inoltre, quando ho scritto
tblExcel.Open "Select * from [Foglio1$]", conExcel
mi sono vincolato al fatto che il nome del foglio excel debba essere
necessariamente "Foglio1". Come faccio a selezionare il foglio n.1,
indipendentemente dal suo nome?
Grazie a tutti
mdm

 wrote in message 
news:1148396956.9...@38g2000cwa.googlegroups.com...
Ho la necessità di accodare ad una tabella presente in Access un file
excel. La directory del file .xls viene scelta dall'utente tramite una
finestra ottenuta dall'uso dell'oggetto FileDialog.
Riesco a creare il recordset da excel ma ottengo un messaggio di errore
nella fase di accodamento perché non è possibile trovare l'oggetto
tblExcel.
Riporto il codice per poi spiegarmi meglio:
   Dim fd As FileDialog
   Dim conExcel As ADODB.Connection
   Dim tblExcel As ADODB.Recordset
   Set fd = Application.FileDialog(msoFileDialogFilePicker)
   fd.Show
   Set conExcel = New ADODB.Connection
   Set tblExcel = New ADODB.Recordset
   conExcel.Provider = "Microsoft.Jet.OLEDB.4.0"
   conExcel.Properties("Data Source") = fd.SelectedItems(1)
   conExcel.Properties("Extended properties") = "Excel 8.0;HDR=Yes"
   conExcel.Open
   tblExcel.Open "Select * from [Foglio1$]", conExcel
'fino a questo punto è tutto ok, ma successivamente la procedura va in
errore
   DoCmd.RunSQL ("INSERT INTO DatiCompleti SELECT * FROM tblExcel")
Che complicazione!
Con una riga fai tutto:
DoCmd.TransferSpreadsheet _
    TransferType:=acImport, _
    SpreadSheetType:=acSpreadsheetTypeExcel9, _
    FileName:="C:\Book1.xls", _
    Range:="Sheet1!B10:F22", _
    TableName:="T11", _
    HasFieldNames:=True
Eventualmente sostituisci acImport con acLink così ti trovi una tabella
collegata e te la giochi come ti pare. In tale caso T11 non deve
esistere in Access.
Immaginavo che una volta creato il recordset da excel (appunto
tblExcel), potessi trattarlo come una normale tabella del db, ma così
non è poiché la RunSql cerca tblExcel tra le tabelle del database e
non la trova. Come posso risolvere il problema?
Con quella montagna di codice hai creato un recordset
non una tabella. Dovrai quindi lavorar di codice (non di query!)
per effettuare l'Append.
Inoltre, quando ho scritto
tblExcel.Open "Select * from [Foglio1$]", conExcel
mi sono vincolato al fatto che il nome del foglio excel debba essere
necessariamente "Foglio1". Come faccio a selezionare il foglio n.1,
indipendentemente dal suo nome?
Con ADO puoi definire:
- un Sheet (la procedura importa tutto quel che vi trova);
- un range esclusivamente del primo Sheet;
- un RangeName il quale, per essere univoco per il Workbook,
   può trovarsi in qualsiasi Sheet.
La prossima volta fa' in modo che la risposta possa rendersi
distinguibiule dalla domanda.
Ciao
Bruno 

Ho adattato alle mie esigenze il codice suggeritomi da te!!!! Era tutto
più semplice di quanto immaginavo :-)
Grazie 
mdm