如何在子内部使用Count If函数?

时间:2019-06-20 13:21:53

标签: excel vba

我正在尝试计算字符串在该范围内显示并返回工作表1的次数。我假设可以在Function()中完成此操作,但是我不知道如何写出语法。

Sub DistributedApps()
    Dim LastRow As Long
    Dim Dist As Long

    LastRow = Worksheets(3).Cells(Rows.Count, 25).End(xlUp).Row

    Dist = Application.Worksheets(3).WorksheetFunction.CountIf(Range("Y1:Y" & LastRow), "Distributed Apps")
    Worksheets(1).Range("N66:P69").Value = Dist
End Sub
  

对象不支持此属性或方法

2 个答案:

答案 0 :(得分:3)

Dist = Application.Worksheets(3).WorksheetFunction...

Worksheets属性返回一个Object,它可以是Sheets集合(如果给定了一组图纸名称)或Worksheet对象(如果给定了一个)工作表名称或工作表索引),因此您将获得一个Worksheet对象,但VBA仅在运行时知道此情况。

通过引入局部Worksheet变量将该知识移至编译时;请注意,Application.Worksheets将为您提供当前处于活动状态的任何工作簿的工作表集合,因此,通过使用实际的Workbook对象限定成员调用来使其更加明确,可能是一个好主意:

Dim sheet As Worksheet
Set sheet = ActiveWorkbook.Worksheets(3)

现在VBA知道此对象具有什么接口,编辑器可以为您提供帮助:在sheet.中键入点时,您将获得Worksheet接口的所有成员的列表-以及看到它们都不是WorksheetFunction:这就是为什么在运行时引发错误438的原因,对象不支持此属性

尽管Application对象确实具有WorksheetFunction成员,所以this will work

lastRow = sheet.Cells(sheet.Rows.Count, 25).End(xlUp).Row
dist = Application.WorksheetFunction.CountIf(sheet.Range("Y1:Y" & lastRow), "Distributed Apps")

请注意,Range参数列表内的CountIf成员调用也明确地由sheet对象限定。如果没有此限定符,Range将指的是ActiveSheet 1 的任何内容,并且由于您不需要Activate来完成此任务工作,使用显式工作表对象作为限定符可确保您正在计算正确工作表的计数。

1 除非代码是在Worksheet模块的代码后面编写的-在这种情况下,隐式限定符为Me而未限定的{{ 1}}调用是指那个工作表。

答案 1 :(得分:2)

我认为这会起作用。

Sub DistributedApps()
    Dim LastRow As Long
    Dim Dist As Long

    LastRow = Worksheets(3).Cells(Rows.Count, 25).End(xlUp).Row

    Dist = Application.WorksheetFunction.CountIf(Worksheets(3).Range("Y1:Y" & LastRow), "Distributed Apps")
    Worksheets(1).Range("N66:P69").Value = Dist

End Sub