REMOVER LINHAS COM VALOR DA CELULA EM BRANCO

ONBASS 14/09/2012 09:32:20
#409665
Srs. bom dia,

Conforme na imagem, eu preciso remover TODAS as linhas nas quais o campo QUANTIDADE esteja em branco, incluindo-se a sua referida linha de cabeçalho(a descrição do procedimento). Ou seja, se o procedimento nao pede idade, e sua quantidade estiver em branco, deve-se remover ambas as linhas do cabeçalho e do procedimento.

Gostaria de fazer via VBA. Fiz uns testes aqui que tá funcionando em parte, pois em alguns casos ele remove os cabeçalhos dos procedimentos mesmo que os mesmos possuam algum valor na coluna quantidade. Ficou mais ou menos assim:

  
While Not Selection.Borders(xlEdgeRight).LineStyle = xlNone
If ActiveCell.Value = [Ô][Ô] Then
Selection.EntireRow.Delete
Else
Selection.Offset(1, 0).Select
End If
Wend



Ou seja, eu posiciono o cursos no topo e vou descendo. Só que esta pasta contem umas 15 planilhas, e cada planilha possui umas 10 especialidades. Esse exemplo aí é uma pequena fração de uma planilha.
Grato a todos.
ONBASS 14/09/2012 11:19:35
#409684
alguem?
pessoal desculpa o incomodo, to sem net em casa queria ver se resolvia isso fim de semana...
qualquer ideia ja é uma luz.
grato
ONBASS 17/09/2012 09:20:55
#409788
pessoal,

to quase conseguindo, só que como eu tenho que achar um [ô]ponto de partida[ô] pra disparar o codigo, estou usando uma macro de busca por valores, assim que ela acha o valor, tipo um texto, eu posiciono o cursor na coluna que desejo e disparo. O unico entrave que rola é que ta dando loop infinito, ou seja, volta sempre ao ponto de partida.
Tipo na imagem acima, eu faço a busca por [Ô]PROCEDIMENTO[Ô], depois posiciono na coluna D, e aí começo a varredura pra baixo, só que como são várias especialidades, ele vai achar vários campos [Ô]PROCEDIMENTO[Ô]. A questão é, mesmo depois que ele acha o ultimo valor PROCEDIMENTO, a macro retorna pra o primeiro valor achado, ou seja, a primeira coluna.
Em miúdos, se são por ex. 10 especialidade, ele teria que achar 10 valores PROCEDIMENTO (apenas referencia).
O que eu quero é: depois que ele achar a ultima referencia para PROCEDIMENTO, encerrrar a macro.

Obs. nao desisti do Net nao galera, foi só uma necessidade urgente aqui. vlw
Brigadao
JONATHANSTECKER 17/09/2012 09:30:39
#409789
Resposta escolhida
Montei uma rotina aqui rapidinho... Vê se com ela você consegue ajustar o seu código...
Public Sub RemoverLinhas()

For Contador = 1 To Range([Ô]A[Ô] & Rows.Count).End(xlUp).Row

If Cells(Contador, 1).Value = [Ô][Ô] Then

ActiveSheet.Rows(Contador).Delete

End If

Next Contador

End Sub
ONBASS 17/09/2012 11:02:38
#409802
JONATHAN, valeu por responder cara,

Porém a princípio me parece que vc está setando o cursor em A1 e descendo.
O que ocorre é que ao longo do percurso ele precisa fazer algumas verificações, tipo:
Se a célula ativa é mesclada. Caso sim, se trata de um semi-cabeçalho de linha. Em seguida, verificar se o procedimento em questão exige idade, isso pra efeito de exclusão do próprio cabeçalho. Caso exiga idade, entao o cabeçalho é mantido e passa-se a verificação para as linhas posteriores. Caso o procedimento não exiga a idade, deve-se verificar se foi informado alguma quantidade, caso sim , nada muda. Caso não, deve-se excluir ambas as linhas cabeçalho e procedimento.
Explicando assim fica meio embaralhado, a questão é que esse pedaço de imagem ai é apenas uma fração da planilha no todo.
Porém, já consegui fazer isso ai. Só ta pegando que ele entra num loop infinito, visto que no codigo estou utilizando uma macro de busca por um determinado valor, PROCEDIMENTO no caso, que é o ponto inicial do codigo.
Mas enquanto ele acha a palavra PROCEDIMENTO, o codigo fica rodando sem parar.
Pensei em escrever o endereço das celulas pesquisadas num arquivo texto, e a cada ciclo ir verificando se ja foi pesquisada. Mas ainda to implementando. Mais sugestões são bem-vindas.

