I'm struggling with importing data into excel sheet from text file with header line
Values in the text file are separated with tab, therefore I had to create Schema.ini file, which is saved in the same folder as text file:
[test no1.txt]
ColNameHeader=True
Format=TabDelimited
MaxScanRows=0
Col1="Column number 1" Float
Col2="Column number 2" Text
Col3="Column number 3" Text
I'm selecting all values from text file into recordset. Then, I'm using this connection string to open target excel:
Public Function getXlsConn() As ADODB.Connection
Dim rv As New ADODB.Connection
Dim strConn As String
strConn = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & targetFileName & ";" & _
"Extended Properties=""Excel 12.0;HDR=YES;IMEX=0"";"
rv.Open strConn
Set getXlsConn = rv
End Function
I get target recordset (range in excel sheet), I'm looping through all lines of source recordset (data from text file) and passing them into target recordset. At the end of loop I'm updating target recordset with command UpdateBatch:
Sub CopyToXls(pRecordSet As ADODB.Recordset, pSheetName As String)
Dim con As ADODB.Connection, rs As ADODB.Recordset
Dim i As Long
Dim size As Integer
Dim fieldsArray() As Variant
Dim values() As Variant
Set con = getXlsConn()
Set rs = New ADODB.Recordset
rs.CursorLocation = adUseServer
'header starts from 2nd row
rs.Open "select * from [" & pSheetName & "$A2:C600000]", con, _
adOpenDynamic, adLockOptimistic
'get number of columns and their names
size = rs.Fields.Count - 1
ReDim values(size)
ReDim fieldsArray(size)
For i = 0 To size
fieldsArray(i) = rs.Fields(i).Name
Next i
'get end of file
If rs.EOF = False Then
rs.MoveFirst
End If
'copy rows from source recordset (text file) to target recordset (excel sheet)
Do Until pRecordSet.EOF = True
For i = 0 To size
values(i) = pRecordSet.Fields(i).Value
Next i
rs.AddNew fieldsArray, values
pRecordSet.MoveNext
rs.MoveNext
Loop
rs.UpdateBatch
rs.Close
Set rs = Nothing
Set con = Nothing
End Sub
Unfortunately, all values are passed as text, therefore SUM function (located in A1 cell) for first column is not working.
I've tried to change IMEX parameter of connection string - for values 1 and 2 I'm getting error "Cannot update. Database object is read-only".
I would like to pass values exactly as I defined them in Schema.ini file. Is this possible?
Select CDbl(Field1) as MyField from MyTableCopyFromRecordsetMethod?