Quando ci connettiamo ad Excel tramite ADO i tipi delle colonne non sono definiti in uno schema, quindi il driver deve analizzare qualche riga per poter capire il tipo di dati contenuto.
Se i dati non sono coerenti, di default viene scelto il tipo di dati preponderante e restituito NULL per gli altri. Se i due tipi di dati sono presenti in uguale misura il tipo di dati sarà numerico.
Il numero di righe da analizzare di default è 8 ma può essere modificato tramite il parametro di configurazione MaxScanRows (da 1 a 16 o 0 per analizzarle tutte), peccato che a causa di un bug nel driver ODBC non funzioni.
L'alternativa è modificare la chiave di registro HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel\TypeGuessRows
Il parametro nella stringa di connessione IMEX che sta per Import Mixed Types se impostato a 1 impone che i dati misti vengano importati come testo.
Però se le N righe in analisi (TypeGuessRows) sono tutte numeriche, il tipo di dati non verrà convertito in testo e rimarrà numerico.
L'unico modo per risolvere questa ultima problematica è impostare nel registro di sistema TypeGuessRows=0 in modo da analizzare tutte le righe.
Riferimenti:
How to Utilizzare ADO con dati di Excel da Visual Basic o VBA
PRB: i valori di Excel restituiti come NULL tramite DAO OpenRecordset
Dati troncati a 255 caratteri con driver ODBC di Excel