REMOVER LINHAS COM VALOR DA CELULA EM BRANCO
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:
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.
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.
alguem?
pessoal desculpa o incomodo, to sem net em casa queria ver se resolvia isso fim de semana...
qualquer ideia ja é uma luz.
grato
pessoal desculpa o incomodo, to sem net em casa queria ver se resolvia isso fim de semana...
qualquer ideia ja é uma luz.
grato
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
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
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
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.
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.
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.
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
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.
Só ta faltando essa parte, como ele parar a busca após atingir a ultima ocorrencia da busca.
Qual o código que você está utilizando para fazer essa busca?
While(Cells.Find(What:=[Ô]PROCEDIMENTO[Ô], After:=ActiveCell, LookIn:=xlValues, _
LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False).Activate)=True
meu codigo....
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.
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
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
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
Tópico encerrado , respostas não são mais permitidas