Как использовать функцию Count If внутри сабвуфера? - PullRequest
1 голос
/ 20 июня 2019

Я пытаюсь подсчитать, сколько раз строка отображается в диапазоне, и вернуться к рабочему листу 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

Объект не поддерживает это свойство или метод

Ответы [ 2 ]

3 голосов
/ 20 июня 2019
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 относится к этот лист.

2 голосов
/ 20 июня 2019

Я думаю, что это будет работать.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...