none
MELHORAR RAPIDEZ DE EXECUÇÃO DE CÓDIGO RRS feed

  • Pergunta

  • Boa tarde.

    Possuo um código associado a um botão, que me serve para limpar a coloração das células. Acontece que o código torna-se lento na sua execução, embora em termos de eficácia cumpra com o que lhe é exigido.

    Na realidade, também posso aplicar o código inverso do que utilizo para colorir as células, mas torna-se ainda mais lento para percorrer as cerca de 3000 linhas preenchidas da folha de cálculo.

    Não sou expert em VBA, sou apenas um autodidata que tem poucos conhecimentos.

    os códigos que consegui, são:

    Dim ULTLINHA As Long
    
    ULTLINHA = Cells(Rows.Count, 1).End(xlUp).Row
      Range("A2:A" & ULTLINHA).Select
        For Each Cell In Selection
            If Cell.Interior.Color <> vbWhite Then
                Cell.Interior.Color = xlNone
            End If
        Next
      
    MsgBox "        A COLORAÇÃO DO PREENCHIMENTO" & vbLf & vbLf & _
           "                           FOI RETIRADA. "
            
    CheckBox1.Value = 0
    CheckBox1.Visible = False
    

    O segundo código é este:

    Dim NLAST As Long
    Dim N As Integer
    
    With Sheets("REGISTOS")
        NLAST = .Cells(.Rows.Count, 3).End(xlUp).Row 'Ler última célula preenchida da coluna C
    End With
    
    For N = 2 To NLAST
        With Sheets("REGISTOS")
            .Cells.Interior.ColorIndex = xlNone
        End With
    Next
      
        MsgBox "----- A COLORAÇÃO DO PREENCHIMENTO FOI RETIRADA. -----"
            
    
    CheckBox1.Value = 0
    CheckBox1.Visible = False
    

    Preciso pois de melhorar a performance da minha mini aplicação VBA, de forma que a ação de limpar a coloração das células se faça de forma mais rápida.

    Para isso, dados os poucos conhecimentos que possuo, solicito a vossa ajuda.

    Cumprimentos

    M_A_L 


    M_A_L

    quarta-feira, 5 de novembro de 2014 18:19

Respostas

  • Desabilite a visualização do que está sendo executado, isso faz com que o método rode mais rápido.

    Só não esqueça de retornar para True no final do método.

    Sub Teste()
    
      Application.ScreenUpdating = False
    
      '....Seu procedimento
      '....Seu procedimento
      '....Seu procedimento
    
      Application.ScreenUpdating = True
    
    End Sub


    Natan

    quarta-feira, 5 de novembro de 2014 18:28
  • Além da dica do Natan, faça o seguinte com o segundo código:

    ThisWorkbook.Worksheets("REGISTOS").Columns("C").Interior.ColorIndex = xlNone


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    quinta-feira, 6 de novembro de 2014 00:21
    Moderador

Todas as Respostas

  • Desabilite a visualização do que está sendo executado, isso faz com que o método rode mais rápido.

    Só não esqueça de retornar para True no final do método.

    Sub Teste()
    
      Application.ScreenUpdating = False
    
      '....Seu procedimento
      '....Seu procedimento
      '....Seu procedimento
    
      Application.ScreenUpdating = True
    
    End Sub


    Natan

    quarta-feira, 5 de novembro de 2014 18:28
  • Além da dica do Natan, faça o seguinte com o segundo código:

    ThisWorkbook.Worksheets("REGISTOS").Columns("C").Interior.ColorIndex = xlNone


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    quinta-feira, 6 de novembro de 2014 00:21
    Moderador
  • Boa noite, Natan.

    Obrigado pela resposta. Assim a olho nu não noto qualquer diferença até porque na rotina que vai colorir a célula, essas instruções estão lá e inicialmente também estavam nestes códigos e por não notar melhorias optei por as retirar.

    No entanto, vou voltar a colocá-las pois às vezes, muitos poucos fazem muito.

    Obrigado pela dica.

    Cumprimentos

    M_A_L


    M_A_L

    quinta-feira, 6 de novembro de 2014 00:37
  • Boa noite Felipe.

    Já lá vão quase quatro meses que não trocávamos informação sabre aquela mini aplicação na qual tanto me ajudou.

    Trata-se aqui de um melhoramento pois a lista de registos é alterada com frequência e é a forma que arranjei para eliminar dados desatualizados. Desta forma a linha que não tiver a célula colorida será excluída.

    Vou alterar a linha de código utilizando a estrutura que me aconselha.

    De qualquer forma, vou continuar a trabalhar numa rotina que me facultou antes, que no evento inicialize cria uma base de dados, pois notei que quando ma facultou, a performance melhorou cerca de 90%.

    Depois de experimentar a sua dica, darei retorno.

    Obrigado mais uma vêz.

    Cumprimentos

    M_A_L


    M_A_L

    quinta-feira, 6 de novembro de 2014 00:55
  • Natan e Felipe:

    Muito Obrigado aos dois.

    Resolveu mesmo.

    M_A_L


    M_A_L

    quinta-feira, 6 de novembro de 2014 01:52