Parse Tab Разделенные Значения в VBA - PullRequest
2 голосов
/ 23 июня 2009

Я пытаюсь взять данные буфера обмена, скопированные из Excel (т. Е. Текст, разделенный табуляцией), и преобразовать их в коллекцию словарей. Идея состоит в том, что каждая строка будет представлена ​​словарем, который отображается из заголовков в значения ячеек. Первая строка в скопированных данных будет содержать заголовки.

Достать текст из буфера обмена достаточно просто:

Dim dataObj As DataObject
Dim clipString As String
Set dataObj = New DataObject
dataObj.GetFromClipboard
clipString = dataObj.GetText

Затем я делю ввод на строки:

Dim strRows As Variant

strRows = Split(clipString, vbNewLine)

Далее я пытаюсь извлечь заголовки:

Dim headers As New Collection
Dim strCols As Variant
strCols = Split(strRows(0), vbTab)

For col = LBound(strCols) To UBound(strCols) - 1
    headers.Add strCols(col)
Next

Наконец я извлекаю строки:

Dim cells
Dim rows As New Collection

For i = 1 To UBound(strRows) - 1
    strCols = Split(strRows(0), vbTab)
    Set cells = CreateObject("Scripting.Dictionary")
    For col = 0 To UBound(strCols) - 1
        cells.Add headers.Item(col + 1), strCols(col)
    Next
    rows.Add cells
Next

Однако я получаю ошибку. На линии

headers.Add strCols(col), col

Доступ возвращается с ошибкой времени выполнения «12»: несоответствие типов.

Обновление исправлено выше, спасибо за предложения. Теперь я получаю сообщение об ошибке

Set cells = CreateObject(Scripting.Dictionary)

424: требуется объект.

Любые намеки на то, что я ошибаюсь - VBA не является моей сильной стороной.

Обновление 2 также исправила эту проблему (спасибо за предложение ниже). Код теперь работает.

Ответы [ 2 ]

3 голосов
/ 23 июня 2009

Для вашей второй проблемы - вам нужно предоставить строковое имя целевого класса, так что на самом деле это

Set cells = CreateObject("Scripting.Dictionary")
2 голосов
/ 23 июня 2009

Я думаю, что col должно быть строковым типом.

headers.Add strCols(col), cstr(col)

...