Набор записей VBA, созданный из файла TXT, возвращает нулевые значения (Excel 2013) - PullRequest
0 голосов
/ 15 мая 2018

Я новичок в использовании наборов записей в VBA, и эта проблема сводит меня с ума.

Я получаю большой отчет (около 57000 строк), сохраненный в виде текстового файла с вкладками.Моя задача - удалить ненужные данные, вставить другие данные и создать что-то вроде сводной таблицы.Теперь эта задача выполняется вручную в Excel, и она создает большой файл, который неудобен в использовании.Поэтому я хочу импортировать TXT-файл в набор записей и манипулировать данными с помощью операторов SQL, а также сохранять результаты в отдельном файле Excel.

Мне удалось импортировать данные непосредственно из TXT..CountRecord показывает правильное количество записей, но они имеют значение Null.Я попытался создать набор записей из .Execute и .Open с тем же результатом.Вот мой код VBA:

Sub user_statistic_report()

Dim sPath As String
Range("A1").EntireRow.Delete

Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
With cn
    .Provider = "Microsoft.Jet.OLEDB.4.0;"
    .Properties("Data Source") = "C:\\Mydocs\raport\" 'sample path
    .Properties("Extended properties") = "text;HDR=No;FMT=Delimited;"
    .Open
End With

rs.CursorLocation = 3 'someone told it helped him but it did not a trick for me
'later I'd like to select only rows with specific conditions
rs.Open "SELECT * FROM [b.txt]", cn, 3
Debug.Print "Number of records:", rs.RecordCount

Set dbFields = rs.Fields
For i = 0 To dbFields.Count - 1
    Debug.Print "Column #", i, dbFields.Item(i).Name
Next i

Debug.Print "Recordset item", rs(3)

rs.Close
cn.Close
Set cn = Nothing
Set rs = Nothing

End Sub

Вот что я вижу в окне «Немедленно»:

Number of records:           5<BR> 
Column #       0            F1<BR>
Column #       1            F2<BR>
Column #       2            F3<BR>
Column #       3            F4<BR>
Recordset item              Null<BR>

Вот мой образец TXT-файла b.txt .Каждая строка начинается с табуляции:

    Col1    Col2    Col3
    11  12  13
    21  22  23

А вот schema.ini :

[b.txt]
Format=TabDelimited
ColNameHeader=False
MaxScanRows=0

Не могли бы вы сообщить, почему набор записей возвращает нулевые значения?

ОБНОВЛЕНИЕ: проблема была в моем файле TXT, он был как-то поврежден.Я заново ввел значения в файл, и скрипт работает.

1 Ответ

0 голосов
/ 15 мая 2018

Я предполагаю, что вы также хотите напечатать значение полей, а не только имена полей.

Измените свой код следующим образом

Set dbFields = rs.Fields
For i = 0 To dbFields.Count - 1
    Debug.Print "Column #", i, dbFields.Item(i).Name
Next i


rs.MoveFirst
Do While Not rs.EOF
    Debug.Print rs.Fields(1).Value, rs.Fields(2).Value, rs.Fields(3).Value
    rs.MoveNext
Loop

В приведенной ниже части будет напечатано значение полей.

Ваша проблема в том, что вы неправильно понимаете вывод своей строки

Debug.Print "Recordset item", rs(3)

В этой строке выводится значение поля с номером 3. Лучше написать

Debug.Print "Recordset item", rs.fields(3).value

И это поле может содержать Null

UPDATE Вы можете попробовать следующий код.Вам нужно добавить ссылку на ADODB

Option Explicit

Sub user_statistic_report()

Dim sPath As String
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset

    Set cn = CreateObject("ADODB.Connection")
    Set rs = CreateObject("ADODB.Recordset")
    With cn
        .Provider = "Microsoft.Jet.OLEDB.4.0;"
        .Properties("Data Source") = "C:\\Mydocs\raport\"    'sample path
        .Properties("Extended properties") = "text;HDR=No;FMT=Delimited;"
        .Open
    End With

    rs.CursorLocation = adUseClient    'someone told it helped him but it did not a trick for me
    'later I'd like to select only rows with specific conditions
    rs.Open "SELECT * FROM [b.txt]", cn, adOpenStatic
    Debug.Print "Number of records:", rs.RecordCount

    Dim wks As Worksheet
    Set wks = ActiveSheet

    wks.UsedRange.Clear
    WriteToSheet wks, rs

    rs.Close
    cn.Close
    Set cn = Nothing
    Set rs = Nothing

End Sub


Sub WriteToSheet(ByVal sh As Worksheet, ByVal rs As ADODB.Recordset)

Dim dbfields As ADODB.Fields
Dim i As Long, j As Long

    ' Write Heading resp. Field names in row 1
    Set dbfields = rs.Fields
    For i = 0 To dbfields.Count - 1
        sh.Cells(1, i + 1).Value = dbfields.Item(i).Name
    Next i

    ' Write values of the recordset starting at row 3
    j = 2
    rs.MoveFirst
    Do While Not rs.EOF
        For i = 0 To dbfields.Count - 1
            sh.Cells(j, i + 1).Value = rs.Fields.Item(i).Value
        Next i
        rs.MoveNext
        j = j + 1
    Loop

End Sub

ОБНОВЛЕНИЕ 2 Это текстовый файл

enter image description here

Это шестнадцатеричное представление

enter image description here

И это результат в Excel, читающем файл со скриптом

enter image description here

Итак, содержимое файла:

TAB 11 TAB TAB 13 CRLF

TAB 21 TAB 22 TAB 23 CRLF

TAB 31 TAB 32 TAB 33 CRLF

TAB 42 TAB 43 CRLF

...