Notifications
Clear all

sincronizar macro mudanças na planilha e formulas

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

Sincronizar macro mudanças na planilha e formulas

estou numa luta aqui para descobrir pq a macro só roda legal a segunda vez.

exp. quero realocar os valores de SA que tem 12 colunas e transformar em 16 colunas

a macro vai...
le o setor "Sa" para saber quantas colunas tem
ajusta as colunas do setor "AuxA" para ficar com o mesmo numero de colunas
e copia os valores de "Sa" para "AuxA"

ajusta "Sa" para ficar com 16 colunas
e realoca os valores quando são sequenciais para ficar corretos no setor de 16 colunas e copia de volta para "Sa"
na segunda vez sempre vai normal e os valores ficam corretos

coloquei Application.CalculateFull em tudo quanto é lado
mas nada

Estou achando que é
Application.ScreenUpdating = False

Por que,
como a macro adiciona ou exclui colunas na planilha
e pega as posições dos setores das formulas na própria planilha
Como a atualização das posições estão travadas, as formulas não tem como saber que mudou

E quando a macro acaba de rodar a planilha é atualizada e se rodar novamente as formulas já pegaram as novas posições

desativar Application.ScreenUpdating = False,
a macro realoca celula por celula, creio que iria demorar muito
se bem que não tem select na macro
bem nao sei....

alguma ideia se é isso mesmo e o que se pode fazer?

 
Postado : 04/04/2014 2:41 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Em teoria o ScreenUpdating , só afeta o refresh de tela, e não a planilha/processamento; portanto não deve ser essa a explicação. Creio que apesar de ser potencialmente demorado, deva efetuar a primeira rodada em modo depuração, assim pode acompanhar a evolução

 
Postado : 04/04/2014 4:13 pm
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

então
deve ser problema de sincronia entre as macros, ou alguma macro auxiliar que eu fiz anteriormente que ficou obsoleta com as mudanças
ou eu me perdi com tantas chamadas de macros entre si e testes lógicos.

oq eu não me conformo é que em qualquer opção,
tamanho maior ou menor, de outra planilha, de outro setor.
vai tudo normal " na segunda vez"

na primeira vez, dá os mais variados resultados,
valores nulos, invade setores,
em branco, valores em zig-zag, zebrado , escada...

e na segunda tudo normal e correto. "bem tem algumas vezes que só na terceira vez que fica normal

vou apagar e refazer, já mexi em tudo mesmo...

 
Postado : 04/04/2014 5:29 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa noite!!

Além da dica do reinaldo, o ideal é todo o calculo de um modo geral ser feito e somente depois voltar as configurações anteriores.
http://www.cpearson.com/excel/optimize.htm
Seria melhor postar se arquivo modelo.

Att

 
Postado : 04/04/2014 5:40 pm
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

muito boa essa pagina, varias coisas para um iniciante igual a mim.

de qualquer forma já apaguei todas as chamadas de macros e só deixei as partes que independentes funcionavam bem

as macros em si funcionam bem se forem acionadas de modo separado.

creio que tbm devo mudar um pouco a planilha,
tipo criando uma planilha única para os setores auxiliares, em vez de cada planilha com seus auxiliares.
muitas mudanças ...
qualquer coisa eu volto...

 
Postado : 04/04/2014 7:14 pm
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

Realmente era erro de sequencia logica,

dependendo da situação tem que se fazer a leitura de uns dos setores antes e depois da alteração da planilha

atualizei algumas macros auxiliares antigas, mas não eram elas
acabei criando mais variáveis publicas e macros auxiliares para facilitar o raciocínio, e mesmo assim tá brabo
sinto que estou complicando cada vez mais uma macro tão simples

a parte inicial e mais simples da macro ficou assim assim, e ainda tem mais
o pior vai ser a parte que faz os cálculos para quando tem diferenças nas quantidades de colunas de um setor para o outro.

Private Sub Realoar_Click()
Limit
Dim Qua As Long, Pa2 As String, De1 As String, PLn As String

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
If Quant <> "" And Quant < 3 Or Quant <> "" And Quant > 1000 Then MsgBox "Quantidade de Colunas impossivel de processar": Exit Sub
If Quant = "" Then Qua = 0 Else Qua = Quant
PLn = Plan_list
De1 = De_1
Pa2 = Para_2
If Plan_Aq = Plan_Princ Then MsgBox "Por Favor NÃO Faça isso Nesta Planilha": Exit Sub
If De1 = "" Then MsgBox "Favor inserir o setor de origem": Exit Sub
If Pa2 = "" And Qua = 0 And PLn = Plan_Aq Then MsgBox "Por favor especifique setor de destino E/OU nova quantidade de Colunas, ou uma planilha de Origem difente": Exit Sub
'On Error GoTo deu_erro

'********************** Le Setor de Origem
If PLn <> "" Then Plan = PLn Else: Plan = Plan_Aq           'verifica Plan de origem
Setor = De1: Setores_O
If Not_Setor = 1 Then MsgBox "favor verificar Setor de Origem": Exit Sub        ' se setor não existe

'*************************************************testa se a mudança é nula
If Cq_O = Qua And Plan = Plan_Aq And Pa2 = "" Then MsgBox "Não tem nada a fazer, destino é igual a origem": Exit Sub
 If De1 = Pa2 And nP_O = Plan_Aq And Qua = 0 Then MsgBox "Destino é igual a origem": Exit Sub
If De1 = Pa2 And Cq_O = Qua And nP_O = Plan_Aq Then MsgBox "Não tem nada a fazer, destino é igual a origem": Exit Sub


'********************** Le Setor de destino
If Pa2 <> "" And Pa2 <> De1 Then
   Setor = Pa2: Plan = Plan_Aq: Setores_D
        If Qua > 0 And Cq_D <> Qua Then
            Copia_D
            Ma = Qua: ColunasN
            Setor = Pa2: Plan = Plan_Aq: Setores_D
        End If
    If Cq_D = Cq_O And Orde_O < Orde_D Or Cq_D = Cq_O And nP_D <> nP_O Then GoTo E_igual

 If Cq_D = Cq_O And Orde_O > Orde_D Then       '<<<<<<quando setor de destino teve alteração e é antes do 
                                                      setor de origem, faz nova leitura de posição. 
 If PLn <> "" Then Plan = PLn Else: Plan = Plan_Aq
       Setor = De1: Setores_O: GoTo E_igual
        End If
End If          ' Para 2

If Pa2 = "" Then...

na macro que le as possições na planilha adicionei,
Sheets(Plan).Range("A11:R25").Calculate, para atualizar as formulas antes de le as posições dos setores

Estou sentindo falta de um indireto para variaveis

 
Postado : 07/04/2014 4:01 pm
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

já tive que modificar varias coisas que nã estavam legais, e completei uma das fase da macro
ia pedi ajuda para otimizar e terminar as partes criticas da macro,
mas creio que ninguem vai querer mexer nesse frankenstein esquizofrenico com partes mal costuradas

antes de um exite sub tem que colocar
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Exit Sub
ou não precisa?

 
Postado : 07/04/2014 10:06 pm
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

bem, ou mal
4 e pouco da manha e a macro depois de tudo, totalmente reformulada...
faz a mesma coisa
vou fechar o tópico para desmembrar o Frankenstein e tentar descobrir qual parte está podre.

 
Postado : 08/04/2014 1:19 am