VBA считает значения в массиве

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