Notifications
Clear all

variável muda de valor no meio da macro sozinha

27 Posts
4 Usuários
0 Reactions
5,889 Visualizações
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

sei que não vão poder me ajudar muito mas queria uma explicação para isso

estava fazendo uma macro que pega valores de uma aba e cola na outra

é bem simples mas uma das variáveis que tem o papel de definir a quantidade de colunas no meio do caminho muda o valor

Sub atualiza_ultima()
With Sheets("Fixa")
For S = 1 To 5
c1 = Let_Num_Col(.Cells(14, S).Value2)

Cq = .Cells(20, S).Value2    'Pega tamanho da range "quantidade de colunas

L = .Cells(Rows.Count, c1).End(xlUp).row
l1 = (S * 5) + (3 - S)
c2 = 3

MsgBox Cq '<<Valor correto

Range(Cells(l1, c2), Cells(l1, c2 + 1)).Value2 = .Range(.Cells(L, c1), .Cells(L, c1 + 1)).Value2
c2 = c2 + 2
c1 = c1 + 3

MsgBox Cq ' Valor mudou ????

Range(Cells(l1, c2), Cells(l1, c2 + Cq)).Value2 = .Range(.Cells(L, c1), .Cells(L, c1 + Cq)).Value2
Next
End With
End Sub

MsgBox Cq '<<Valor correto
Range(Cells(l1, c2), Cells(l1, c2 + 1)).Value2 = .Range(.Cells(L, c1), .Cells(L, c1 + 1)).Value2 <<<"Sem essa linha o valor de Cq não muda , muda na proxima mas seu valor correto é novamente redefinido no inicio da macro oq nela faz a variavel mudar?"
c2 = c2 + 2
c1 = c1 + 3
MsgBox Cq ' Valor mudou ????

se eu mudar o nome da variavel funciona normal
lembrando que não é uma variavel Const
Public Cq As Long

eu a uso em outras macros perfeitamente para a mesma função
mas pq ela está mudando de valor no meio do caminho, onde foi que eu errei???

mais um detalhe ...
essa macro está em uma das folhas e não em um modulo
todas as outras macros estão em modulos

 
Postado : 07/12/2014 6:31 am
(@rlm)
Posts: 0
New Member
 

Pois é fica difícil, mas apenas acompanhando a rotina, e pelo trecho, não há razão aparente para essa variação.
Experimente no inicio da rotina Zerar a variável Cq, talvez seja algum valor em memoria
With Sheets("Plan1")
Cq = 0
For S = 1 To 5

 
Postado : 07/12/2014 7:16 am
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

o valor dela é definido no inicio do loop

For S = 1 To 5
c1 = Let_Num_Col(.Cells(14, S).Value2)
Cq = .Cells(20, S).Value2

mudando de valor depois dessa linha
Range(Cells(l1, c2), Cells(l1, c2 + 1)).Value2 = .Range(.Cells(L, c1), .Cells(L, c1 + 1)).Value2

e como pode ver, dentro da macro não é chamada outra instrução função ou macro para que tal situação esteja ocorrendo

pode ser algo entre referencia With Sheets, variável publica de modulo
e a macro numa das folhas
quando chama a referencia .Range Cq assume valor sei lá de onde

eu posso usar outra variavel,
mas quero entender pq disso acontecer

 
Postado : 07/12/2014 7:40 am
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

coloquei a macro em um modulo e deu a mesma coisa

deve ser a referencia With Sheets que está redefinido a varivel, mas pq?
se eu mudo a variavel não acontece
?????

 
Postado : 07/12/2014 7:59 am
(@rlm)
Posts: 0
New Member
 

Como disse, aparentemente não há razão para tal.
Vi que ela é definida em cada passagem do loop, pegando o valor da linha 20 (coluna 1 a 5).
Pode ser, que em algum momento a range(cells(li,c2),cells(li,c2+1)) refira=se a linha 20 coluna 1 a 5 , mesma de Cq, assim redefinindo o valor da variável, porem não há lógica, ou pelo menos não estou "vendo" uma lógica nisso

 
Postado : 07/12/2014 8:48 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Fico com a mesma opinião do Reinaldo, e fica dificil encontrar o porque sem ter o conjunto completo, tentei montar para ver, mas sem o que está definido em "Let_Num_Col" não dá para continuar.

Então uma outra sugestão, uma vez que diz que : "se eu mudar o nome da Variável funciona normal", procure utilizar a busca no projeto para ver se não existe uma outra Variável com o mesmo nome em algum outro local do projeto que possa estar afetando o resultado.

[]s

 
Postado : 07/12/2014 9:10 am
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

