VBA que pode excluir uma linha de um intervalo onde não há texto, embora a célula tenha uma fórmula

5

Estou criando um modelo de relatório automatizado que cabe em uma página. Este relatório inclui marcadores e um gráfico. Por causa de uma solicitação de apresentação, preciso ter certeza de que o gráfico sempre fica na mesma distância sob o último ponto de marcador. Infelizmente, pode haver 7 marcadores ou 2. Então, automatizar isso se tornou problemático.

Veja a imagem abaixo, mas meu pensamento é:

  1. Especifique um intervalo (B11: B17)
  2. Ir para o final desse intervalo e trabalhar
  3. Encontre células vazias nesse intervalo e exclua a linha inteira (problema 1)
  4. Atualize a variável de intervalo para acomodar a alteração (não é possível)
  5. Realize as etapas anteriores
  6. Recupere o tamanho do intervalo original e insira novamente as linhas em que ele deve estar
  7. Volte para o meu procedimento original para preencher os marcadores e comece na Etapa 1 novamente

VBA é algo com que eu me esforço, mas me vejo usando mais e mais. Eu pesquisei e tentei diferentes maneiras de criar um intervalo e excluir células / linhas vazias. Alguns deles eram perigosamente ruins. Eu estou começando com este código simples abaixo agora, mas não está funcionando:

Set MyFullRange = Range("B11:B17")
MyFullRange.Select
For CellRange = 1 To MyFullRange.Rows.Count
    If MyFullRange(CellRange).End(xlUp).Row = "" Then
        MyFullRange(CellRange).EntireRow.Delete xlShiftUp
    End If
Next CellRange

Meus problemas

  1. As linhas de marcador são preenchidas por referência a outra planilha (= ProjectBullet_1, = ProjectBullet_2, etc.). Por isso, estou com dificuldade para reconhecer a célula vazia e excluir a linha de acordo.
  2. Reinserir as linhas de volta à minha estrutura de modelo original. ( veja a possível ideia alternativa abaixo )
  3. As linhas com marcadores aparecem em uma determinada parte do modelo $ B $ 20: $ B: $ 26. (abaixo e acima de outras linhas preenchidas) e tentativas anteriores de excluir linhas resultaram na exclusão de outras linhas vazias.

Seria mais fácil (especialmente para a etapa 6) se eu simplesmente copiasse a folha de modelo, a chamasse de outra coisa e carregasse as etapas 1 a 5 na cópia, excluindo a cópia depois de exportá-la?

Eu sei que preciso dividir essa questão em partes, mas estou lutando com a primeira parte.

    
por RocketGoal 14.11.2016 / 12:09

1 resposta

7

Você pode ocultar as linhas em vez de excluí-las.

Eu modifiquei seu código para ocultar as linhas:

Public Sub hiderows()
    Dim thisrange As Range
    Set thisrange = ActiveSheet.Range("B11:B17")
    For CellRange = thisrange.Rows.Count + 10 To 11 Step -1
        If ActiveSheet.Cells(CellRange, 2).Value = "" Then
            Rows(CellRange).EntireRow.Hidden = True
        End If
    Next
End Sub

O ponto chave é a linha If ActiveSheet.Cells(CellRange, 2).Value = "" Then onde eu verifico o valor da célula. Ele lê o valor, não a fórmula .

    
por 14.11.2016 / 12:31