VBA 循环遍历数组字符串元素问题

VBA loop through array string element issue

提问人:Dima Bilan 提问时间:10/15/2023 最后编辑:ZygDDima Bilan 更新时间:10/15/2023 访问量:56

问:

由于 Variant 数组的简单循环,我注意到如果值代码“SALA_1000”,编译器似乎看不到元素,因此条件 Element = prevElement 永远不会发生此值。这种行为的原因是什么?有趣的是,如果我将更改为Sala_1000,或SAla_1000或添加空间,它可以正常工作。Sala_1000 VBA 中有什么特别的含义吗?快照

数据:

编号 法典
编号: A001 HRLY_1001
编号: A002 SALA_1000
编号: A003 SALA_1000
编号 A004 HRLY_1001
编号: A005 SALA_1000
Sub CheckSome()

  Dim fc As Range
  Dim Tbl As Range
  Dim DataArr() As Variant
  
  Dim i As Long

  Dim Element As String
  Dim prevElement As String
  

  Set fc = ThisWorkbook.Sheets("Sheet1").Cells.Find(What:="code")
  Set Tbl = fc.CurrentRegion

  'assign range data to array
  DataArr = Tbl
  
  'looping through array
  For i = 1 To UBound(DataArr)
    
    'make "key": ID & code & Amount
    Element = CStr(DataArr(i, 1)) & CStr(DataArr(i, 2))
    
    'check if Element = prevElement
    If Element = prevElement Then
      
    Debug.Print DataArr(i, 2)
    
    Else
    
    Debug.Print "ok"
     
    End If
     
    prevElement = Element
  Next i

End Sub
数组 Excel VBA 字符串 循环

评论

1赞 Notus_Panda 10/15/2023
您正在制作一个 ID 键(在您的测试用例中是唯一的)和 Code,这本身使每个元素都独一无二,所以我很惊讶您会说,如果您稍微更改代码值,它会正常工作,即A002SALA_1000与A003SALA_1000
0赞 Dima Bilan 10/15/2023
即使只循环通过代码列 - 仍然有奇怪的行为
0赞 Notus_Panda 10/16/2023
我使用了您的示例数据,在 b 列上运行了带有相交的代码,因此您的“Tbl”只有 B1:B6(仅通过代码列),删除了(也可以在没有相交 ofc 的情况下使用)并进入子句就好了。您的代码正在按预期工作,因为您正在创建唯一的密钥。如果要检查代码是否相同,则无法执行此操作。& CStr(DataArr(i, 2))CStr(DataArr(i, 1))If Element = prevElement

答:

2赞 vbakim 10/15/2023 #1

由于 prevElement = Element 位于循环末尾,If Element = prevElement 条件中的 Debug.Print DataArr(i, 2) 语句可能无法按预期执行。 因为 Element = CStr(DataArr(i, 1)) & CStr(DataArr(i, 2)) 将新 ID 分配给“SALA_1000”。

为了查看 Debug.Print DataArr(i, 2) 的输出,我会将 Debug.Print 语句放在 prevElement = Element 行的上方。

Else
    
    Debug.Print "ok"
     
    End If
    
    Debug.Print DataArr(i, 2)
    prevElement = Element
  Next i

End Sub