任务要求:
Excel高手用VBA解决最大数字连续次数,用VBA统计E列中1出现最大连续次数,结果保存H20,用按钮控制结果。
Sub tes3t()
For Each x In Range("e5:e" & [e65536].End(3).Row)
If x = 1 Then
n = n + 1
If k < n Then k = n
Else
n = 0
End If
Next
[H22] = k
End Sub
以上代码用sub方式制作,可以完成求1的最大次数。如果单元格中x=1,则累加n+1,并比较K值,如果此时n比k大,则k=n.刷新了最大值。
但其中1是个定值,不方便扩展。如果要求2的最大连续是还要改。
下面我制作一个非常通用的vba自定义函数,来解决这个问题。
Function maxcs(rng As Range, 要查找的值 As Integer) As Integer
Dim arr, i, n
Dim k As Integer
k = 0
arr = rng.Value
For i = 1 To UBound(arr, 1)
If arr(i, 1) = 要查找的值 Then
n = n + 1
If k < n Then k = n
Else
n = 0
End If
Next
maxcs = k
End Function
主体代码几乎完全一样,只是为了程序健壮性,加了dim声明,并且提供了"要查找的值"作为参数
用以下代码测试下:
Sub test01()
Dim rng As Range
Set rng = Sheets(1).Range("E5:E19")
MsgBox CStr(maxcs(rng, 1))
End Sub
可以正确返回1的最大连续次数5.
在excel表格用公式方法测试:
公式简单明了,普通用户也可以用。比excel公式高手编写的长串公式简明多了。参数变化问题也解决了。
最后一步:收集到vbnet库中
Function max连续次数(arr(,) As Object, 要查找的值 As Object) As Integer
Dim i, j, n, k As Integer
n = 0 : k = 0
For i = 1 To UBound(arr, 1)
For j = 1 To UBound(arr, 2)
If arr(i, j) = 要查找的值 Then
n = n + 1
If k < n Then k = n
Else
n = 0
End If
Next
Next
Return k
End Function
结论:
vba方法适用于sub过程 和function函数,可以完美解决自定义公式的复杂参数问题。
以上方法也可以方便移植到vbnet,一码三用。完全不用重写三遍了。这就是上文我说的vbnet代码兼容vb和vb6。