Newsgroup: it.comp.lang.visual-basic
Titolo: [VBS] Ado con excel

Ciao a tutti.
da un active x accedo a un file excel tramite la connessione
    myConnExcel.Open "Driver={Microsoft Excel Driver (*.xls)};" & _
    "DriverId=790;" & _
    "Dbq=c:\prova.xls;" & _
    "DefaultDir=c:\;"
Apro il recordset ed estraggo i dati
    myRecordsetExcel.Open "SELECT * FROM [prova$] ", myConnExcel
tutto funziona.
Il problema nasce quando per una colonna(numerica) non sono avvalorate le
prime 10 righe.
In questo caso non mi estrae nemmeno uno dei valori  della colonna.
Esempio:
Ho un foglio excel PROVA in cui ho due colonne COLONNA_A(numerica) e
COLONNA_B(alfanumerica)
Se la prima cella avvalorata della COLONNA_A si trova alla 15a riga, quella
cella nella connessione ADO mi restituira' un valore NULL.
Se invece aggiungo un numero qualsiasi in una delle prime 10 righe della
COLONNA_A la connessione ADO mi restituira' tutti i valori presenti nella
colonna.
Se faccio le stesse cose per la COLONNA_B funziona sempre tutto, la
connessione ADO mi restituisce sempre i valori corretti.
E' mai capitato anche a voi?
Sapete come risolvere questa situazione?
E' un baco o sbaglio io qualche cosa?
Vi ringrazio per le risposte e nel caso ci fossero dei dubbi su quel che ho
scritto ditemelo pure e io cerchero' di essere piu' chiaro.
Grazie
Alex

 prime 10 righe.
Il valore deve essere presente nelle prime 9 righe altrimenti non estrae
nulla.
Volevo aggiungere che ho provato anche questa stringa di connessione ma il
problema persiste.
    myConnExcel.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
    "Data Source=c:\prova.xls;" & _
    "Extended Properties=""Excel 8.0;HDR=Yes"""
Ciao e grazie ancora
Alex

     "Extended Properties=""Excel 8.0;HDR=Yes"""
Ciao, Alex.
    Ho provato a riprodurre la tua situazione. Ecco cosa ho ottenuto:
   |   A   |   B   |
---+-------+-------+
  1|Campo1 |Campo2 |
  2|       |      1|
  3|       |      2|
  4|       |      3|
  5|       |      4|
  6|       |      5|
  7|       |      6|
  8|       |      7|
  9|       |      8|
 10|       |      9|
 11|       |     10|
 12|       |     11|
 13|       |     12|
 14|       |     13|
 15|       |     14|
 16|       |     15|
 17|       |     16|
 18|       |     17|
 19|       |     18|
 20|       |     19|
 21|Z      |     20|
\Foglio2/
Option Explicit
Public Sub Main()
  On Error GoTo ErrorHandler
  Dim strCnn As String
  Dim strQry As String
  Dim cnn As ADODB.Connection
  Dim rst As ADODB.Recordset
  Dim fld As ADODB.Field
  strCnn = ";Driver={Microsoft Excel Driver (*.xls)}" _
    & ";DBQ=D:\Percorso\DB.xls" _
    & ";DefaultDir=D:\Percorso" _
    & ";DriverId=790" _
    & ";MaxBufferSize=2048" _
    & ";PageTimeout=5" _
    & ";"
  strQry = "SELECT " _
    & "T.Campo1 AS Campo1" _
    & ", " _
    & "T.Campo2 AS Campo2" _
    & " FROM" _
    & " [Foglio2$] AS T "
  Set cnn = New ADODB.Connection
  Set rst = New ADODB.Recordset
  cnn.Open strCnn
  rst.Open strQry, cnn
  With rst
    If (.BOF And .EOF) Then
      ' DO NOTHING
    Else
      Do Until (.EOF)
        For Each fld In .Fields
          Debug.Print fld.Value,
        Next
        Debug.Print
        .MoveNext
      Loop
    End If
  End With
  Debug.Print "<EOF>"
ExitProcedure:
  Set fld = Nothing
  Set rst = Nothing
  Set cnn = Nothing
  Exit Sub
ErrorHandler:
  Debug.Print Err.Description
  Resume ExitProcedure
End Sub
Output:
Null           1
Null           2
Null           3
Null           4
Null           5
Null           6
Null           7
Null           8
Null           9
Null           10
Null           11
Null           12
Null           13
Null           14
Null           15
Null           16
Null           17
Null           18
Null           19
Z              20
<EOF>
    Mi sembra regolare.
-- 
    (Facci sapere se ed eventualmente come hai risolto. Grazie.)
