Excel VBA — ошибка WorksheetFunction.CountA — требуется объект

близкие. Я новичок в программировании, пытаюсь написать макрос для извлечения некоторых строк данных из нескольких книг и компилировать их в новую книгу, а затем отображать их в виде графика. Я понял, как просмотреть исходные таблицы и кое-что еще, но сейчас я застрял в нескольких местах. (Для ясности я буду задавать разные вопросы в разных темах.)

Этот вопрос касается ошибки при использовании WorksheetFunction.CountA для получения номера списка элементов, которые я ищу. Я хочу знать номер, чтобы знать, когда я найду все свои строки поиска. Если я не могу найти их все, я хочу сообщить об этом пользователю и выйти.

Следуя совету по этот вопрос, я написал фрагмент для проверки функции CountA. Я получаю сообщение об ошибке «Требуется объект». Я просмотрел несколько тем на эту тему, но до сих пор не понял. Вот мой фрагмент кода:

Sub a_test_kpi_count()

Dim kpi_list_count As Integer

 Set kpi_list_count = Application.WorksheetFunction.CountA("kpi_list")

 MsgBox "There are " & kpi_list_count & "kpis in the list."


End Sub

Когда я запускаю код, редактор останавливается с выделенным либо «kpi_list_count», либо «CountA». Что ж, ЭТО ПОЛЕЗНО!

Я должен добавить, что «kpi_list» — это именованный диапазон на листе, где находится макрос. Однако я получаю ту же ошибку, когда указываю диапазон следующим образом:

Set kpi_list_count = Application.WorksheetFunction.CountA("K3:K7")

Следовательно, я не думаю, что именованный диапазон - моя проблема.

Толчок в правильном направлении был бы очень признателен!

ИЛИ, не стесняйтесь называть меня идиотом и указывать на мою очевидную ошибку! ;-)

РЕДАКТИРОВАТЬ:

Спасибо, Бен.

Этот код работает:

Sub a_test_KPI_count()

Dim KPIListCount As Long

 KPIListCount = WorksheetFunction.CountA(Sheet1.Range("KPI_list"))

 MsgBox "There are " & KPIListCount & "KPIs in the list."

End Sub

Благодарю вас! Как ни странно, это НЕ работает, когда я использую имя листа, кнопки. Являются ли имена листов чувствительными к регистру? Я спрашиваю, потому что редактор настаивает на «кнопках», а не «кнопках».

Еще пара вопросов для моего обучения, если можно, о некоторых ваших советах:

3, длинное и целочисленное. В данном случае я считаю пункты из короткого списка (‹6). Приемлемо ли здесь целое число, или лучше придерживаться Long?

  1. Кэмелкейс против змеиного футляра. Отмеченный. Это просто предпочтение более опытных программистов? Или есть функциональная разница?

Все ваши ответы были такими, на которые я надеюсь. Урок рыбалки, а не рыба! Благодарю вас!


person JohnSquare    schedule 14.01.2020    source источник
comment
Поскольку kpi_list_count является целым числом, удалите Set.   -  person Brian M Stafford    schedule 14.01.2020
comment
Имена листов не совпадают с кодовыми именами листов. Чтобы использовать имя листа, вы должны использовать ThisWorkbook.Worksheets("Buttons") вместо Sheet1.   -  person BigBen    schedule 14.01.2020
comment
См. этот вопрос, почему Long предпочтительнее Integer.   -  person BigBen    schedule 14.01.2020
comment
В соглашениях об именах нет функциональной разницы, кроме того, как (положительно/отрицательно) это влияет на удобочитаемость и ремонтопригодность. В стандартных библиотеках VBA ровно 0 членов, которые используют snake_case, это должно быть хорошей подсказкой! Кроме того, если/когда вы начнете заниматься ООП и реализовывать интерфейсы, вы обнаружите, что символы подчеркивания в именах общедоступных членов фактически сделают ваш код некомпилируемым, потому что подчеркивание действительно имеет особое значение в VBA.   -  person Mathieu Guindon    schedule 14.01.2020
comment
Об имени листа и кодовом имени вы можете прочитать CodeName: Sheet1 в моем блоге, это должно быть разъяснено.   -  person Mathieu Guindon    schedule 14.01.2020
comment
Матье, спасибо. Очень полезно.   -  person JohnSquare    schedule 15.01.2020


Ответы (1)


  1. Set для Object переменных - удалите его.

  2. Вам нужен вызов Range при указании именованного диапазона.

    kpi_list_count = Application.WorksheetFunction.CountA(Range("kpi_list"))
    
  3. В 99,9999% случаев вам нужен Long, а не Integer; см. этот вопрос:

    Dim kpi_list_count as Long
    
  4. Лучше всего указать, на каком листе находится Range (изменить при необходимости):

    kpi_list_count = Application.WorksheetFunction.CountA(Sheet1.Range("kpi_list"))
    
  5. Вы можете отказаться от Application, если хотите.

  6. Попробуйте использовать camelCase вместо snake_case.

person BigBen    schedule 14.01.2020
comment
Большое спасибо за образовательный ответ. Тем не менее, я все еще получаю ошибку, требующую объекта, с обоими этими подходами. ''KPIListCount = Application.WorksheetFunction.CountA(Диапазон(KPI_list)) KPIListCount = Application.WorksheetFunction.CountA(Buttons.Range(KPI_list))' - person JohnSquare; 14.01.2020
comment
Можете ли вы отредактировать свой вопрос с исправленным кодом, который вы используете? - person BigBen; 14.01.2020
comment
Должен ли я сделать это в исходном вопросе? Все еще изучаю протокол здесь. - person JohnSquare; 14.01.2020
comment
Да, это было бы лучше всего. Вы можете добавить его в конец как РЕДАКТИРОВАТЬ. - person BigBen; 14.01.2020
comment
Примечание. Вы можете обратиться к листу по имени листа или по кодовому имени листа. Я использую последний. Кодовое имя можно найти в VBEditor. Скорее всего, Buttons не является фактическим кодовым названием листа. - person BigBen; 14.01.2020