VBA Excel — ошибка переполнения при выборе диапазона

#excel #vba #range

#excel #vba #диапазон

Вопрос:

Я получил следующий код, теперь, когда я фильтрую свои результаты следующим образом, и он не возвращает результатов, я получаю ошибку переполнения. Но я не понимаю, почему. Я подумал, что это будет тот факт, что я пытаюсь выбрать неверный диапазон. Итак, я попытался проверить, является ли первая ячейка со значением пустой или нет. Но, похоже, на данный момент это не помогает.

 If Range("A2") <> "" Then
    iCtr = Range("A2", Range("A2").End(xlDown)).Count   1
    ActiveSheet.Range("$A$1:$AB" amp; iCtr).AutoFilter Field:=8, Criteria1:="=1100" _
    , Operator:=xlOr, Criteria2:="=1110"
End If
  

Итак, у кого-нибудь есть идеи, как это решить или в чем проблема?

Комментарии:

1. Ошибка в первом операторе или во втором?

2. Я получаю ошибку в следующей строке iCtr = Range("A2", Range("A2").End(xlDown)).Count 1

3. Что такое iCtr ? это Integer или Long ? Dim iCtr AS Long может позаботиться об этом, если количество строк больше, чем ~ 32 тыс.

4. В настоящее время у меня есть iCtr как целое число, однако это может показаться странным, поскольку нет никаких строк для выбора. Но я попробую и посмотрю, что это даст.

5. Я попробовал код с некоторыми такими же данными на своем конце, и он работает нормально, поэтому проблема может быть специфичной для рабочего листа.

Ответ №1:

Определить

 Dim iCtr AS Long
  

поскольку это безопасно позволило бы ему принимать диапазоны RowCount любого размера.

Комментарии:

1. технически говоря, any фактически ограничено от -2,147,483,648 до 2,147,483,647

2. Верно, но поскольку (по крайней мере, начиная с Excel 2013) максимум Rowcount может составлять только ~ 1 миллион, любой действительный возврат из RowCount может быть безопасно принят в Long . Но правильная точка об ограничениях размера для 32 бит Long , так что 1.

3. 1 при длительном. Что быстрее, чем целое число, независимо.

Ответ №2:

Из приведенной выше информации весьма подозрительно, что проблема вызвана iCtr как Integer. Максимальное целое число равно 32767, поэтому оно не может содержать большое число. Вы можете определить его как можно дольше, чтобы избежать проблемы переполнения.

 Dim iCtr As Long
  

В качестве Long максимальное значение будет равно 2147483647.