VBA - объект требуется ошибка, изменение объекта из словаря
Я программирую своего рода синтаксический анализатор, который читает таблицу Excel, а затем создает список процессов с некоторыми свойствами, такими как Name, StartTime, EndTime и т. Д. Для этого у меня есть класс Process, а в главном файле у меня есть processList (Scripting. Словарь), куда я помещаю процессы, когда читаю строки... Для этого назначения ключ представляет собой строку с именем MSID.
Теперь проблема в том, что по какой-то причине я могу получить доступ к объекту только из словаря и изменить его параметры внутри одной части моего оператора If-ElseIf. В другом случае он выдает ошибку 424 объекта, и я понятия не имею, почему.
Вот код
Sub ParseMessages()
' ITERATOR VARIABLES
Dim wb As Workbook, ws As Worksheet
Dim rowIter As Long, row As Variant
Dim A As Variant, B As Variant, C As Variant, D As Variant, E As Variant, F As Variant ' A,B,C,D,E,F variables for the cells of each row
' PROCESS PARAMETERS
Dim MSID As Variant
Dim StartTime As Variant
Dim EndTime As Variant
' OBJECTS
Dim process As process
Dim processList As Scripting.Dictionary ' DICTIONARY where the error happens
Set processList = New Scripting.Dictionary
Worksheets(1).Activate
'####### MAIN LOOP ######################################################
For rowIter = 1 To 11
row = Rows(rowIter)
A = row(1, 1)
B = row(1, 2)
C = row(1, 3)
D = row(1, 4)
E = row(1, 5)
F = row(1, 6)
Dim startIndex As Long, endIndex As Long, count As Long
' ------ PROCESSSTART -> MSID, processName, startTime
If (.....) Then
Debug.Print (vbNewLine & "Process start")
If (...) Then ' --MSID
startIndex = InStr(F, "Nr") + 3 '3 to skip "Nr "
endIndex = InStr(startIndex, F, "(")
count = endIndex - startIndex
MSID = Mid(F, startIndex, count)
StartTime = B
Debug.Print (StartTime & " -> " & MSID)
' **** MAKE new Process object, add to collection
Set process = New process
process.StartTime = StartTime
process.MSID = MSID
processList.Add MSID, process ' Add to the dictionary, KEY, VALUE
ElseIf (...) Then ' --ProcessName
startIndex = InStr(F, "=") + 2
endIndex = InStr(F, "<") - 1
count = endIndex - startIndex
processName = Mid(F, startIndex, count)
Debug.Print (processName)
' **** Add Name to the last element of the dictionary
processList(processList.Keys(processList.count - 1)).Name = processName 'get last Process Object
processList(MSID).Name = "Just Testing" ' !!!! here it works
Else
End If
' ------ END OF PROCESS ->
ElseIf (......) Then
startIndex = InStr(D, "MSID") + 5
endIndex = InStr(startIndex, D, "]")
count = endIndex - startIndex
MSID = Mid(D, startIndex, count)
EndTime = B
Debug.Print (EndTime & " End of process " & MSID)
' **** Add End time for the process from the collection, specified by MSID
Debug.Print ("Test of " & processList(MSID).Name) ' !!!!! Doesn't work
processList(MSID).Name = "Just Prooooooving" ' !!!!! Here doesn't work
processList(MSID).EndTime = EndTime ' !!!!! Does not work
End If
Next
End Sub
Итак, чтобы уточнить вопрос - почему это работает:
processList(MSID).Name = "Just Testing" ' !!!! here it works
И это не так:
processList(MSID).Name = "Just Prooooooving" ' !!!!! Here doesn't work
Если я сначала докажу, существует ли в словаре Объект с ключом MSID, он не найден.
If processList.Exists(MSID) Then
Debug.Print ("Process exists, altering it...")
processList(MSID).Name = "Just Prooooooving" ' !!!!! Here doesn't work
processList(MSID).EndTime = EndTime
End If
Но в самой первой строке, где оценивается условие, я получаю что-то другое при отладке. Это здесь! Смотрите картинку ниже
Отладка - MSID там, но не может получить доступ к словарю с ключом
Можете ли вы предложить, как решить эту проблему?
Заранее большое спасибо за вашу помощь!
1 ответ
Итак... Это немного стыдно, но после нескольких часов попыток решить эту проблему я обнаружил, что добавил объект в список с MSID="124 " в качестве ключа.
Когда я пытался получить доступ, я, конечно, использовал MSID со значением "124". Заметили разницу? Да, это место в конце.
Сложность заключается в том, что отладчик VBA обрезает пробелы в конце строк, поэтому его невозможно увидеть. Та же ситуация, если вы распечатаете это - невозможно увидеть...
В итоге я потратил много часов на поиски ответа, который так прост:/ Все, что я могу сделать, это посмеяться над этим.