VBA for Excel,activecell在编写函数时不起作用

时间:2016-12-30 17:25:48

标签: excel-vba vba excel

我写了一个函数但由于某种原因它不起作用。我调试了,但我还是不知道发生了什么。我写了一些其他函数来理解什么不起作用,我得出结论,activecell是有问题的部分。出于某种原因,当我写函数activecell时。未检测到。 我在下面写了我的代码。该函数有两个参数,r(一个只有列的范围,换句话说就像是Ai:Aj)和名称(必须是一个字符串),这个函数应该做的是计算最长的外观连续命名,换句话说,如果我输入的单元格具有值a,a,b,a,a,a,如果name = a,则函数将返回3.

Function cont(r As range, name As String) As Integer
Dim count As Integer, l As Integer
r.Cells(1).Activate
l = 0
count = 0
Do While IsEmpty(ActiveCell) = False
    If ActiveCell.Value <> name Then
        ActiveCell.Offset(1, 0).Activate
    Else
        Do While ActiveCell.Value = name
            count = count + 1
            ActiveCell.Offset(1, 0).Activate
        Loop
        If count >= l Then l = count
    End If
    count = 0
Loop
cont = l
End Function

我抬头看看是否有其他人遇到类似的问题,但我找不到有用的东西。也许有人在这里可以告诉我什么是错的?谢谢!

1 个答案:

答案 0 :(得分:2)

不要使用激活或选择,只需迭代输入范围并测试它:

Function cont(r As Range, name As String) As Integer

Dim i&, j&, cnt&
For i = 1 To r.Rows.count
    If r(i, 1).Value = name Then
        For j = i To r.Rows.count
            If r(j, 1).Value <> name Then
                Exit For
            Else
                cnt = cnt + 1
            End If
        Next j
        If cnt > cont Then cont = cnt
        cnt = 0
        i = j
    End If
Next i

enter image description here

只用一个循环来做:

Function cont(r As Range, name As String) As Integer

Dim i&, cnt&, tst As Boolean
For i = 1 To r.Rows.count
    If r(i, 1).Value = name And tst = True Then
        cnt = cnt + 1
    ElseIf r(i, 1).Value = name And tst = False Then
        tst = True
        cnt = 1
    Else
        tst = False
        If cont < cnt Then cont = cnt
    End If
Next i
If cont < cnt Then cont = cnt   

End Function

有关避免选择和激活的更多信息,请参阅此处:How to avoid using Select in Excel VBA macros