Newsgroup: it.comp.appl.access
Titolo: Lettura da file Excel non collegato.

WXP Pro/A03 SP3
Volendo recuperare i dati da un foglio di Excel collegato, mi accorgo che
Access assegna il tipo dato 
di ogni colonna utilizzando quello della prima riga di dati. Ciò comporta,
ad esempio, che se nella 
prima riga dati c'è un numero, il campo che fa riferimento a quella
colonna sarà di tipo numerico 
generando un errore per tutti quei dati del campo che, nei record
successivi, sono ad esempio 
alfanumerici.
Dal momento che non posso modificare il tipo dato di un foglio Excel
collegato, esiste un altro modo 
per avere i dati corretti, ovvero assegnare dei tipi dati diversi da
quelli proposti da Access al 
momento del collegamento?
Grazie.
-- 
TANNHAUSER
"I've seen things you people wouldn't believe..."
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 ha scritto nel messaggio 
news:ghoovv$lli$1...@news.newsland.it...

Visto che non è collegato puoi provare con ADO:
es.
'---
Dim rs As ADODB.Recordset
Dim connstr As String, Campo As Integer
Set rs = CreateObject("ADODB.recordset")
connstr = "Driver={Microsoft Excel Driver (*.xls)};DBQ=" & 
CurrentProject.path & "\nomeFile.xls;DriverID=278"
rs.Open "SELECT * FROM " & Chr$(34) & "Foglio1$" & Chr$(34), connstr
Do While Not rs.EOF
    For Campo = 0 To rs.Fields.Count - 1
        Debug.Print rs(Campo)
    Next
    rs.MoveNext
Loop
Set rs = Nothing
'---
Ciao.
-- 
Sergio MAZZA 

 Ciao.
Grazie Sergio,
con lo stesso codice, modificato, posso anche creare al volo una tabella
che contiene tutti i campi e tutti i record?


 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it
Ciao.
-- 
Sergio MAZZA 

 Ciao.
Ciao Sergio,
sono giunto, per tentativi successivi, al seguente codice:
Dim rs As ADODB.Recordset
Dim connstr As String, Campo As Integer
Dim Db As Database, Tbl As TableDef, Fld As Field, rst As Recordset
Set rs = CreateObject("ADODB.recordset")
Set Db = CurrentDb
connstr = "Driver={Microsoft Excel Driver (*.xls)};DBQ=" &
CurrentProject.Path & "NAVI.xls;DriverID=278"
Db.TableDefs.Delete ("Tbl_Navi")
Set Tbl = Db.CreateTableDef("Tbl_Navi")
rs.Open "SELECT * FROM " & Chr$(34) & "NAVE FTW$" & Chr$(34), connstr
For Campo = 0 To rs.Fields.Count - 1
If Campo = 33 Or Campo = 34 Then
Set Fld = Tbl.CreateField("F" & Campo, dbMemo): Tbl.Fields.Append Fld
Else
Set Fld = Tbl.CreateField("F" & Campo, dbText): Tbl.Fields.Append Fld
End If
Next
Db.TableDefs.Append Tbl
Set rst = CurrentDb.OpenRecordset("Tbl_Navi")
rs.MoveFirst
Do While Not rs.EOF
rst.AddNew
For Campo = 0 To rs.Fields.Count - 1
rst("F" & Campo) = rs(Campo)
Next Campo
rst.Update
rs.MoveNext
Loop
Set rs = Nothing
Ora, pur sapendo che c'è sicuramente la possibilità di ridurre la
lunghezza del codice ed ottimizzare la procedura, l'unica cosa che il
codice non fa è quella di scrivermi i dati alfanumerici nel primo campo,
ovvero: ogni volta che legge dal foglio Excel un dato alfanumerico nel
primo campo, mi lascia il campo nel corrispondente record vuoto; eppure il
campo è di tipo testo.
Stefano.


 Sergio MAZZA ha scritto:

Quello che potresti modificare è inserire nel primo ciclo for una verifica 
del tipo del campo tramite la proprietà Type (oggetto Field).
Es.
'---
For Campo = 0 To rs.Fields.Count - 1
        Select Case rs.Fields(Campo).Type
            Case adChar
               FieldType = "adChar"
            Case adVarChar
               FieldType = "adVarChar"
            Case adSmallInt
               FieldType = "adSmallInt"
            Case adUnsignedTinyInt
               FieldType = "adUnsignedTinyInt"
            Case adDBTimeStamp
               FieldType = "adDBTimeStamp"
            Case else
                FieldType = "alotr tipo"
        End Select
        Debug.Print "  Nome Campo: " & fld.Name & vbCr & _
          "  Tipo: " & FieldType & vbCr
Next
'---
Così sai di preciso che tipo di campo viene "tradotto" da access per la 
tabella excel e
L'elenco completo delle costanti lo trovi nell'help in linea alla voce:
DataTypeEnum
Ciao.
-- 
Sergio MAZZA