Notifications
Clear all

Macro para inserir palavra em célula vazia

14 Posts
4 Usuários
0 Reactions
2,780 Visualizações
(@lvenuto)
Posts: 0
New Member
Topic starter
 

Boa tarde, Galera

Encontrei a macro abaixo que percorre a coluna C e, ao encontrar células vazias, insere a palavra "Não se Aplica". Funciona muito bem, porém ela é executada até a ultima linha da planilha (1.048.576). Como esta planilha é extraída todos os dias, sempre será maior a cada extração, portanto não tenho como limitar a range de ação da macro.

Dito isso, preciso que essa macro ou outra parecida, substitua as células vazias da coluna C, mas que pare quando chegar na ultima célula preenchida na coluna A.

Anexei um planilha de exemplo pra quem puder me ajudar.

Abraços.

Public Sub PreencherVazios()

    Dim wks As Worksheet
    Dim rng As Range
    Dim cel As Range
    
    Application.ScreenUpdating = False
    
    Set wks = ThisWorkbook.Worksheets("Base")
    Set rng = wks.Range("C1:C" & wks.Rows.Count)
        
    
    For Each cel In rng.Cells
    If Len(Trim(cel)) = 0 Then cel = "Não se Aplica"
    
    Next
    

    Set cel = Nothing
    Set rng = Nothing
    Set wks = Nothing
    Application.ScreenUpdating = True

End Sub
 
Postado : 30/05/2017 9:59 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa tarde Ivenuto,

Vê se ajuda:

Public Sub PreencherVazios()
Dim wks     As Worksheet
Dim rng     As Range
Dim cel     As Range
   
    Application.ScreenUpdating = False
   
    Set wks = ThisWorkbook.Worksheets("Base")
    Set rng = wks.Range("C1:C" & wks.Rows.Count)
       
    For Each cel In rng.Cells
        If wks.Cells(cel.Row, 1).Value = Empty Then Exit For
        If Len(Trim(cel)) = 0 Then cel = "Não se Aplica"
    Next
   
    Set cel = Nothing
    Set rng = Nothing
    Set wks = Nothing
    
    Application.ScreenUpdating = True

End Sub

Qualquer coisa da o grito.
Abraço

 
Postado : 30/05/2017 11:16 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Ou... Faça esse abaixo, vc vai identificar uma melhora significativa no desempenho...

Public Sub PreencherVazios()
Dim wks As Excel.Worksheet
Dim ult As Long
Dim mtz As Variant
Dim cnt As Long
    
    Set wks = ThisWorkbook.Worksheets("Base")           'aqui eu instancio o objeo do tipo planilha

    ult = wks.Cells(wks.Rows.Count, 3).End(xlUp).Row    'aqui eu determino a última linha
    
    mtz = wks.Range("C1:C" & ult).Value                 'aqui eu pEgo a matriz, a array, e aqui é a maravilha dos mundos

    For cnt = LBound(mtz, 1) To UBound(mtz, 1) Step 1   'aqui eu loop a matriz e mudo o valor na própria matriz!
        If VBA.Trim(mtz(cnt, 1)) = vbNullString Then    'evitando ao máximo, tocar no objeto range desnecessariamente
            mtz(cnt, 1) = "Não se aplica"
        End If
    Next cnt
    
    wks.Range("C1:C" & ult).Value = mtz                 'aqui eu escrevo a matriz inteira de volta na coluna !

    Set wks = Nothing                                   'aqui eu destruo o objeto
End Sub
 
Postado : 30/05/2017 11:26 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Tem que apelar né Fernando.
kkkkkkkk

Eu tenho que ampliar meu conhecimento na biblioteca nativa e criar um hábito de utiliza-las...
Na pressa acabo não utilizando....
E realmente dignifica o desempenho.

 
Postado : 30/05/2017 11:37 am
(@lvenuto)
Posts: 0
New Member
Topic starter
 

Tem que apelar né Fernando.
kkkkkkkk

Eu tenho que ampliar meu conhecimento na biblioteca nativa e criar um hábito de utiliza-las...
Na pressa acabo não utilizando....
E realmente dignifica o desempenho.

Caras, FANTÁSTICO!!!

Seu código funcionou perfeitamente ao meu propósito. Muito obrigado. Acabei usando o que o Fernando Fernandes postou porque rodou ainda mais rápido, mas ambos são muito bons!

Abraços

 
Postado : 30/05/2017 12:27 pm
(@lvenuto)
Posts: 0
New Member
Topic starter
 

Ou... Faça esse abaixo, vc vai identificar uma melhora significativa no desempenho...

Public Sub PreencherVazios()
Dim wks As Excel.Worksheet
Dim ult As Long
Dim mtz As Variant
Dim cnt As Long
    
    Set wks = ThisWorkbook.Worksheets("Base")           'aqui eu instancio o objeo do tipo planilha

    ult = wks.Cells(wks.Rows.Count, 3).End(xlUp).Row    'aqui eu determino a última linha
    
    mtz = wks.Range("C1:C" & ult).Value                 'aqui eu pEgo a matriz, a array, e aqui é a maravilha dos mundos

    For cnt = LBound(mtz, 1) To UBound(mtz, 1) Step 1   'aqui eu loop a matriz e mudo o valor na própria matriz!
        If VBA.Trim(mtz(cnt, 1)) = vbNullString Then    'evitando ao máximo, tocar no objeto range desnecessariamente
            mtz(cnt, 1) = "Não se aplica"
        End If
    Next cnt
    
    wks.Range("C1:C" & ult).Value = mtz                 'aqui eu escrevo a matriz inteira de volta na coluna !

    Set wks = Nothing                                   'aqui eu destruo o objeto
