Excel VBA - WorksheetFunction.CountA ошибка - требуется объект - PullRequest
1 голос
/ 14 января 2020

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

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

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

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")

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

Смещение в правильном направлении будет высоко ценится!

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

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

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

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

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? </p>

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

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

1 Ответ

4 голосов
/ 14 января 2020
  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 .

...