更新 - 经过进一步测试后,我发现UniqueLength的值变为2 ^(X-1)+1,其中X是结果的数量。我仍然不明白为什么会发生这种情况......
我有一个功能,用户可以在一行Excel(预定格式和特定列)中输入一个名为ScoreQ2()的函数。该函数从B列获取一个ID,在B列的每一行中搜索该ID,并检查这些行的几个标准。最终,它会返回一个分数(不需要你理解,但它会对某些东西进行评分)。
它适用于大多数项目,但由于某种原因,它会打破一些较大的值。具体来说,它打破了符合条件的行数最多的3个ID(“2 - Red Chemical ...”)和单元格(i,24)= 200。数据集大约为13K行,这些ID在该集合中有21,15或11个响应。
在我的代码中,你会看到我声明一个1到5000的数组。我不知道为什么我需要超过21个。当我将数组大小从500更改为5,000时,具有13个响应的ID开始起作用。并添加另一个0到50,000使15响应项工作。但是,没有可接受的数组大小可以用于21个响应(我一直加0,直到它崩溃)。
我意识到我在这里做了一些非常奇怪的事情,比如声明我的数组的前19个值。出于某种原因,我不得不申报一些,这就是我最终的地方......
我尝试使用21尺寸ID中的一组示例。它最终打破了“Unique(UniqueLength)= Cells(i,23)”,说错误9,下标超出范围。这就是我如何将阵列大小从500增加到5,000的原因。
我可以在这里发布几个例子,但我不确定如何,或者是否有必要。如果这会有所帮助,请告诉我。
Function ScoreQ2()
Dim Max As Integer
Dim Min As Integer
Dim Unique(1 To 5000) As Integer
Dim UniqueLength As Integer
Dim NewUnique As Boolean
Dim LastRow As Integer
Dim ResultID As Long
Dim question As Long
ResultID = 0
UniqueLength = 1
NewUnique = True
Max = 0
Min = 200
question = 0
Unique(1) = 500
Unique(2) = 500
Unique(3) = 500
Unique(4) = 500
Unique(5) = 500
Unique(6) = 500
Unique(7) = 500
Unique(8) = 500
Unique(9) = 500
Unique(10) = 500
Unique(11) = 500
Unique(12) = 500
Unique(13) = 500
Unique(14) = 500
Unique(15) = 500
Unique(16) = 500
Unique(17) = 500
Unique(18) = 500
Unique(19) = 500
LastRow = Application.Caller.Worksheet.UsedRange.Rows.Count
For i = 1 To LastRow
If Cells(i, 2) = Cells(Application.Caller.Row, Application.Caller.Column - 15) Then
ResultID = ResultID + 1
If StrComp(Cells(i, 11), "2 - Red Chemical_Reduced Range") = 0 Then
question = question + 1
If Cells(i, 24) = 200 Then
NewUnique = True
For j = 1 To UniqueLength
If Cells(i, 23) = Unique(j) Then
NewUnique = False
j = UniqueLength
End If
If NewUnique = True Then
Unique(UniqueLength) = Cells(i, 23)
UniqueLength = UniqueLength + 1
If Cells(i, 23) > Max Then
Max = Cells(i, 23)
End If
If Cells(i, 23) < Min Then
Min = Cells(i, 23)
End If
End If
Next j
Else
End If
Else
End If
Else
End If
Next i
If UniqueLength > 3 Then
If Max - Min > 99 Then
ScoreQ2 = 3
Else
ScoreQ2 = 2
End If
ElseIf UniqueLength > 2 Then
ScoreQ2 = 1
Else
ScoreQ2 = 0
End If
End Function
答案 0 :(得分:0)
我不知道你想要做什么,但问题出在你的循环结构中。
第一次(i,24)= 200你的for循环是
For j = 1 To 1
并且仅运行一次,其值为UniqueLength = 1.
如果条件
If Cells(i, 23) = Unique(1)
被评估为false,然后你将为UniqueLength添加1,所以它现在是2.
下次你有for循环
For j = 1 To 2
,UniqueLength的值为2。
然后检查
If Cells(i, 23) = Unique(1) and then runs again and checks if it is Unique(2).
如果这些都不是真的(并且它永远不会成立,因为你将Unique数组的前19项设置为500,这可能不是一个可能的值),那么你将增加UniqueLength两次,以便它现在是4。
下一次,你的for循环是
For j = 1 To 4
你将把UniqueLength增加4。
这会导致UniqueLength = 2 ^ X。
的行为至于如何解决这个问题,目前还不清楚你要做什么,所以我不知道该说些什么。
首先,您必须在数组中声明值的原因是,当您第一次启动时,该数组为空。
然后对阵列进行检查:
If Cells(i, 23) = Unique(j)
但唯一(1)是空的!!
您需要修复查看阵列的方式。 (注意:可能有更好的方法来做到这一点,但这是我能想到的最快的解决方案) Dim ws As Worksheet 设置ws =表格(“mySheet”) UniqueLength = 0
....more code (do not declare the array values)
If ws.Cells(i, 24) = 200 Then
NewUnique = True
For j = 1 To UniqueLength 'When 0, this will not run the loop
If ws.Cells(i, 23) = Unique(j) Then
NewUnique = False
Exit For
End If
Next j
If NewUnique = True Then
UniqueLength = UniqueLength + 1
Unique(UniqueLength) = ws.Cells(i, 23)
.....rest of code
显然,您需要在设置分数的末尾修复该部分,我不确定您要做什么,但这至少会以指数方式循环运行。