End Sub

Cara,

Realmente fantástico! Atendeu exatamente ao que precisava. Como faço para agradecer mil vezes! Hahaha

 
Postado : 30/05/2017 12:31 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

kkkk pode entrar no meu canal e se inscrever, daí já aceito como mil agradecimentos :D :D

 
Postado : 30/05/2017 12:36 pm
(@edcronos2)
Posts: 0
New Member
 

Tem que apelar né Fernando.
kkkkkkkk

Eu tenho que ampliar meu conhecimento na biblioteca nativa e criar um hábito de utiliza-las...
Na pressa acabo não utilizando....
E realmente dignifica o desempenho.

o grande diferencial na macro do fernando foi o uso de array
fazer loop em cima de celulas é um grande peso de acesso
uma coisa que eu faria diferente seria usar Value2 em vez de Value, isso dá um pouco mais de velocidade e conserva os valores reais tipo dadas e numéricos

 
Postado : 30/05/2017 2:29 pm
(@osvaldomp)
Posts: 857
Prominent Member
 
Sub InsereTextoEmCélulasVazias()
 Range("C2:C" & Cells(Rows.Count, 1).End(3).Row).SpecialCells(xlBlanks) = "Não se Aplica"
End Sub
 
Postado : 30/05/2017 2:59 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

uma coisa que eu faria diferente seria usar Value2 em vez de Value, isso dá um pouco mais de velocidade e conserva os valores reais tipo dadas e numéricos

É uma excelente ideia, Ed, para um teste! Vou ver depois e falo, mas como eu só usei o value duas vezes, pra ler e pra escrever. Acho que a diferença dar-se-á, ou dar-se-ia, na casa dos nano segundos... mas vale fazer teste... com o value2, o value e o text tb... ;)

Sub InsereTextoEmCélulasVazias()
 Range("C2:C" & Cells(Rows.Count, 1).End(3).Row).SpecialCells(xlBlanks) = "Não se Aplica"
End Sub

Osvaldo, animal, excelente, com uma linha de código. Matou a pau !

Valeu !

FF

 
Postado : 30/05/2017 3:24 pm
(@edcronos2)
Posts: 0
New Member
 

fernando como vc sabe eu uso arrays já a bastante tempo
eu uso .Value2 ou .FormulaLocal que tbm pega valores reais em vez de valores formatados
isso evita de modificar formatação das celulas quando se cola os dados e não tem que se preocupar com formatação de datas

SpecialCells acho que tem certos inconvenientes , no caso vc usou o trim para saber se não tinha espaço, com SpecialCells só dá para usar em certas ocasiões "eu acho"

em falando de arrays, me lembro que vc perguntou em que situação se usa um array 3D
bem se pode usar para correlacionar dados
tipo

                    Lad2(result(L, C), result(L + Lx(n), C + Cx(n)), n) =  _
                    Lad2(result(L, C), result(L + Lx(n), C + Cx(n)), n) & "," & result(L + Lx(n), 2)   
se bem que prefiro usar assim:
                    Pos(2, n)(result(L, C), result(L + Lx(n), C + Cx(n))) = _
                    Pos(2, n)(result(L, C), result(L + Lx(n), C + Cx(n))) & "," & result(L + Lx(n), 2)  

se bem que essa tem muitas dimensões
com isso se cria uma cascata de dados segmentados e a busca de um valor tras todos os valores relacionados como uma tabela dinamica,
mas claro que dá um bocado de trabalho montar o conceito logico da coisa

 
Postado : 30/05/2017 4:07 pm
(@osvaldomp)
Posts: 857
Prominent Member
 

Fala, Fernando.

Pois é, cara, mentes brilhantes como a de vocês tendem a conceber soluções igualmente brilhantes, tecnicamente evoluídas. Já os limitados, como eu, ficam nas soluções básicas, simples, que às vezes dão certo :D

 
Postado : 30/05/2017 4:09 pm
(@edcronos2)
Posts: 0
New Member
 

simples nada Osvaldo, para lembrar desses comando tem que ter muita memoria

tem um motivo que eu só uso arrays
nunca lembro dessas funções , e se lembrar nunca sei como se escreve
mas tbm tem o fator adaptação , se for reescrever para um outro sistema fica muito mais facil com funções simples como arrays e laços

 
Postado : 30/05/2017 4:14 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Osvaldo, tudo é simples. Basta estudar e treinar. Tem que ter paciência e saber respeitar o próprio tempo.

E como meu amigo Rodrigo Aiosa do Escola Excel sempre diz: o difícil é fazer fácil...
Então não desanime. Sua solução foi genial, e usa um recurso básico do Excel para escrever a solução em UMA LINHA. É melhor que a minha, é melhor que a do Bernardo e é melhor que a do Ed.
Parabéns, continue assim! :ugeek:

Ed, sua matriz 3D é muito legal. Gostei de ver. Como eu disse numa das minhas aulas, pra trabalhar com matriz 3D tem que ter um cérebro diferenciado, evoluído! Você certamente está acima da média !
Obrigado por compartilhar!

Abs,

 
Postado : 30/05/2017 9:37 pm