Обновление объекта словаря при обновлении переменной, содержащей ключ
Я работаю над парсером для серии документов. в рамках этого анализа я размещаю закладки в отдельных документах, а затем циклически перебираю их по одной, чтобы извлечь нужные мне данные из документа, в котором есть несколько экземпляров. Информация, которая меня интересует в этом документе, состоит из нескольких частей, к которым я последовательно обращаюсь, а затем добавляю их в массив, содержащий словарь с отображениями данных. по какой-то причине, когда я обновляю переменную, которая используется для предоставления ключа к словарю, несколькими строками позже, словарь обновляется - на несколько строк раньше, чем должен. Это вызывает ошибку, когда я пытаюсь добавить ключ несколькими строками позже. Если кто-нибудь может объяснить фантомное обновление, я был бы благодарен.
Обновление: я только заметил, что это также происходит после
Set Topics(TopicsCount).TopicMap = New Scripting.Dictionary
когда значение CurrentString равно "Title" в первый раз, прежде чем я даже вызвал Add
Sub ParseDoc()
Dim objDoc As Document
Set objDoc = ActiveDocument
Dim Topics() As TopicData
Dim TopicsCount As Integer
TopicsCount = -1
Dim DataRange As Range
For i = 1 To objDoc.Bookmarks.count - 1
indexOfBase = InStr(1, objDoc.Range.Bookmarks(i), "Base")
CurrentString = Left(objDoc.Range.Bookmarks(i), indexOfBase - 1) ' after this line the Topices(TopicCount).TopicMap updates
If CurrentString = "Title" Then
TopicsCount = TopicsCount + 1
ReDim Preserve Topics(TopicsCount)
Set Topics(TopicsCount) = New TopicData
Topics(TopicsCount).TopicID = GrabTitle
Set Topics(TopicsCount).TopicMap = New Scripting.Dictionary 'the Map will update here the first time with CurrentString, note that the add line is further down and the Map shouldn't know about CurrentString yet.'
End If
Set DataRange = ActiveDocument.Range(Start:=objDoc.Range.Bookmarks(i).End, End:=objDoc.Range.Bookmarks(i + 1).Start)
If CurrentString = "TechArea" Or CurrentString = "Keywords" Then
DataArray = Split(DataRange.Text, ",")
For j = 0 To UBound(DataArray)
DataArray(j) = Trim(DataArray(j))
Next j
Topics(TopicsCount).TopicMap.Add CurrentString, DataArray ' throws error because of earlier update
Else
Topics(TopicsCount).TopicMap.Add CurrentString, DataRange.Text ' thorws error because of earlier update
End If
Next i
End Sub
1 ответ
По какой-то причине это перестало быть проблемой. спасибо за помощь людям, но так же загадочно, как и началась эта проблема, она прекратилась.
Обновление - проблема на самом деле, кажется, связана с отладкой. Похоже, это происходит только тогда, когда отладчик достигает точки останова перед строкой словаря. очевидно, VBA как-то автоматически заполнял его (по крайней мере, с элементом индекса 0), когда я достигал точки останова.