Excel VBA: Ignorar uma linha inteira do processamento se a condição for atendida

2

Olá a todos Eu sou relativamente novo no código VBA no Excel (versão atual 2010) e estou tentando aperfeiçoar um programa simples que suprime pequenos valores nas tabelas que minha organização libera. O formato dos meus dados é o seguinte.

Na coluna mais à esquerda (normalmente C), tenho os rótulos de linha (por exemplo, Hospital, Casa, Outro, Dados ausentes). Na coluna seguinte, temos o número de registros nessa categoria. Na última coluna, temos um valor percentual para essa linha.

Ao reportar os resultados, sempre suprimimos o tamanho das células de 1 a 5. No entanto, não suprimimos o número de registros na linha "Dados ausentes".

Eu criei a macro a seguir com a ajuda de outros usuários neste fórum, um programa que substitui todos os valores n em nossas tabelas por "< 6". A razão para a declaração de formato é que eu não quero suprimir porcentagens e elas são sempre formatadas como numéricas com um único ponto decimal.

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

O que eu gostaria de fazer é dizer ao Excel que, se encontrar a string "Missing Data", não execute o código para todos os valores nessa linha .

Agradeço qualquer ajuda que você possa fornecer. Obrigado!

    
por user3771733 10.06.2015 / 19:09

1 resposta

1

Se você quiser pular uma linha, poderá dividir o Cells em Rows e, em seguida, usar a condição para decidir se a linha deve ser executada. Realmente você o divide em Rows primeiro e faz o Cells de cada linha. Isso é mais fácil se você souber onde Missing Data será exibido.

Código inclui suas condições e adiciona um loop externo para passar pelo Selection by 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

A imagem é exibida antes e depois

Observe que executei esse código com a condição NumberFormat excluída, pois não queria emulá-la. Eu coloquei de volta para o código final para que você não tenha que mudar as coisas.

Este código requer que você tenha uma maneira confiável de verificar que em algum lugar da linha, Missing Data está presente. Acabei de verificar a primeira célula da coluna (que soa como o que você tem), mas você pode fazer isso para verificar uma série de outras maneiras (por exemplo, usando Find , looping e verificação de valores, etc.).

    
por 10.06.2015 / 21:55