我正在尝试计算字符串在该范围内显示并返回工作表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
对象不支持此属性或方法
答案 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