我正在尝试计算字符串在范围内出现的次数并返回到工作表 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
将引用ActiveSheet
为1的任何内容,并且由于您不想需要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