1

奇怪的问题。通过检查单步执行代码可以给我正确的答案。只是运行它不会。

该程序遍历列中的每个单元格,搜索正则表达式匹配。当它找到某些东西时,检查它属于哪个组的相邻列并在字典中保持计数。例如:第 3 组:7、第 5 组:2、第 3 组:8

只是单步执行代码最后会给我不正确的结果,但是为字典中的每个已知项目添加和检查就可以了。对每个 Dictionary(key) 使用 Debug.Print 来检查我在每个循环中得到了多少项目也给了我一个很好的输出。

正确 // 运行代码后真正发生了什么

  • Group1:23 // Group1:23
  • Group3:21 // Group3: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中将字典初始化为空并添加一个 watch for DictContador("a")。您将"a"在本地窗口中看到添加为项目。

集合提供了一种不存在此问题的替代方法,它们还显示值而不是键,这可能对调试更有用。另一方面,Exists缺少一个方法,因此您需要添加on error resume next并测试错误,或者添加一个自定义集合类并添加一个 exists 方法。两种方法都需要权衡取舍。

于 2013-09-14T23:24:54.490 回答