ola mauro
Let_Num_Col é uma função que transforma letra de coluna em numero e numero de coluna em letra

Public Function Let_Num_Col(ByVal Numero_ou_Letra_Coluna As Variant) As Variant    ' '-------( numero  em letra e Letra em numerode coluna)
    Dim CLx As String
    If Numero_ou_Letra_Coluna > 0 And Numero_ou_Letra_Coluna < Columns.Count Then
        CLx = Cells(1, Numero_ou_Letra_Coluna).Address
        Let_Num_Col = Mid(CLx, InStr(CLx, "$") + 1, InStr(2, CLx, "$") - 2)
    Else
        Let_Num_Col = Cells(1, Numero_ou_Letra_Coluna).Column
    End If
End Function

Cq é utilizado em varias outras macros com o mesmo conceito informar largura do setor
normalmente ela é definida em uma macro junto de outras variaveis e utilizada em outra macro

mas já fiz varios teste e as unicas linhas que modificam a variavel é
Range(Cells(l1, c2), Cells(l1, c2 + 1)).Value2 = .Range(.Cells(L, c1), .Cells(L, c1 + 1)).Value2

Range(Cells(l1, c2), Cells(l1, c2 + Cq1)).Value2 = .Range(.Cells(L, c1), .Cells(L, c1 + Cq1)).Value2

eu coloquei um msgbox CQ para mostrar o valor da variavel antes e depois
antes o valor está normal e é aplicado corretamente a range
depois o valor vai para 31

já tive problemas com nomes aqui, que eu não sabia que existia no vba, e apenas com alguns parâmetros dava valores errôneos

mas cq não achei nenhuma referencia

assim está sendo definida a variavel no modulo

Public nST As String  'indica Nome do  Setor
Public nSTo As String  'indica Nome do  Setor de ORIGEM
Public Cq As Long   'indica quantidade de colunas de valores do setor
Public CqT As Long   'indica quantidade Total de colunas do setor

uma das macros que utiliza o valor de cq para redimensionar os setores
e essa nunca me deu problemas

Sub ColunasN(ByVal Quantidade_de_Colunas As Long, Optional Nome_AbA As String)   '(ByVal Nome_SETOR As String,
    If Limit = 1 Then MsgBox "Execução Proibida": Exit Sub
    If Nome_AbA = "" Then Nome_AbA = ActiveSheet.Name
    Dim Ma As Long, N As Long
    Ma = Quantidade_de_Colunas

    With Sheets(Nome_AbA)

        .Range(TabelaSetores).Calculate
        If Limit(1) <> "AUXIa" Then Desformata
        If Ma > 2 Then
            Cf1 = Let_Num_Col(Cf)    'Range(Cf & "1").Column
            If Cq < Ma Then
                N = Ma - Cq
                .Range(.Cells(6, Cf1 + 1), .Cells(1, Cf1 + N)).EntireColumn.Insert
                .Range(.Cells(6, Cf1 - 1), .Cells(12, Cf1)).AutoFill Destination:=.Range(.Cells(6, Cf1 - 1), .Cells(12, Cf1 + N)), Type:=xlFillDefault 
                Cf = Letra_Col(Cf1 + N): Fc = Letra_Col(Cf1 + N + 1)
            End If
            If Cq > Ma Then
                N = Cq - Ma - 1
                .Range(.Cells(6, Cf1 - N), .Cells(1, Cf1)).EntireColumn.Delete
                Cf = Letra_Col(Cf1 - (N + 1)): Fc = Letra_Col(Cf1 - N)
            End If
            Cq = Ma
        End If
        .Range(TabelaSetores).Calculate
        If Limit(1) <> "AUXIa" Then Reformata
    End With
End Sub
 
Postado : 07/12/2014 10:09 am
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

Reinaldo
l1 = (S * 5) + (3 - S)
c2 = 3
faz : range(cells(li,c2),cells(li,c2+1))
colar os valores de 5 em 5 linhas começando na linha 7 e coluna "C"
oq dá linhas 7,11,15,19,23

e mesmo se fosse sobre-passar o valor dessa celula
como pode ver
Cq =.Cells(20, S).Value2
a referencia do ponto o valor é pego de outra aba
e o valor é definido antes da linha que falei

cq é pego em uma tabela que mostra os parâmetros dos setores
tipo
Coluna inicial
coluna final
...
que tbm são usadas em formulas dentro das macros

sei que qualquer um simplesmente usaria outra variável e deixaria pra lá
eu até posso usar outra variavel, mas não deixar de lado uma questão que pode colocar todo o meu projeto no lixo

 
Postado : 07/12/2014 10:35 am
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

