Excel VBA / Macro: como posso excluir linhas e remover pontos e traços?

0

Recentemente, recebi um arquivo do Excel para formatar - centenas de linhas. A imagem abaixo mostra o estado dela. Este poderia ser um exercício muito longo se eu trabalhasse manualmente, então me perguntei se uma macro poderia ajudar.

Meu trabalho é:

  1. Exclua as linhas em que Dot & Dot & Dash são usados juntos. Então,

  2. Percorra a lista novamente e remova os demais pontos e traços sem excluir as linhas.

Espero que isso deixe minha nova lista formatada alinhada à esquerda.

De qualquer forma, se algum de vocês puder me apontar as coisas corretas para colocar em uma Macro adequada, então seria muito apreciado (e me poupará horas de trabalho, pois eu sinto que essa não é a única folha que eles formataram neste maneira).

    
por RocketGoal 12.07.2010 / 12:24

3 respostas

3

Quando você exclui linhas em um loop, é melhor fazer um loop para trás. Dessa forma, o contador de loop interno não fica confuso. Sempre, sempre, sempre faça um backup de seus dados antes de executar o código da Internet que exclui coisas.

Sub DeleteRows()

    Dim i As Long
    Dim rng As Range

    Set rng = Intersect(ActiveSheet.UsedRange, ActiveSheet.Columns(1))

    For i = rng.Count To 1 Step -1
        If rng.Cells(i).Value Like "..-*" Then
            rng.Cells(i).EntireRow.Delete
        ElseIf rng.Cells(i).Value Like ".-*" Then
            rng.Cells(i).Value = Replace(rng.Cells(i).Value, ".-", "", 1, 1)
        End If
    Next i

End Sub
    
por 12.07.2010 / 15:38
1

No lugar de uma macro, você pode:

  1. use a função de classificação
  2. mate suas linhas ..-
  3. use Localizar / substituir em ".-" (sem nada como a opção de substituição) e, em seguida,
  4. reordene seus dados.

Isso é um pouco mais trabalhoso do que uma macro, mas é uma alternativa de qualquer maneira. A solução da dkusleika parece que deve funcionar.

    
por 12.07.2010 / 15:49
0

É assim que eu gerencio isso:

For Each Cell In ActiveSheet.Range("A:A")
    If Left(Cell.Value, 3) = "..-" Then
        Cell.EntireRow.Delete
    ElseIf Left(Cell.Value, 2) = ".-" Then
        Cell.Value = Right(Cell.Value, (Len(Cell.Value) - 2))
    End If
Next

O único problema é que ele não consegue ver a linha após uma exclusão, por isso, talvez seja melhor fazer algo como o seguinte:

For Each Cell In ActiveSheet.Range("A:A")
    If Left(Cell.Value, 3) = "..-" Then
        Cell.EntireRow.Delete
    ElseIf Cell.Value = "" Then
        Exit For
    End If
Next
For Each Cell In ActiveSheet.Range("A:A")
    If Left(Cell.Value, 2) = ".-" Then
        Cell.Value = Right(Cell.Value, (Len(Cell.Value) - 2))
    ElseIf Left(Cell.Value, 1) = "-" Then
        Cell.Value = Right(Cell.Value, (Len(Cell.Value) - 1))
    ElseIf Cell.Value = "" Then
        Exit For
    End If
Next

Você acaba repetindo o lote de células duas vezes, mas na verdade pega tudo ...

Se você precisar alinhar uma coluna específica, tente

With ActiveSheet.Columns("A")
    .HorizontalAlignment = xlLeft
End With
    
por 12.07.2010 / 14:45