Ah e sem falar que, as especialidade, ficam na mesma planilha, ou seja, começa com CLINICA MEDICA, por ex, ae tem toda essa sequencia da imagem , que é muito maior por sinal, depois vem, ODONTOLOGIA, ENFERMAGEM, PSICOLOGIA, e muitas outras.
JONATHANSTECKER 17/09/2012 11:10:35
#409803
Realmente ficou meio complicado de se entender... hehehe

Mas a função que postei acima não foi com a intenção de definir as regras, e sim para exemplificar como ler todas as linhas da planilha sem entrar em um loop infinito.
Nessa condição abaixo você passará item por item até chegar no último.
For Contador = 1 To Range([Ô]A[Ô] & Rows.Count).End(xlUp).Row
If [txt-color=#e80000]SUASCONDIÇÕES[/txt-color] Then
ActiveSheet.Rows(Contador).Delete
End If
Next Contador
ONBASS 17/09/2012 11:32:25
#409804
rss. entao....como disse....Imagine que temos a palavra PROCEDIMENTO umas 10 vezes, se vc fizer uma busca normal no Excel (Ctrl+L), observe que, mesmo que ele ache a 10a ocorrencia, quando deveria parar a busca, ele retorna para a 1a ocorrencia, e o loop continua infinitamente.
Só ta faltando essa parte, como ele parar a busca após atingir a ultima ocorrencia da busca.
JONATHANSTECKER 17/09/2012 11:43:03
#409805
Qual o código que você está utilizando para fazer essa busca?
ONBASS 17/09/2012 11:55:41
#409807
  While(Cells.Find(What:=[Ô]PROCEDIMENTO[Ô], After:=ActiveCell, LookIn:=xlValues, _
LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False).Activate)=True
meu codigo....
ONBASS 17/09/2012 22:38:19
#409851
Pessoal boa noite! Estou com modem emprestado... Quem conseguir sair desse loop vai ganhar uma bala vlw..rsrs
Escreva umas 5 células diferentes o nome PROCEDIMENTO, depois, via código, tente sair do loop.
  
While(Cells.Find(What:=[Ô]PROCEDIMENTO[Ô], After:=ActiveCell, LookIn:=xlValues, _
LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False).Activate)=True
IRENKO 18/09/2012 07:26:23
#409858
Tente as sugestões abaixo:

Sub ExcluirLinha()
Dim Cont
Dim Lin
Lin = 1
Application.ScreenUpdating = False
For Cont = 1 To 100
If Range([Ô]A[Ô] & Lin) = [Ô][Ô] Then
Range([Ô]A[Ô] & Lin).EntireRow.Delete
Lin = Lin - 1
End If
Lin = Lin + 1
Next
Application.ScreenUpdating = True
End Sub

OU

Sub condiçao()
Dim Linha, LinhaFinal As Integer
LinhaFinal = Range([Ô]N65000[Ô]).End(xlUp).Row
For Linha = 2 To LinhaFinal
If Range([Ô]n[Ô] & Linha).Value = [Ô][Ô] Then
Range([Ô]n[Ô] & Linha).Delete (xlUp)
Call condiçao
Exit Sub
End If
Next Linha
End Sub

OU AINDA

Sub ExcluirLinhas()
Range([Ô]A2[Ô]).Select
Do Until IsEmpty(ActiveCell.Offset(0, 0))
If ActiveCell.Offset(0, 0) >= Range([Ô]D1[Ô]) And _
ActiveCell.Offset(0, 0) <= Range([Ô]G1[Ô]) Then
ActiveCell.Offset(1, 0).Select

Else
ActiveCell.Offset(0, 0).EntireRow.Delete
End If
Loop
End Sub
Página 1 de 2 [12 registro(s)]
Tópico encerrado , respostas não são mais permitidas