DetailPage-MSS-KB

Microsoft Knowledge Base

Identificativo articolo: 257819 - Ultima modifica: venerdì 20 gennaio 2006 - Revisione: 4.0

In questa pagina

Sommario

In questo articolo viene spiegato come utilizzare ActiveX Data Objects (ADO) con un'origine dati composta da fogli di calcolo di Microsoft Excel. Vengono inoltre affrontati gli aspetti della sintassi e i limiti specifici di Excel, mentre non vengono considerate tecnologie OLAP o tabella pivot o altri utilizzi specializzati dei dati di Excel.

Per ulteriori informazioni, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito (il contenuto potrebbe essere in inglese):
303814  (http://support.microsoft.com/kb/303814/IT/ ) How to Utilizzare ADOX con dati di Excel in Visual Basic o VBA

Informazioni

INTRODUZIONE

Le righe e le colonne di un foglio di calcolo di Microsoft Excel assomigliano molto alle righe e alle colonne di una tabella di database. Ciononostante, è importante ricordare che Microsoft Excel non è un sistema di gestione di database relazionali, per cui è necessario avere sempre presente i limiti che questo comporta quando si utilizzano Excel e i relativi strumenti per archiviare e analizzare dei dati.

Come illustrato nelle sezioni di questo articolo, Microsoft ActiveX Data Objects consente di trattare una cartella di lavoro di Excel come fosse un database. NOTA: la verifica del contenuto di questo articolo è stata condotta utilizzando Microsoft Data Access Components (MDAC) 2.5 in Microsoft Windows 2000 con Visual Basic 6.0 Service Pack 3 ed Excel 2000. Differenze di comportamento derivanti dall'utilizzo di versioni diverse di MDAC, Microsoft Windows, Visual Basic o Excel non sono affrontate in questo articolo.

Connessione a Excel mediante ADO

ADO consente di connettersi a un file di dati di Excel utilizzando uno dei due provider OLE DB inclusi in MDAC:
  • Provider OLE DB di Microsoft Jet

    oppure

  • Provider Microsoft OLE DB per driver ODBC

Utilizzo del provider OLE DB di Microsoft Jet

Il provider Jet richiede solo due informazioni per connettersi a un'origine dati di Excel: il percorso, comprensivo del nome del file, e la versione del file di Excel.

Provider Jet che utilizza una stringa di connessione
Dim cn as ADODB.Connection
Set cn = New ADODB.Connection
With cn
	.Provider = "Microsoft.Jet.OLEDB.4.0"
	.ConnectionString = "Data Source=C:\MyFolder\MyWorkbook.xls;" & _
"Extended Properties=Excel 8.0;"
	.Open
End With
				
Versione provider: è necessario utilizzare la versione 4.0 del provider Jet, in quanto la versione 3.51 non supporta i driver ISAM di Jet. Specificando la versione 3.51 del provider Jet, in fase di esecuzione verrà visualizzato il seguente messaggio di errore:
Impossibile trovare ISAM installabile.
Versione di Excel: specificare Excel 5.0 per una cartella di lavoro di Excel 95 (versione 7.0 di Excel) ed Excel 8.0 per una cartella di lavoro di Excel 97, Excel 2000 o Excel 2002 (XP) (versioni 8.0, 9.0 e 10.0 di Excel).

Provider Jet che utilizza la finestra di dialogo Proprietà di Data Link

Se si utilizza il controllo ADO Data oppure Data Environment nella propria applicazione, verrà visualizzata la finestra di dialogo Proprietà di Data Link per raccogliere le impostazioni di connessione necessarie.
  1. Nella scheda Provider selezionare la versione 4.0 del provider Jet, in quanto la versione 3.51 non supporta i driver ISAM di Jet. Specificando la versione 3.51 del provider Jet, in fase di esecuzione verrà visualizzato il seguente messaggio di errore:
    Impossibile trovare ISAM installabile.
  2. Nella scheda Connessione individuare il file della cartella di lavoro. Ignorare le voci "ID Utente" e "Password", in quanto non applicabili a una connessione a Excel. Non è possibile aprire un file di Excel protetto da password come origine dati, come spiegato di seguito in questo articolo.
  3. Nella scheda Tutte selezionare Proprietà estese dall'elenco, quindi scegliere Modifica valore. Immettere Excel 8.0; separandolo da qualsiasi altra voce esistente mediante un punto e virgola (;). Se non si effettua questa operazione, verrà visualizzato un messaggio di errore in fase di verifica della connessione, in quanto il provider Jet si aspetta un database di Microsoft Access, se non diversamente specificato.
  4. Tornare alla scheda Connessione e fare clic su Verifica connessione. Verrà visualizzata una finestra di dialogo che informa che il processo è andato a buon fine.
Altre impostazioni di connessione del provider Jet

Intestazioni di colonna: per impostazione predefinita, la prima riga dell'origine dati di Excel si presume contenga intestazioni di colonna, utilizzabili come nomi di campi. Per evitare questo, disattivare questa impostazione o la prima riga di dati scomparirà per essere utilizzata come nomi di campi. A tale proposito, basta aggiungere l'impostazione facoltativa HDR= alle Proprietà estese della stringa di connessione. L'impostazione predefinita, che non è necessario specificare, è HDR=Yes. In assenza di intestazioni di colonna, è necessario specificare HDR=No. I campi verranno così denominati F1, F2 e così via. Dato che la stringa delle Proprietà estese contiene ora più valori stringa, è necessario racchiuderla tra virgolette doppie, a cui va aggiunta un'altra coppia di virgolette doppie per informare Visual Basic di trattare il primo gruppo di virgolette come valori letterali, come illustrato nell'esempio che segue (gli spazi aggiuntivi sono stati inseriti per ragioni di chiarezza).
.ConnectionString = "Data Source=C:\MyFolder\MyWorkbook.xls;" & _
"Extended Properties=" " Excel 8.0; HDR=No;" " "
				

Utilizzo del provider Microsoft OLE DB per driver ODBC

Anche il provider per driver ODBC, che di seguito chiameremo "provider ODBC" per ragioni di concisione, richiede solo due informazioni per connettersi a un'origine dati di Excel, il nome del driver e il percorso e il nome del file della cartella di lavoro.

IMPORTANTE: per impostazione predefinita, una connessione ODBC a Excel è di sola lettura. L'impostazione della proprietà LockType del recordset ADO non ha la priorità su questa impostazione a livello di connessione. Pertanto sarà necessario impostare ReadOnly su False nella stringa di connessione o nella configurazione DSN, se si desidera modificare i dati. In caso contrario, verrà visualizzato il seguente messaggio di errore:
Per l'operazione è necessaria una query aggiornabile.
Provider ODBC che utilizza una stringa di connessione senza DSN
Dim cn as ADODB.Connection
Set cn = New ADODB.Connection
With cn
	.Provider = "MSDASQL"
	.ConnectionString = "Driver={Microsoft Excel Driver (*.xls)};" & _
"DBQ=C:\MyFolder\MyWorkbook.xls; ReadOnly=False;"
	.Open
End With
				
Provider ODBC che utilizza una stringa di connessione con DSN
Dim cn as ADODB.Connection
Set cn = New ADODB.Connection
With cn
	.Provider = "MSDASQL"
	.ConnectionString = "DSN=MyExcelDSN;"
	.Open
End With
				
Provider ODBC che utilizza la finestra di dialogo Proprietà di Data Link

Se si utilizza il controllo ADO Data oppure Data Environment nella propria applicazione, verrà visualizzata la finestra di dialogo Proprietà di Data Link per raccogliere le impostazioni di connessione necessarie.
  1. Nella scheda Provider selezionare Provider Microsoft OLE DB per driver ODBC.
  2. Nella scheda Connessione selezionare il DSN esistente che si desidera utilizzare oppure scegliere Usa stringa di connessione. Questo consente di visualizzare la finestra di dialogo della configurazione DSN standard, in cui raccogliere le impostazioni di connessione necessarie. Ricordare di deselezionare l'impostazione predefinita di sola lettura, se desiderato, come menzionato precedentemente.
  3. Tornare alla scheda Connessione e fare clic su Verifica connessione. Verrà visualizzata una finestra di dialogo che informa che il processo è andato a buon fine.
Altre impostazioni di connessione del provider ODBC

Intestazioni di colonna: per impostazione predefinita, la prima riga dell'origine dati di Excel si presume contenga intestazioni di colonna, utilizzabili come nomi di campi. Per evitare questo, disattivare questa impostazione o la prima riga di dati scomparirà per essere utilizzata come nomi di campi. A tale proposito, basta aggiungere l'impostazione facoltativa FirstRowHasNames= alla stringa di connessione. L'impostazione predefinita, che non è necessario specificare, è FirstRowHasNames=1, dove 1 = True. In assenza di intestazioni di colonna, specificare FirstRowHasNames=0, dove 0 = False. I campi verranno denominati F1, F2 e così via. Questa opzione non è disponibile nella finestra di dialogo della configurazione DSN.

Tuttavia, a causa di un bug nel driver ODBC, anche specificando l'impostazione FirstRowHasNames, non si otterrà l'effetto desiderato, ovvero la prima riga dell'origine dati specificata verrà comunque considerata una riga di nomi di campi dal driver ODBC di Excel (MDAC 2.1 e versioni successive). Per ulteriori informazioni sul bug relativo alle intestazioni di colonna, fare clic sul numero dell'articolo della Knowledge Base riportato di seguito (il contenuto potrebbe essere in inglese):
288343  (http://support.microsoft.com/kb/288343/IT/ ) BUG: Il driver ODBC per Excel ignora l'impostazione FirstRowHasNames o Header
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.

Per ulteriori informazioni sul bug relativo alle righe da analizzare e sulla relativa soluzione temporanea, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito (il contenuto potrebbe essere in inglese):
189897  (http://support.microsoft.com/kb/189897/IT/ ) XL97: Con il driver ODBC per Excel i dati contenenti più di 255 caratteri vengono troncati
Altre impostazioni: se si costruisce la stringa di connessione utilizzando la finestra di dialogo Proprietà di Data Link, si noterà che alla stringa vengono aggiunte altre Proprietà estese assolutamente non necessarie, come:
... DefaultDir=C:\WorkbookPath;DriverId=790;FIL=excel 8.0;MaxBufferSize=2048;PageTimeout=5;
				
Messaggio di errore "Sequenza di ordinamento" in Visual Basic Editor

Nell'ambiente di progettazione di Visual Basic con certe versioni di MDAC è possibile che venga visualizzato il messaggio di errore riportato di seguito la prima volta che si stabilisce la connessione a un'origine dati di Excel in fase di progettazione:
Sequenza di ordinamento selezionata non supportata dal sistema operativo.
Questo messaggio viene visualizzato solo nell'IDE e non nella versione compilata del programma. Per ulteriori informazioni, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito (il contenuto potrebbe essere in inglese):
246167  (http://support.microsoft.com/kb/246167/IT/ ) PRB: Errore nella sequenza di ordinamento la prima volta che si apre un recordset ADODB in un foglio di calcolo di Excel

Considerazioni applicabili a entrambi i provider OLE DB

Attenzione ai tipi di dati misti

Come visto in precedenza, ADO deve derivare il tipo di dati di ciascuna colonna dal foglio di lavoro o dall'intervallo di Excel. Tale operazione non è influenzata dalle impostazioni di formattazione delle celle di Excel. La presenza all'interno della stessa colonna di valori numerici e di valori di testo può dare origine a un serio problema. Sia il provider Jet che quello ODBC restituiranno infatti i dati del tipo preponderante, mentre restituiranno valori NULL (vuoti) per il tipo di dati minoritario. Se i due tipi di dati sono presenti in uguale misura nella colonna, verranno scelti i dati di tipo numerico.

Ad esempio:
  • Se nelle 8 righe analizzate la colonna contiene 5 valori numerici e 3 valori di testo, verranno restituiti 5 numeri e 3 valori Null.
  • Se nelle 8 righe analizzate la colonna contiene 3 valori numerici e 5 valori di testo, verranno restituiti 3 valori Null e 5 valori di testo.
  • Se nelle otto righe analizzate la colonna contiene 4 valori numerici e 4 valori di testo, verranno restituiti 4 numeri e 4 valori Null.
Se pertanto la colonna contiene valori misti, l'unica soluzione consiste nel salvare i valori numerici nella stessa colonna ma come testo, per poi riconvertirli in numeri quando necessari nell'applicazione client, utilizzando la funzione VAL di Visual Basic o una funzione equivalente.

Per ovviare a questo problema nel caso di dati di sola lettura, abilitare la Modalità importazione utilizzando l'impostazione "IMEX=1" nella sezione delle proprietà estese della stringa di connessione. In questo modo viene abilitata l'impostazione del Registro di sistema ImportMixedTypes=Text. Gli aggiornamenti potrebbero tuttavia produrre risultati imprevisti in questa modalità. Per ulteriori informazioni su questa impostazione, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito (il contenuto potrebbe essere in inglese):
194124  (http://support.microsoft.com/kb/194124/IT/ ) PRB: Utilizzando il metodo DAO OpenRecordset in Excel vengono restituiti valori NULL
Non è possibile aprire una cartella di lavoro protetta da password

Se la cartella di lavoro di Excel è protetta da password, non sarà possibile aprirla per accedere ai dati in essa contenuti, nemmeno fornendo la password corretta tra le impostazioni di connessione, a meno che il file della cartella di lavoro non sia già aperto nell'applicazione Microsoft Excel. Tentando tale operazione, viene visualizzato il seguente messaggio di errore:
Impossibile decrittografare il file.
Per ulteriori informazioni, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito (il contenuto potrebbe essere in inglese):
211378  (http://support.microsoft.com/kb/211378/IT/ ) XL2000: Errore "Impossibile decrittografare il file" con un file protetto da password

Recupero e modifica dei dati di Excel mediante ADO

In questa sezione vengono affrontati due aspetti delle operazioni con i dati di Excel:
  • Come selezionare i dati

    -e-

  • Come modificare i dati

Come selezionare i dati

Esistono vari modi per selezionare i dati. È possibile:

  • Selezionare dati di Excel utilizzando il codice.
  • Selezionare dati di Excel utilizzando il controllo ADO Data.
  • Selezionare dati di Excel utilizzando i comandi di Data Environment.

Selezionare dati di Excel utilizzando il codice

I dati di Excel presenti nella cartella di lavoro possono essere contenuti in:

  • Un intero foglio di lavoro.
  • Un intervallo definito di celle in un foglio di lavoro.
  • Un intervallo non definito di celle in un foglio di lavoro.
Specificare un foglio di lavoro

Per specificare un foglio di lavoro come origine record, utilizzare il nome del foglio di lavoro seguito dal simbolo del dollaro e racchiuso tra parentesi quadre. Ad esempio:
	strQuery = "SELECT * FROM [Sheet1$]"
				
È anche possibile delimitare il nome del foglio di lavoro utilizzando il carattere virgoletta singola inclinata (`). Ad esempio:
	strQuery = "SELECT * FROM `Sheet1$`"
				
È preferibile utilizzare le parentesi quadre, in quanto sono la convenzione standard per nomi di database problematici.

Omettendo il simbolo del dollaro e le parentesi quadre o anche solo il simbolo del dollaro, verrà visualizzato il seguente messaggio di errore:
... Il modulo di gestione di database Microsoft Jet non è riuscito a trovare l'oggetto.
Utilizzando il simbolo del dollaro ma omettendo le parentesi, verrà visualizzato il seguente messaggio di errore:
Errore di sintassi nella proposizione FROM.
Utilizzando le virgolette semplici dritte, verrà visualizzato il seguente messaggio di errore:
Errore di sintassi nella query. Proposizione della query incompleta.
Specificare un intervallo definito

Per specificare un intervallo di celle definito come origine record, utilizzare semplicemente il nome definito. Ad esempio:
	strQuery = "SELECT * FROM MyRange"
				
Specificare un intervallo non definito

Per specificare un intervallo di celle non definito come origine record, aggiungere la notazione riga/colonna standard di Excel alla fine del nome del foglio, racchiudendo il tutto tra parentesi quadre. Ad esempio:
	strQuery = "SELECT * FROM [Sheet1$A1:B10]"
				
Attenzione a come si specificano i fogli di lavoro: il provider presuppone che la tabella di dati inizi con la prima cella a sinistra contenente dei dati nel foglio di lavoro specificato. In altre parole, la tabella di dati può iniziare dalla riga 3, colonna C senza alcun problema. Tuttavia, non è possibile ad esempio digitare un titolo di foglio di lavoro al di sopra e alla sinistra dei dati presenti nella cella A1.

Attenzione a come specificare gli intervalli: quando si specifica un foglio di lavoro come origine record, il provider aggiunge nuovi record al di sotto dei record esistenti nel foglio di lavoro, in base allo spazio disponibile. Quando si specifica un intervallo, definito o meno, Jet aggiunge anche dei nuovi record al di sotto dei record dell'intervallo, in base allo spazio disponibile. Tuttavia, interrogando nuovamente l'intervallo originale, nel recordset risultante non verranno inclusi i nuovi record aggiunti al di fuori dell'intervallo.

Nelle versioni di MDAC precedenti alla 2.5, quando si specifica un intervallo definito, se si aggiungono nuovi record al di fuori dei limiti dell'intervallo definito, viene visualizzato il seguente errore:
Impossibile espandere l'intervallo denominato.

Selezione di dati di Excel utilizzando il controllo ADO Data

Una volta specificate le impostazioni di connessione per l'origine dati di Excel nella scheda Generale della finestra di dialogo delle Proprietà di ADODC, fare clic sulla scheda OrigineRecord. Se si sceglie come CommandType adCmdText, sarà possibile inserire una query SELECT nella finestra di dialogo Testo comando utilizzando la sintassi descritta in precedenza. Se si sceglie come CommandType adCmdTable e si utilizza il provider Jet, nell'elenco a discesa saranno visualizzati sia gli intervalli definiti sia i nomi degli fogli di lavoro disponibili nella cartella di lavoro selezionata, con gli intervalli definiti elencati per primi.

Questa finestra di dialogo aggiunge correttamente il simbolo del dollaro ai nomi dei fogli di lavoro, mentre non aggiunge le parentesi quadre necessarie. Come risultato, se si seleziona semplicemente un nome di foglio di lavoro e si sceglie OK, in seguito verrà visualizzato il seguente messaggio di errore:
Errore di sintassi nella proposizione FROM.
È necessario racchiudere manualmente il nome del foglio di lavoro tra parentesi quadre. È possibile apportare la modifica in questa casella combinata. Se si utilizza il provider ODBC, nell'elenco a discesa saranno visualizzati solo gli intervalli definiti. È tuttavia possibile specificare manualmente un nome di foglio di lavoro, racchiudendolo tra i delimitatori appropriati.

Selezione di dati di Excel utilizzando i comandi di Data Environment

Una volta impostata la connessione di Data Environment per l'origine dati di Excel, creare un nuovo oggetto Comando. Se si sceglie come Origine dati una Istruzione SQL, sarà possibile inserire una query nella casella di testo utilizzando la sintassi descritta in precedenza. Se si sceglie come Origine dati un Oggetto database, selezionare Tabella dal primo elenco a discesa, che, nel caso in cui si utilizzi il provider Jet, conterrà sia gli intervalli definiti che i nomi di fogli di lavoro disponibili nella cartella di lavoro, con gli intervalli definiti elencati per primi. Se si sceglie un nome di foglio di lavoro in questo elenco, non sarà necessario aggiungere manualmente le parentesi quadre per racchiudere il nome del foglio di lavoro, come nel caso del controllo ADO Data. Se si utilizza il provider ODBC, nell'elenco a discesa saranno visualizzati solo gli intervalli definiti. È tuttavia possibile specificare manualmente un nome di foglio di lavoro.

Modalità di modifica dei dati di Excel: modifica, aggiunta, eliminazione

Modifica

È possibile modificare dati di Excel utilizzando i comuni metodi ADO. I campi del recordset corrispondenti alle celle del foglio di lavoro di Excel contenenti delle formule di Excel (che iniziano con "=") sono di sola lettura e non possono essere modificati. Ricordare che una connessione ODBC a Excel è di sola lettura per impostazione predefinita, se non altrimenti specificato nelle impostazioni di connessione. Vedere la sezione precedente "Utilizzo del provider Microsoft OLE DB per driver ODBC".

Aggiunta

È possibile aggiungere record all'origine record di Excel, in base allo spazio disponibile. Se tuttavia si aggiungono nuovi record al di fuori dell'intervallo originariamente specificato, questi non saranno visibili eseguendo nuovamente la query nell'intervallo originale. Vedere la sezione "Attenzione a come specificare gli intervalli".

In determinate circostanze, quando si utilizzano i metodi AddNew e Update dell'oggetto Recordset ADO per inserire nuove righe di dati in una tabella di Excel, ADO potrebbe inserire i valori dei dati nelle colonne sbagliate in Excel. Per ulteriori informazioni, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito (il contenuto potrebbe essere in inglese):
314763  (http://support.microsoft.com/kb/314763/IT/ ) FIX: ADO inserisce dati nelle colonne non corrette in Excel
Eliminazione

L'eliminazione di dati di Excel presenta più limitazioni rispetto all'eliminazione di dati da un'origine dati relazionale. In un database relazionale, "riga" non ha nessun significato se non quello di "record". Questo non è vero in un foglio di lavoro di Excel. È possibile eliminare valori presenti in campi (celle). Non è tuttavia possibile:
  1. Eliminare un intero record contemporaneamente, in quanto viene visualizzato il seguente messaggio di errore:
    Eliminazione dati in una tabella collegata non supportata da questo ISAM.
    È possibile eliminare un record solo cancellando il contenuto di ogni singolo campo.
  2. Eliminare il valore in una cella contenente una formula di Excel, in quanto viene visualizzato il seguente messaggio di errore:
    Operazione non consentita in questo contesto.
  3. Non è possibile eliminare una o più righe vuote del foglio di calcolo in cui erano contenuti i dati eliminati. Infatti nel recordset continueranno a essere visualizzati record vuoti corrispondenti a queste righe vuote.
Attenzione a come si modificano dati di Excel utilizzando ADO: quando si inseriscono dati di testo in Excel utilizzando ADO, il valore di testo è preceduto da una virgoletta singola. Questo può causare problemi in seguito, quando si lavorerà con i nuovi dati.

Recupero della struttura dell'origine dati (metadati) da Excel

È possibile recuperare dati relativi alla struttura dell'origine dati di Excel (tabelle e campi) utilizzando ADO. Si otterranno risultati leggermente diversi a seconda del provider OLE DB utilizzato, sebbene entrambi restituiscano lo stesso numero di campi di informazioni utili. Questi metadati possono essere recuperati utilizzando il metodo OpenSchema dell'oggetto Connessione ADO, che restituisce un oggetto Recordset ADO. A tale proposito, è possibile utilizzare la più potente libreria di Microsoft ActiveX Data Objects Extensions for Data Definition Language and Security (ADOX). Nel caso di un'origine dati di Excel tuttavia, dove una "tabella" è un foglio di lavoro o un intervallo definito e un "campo" può essere di un numero limitato di tipi di dati generici, questa potenza in più è sprecata.

Recupero di informazioni sulle tabelle

Dei vari oggetti disponibili in un database relazionale, tabelle, viste, stored procedure e così via, un'origine di dati di Excel espone solo gli equivalenti a una tabella, ovvero fogli di lavoro e intervalli definiti all'interno della cartella di lavoro specificata. Gli intervalli definiti sono trattati come "Tabelle" e i fogli di lavoro come "Tabelle di sistema" e non esistono molte altre informazioni utili sulle tabelle che sia possibile recuperare, oltre alla proprietà "table_type". Per recuperare un elenco delle tabelle disponibili nella cartella di lavoro utilizzare il seguente codice:
Set rs = cn.OpenSchema(adSchemaTables)
				
Il provider Jet restituisce un recordset con 9 campi, di cui ne popola solo 4:

  • table_name
  • table_type ("Tabella" o "Tabella di sistema")
  • date_created
  • date_modified
Nel caso di una tabella, nei due campi della data è visualizzato lo stesso valore, ovvero la data dell'ultima modifica. In altre parole, il campo "date_created" non è attendibile.

Il provider ODBC restituisce un recordset con 9 campi, di cui ne popola solo 3:

  • table_catalog, la cartella in cui si trova la cartella di lavoro.
  • table_name.
  • table_type, come indicato in precedenza.
Secondo la documentazione ADO, è possibile recuperare solo un elenco di fogli di lavoro, ad esempio specificando i seguenti criteri aggiuntivi nel metodo OpenSchema:
Set rs = cn.OpenSchema(adSchemaTables, Array(Empty, Empty, Empty, "System Table"))
				
Sfortunatamente, questo non funziona con un'origine dati di Excel con le versioni di MDAC successive alla 2.0, qualunque provider si utilizzi.

Recupero di informazioni sui campi

Ogni campo (colonna) di un'origine dati di Excel può presentare uno dei seguenti tipi di dati:

  • numerico (tipo dati ADO 5, adDouble)
  • valuta (tipo dati ADO 6, adCurrency)
  • logico o booleano (tipo dati ADO 11, adBoolean)
  • data (tipo dati ADO 7, adDate, se si utilizza Jet; 135, adDBTimestamp, se si utilizza ODBC)
  • testo (un tipo dati ADO ad...Char, quale 202, adVarChar, 200, adVarWChar o simili)
Per una colonna di tipo numerico viene sempre restituito un valore numeric_precision di 15 (la precisione massima in Excel), per una colonna di testo viene sempre restituito un valore character_maximum_length di 255 (la larghezza massima di visualizzazione, per quanto diversa dalla lunghezza massima del testo in una colonna di Excel). Non esistono molte informazioni utili relative ai campi che è possibile recuperare, oltre alla proprietà data_type. Per recuperare un elenco dei campi disponibili di una tabella, utilizzare il seguente codice:
Set rs = cn.OpenSchema(adSchemaTables, Array(Empty, Empty, "TableName", Empty))
				
Il provider Jet restituisce un recordset con 28 campi, di cui ne popola 8 nel caso di campi numerici e 9 nel caso di campi di testo. Probabilmente i campi utili saranno:

  • table_name
  • column_name
  • ordinal_position
  • data_type
Il provider ODBC restituisce un recordset con 29 campi, di cui ne popola 10 nel caso di campi numerici e 11 nel caso di campi di testo. I campi utili sono gli stessi visti per il provider Jet.

Enumerazione di tabelle e campi e relative proprietà

Il codice di Visual Basic (come quello dell'esempio che segue) può essere utilizzato per enumerare le tabelle e le colonne di un'origine dati di Excel e i relativi campi di informazioni disponibili. Nell'esempio che segue i risultati vengono inviati a un Listbox, List1, nello stesso form.
Dim cn As ADODB.Connection
Dim rsT As ADODB.Recordset
Dim intTblCnt As Integer, intTblFlds As Integer
Dim strTbl As String
Dim rsC As ADODB.Recordset
Dim intColCnt As Integer, intColFlds As Integer
Dim strCol As String
Dim t As Integer, c As Integer, f As Integer
Set cn = New ADODB.Connection
With cn
	.Provider = "Microsoft.Jet.OLEDB.4.0"
	.ConnectionString = "Data Source=" & App.Path & _
"\ExcelSrc.xls;Extended Properties=Excel 8.0;"
	'.Provider = "MSDASQL"
	'.ConnectionString = "Driver={Microsoft Excel Driver (*.xls)};" & _
"DBQ=" & App.Path & "\ExcelSrc.xls; "
	.CursorLocation = adUseClient
	.Open
End With
Set rsT = cn.OpenSchema(adSchemaTables)
intTblCnt = rsT.RecordCount
intTblFlds = rsT.Fields.Count
List1.AddItem "Tables:	" & intTblCnt
List1.AddItem "--------------------"
For t = 1 To intTblCnt
	strTbl = rsT.Fields("TABLE_NAME").Value
	List1.AddItem vbTab & "Table #" & t & ":	" & strTbl
	List1.AddItem vbTab & "--------------------"
	For f = 0 To intTblFlds - 1
		List1.AddItem vbTab & rsT.Fields(f).Name & _
vbTab & rsT.Fields(f).Value
	Next
	List1.AddItem "--------------------"
	Set rsC = cn.OpenSchema(adSchemaColumns, Array(Empty, Empty, strTbl, Empty))
	intColCnt = rsC.RecordCount
	intColFlds = rsC.Fields.Count
	For c = 1 To intColCnt
		strCol = rsC.Fields("COLUMN_NAME").Value
		List1.AddItem vbTab & vbTab & "Column #" & c & ": " & strCol
		List1.AddItem vbTab & vbTab & "--------------------"
		For f = 0 To intColFlds - 1
			List1.AddItem vbTab & vbTab & rsC.Fields(f).Name & _
vbTab & rsC.Fields(f).Value
		Next
		List1.AddItem vbTab & vbTab & "--------------------"
		rsC.MoveNext
		Next
		rsC.Close
		List1.AddItem "--------------------"
		rsT.MoveNext
Next
rsT.Close
cn.Close
				

Utilizzo della finestra Visualizzazione dati

Se si crea un Data Link a un'origine dati di Excel nella finestra Visualizzazione dati di Visual Basic, nella finestra verranno visualizzate le stesse informazioni recuperabili a livello di programmazione seguendo le procedure descritte in precedenza. In particolare, utilizzando il provider Jet vengono elencati sia fogli di lavoro che intervalli definiti nell'elenco "Tabelle", mentre utilizzando il provider ODBC vengono elencati solo intervalli definiti. Se si utilizza il provider ODBC e non è disponibile alcun intervallo definito, l'elenco "Tabelle" sarà vuoto.

Limiti di Excel

L'utilizzo di Excel come origine dati è limitato da una serie di restrizioni intrinseche delle cartelle e dei fogli di lavoro di Excel. Tali limitazioni includono, ma non limitatamente:

  • Dimensioni del foglio di lavoro: 65.536 righe per 256 colonne
  • Contenuto delle celle (testo): 32.767 caratteri
  • Fogli di una cartella di lavoro: limitati dalla memoria disponibile
  • Nomi in una cartella di lavoro: limitati dalla memoria disponibile

Riferimenti

Per ulteriori informazioni sull'utilizzo di ADO.NET per recuperare e modificare record in una cartella di lavoro di Excel mediante Visual Basic .NET, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito (il contenuto potrebbe essere in inglese):
316934  (http://support.microsoft.com/kb/316934/IT/ ) HOW TO: Utilizzare ADO.NET per recuperare e modificare record in una cartella di lavoro di Excel con Visual Basic .NET
Per ulteriori informazioni, fare clic sui numeri degli articoli della Microsoft Knowledge Base riportati di seguito (il contenuto potrebbe essere in inglese):
295646  (http://support.microsoft.com/kb/295646/IT/ ) How to Trasferire dati da un'origine dati ADO a Excel con ADO
246335  (http://support.microsoft.com/kb/246335/IT/ ) How to Trasferire dati da un recordset ADO a Excel tramite automazione
247412  (http://support.microsoft.com/kb/247412/IT/ ) INFO: Metodi per il trasferimento di dati da Visual Basic a Excel
278973  (http://support.microsoft.com/kb/278973/IT/ ) SAMPLE: Utilizzo di ADO per leggere e scrivere dati in cartelle di lavoro di Excel illustrato in ExcelADO
318373  (http://support.microsoft.com/kb/318373/IT/ ) HOW TO: Recuperare metadati da Excel utilizzando il metodo GetOleDbSchemaTable in Visual Basic .NET
Per ulteriori informazioni, vedere il seguente corso Microsoft Training & Certification:
Microsoft Corporation 1301 Mastering Office 2000 Solution Development (http://www.microsoft.com/italy/traincert/)

Le informazioni in questo articolo si applicano a
  • Microsoft Excel 2000 Standard Edition
  • Microsoft Visual Basic 6.0 Learning Edition
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Visual Basic 6.0 Enterprise Edition
  • Microsoft Visual Basic 6.0 Enterprise Edition Service Pack 3
  • Microsoft Visual Basic for Applications 6.0
  • Microsoft ActiveX Data Objects 2.1
  • Microsoft ActiveX Data Objects 2.1 Service Pack 1
  • Microsoft ActiveX Data Objects 2.1 Service Pack 2
  • Microsoft ActiveX Data Objects 2.5
  • Microsoft Data Access Components 2.1
  • Microsoft Data Access Components 2.1 Service Pack 1
  • Microsoft Data Access Components 2.1 Service Pack 2
  • Microsoft Data Access Components 2.5
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Excel 97 Standard Edition
  • Microsoft Excel 95 Standard Edition
Chiavi: 
kbhowto kbiisam KB257819
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.
Condividi
Altre opzioni per il supporto
Forum del supporto di Microsoft Community
Contattaci direttamente
Ricerca di un partner certificato Microsoft
Microsoft Store