#arrays #excel #vba #count
#массивы #excel #vba #подсчитывать
Вопрос:
Я прочитал сообщение об этой проблеме VBA, но мой скрипт VBA все еще не работает.
Public Sub Test()
Dim arrNames As Variant 'Declare array named "arrNames"
arrNames = Sheet1.Range("F2:F1000") 'Array filled with column F
intN = Application.CountIf(arrNames, "*") 'does not work intent: count cells w/info
'intN = Application.CountA(arrNames) 'works but MsgBox displays value of 999
MsgBox (intN)
End Sub
Как мне получить количество ячеек в моем массиве, содержащих любое значение?
ОТРЕДАКТИРОВАННАЯ версия после справки
Public Sub Test()
Dim arrNames As Variant 'Declare array named "arrNames"
Dim i As Long
arrNames = Sheet1.Range("F2:F1000") 'Array filled with column F
For i = LBound(arrNames) To UBound(arrNames)
If (arrNames(i,1) = "") Then
EmptyCounter = EmptyCounter 1
End If
Next i
End Sub
Комментарии:
1. Вы не объявили
Dim EmptyCounter As Long
2. Вы не можете использовать самый простой подход, такой как
MsgBox Application.WorksheetFunction.CountBlank(Range("F2:F1000"))
??3. @Грег, помогло ли мое решение, приведенное ниже?
4. Нет и Да. arrNames необходимо изменить в строке 9 после инструкции If как таковой: If arrNames(i, 1) в противном случае возникает ошибка, при которой нижний индекс выходит за пределы диапазона.
Ответ №1:
Насколько я понимаю, прямого способа сделать это нет. Но вы могли бы запустить простой цикл, чтобы проверить, равны ли значения «», предполагая строковые данные.
Например,
For i = LBound(ArrayName) to UBound(ArrayName)
If (ArrayName(i) = "") Then
EmptyCounter = EmptyCounter 1
End If
Next i
Если это числовые данные или данные другого типа, вы можете попробовать варианты вышеупомянутого цикла, используя такие функции, как IsEmpty(VariableName)
и т.д.
Комментарии:
1. Обычно это просто строка, например, смешанные данные, такие как S12-9
2. Если (arrNames(i) = «»), то ‘Скрипт зависает на этой строке
3. что значит «зависает»? Что за ошибка, которая появляется?
4. Ошибка времени выполнения ‘9’: индекс выходит за пределы диапазона
5. Это очень, очень странно, если он переходит из LBound в Ubound, это практически невозможно.
i
Объявлено как Long? или целое число? Пожалуйста, объявите это какLong
и посмотрите еще раз.
Ответ №2:
Вы можете попробовать это:
intN = Worksheets("Sheet1").Range("F2:F1000").Cells.SpecialCells(xlCellTypeConstants).Count
MsgBox intN
на 100% это работает.
Комментарии:
1. Это действительно работает, однако мне нужно «count» для массива, поскольку мои массивы обрабатываются в скрипте.
2. Я не уверен, что правильно понял вас в этом вопросе. Но если я это сделаю, вы можете попробовать что-то вроде этого:
intN = arrNames.Cells.SpecialCells(xlCellTypeConstants).Count
— Я предполагаю, что вы ранее объявляли arrNames как диапазон. Помогает ли это?3. Я имел в виду, что ваш ответ действительно оценивает значения, которые будут помещены в массив, а не сам массив. Но бывают случаи, когда мне нужно будет подсчитать массив после того, как я «отсортирую», удалю дубликаты и т.д. Из массива. В этом случае intN = Worksheets… не сработало бы.
4. хорошо, все еще не отказываясь от этого — вы можете переопределить свой диапазон в терминах строк следующим образом:
Dim TheLastRow As Long TheLastRow = Worksheets("Sheet1").Range("F2:F1000").Cells.SpecialCells(xlCellTypeLastCell).Row MsgBox (TheLastRow)
— эта строка находит последнюю непустую строку. затем вы можете запустить код, который я предложил в моем первом ответе.5. Это имеет смысл, и intN выдаст вам промежуточное значение. Однако, как мне ввести это значение последней строки при настройке диапазона массива? Следующее не работает. arrNames = Sheet1. Диапазон («F2»: intN)