如何在子内部使用计数如果函数?

  • 本文关键字:如果 函数 内部 excel vba
  • 更新时间 :
  • 英文 :


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

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

对象不支持此属性或方法

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成员,因此这将起作用。

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

请注意,CountIf参数列表中的Range成员调用也使用sheet对象显式限定。如果没有此限定符,Range将引用ActiveSheet1的任何内容,并且由于您不想需要Activate任何工作表即可使其正常工作,因此使用显式工作表对象作为限定符可确保计算正确工作表的计数。

1除非该代码是在Worksheet模块的代码隐藏中编写的 - 在这种情况下,隐式限定符是Me的,并且非限定Range调用引用工作表。

我认为这会起作用。

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

相关内容

最新更新