Как посчитать ячейки, основываясь на левом значении ячейки между двумя значениями - PullRequest
1 голос
/ 04 июля 2019

У меня есть электронная таблица с примерно 1500 строками, и я пытаюсь подсчитать количество строк с одним значением ячейки 0 или ниже, а затем сгруппировать их на основе первых 3 символов в другой ячейке в этой строке.

Это моя первая попытка попробовать VBA, и я провел исследование по каждому разделу этого кода, но я видел довольно много противоречивых ответов о том, как сделать каждую часть этого кода. Я основал код на единицах, которые я нашел, чтобы посчитать количество ячеек с определенным словом в них, так что это может быть очень далеко от того, что я хочу.

For Each Cell in Range("S26:S1500")
Cell.Activate
If IsEmpty(Cell) Then Exit For
If Left(Cell.Value,3) >= 100 And Left(Cell.Value,3) <=150 And
If ActiveCell.Offset(0,-17) < 1 Then
MisProd = MisProd + 1

Результатом должно быть общее количество ячеек, которые начинаются со 100 до 150 и имеют ячейку, в которой 17 ячеек осталось меньше 1.

Вместо этого я получаю ошибку компиляции: Ожидается: выражение.

Ответы [ 2 ]

1 голос
/ 04 июля 2019

Обновлено У первой функции было несколько опечаток. Я проверил, и это работает.

Вероятно, это будет лучше, чем пользовательская функция. Вот синтаксис, который, я думаю, вы ищете.

Function MisProd (srchRNG As Range) As Long
Dim cell As Range

    For Each cell In Intersect(srchRNG, srchRNG.Worksheet.UsedRange).Cells
        'I use the intersection function so users can selet a whole column)

    If IsEmpty(cell) Then
        'probably do nothing if it's empty?
        'might also be better to use Isnumeric(Left(cell.value,3)) to avoid errors.

    ElseIf Left(cell.Value, 3) >= 100 And Left(cell.Value, 3) <= 150 Then
        'this is a range of 101 to 149...

        If cell.Offset(0, -17) < 1 Then
            'if column b for this row is less than 1
             MisProd = MisProd + 1
        End If

    End If

    Next Cell

End Function

Вы можете использовать это в сочетании с макросом, как показано здесь.

Sub nowAmacro()

    MsgBox "Your results are " & MisProd (Range("S26:S1500"))
    'better to specify the sheet such as Sheet1.Range("S26:S15000")


End Sub
0 голосов
/ 04 июля 2019

Во-первых, предыдущие комментарии и ответы все хороши и исправят ваш VBA.Хотя, если вы просто пытаетесь изучать VBA, то лучше понять, в чем ваша ошибка.Сделайте перерыв в своем коде и посмотрите, сможете ли вы пробежать до тех пор, пока не произойдет ошибка.Вероятно, это связано с необычным рядом данных.

Если он определенно проходит через первые полдюжины строк, введите Debug.Print cell.row и после того, как он допустил ошибку, проверьте в окне вывода номер строки с ошибками.

Эти методы научатВы для отладки кода VBA.А у тебя в основном все нормально.Прекратите активировать эту ячейку, как упоминалось, и используйте «<= 0», а не «<1» для столбца А. Хотя это может быть одно и то же, если все они целые. </p>

Но, наконец, рассмотрите возможность не использовать VBAдля логической задачи, как это, если вы можете.Если у вас есть возможность добавлять столбцы на свой лист, добавьте один, чтобы получить NUMBERVALUE столбца S, а затем еще один, чтобы показать 1 или 0, если выполняются ваши условия.Затем сложите ячейки во втором столбце.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...