Notifications
Clear all

otimizar macro de formatar (bordas) loop

7 Posts
2 Usuários
0 Reactions
1,372 Visualizações
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

a macro é para fazer formatação sobre demanda em Ranges
principalmente as Bordas, ainda vou adicionar outras coisas.
eu uso em loops
eu acho que estou errando em algo na macro, está funcionando mas está um pouco lenta

como é para testes é rodado varias vezes

essa é para teste

Sub fss()
Call formataCELL(Range("f4:j8"), 3, 1200)
End Sub

Sub formataCELL(Ringo As Range, Optional EspessuraBorda1_2_3_0_Limpa As Long, Optional corrange As Long)
    If Limit = 1 Then Exit Sub

    esp = EspessuraBorda1_2_3_0_Limpa
    tip = Array(0, xlThin, xlMedium, xlThick)    '  xlThin (fina)    xlMedium     xlThick (grossa)

    bod = Array(7, 10, 8, 9, 11, 12)
    If EspessuraBorda1_2_3_0_Limpa = 0 Then
        With Ringo
            For L = 7 To 12
                .Borders(L).LineStyle = xlNone
            Next
            .Font.Bold = False
        End With
        With Ringo.Interior
            .Pattern = xlNone
            .TintAndShade = 0
            .PatternTintAndShade = 0
        End With
    Else

            With Ringo
                For L = 0 To 5
                    With .Borders(bod(L))
                        .LineStyle = xlContinuous
                        .ColorIndex = xlAutomatic
                        .TintAndShade = 0
                        .Weight = tip(esp)
                    End With
                Next
            End With

        If corrange > 0 Then Ringo.Interior.Color = corrange
    End If
End Sub

será que se adicionar as celulas em uma variavel durante o loop de valor e depois usar essa variavel para formatar tudo junto fica mais rapido?

 
Postado : 03/02/2015 8:23 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Edcronos, qto tempo !

Seguinte, quando se tem um loop para mudar qquer propriedade de uma célula, isso vai ficar lento... uma dica q pode acelerar é o application.screenupdate = false no começo do código, e o application.screenupdate = true no final do código.... mas não vai melhorar muito, ...

Mas ao ler seu código vi que vc usou matrizes o que é bom, mas o gargalo está na mudança das bordas.... se conseguir um jeito de aplicar todas as bordas de uma vez, é melhor... e digo mais, aqui a roina voou...
Quando vc diz que está lento, qto tempo está demorando para rodar ??

 
Postado : 03/02/2015 6:11 pm
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

ola fernando
no caso a rotina vai ser aplicada durante um loop de range dinamico que pode ser pequeno ou bem extenso
numa delas pode formartar milhares de celulas independentes " nessa eu ainda tenho que calcular a range total para limpar as propriedades no novo teste."

application.screenupdate = false
sempre uso, só não usei nessa pq é uma função que vai ser chamada por outras macros que já tem

arrays eu sempre uso "tanto que as vezes esqueço como usar propriedades range nas macros"

mas nesse caso só usei array para endereçar as propriedades que vão ser aplicadas

eu bem imaginei de juntar as ranges durante o loop de atribuição de valores e no final formatar tudo de uma só vez

só tenho que imaginar como fazer isso para formatação dinamica "nem numero definido de valores"

e olha que eu to querendo adicionar a propriedade de cor de borda e cor de fonte

 
Postado : 03/02/2015 7:06 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 
dim rng as range
set range = application.union(range("a1"),range("g6"),range("g4:k10"))

assim vc une todos os ranges num só , faça um loop com o union dentro... e dps vc formata tudo de uma vez...

 
Postado : 03/02/2015 7:15 pm
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

meu problema não é juntar as range
o fato é que vão ser muitos conjuntos com propriedades diferentes

são 3 loops um dentro do outro
mais um grupo de array e if que dependendo da posição e do valor vai ter uma formatação diferente
e como essas posição e esse valor mudam de acordo com as escolhas inseridas
fica dificil determinar os limites

 
Postado : 03/02/2015 7:24 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

se for depender dos valores das células, puxe todas numa matriz e do for ver valor, leia da matriz ao invés de ler do range...

dim Mtz as variant
mtz = rng.value

se misturar essa linha com a q mandei antes, vc terá todo o range, numa matriz...

 
Postado : 03/02/2015 7:59 pm
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

bem fernando como o numero de formatações é desconhecido
tipo no loop tem os valores mestres que depende da celula e do valor que foi colocado ali, e os valores escravos que vai ter uma tonalidade diferente dessa dor do mestre, mas tem os valores que divide a cor de dois mestres por causa do encontro "próximas"
a parte de cores ainda estou trabalhando, por enquanto a matemática é simples pq os cálculos para um colorímetro perfeito é meio chata de fazer por causa dos valores logaritmos.

por enquanto vou usar do jeito que está, mas depois vou trabalhar um array para juntar todas as celulas no loop e suas formatações
depois no final esse array vai parsar por um filtro,
tipo:
pega a primeira range e as suas formatações,
depois num loop procura formataçõe iguais
e vai setando uma union das ranges
e no final formata a planilha,
depois pega a segunda formatação "diferente da primeira" e faz o loop para pegar todas iguais e formatar tudo junto, e por aí vai

eita que trabalho...
mas vou fazer isso quando a macro em si estiver pronta
mas valeu pela ajuda, eu pensei que tinha algo que pudesse melhorar na macro

 
Postado : 04/02/2015 8:40 pm