Ciao :o)
Maurizio Borrelli, Microsoft MVP - Office Systems - Access
--------
?SPQR(C)
 X
--------

Ciao
Il problema me lo da solo con campi numerici (forse anche con le date, non
l'ho provato, ma credo di si)
prova a invertire le colonne
    |   A   |   B   |
 ---+-------+-------+
   1|Campo1 |Campo2 |
   2|       |         |
   3|       |          |
   4|       |          |
   5|       |          |
   6|       |          |
   7|       |          |
   8|       |          |
   9|       |          |
  10|        |          |
  11|       |         |
  12|      |         |
  13|      |         |
  14|      |         |
  15|       |         |
  16|      |         |
  17|      |         |
  18|      |         |
  19|      |         |
  20|     |         |
  21|V     |     20|
--- nome foglio "prova" ---
    Dim myConnExcel
    Dim myRecordsetExcel
    Set myConnExcel = CreateObject("ADODB.Connection")
    Set myRecordsetExcel = CreateObject("ADODB.Recordset")
    myConnExcel.Open "Driver={Microsoft Excel Driver (*.xls)};" & _
    "DriverId=790;" & _
    "Dbq=C:\prova.xls;" & _
    "DefaultDir=C:\;"
     myRecordsetExcel.Open "SELECT Campo1 ,Campo2  FROM [prova$] ",
myConnExcel
     Do while not myRecordsetExcel.EOF
          msgbox myRecordsetExcel(0)
          msgbox myRecordsetExcel(1)
          myRecordsetExcel.MoveNext
    loop
Campo 1 mi restituisce "V"
Campo 2 mi restituisce sempre Null
Ciao e grazie per l'interessamento.
Alex

Ho provata a settare il campo prima di estrarlo
--  200 e' adVarChar -- 
myRecordsetExcel.fields.append "Campo2  ",200,20
myRecordsetExcel.Open "SELECT Campo1 ,Campo2  FROM [prova$] ",myConnExcel
Nulla di fatto.....il problema persiste.
Ciao
Alex

TROVATO IL PROBLEMA
http://support.microsoft.com/kb/q257819/
Righe da analizzare: Excel non fornisce ad ADO informazioni di schema
dettagliate relative ai dati che contiene, come farebbe un database
relazionale. Pertanto, il driver deve analizzare qualche riga dei dati
esistenti per poter formulare un'ipotesi in merito al tipo di dati contenuto
in ciascuna colonna. Il numero predefinito di "Righe da analizzare" è 8. È
possibile specificare un valore interno compreso tra 1 e 16 oppure
specificare 0 perché vengano analizzate tutte le righe esistenti. Per
effettuare questa operazione, aggiungere l'impostazione facoltativa
MaxScanRows= alla stringa di connessione oppure cambiare l'impostazione
Righe da analizzare nella finestra di dialogo della configurazione DSN.
Tuttavia, a causa di un bug nel driver ODBC, anche specificando
l'impostazione delle righe da analizzare (MaxScanRows), non si otterrà
l'effetto desiderato, ovvero il driver ODBC di Excel (MDAC 2.1 e versioni
successive) continuerà ad analizzare le prime otto righe dell'origine dati
specificata per determinare il tipo di dati di ciascuna colonna.
Adesso devo capire come risolverlo......nel caso fosse possibile.
Ciao
Alex

 Adesso devo capire come risolverlo......nel caso fosse possibile.
Ciao, Alex.
    Bastava il link! ;-)
    Perfetto. Allora vedi se per caso questo fa al caso tuo:
        FIX: ADO Inserts Data into Wrong Columns in Excel
 
http://support.microsoft.com/kb/314763


Ti ringrazio ma penso di aver risolto in questa maniera :
select *
from OPENROWSET (
  'Microsoft.Jet.OLEDB.4.0',
  'Excel 8.0;Database=c:\prova.xls;HDR=no;IMEX=1'
  ,Prova$
)
Cosi' e' SQL SERVER che accede al file Excel e io non ho piu' problemi :-)
In teoria il parametro IMEX=1 avrebbe dovuto risolvermi il problema anche
settando il driver :
    myConnExcel.Open "Driver={Microsoft Excel Driver (*.xls)};" & _
    "DriverId=790;" & _
    "IMEX=1';" & _
    "Dbq=C:\prova.xls;" & _
    "DefaultDir=C:\;"
Ma non ha funzionato.
Nel posto precedente ti ho postato la parte che mi interessava di piu'
dell'articolo per evitarti di leggerlo tutto :-D
Ciao e Grazie
Alex