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")
Обратите внимание, что вызов члена Range
в списке аргументов CountIf
также явно квалифицирован объектом sheet
. Без этого квалификатора Range
будет относиться к тому, что ActiveSheet
равно 1 , и поскольку вам не нужно Activate
какие-либо листы, чтобы это работало, используя явный объект рабочего листа как квалификатор гарантирует, что вы вычисляете счет на правильном листе.
1 Если этот код не записан в коде для модуля Worksheet
- в этом случае неявный квалификатор равен Me
, а неквалифицированный вызов Range
относится к этот лист.