несоответствие типов при переборе словаря - PullRequest
0 голосов
/ 03 июля 2018

Я наткнулся на проблему, которую не могу решить. Я пытаюсь создать словарь, как: ключ: число в виде строки item: массив строк

Когда я передаю ключи в MsgBox, все в порядке, но когда я хочу добавить элементы, я получаю ошибку несоответствия типов ...

Мой код выглядит так:

Sub test()

Dim dict As Scripting.Dictionary
Set dict = New Scripting.Dictionary

Dim records As String
Dim RecordArray() As String

Dim x As Integer
            Application.ScreenUpdating = False
            NumRows = Range("A1", Range("A1").End(xlDown)).Rows.Count
            Range("A1").Select

For x = 1 To NumRows

                If IsNumeric(Cells(x, 1).Value) Then
                    records = Trim(Cells(x, 2).Value)
                    RecordArray() = Split(records, ",")
                    dict.Add Key:=(Cells(x, 1).Value), Item:=RecordArray()

            ActiveCell.Offset(1, 0).Select

        End If
        Next x


        Application.ScreenUpdating = True

Dim key As Variant
        For Each key In dict.Keys
                MsgBox key
                MsgBox dict(key)
        Next key

End Sub

Данные, например:

A1:2001 B1:  0000101,0000102,0000103
A2:2015 B2:  0000107,0000108
A3:8000 B3:  0000215,0000216,0000217

и так далее. Помните, что значения в столбце B начинаются с двух пробелов перед текстом. Что я здесь не так делаю? Я знаю, что этот код, вероятно, не так хорош, но это как моя первая попытка с VBA: (

1 Ответ

0 голосов
/ 03 июля 2018

Вы получаете несоответствие типов, потому что вы пытаетесь поместить массив в msgbox. Попробуйте это:

Sub test()

Dim dict As Scripting.Dictionary
Set dict = New Scripting.Dictionary
dict.CompareMode = BinaryCompare

Dim records As String
Dim RecordArray() As String

Dim x As Integer
            Application.ScreenUpdating = False
            NumRows = Range("A1", Range("A1").End(xlDown)).Rows.Count
            Range("A1").Select

For x = 1 To NumRows

                If IsNumeric(Cells(x, 1).Value) Then
                    records = Trim(Cells(x, 2).Value)
                    RecordArray() = Split(records, ",")
                    keyString = (Cells(x, 1).Value)
                    dict.Add key:=keyString, Item:=RecordArray()

            ActiveCell.Offset(1, 0).Select

        End If
        Next x


        Application.ScreenUpdating = True

Dim key As Variant
        For Each key In dict.Keys
                MsgBox key
                i = 0
                For Each Item In dict(key)
                    MsgBox (dict(key)(i))
                    i = i + 1
                Next Item
        Next key

End Sub

Я включил цикл для отображения каждого элемента массива, хранящегося в словаре. Вы можете построить строку, используя тот же метод, и отобразить ее, если вам нужен только один msgbox.

...