Excel VBA: пропустить целую строку из обработки, если условие выполнено

Excel VBA: пропустить целую строку из обработки, если условие выполнено

Привет всем Я относительно новичок в кодировании VBA в Excel (текущая версия 2010) и пытаюсь улучшить простую программу, которая подавляет небольшие значения в таблицах, которые выпускает моя организация. Формат моих данных следующий.

В самом левом столбце (обычно C) у меня есть метки строк (например, Больница, Дом, Другое, Отсутствующие данные). В следующем столбце у нас есть количество записей в этой категории. В последнем столбце у нас есть процентное значение для этой строки.

При выводе результатов мы всегда подавляем размеры ячеек от 1 до 5. Однако мы не подавляем количество записей в строке «Отсутствующие данные».

Я сгенерировал следующий макрос с помощью других пользователей на этом форуме, программу, которая заменяет все значения n в наших таблицах на "<6". Причина для оператора форматирования в том, что я не хочу подавлять проценты, а они всегда форматируются как числа с одной десятичной точкой.

Sub SuppressN()
Dim rng As Range, cell As Range
Set rng = Selection
If rng Is Nothing Then Exit Sub
For Each cell In rng.Cells
   If cell.NumberFormatLocal = "#,##0" And cell.Value >= 1 And 
   cell.Value <= 5 Then cell.Value = "<6"
Next
End Sub

Я хотел бы сообщить Excel, что если он обнаружит строку «Отсутствующие данные», то не следует запускать код длявсе значения в этой строке.

Я ценю любую помощь, которую вы можете оказать. Спасибо!

решение1

Если вы хотите пропустить строку, вы можете разбить ее Cellsна Rowsи затем использовать условие, чтобы решить, следует ли запускать строку. На самом деле вы Rowsсначала разбиваете ее на и делаете Cellsдля каждой строки. Это проще всего сделать, если вы знаете, где Missing Dataона появится.

Кодвключает ваши условия и добавляет внешний цикл для обхода Selectionby Rows.

Sub SuppressN()

    Dim rng As Range
    Set rng = Selection

    If rng Is Nothing Then Exit Sub

    'go through by rows first
    Dim rng_row As Range
    For Each rng_row In rng_data.Rows
        If rng_row.Cells(1, 1) <> "Missing Data" Then
            'if good keep going on all the cells
            Dim cell As Range
            For Each cell In rng_row.Cells
                If cell.NumberFormatLocal = "#,##0" And cell.Value >= 1 And cell.Value <= 5 Then
                    cell.Value = "<6"
                End If
            Next
        End If
    Next
End Sub

На фото до и после

до после

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

Этот код требует, чтобы у вас был какой-то надежный способ проверки того, что где-то в строке Missing Dataприсутствует. Я только что проверил первую ячейку столбца (что похоже на то, что у вас есть), но вы можете сделать эту проверку несколькими другими способами (например, используя Find, проходя по циклу и проверяя значения и т. д.).

Связанный контент