I am trying to extract a table of values from an excel (2003) spreadsheet using vb6, the result of which needs to be stored in a (adodb) recordset. The table looks like this:
Name Option.1 Option.2 Option.3 Option.4 Option.5 Option.6 ----------------------------------------------------------------- Name1 2 3 4 Name2 2 3 4 Name3 2 3 4 Name4 2 3 4 Name5 2 3 4 Name6 2 3 4 Name7 2 3 4 Name8 2 3 4 Name9 2 3 4 5 6 7
Upon connecting and executing the query "SELECT * FROM [Sheet1$]
" or even a column-specific, "SELECT [Option#6] FROM [Sheet1$]
" (see footnote 1) and looping through the results, I am given Null
values for the row Name9
, Option.4
--> Option.6
rather than the correct values 5, 6, and 7. It seems the connection to the spreadsheet is using a "best guess" of deciding what the valid table limits are, and only takes a set number of rows into account.
To connect to the spreadsheet, I have tried both connection providers Microsoft.Jet.OLEDB.4.0
and MSDASQL
and get the same problem.
Here are the connection settings I use:
Set cn = New ADODB.Connection
With cn
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "Data Source=" & filePath & ";Extended Properties=Excel 8.0;"
- - - - OR - - - -
.Provider = "MSDASQL"
.ConnectionString = "Driver={Microsoft Excel Driver (*.xls)};" & _
"DBQ=" & filePath & ";MaxScanRows=0;"
.CursorLocation = adUseClient
.Open
End With
Set rsSelects = New ADODB.Recordset
Set rsSelects = cn.Execute("SELECT [Option#5] FROM " & "[" & strTbl & "]")
This problem only occurs when there are more than 8 rows (excluding the column names), and I have set MaxScanRow=0
for the MSDASQL
connection, but this has produced the same results.
Notable project references I have included are:
Any help in this matter would be very appreciated!
(1) For some reason, when including a decimal point in the column name, it is interpreted as a #.
Thanks everyone! Halfway through trying to set up a Schema.ini
"programmatically" from KB155512 onedaywhen's excellent post pointed me towards the solution:
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "Data Source=" & filePath & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"
I would encourage anyone with similar problems to read the post and comments, since there are slight variations to a solution from one person to another.
You are correct: it is guessing the data type based on a number of rows. There are local machine registry keys you may be able to alter to influence the data type chosen. For more details, see this answer.