vba array - 处理超出数组保留维度的条件
vba array - handle conditions outside the preserved dimension of an array
我想遍历我的 table,将值存储到数组 LotN() 中(图中有 2 个单独的样本数据集,以说明我可能会遇到不同的数字唯一批号)(屏幕截图仅供参考。数据实际上存储在二维数组 A1() 中)。
candidate = "blah"
' loop through records, add to arrays (skip adding duplicated values with the function IsInArray = false)
For i = 2 To LR
If .Cells(i, 5).Value = candidate And IsInArray(.Cells(i, 2).Value, lotN) = False Then
q = q + 1
lotN(q) = .Cells(i, 2).Value
End If
Next i
Debug.Print "q = " & q ' try to know how many records were thrown into the arrays
ReDim Preserve lotN(1 To q)
通常我的数据q等于1到3,但我必须准备q到6,以用于下面的程序。我需要的下一步是计算另一个数组 A1() 中与 LotN() 中的每个元素匹配的元素数。
' use counter to check the number of data pieces from another array A1() matching the elements within the array LotN()
For k = 1 To r
If A1(k, 2) = lotN(1) And lotN(1) <> "" Then
c = c + 1
End If
If A1(k, 2) = lotN(2) And lotN(2) <> "" Then
d = d + 1
End If
If A1(k, 2) = lotN(3) And lotN(3) <> "" Then ' with q = 2, the code stopped at this line with error "script out of range"
e = e + 1
End If
If A1(k, 2) = lotN(4) And lotN(4) <> "" Then
f = f + 1
End If
If A1(k, 2) = lotN(5) And lotN(5) <> "" Then
g = g + 1
End If
If A1(k, 2) = lotN(6) And lotN(6) <> "" Then
h = h + 1
End If
Next k
我想为数组中的每个元素创建计数器(上面几行中的 c、d、e、f、g、h)。由于我不确定 q 究竟等于多少,我的尝试是使用 lotN(该数组中元素的位置)<> "" 来允许计数器递增。但是,这不起作用。当 q = 2 时,指示处或下方的行仍会导致错误“脚本超出范围”。
我该如何处理这个错误?
由于数组的大小是可变的,我建议您不要遍历设定范围,而是遍历数组本身。
counter = 0
For Each itm in lotN
counter = counter + 1
If A1(counter, 2) = itm Then
If counter = 1 Then
c = c + 1
ElseIf counter = 2 Then
d = d + 1
ElseIf counter = 3 Then
e = e + 1
ElseIf counter = 4 Then
f = f + 1
ElseIf counter = 5 Then
g = g + 1
ElseIf counter = 6 Then
h = h + 1
End If
End If
Next itm
为此,您需要 tools-References 下的 Microsoft Scripting Runtime
库。
这是注释的代码:
Option Explicit
Const Candidate As String = "blah"
Sub Test()
'Here we will store the Candidates to enum
Dim Candidates As Dictionary: Set Candidates = LoadCandidates
'Another dictionary to hold the candidates on the array
Dim lotN As Dictionary: Set lotN = New Dictionary
For K = 1 To r
'If the value is in the Candidates Dictionary then
If Candidates.Exists(A1(K, 2)) Then
'If the Candidate is in the lotN already, add 1
If lotN.Exists(A1(K, 2)) Then
lotN(A1(K, 2)) = lotN(A1(K, 2)) + 1
'If not, add the candidate to the lotN and equal it to 1
Else
lotN.Add A1(K, 2), 1
End If
'output the number of times the candidate has appeared
A1(K, 7) = lotN(A1(K, 2))
End If
Next K
End Sub
Private Function LoadCandidates() As Dictionary
Set LoadCandidates = New Dictionary
For i = 2 To LR
If Cells(i, 5) = Candidate And Not LoadCandidates.Exists(Cells(i, 2).Value) Then
LoadCandidates.Add Cells(i, 2).Value, 1
End If
Next i
End
P.S.: 修改代码以满足您的需要,因为您没有 post 引用单元格的工作表和工作簿并提供 A1 数组所需的整个代码。 .
candidate = "blah"
' loop through records, add to arrays (skip adding duplicated values with the function IsInArray = false)
For i = 2 To LR
If .Cells(i, 5).Value = candidate And IsInArray(.Cells(i, 2).Value, lotN) = False Then
q = q + 1
lotN(q) = .Cells(i, 2).Value
End If
Next i
Debug.Print "q = " & q ' try to know how many records were thrown into the arrays
ReDim Preserve lotN(1 To q)
通常我的数据q等于1到3,但我必须准备q到6,以用于下面的程序。我需要的下一步是计算另一个数组 A1() 中与 LotN() 中的每个元素匹配的元素数。
' use counter to check the number of data pieces from another array A1() matching the elements within the array LotN()
For k = 1 To r
If A1(k, 2) = lotN(1) And lotN(1) <> "" Then
c = c + 1
End If
If A1(k, 2) = lotN(2) And lotN(2) <> "" Then
d = d + 1
End If
If A1(k, 2) = lotN(3) And lotN(3) <> "" Then ' with q = 2, the code stopped at this line with error "script out of range"
e = e + 1
End If
If A1(k, 2) = lotN(4) And lotN(4) <> "" Then
f = f + 1
End If
If A1(k, 2) = lotN(5) And lotN(5) <> "" Then
g = g + 1
End If
If A1(k, 2) = lotN(6) And lotN(6) <> "" Then
h = h + 1
End If
Next k
我想为数组中的每个元素创建计数器(上面几行中的 c、d、e、f、g、h)。由于我不确定 q 究竟等于多少,我的尝试是使用 lotN(该数组中元素的位置)<> "" 来允许计数器递增。但是,这不起作用。当 q = 2 时,指示处或下方的行仍会导致错误“脚本超出范围”。
我该如何处理这个错误?
由于数组的大小是可变的,我建议您不要遍历设定范围,而是遍历数组本身。
counter = 0
For Each itm in lotN
counter = counter + 1
If A1(counter, 2) = itm Then
If counter = 1 Then
c = c + 1
ElseIf counter = 2 Then
d = d + 1
ElseIf counter = 3 Then
e = e + 1
ElseIf counter = 4 Then
f = f + 1
ElseIf counter = 5 Then
g = g + 1
ElseIf counter = 6 Then
h = h + 1
End If
End If
Next itm
为此,您需要 tools-References 下的 Microsoft Scripting Runtime
库。
这是注释的代码:
Option Explicit
Const Candidate As String = "blah"
Sub Test()
'Here we will store the Candidates to enum
Dim Candidates As Dictionary: Set Candidates = LoadCandidates
'Another dictionary to hold the candidates on the array
Dim lotN As Dictionary: Set lotN = New Dictionary
For K = 1 To r
'If the value is in the Candidates Dictionary then
If Candidates.Exists(A1(K, 2)) Then
'If the Candidate is in the lotN already, add 1
If lotN.Exists(A1(K, 2)) Then
lotN(A1(K, 2)) = lotN(A1(K, 2)) + 1
'If not, add the candidate to the lotN and equal it to 1
Else
lotN.Add A1(K, 2), 1
End If
'output the number of times the candidate has appeared
A1(K, 7) = lotN(A1(K, 2))
End If
Next K
End Sub
Private Function LoadCandidates() As Dictionary
Set LoadCandidates = New Dictionary
For i = 2 To LR
If Cells(i, 5) = Candidate And Not LoadCandidates.Exists(Cells(i, 2).Value) Then
LoadCandidates.Add Cells(i, 2).Value, 1
End If
Next i
End
P.S.: 修改代码以满足您的需要,因为您没有 post 引用单元格的工作表和工作簿并提供 A1 数组所需的整个代码。 .