Невозможно перебрать ключи словаря - PullRequest
0 голосов
/ 09 июля 2019

Для работы я создаю словарь, который берет информацию из таблицы Excel, которая содержит несколько кодов продуктов, а также даты производства и их соответствующие количества.Цель словаря - собрать все одинаковые коды в 1 строку и сложить значения в один ряд.Например, вот как мои данные в настоящее время выглядят

               MON    TUES    WED    THURS    FRI
product 1              3       1               5
product 2       5              4       2
product 2       4              4       1
product 3              8                   
...
product n

И вот как я хочу, чтобы код отформатировал их,

               MON    TUES    WED    THURS    FRI
product 1       2      3       4              5  
product 2       9              8       3
product 3              8                   
...
product n

ЧтобыДля этого я сохранил несколько значений в одном ключе.Ключ - это код продукта, а даты производства - это позиции.Чтобы сохранить несколько значений в ключе, я использовал класс (используя этот сайт в качестве руководства).Я интенсивно использовал этот сайт, и это примеры, в качестве руководства я не делал этого ранее.

Проблема, с которой я сталкиваюсь, заключается в том, что каждый раз, когда я пытаюсь напечатать словарь, будь то Debug.Print или лист, я получаю ошибку «Требуется 424 объекта».Я не уверен, почему у меня возникает эта ошибка, поскольку я даже не могу проверить, правильно ли работает словарь.

Я просмотрел несколько сообщений ( 1 , 2 ) и сайты, чтобы попробовать разные методы циклического перебора ключей, чтобы посмотреть, дадут ли они другой результат (они этого не сделали).

Вот часть моего кода:

Option Explicit
Sub concatenateData()

    Dim dictPC As Object
    Dim productCodes As clsProductCodes
    Dim wsCryovac As Worksheet
    Dim PLU As Integer
    Dim Friday As Integer
    Dim Saturday As Integer
    Dim Monday As Integer
    Dim Tuesday As Integer
    Dim Wednesday As Integer
    Dim Thursday As Integer
    Dim row As Long
    Dim col As Long
    Dim lrow As Long

    Set dictPC = CreateObject("Scripting.Dictionary")
    Set wsCryovac = ThisWorkbook.Sheets("Cryovac")
    Set Sheet2 = ThisWorkbook.Sheets("Sheet2")
    lrow = wsCryovac.Cells(Rows.Count, 1).End(xlUp).row
    For row = 4 To lrow

        PLU = wsCryovac.Cells(row, 1).Value2
        Friday = wsCryovac.Cells(row, 2).Value2
        Saturday = wsCryovac.Cells(row, 3).Value2
        Monday = wsCryovac.Cells(row, 4).Value2
        Tuesday = wsCryovac.Cells(row, 5).Value2
        Wednesday = wsCryovac.Cells(row, 6).Value2
        Thursday = wsCryovac.Cells(row, 7).Value2

        If dictPC.Exists(PLU) = True Then
            Set productCodes = dictPC(PLU)
        Else
            Set productCodes = New clsProductCodes
            dictPC.Add PLU, productCodes
        End If

        dictPC(productCodes.PLU) = PLU
        dictPC(productCodes.Friday) = dictPC(productCodes.Friday) + Friday
        dictPC(productCodes.Saturday) = dictPC(productCodes.Saturday) + Saturday
        dictPC(productCodes.Monday) = dictPC(productCodes.Monday) + Monday
        dictPC(productCodes.Tuesday) = dictPC(productCodes.Tuesday) + Tuesday
        dictPC(productCodes.Wednesday) = dictPC(productCodes.Wednesday) + Wednesday
        dictPC(productCodes.Thursday) = dictPC(productCodes.Thursday) + Thursday

    Next row

    WriteToImmediate dictPC

End Sub
'This is where I attempt to check the dictionary information with code I used from: 
'https://excelmacromastery.com/vbadictionary/#Example_2_8211_Dealing_with_Multiple_Values
Private Sub WriteToImmediate(dictPC As Dictionary)

    Dim key As Variant, productCodes As clsProductCodes

    ' Read through the dictionary
    For Each key In dictPC.Keys
        Set productCodes = dictPC(key) 'I get the 424 error on this line
        With productCodes
            ' Write to the Immediate Window (Ctrl + G)
            Debug.Print .PLU, .Friday, .Saturday, .Monday, .Tuesday, .Wednesday, .Thursday
        End With
    Next key

End Sub

Повторюсь, у меня проблема в том, что я получаю "ошибку объекта 424", которую я не знаю, как ее исправить, отчасти из-за моей неопытности в использовании словаря.

1 Ответ

2 голосов
/ 09 июля 2019

Я неправильно говорил выше - у вас есть экземпляры clsProductCodes в вашем словаре:

Set productCodes = New clsProductCodes
dictPC.Add PLU, productCodes

но затем вы делаете это:

    dictPC(productCodes.PLU) = PLU
    dictPC(productCodes.Friday) = dictPC(productCodes.Friday) + Friday
    dictPC(productCodes.Saturday) = dictPC(productCodes.Saturday) + Saturday

здесь вы не обновляете объект, сохраненный в словаре - вы добавляете новые ключи и значения

Я думаю вы хотели сделать что-то более похожее на это:

    dictPC(PLU).PLU = PLU
    dictPC(PLU).Friday = dictPC(PLU).Friday + Friday
    dictPC(PLU).Saturday = dictPC(PLU).Saturday + Saturday
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...