1

奇妙な問題。インスペクションを使用してコードをステップ実行すると、正しい答えが得られます。実行するだけではありません。

このプログラムは、正規表現の一致を検索しながら、列の各セルをループします。何かを見つけると、それが属するグループの隣の列をチェックインし、辞書にカウントを保持します。例:Group3:7、Group5:2、Group3:8

コードをステップ実行するだけで、最後に誤った結果が返されますが、辞書内の既知の各項目を追加して検査すると、うまくいきます。各 Dictionary(key) に対して Debug.Print を使用して、各ループで取得したアイテムの数を確認すると、適切な出力が得られます。

正しい // コードを実行した後に実際に起こること

  • グループ 1:23 // グループ 1:23
  • グループ 3:21 // グループ 3:22
  • Group6:2 // Group6:2
  • Group7:3 // Group7:6
  • Group9:8 // Group9:8
  • Group11:1 // Group11:12
  • Group12:2 // Group12:21

    Sub Proce()
    
    Dim regEx As New VBScript_RegExp_55.RegExp
    Dim matches
    Dim Rango, RangoJulio, RangoAgosto As String
    Dim DictContador As New Scripting.Dictionary
    Dim j As Integer
    Dim conteo As Integer
    Dim Especialidad As String
    
    regEx.Pattern = "cop|col"
    regEx.Global = False 'True matches all occurances, False matches the first occurance
    regEx.IgnoreCase = True
    
    i = 3
    conteo = 1
    RangoJulio = "L3:L283"
    RangoAgosto = "L3:L315"
    Julio = Excel.ActiveWorkbook.Sheets("Julio")
    Rango = RangoJulio
    
    Julio.Activate
    For Each celda In Julio.Range(Rango)
    
        If regEx.Test(celda.Value) Then
            Set matches = regEx.Execute(celda.Value)
            For Each Match In matches  
    
                j = 13 'column M
                Especialidad = Julio.Cells(i, j).Value
                If (Not DictContador.Exists(Especialidad)) Then
                    Call DictContador.Add(Especialidad, conteo)
                    GoTo ContinueLoop
                End If
                conteo = DictContador(Especialidad)
                conteo = CInt(conteo) + 1
                DictContador(Especialidad) = conteo
    
            Next
        End If
    
    ContinueLoop:
    i = i + 1
    'Debug.Print DictContador(key1)
    'Debug.Print DictContador(key2)
    'etc
    
    Next
    
    'Finally, write the results in another sheet.
    
    End Sub
    

VBAが「機会があればだまします」と言っているようなものです。

ありがとう

4

2 に答える 2

0

あなたのメインループはこれに減らすことができるようです:

For Each celda In Julio.Range(Rango)

    If regEx.Test(celda.Value) Then

        Especialidad = celda.EntireRow.Cells(13).Value

        'make sure the key exists: set initial count=0
        If (Not DictContador.Exists(Especialidad)) Then _
                          DictContador.Add Especialidad, 0

        'increment the count
        DictContador(Especialidad) = DictContador(Especialidad) +1

    End If

Next
于 2013-09-14T22:43:45.993 に答える
0

ウォッチまたはイミディエイト ウィンドウを使用してアイテムを検査すると、アイテムがまだ存在しない場合にアイテムが作成されるという辞書のバグ/機能があるため、コードをステップ実行すると異なる結果が得られます。

これを確認するには、変数宣言の下の最初の行にブレーク ポイントを配置し、F5 キーを押してブレーク ポイントまで実行し、次に即時ウィンドウ タイプset DictContador = new Dictionaryで辞書が空で初期化されるようにし、 のウォッチを追加しDictContador("a")ます。"a"ローカルウィンドウにアイテムとして追加されたことがわかります。

コレクションは、この問題のない代替方法を提供します。コレクションは、デバッグに役立つ可能性があるキーではなく値も表示します。一方、Existsメソッドが不足しているため、on error resume next代わりに追加してエラーをテストするか、exists メソッドが追加されたカスタム コレクション クラスを追加する必要があります。どちらのアプローチにもトレードオフがあります。

于 2013-09-14T23:24:54.490 に答える