1

私は一連のドキュメントのパーサーに取り組んでいます。その解析の一環として、個々のドキュメント全体にブックマークを配置し、一度に 1 つずつ循環して、複数のインスタンスが含まれるドキュメントから実際に必要なデータを引き出します。ドキュメント内で関心のある情報にはいくつかの部分があり、これらの部分に順番にアクセスしてから、データ マッピングを含む Dictionary を保持する配列にスローします。何らかの理由で、数行後に辞書にキーを提供するために使用されている変数を更新すると、辞書が更新されます-必要な数行前に。これにより、数行後にキーを追加しようとするとエラーがスローされます。ファントムの更新について誰かが説明できれば、私は感謝しています。

更新:私はちょうどそれが後にも起こることに気付きました

Set Topics(TopicsCount).TopicMap = New Scripting.Dictionary

Add を呼び出す前に、CurrentString 値が初めて「Title」の場合

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
4

1 に答える 1

0

何らかの理由で、これは問題ではなくなりました。人々の助けに感謝しますが、この問題が始まったのと同じくらい不思議なことに、それは止まりました.

更新 - 問題は実際にはデバッグに関連しているようです。デバッガーが辞書行の前にブレークポイントにヒットした場合にのみ発生するようです。どうやらVBAは、ブレークポイントに到達したときに、何らかの形で(少なくとも0インデックス項目で)自動入力していたようです。

于 2014-06-02T17:37:40.137 に答える