MsgBox Cq <<< valor normal
Range(Cells(l1, c2), Cells(l1, c2 + 1)).Value2 = .Range(.Cells(L, c1), .Cells(L, c1 + 1)).Value2
MsgBox Cq <<< valor errado

tirando Cq do publico corrige,
colocando novamente como público volta a anormalidade

sim tem algo errado, cq está tendo o seu valor trocado por algo

outro teste , não é a referencia....
MsgBox Cq <<<normal
ColunO = .Range(.Cells(L, c1), .Cells(L, c1 + 1)).Value2
MsgBox Cq <<<normal
Range(Cells(l1, c2), Cells(l1, c2 + 1)).Value2 = ColunO
MsgBox Cq <<<valor errado

e essa Aba nem tem muitos dados "comecei ela agora, é apenas de apresentação "
e não tem o valor 31 , é a única macro dela
não uso eventos

se é a alteração da planilha que está alterando o valor da variável
oq em uma planilha teria o poder de fazer isso?

se CQ fosse definida como uma range ( Cq as Range )
tudo bem,
mas Cq é long
e já uso em outras macros pulando de uma aba para outra sem problemas

:roll: :?:

 
Postado : 07/12/2014 12:19 pm
(@rlm)
Posts: 0
New Member
 

Alguns mistérios, são difíceis de entender/localizar os motivos. Esse está parecendo um deles.
Como salientou Cq é uma variável publica. Seu projeto possui muitas macros/rotinas; então (mais uma vez) talvez a atualização/alteração da planilha gere um evento (sheet change ou calculate ou workbook change...) que force o recalculo Cq em algum outro ponto do projeto. Assim se tirar a declaração de publica, mesmo recalculado em outro ponto não afeta o em uso. Também mudando o nome da variável nessa rotina, essa alteração não é percebida.

 
Postado : 07/12/2014 1:19 pm
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

mas mesmo Cq sendo uma variavel publica
como ela é long e não range pq uma alteração de de planilha mudaria o valor dela?

testei em uma aba em branco e deu a mesma coisa

mas sheet change ou calculate ou workbook change não iria gerar mudança apenas com uso de eventos no projeto?
eu não uso nenhum tipo de evento na planilha "deixa ela lenta"

sim é algo do calculate fiz um teste aqui colocando como Manual no inicio da macro e não deu o problema

talvez nas outras não deram problemas pq sempre adicionei
Application.Calculation = xlCalculationManual

mais um motivo para me preoculpar

mas isso ainda não explica o pq gravar valores numa aba em branco mudaria o valor de uma variavel
lembrando que cq não é range e sim long

tentei assim tbm, e foi a mesma coisa
Cq1 = .Cells(20, S).Value2
Cq = Cq1
é como se cq estivesse assumindo o papel de range mas qual?
mesmo reiniciando a planilha é a mesma coisa valor 31

será que alguma função dentro de alguma planilha pode estar alterando o valor de Cq
tipo em alguma planilha tem uma função que define Cq e quando tem o calculation a função é chamada e muda o valor de Cq

mas se é assim pq não consigo definir o valor de uma variavel dentro de uma função para ser usada em outra macro, a não ser que seja variavel global ?

 
Postado : 07/12/2014 1:46 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

No seu trecho de código não está claro qual a definição e a tipagem da variável Cq... talvez por ela ser global *ou publica, (como queira), fica difícil replicar ou tentar ajudar....

Faça um teste com ela sendo local... O valor não deveria mudar.
Se quiser mais ajuda pra saber pq mudou, daí qquer um de nós precisará do contexto completo, não só deste trecho de código ...

FF

 
Postado : 10/04/2015 11:36 am
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

ela é publica e long

Public Cq As Long 'indica quantidade de colunas do setor
Public CqT As Long 'indica quantidade Total de colunas do setor

Public CqO As Long 'indica quantidade de colunas do setor de ORIGEM
Public CqD As Long 'indica quantidade de colunas do setor de Destino

é utilizado para saber o tamanho do setor
tipo a macro vai pegar o setor 1 e colar no lugar do setor 2
e setor 1 tem 10 colunas e o setor 2 tem 3 colunas

se for para reajuste ela chama outra macro que realoca os valores para caber no setor 2,
ou então faz um reajuste do setor 2 para caber os dados

 
Postado : 10/04/2015 12:56 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

e tem algum código no evento change da planilha ?

 
Postado : 10/04/2015 1:05 pm
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

nenhum, não tem evento,
acho que elas pesam a planilha
até gostaria de usar e automatizar algumas ações, mas não abro mão do desempenho

 
Postado : 10/04/2015 1:13 pm
Página 1 / 2