如何解决vba数组-处理数组保留维之外的条件
我想遍历表,将值存储到数组LotN()中(图片中有2个单独的样本数据集,以说明我可能遇到不同数量的唯一手数)(屏幕盖只是一个例子,数据实际上存储在2D数组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。我需要的下一步是计算与LotN()中每个元素匹配的另一个数组A1()中的元素数量。
' 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
,
要执行此操作,您将需要在工具-参考下的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 .:修改代码以适合您的需要,因为您没有发布完整的代码,您需要引用单元格的工作表和工作簿并提供A1数组...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。