Notifications
Clear all

valor de variavel como nome de variavel

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

Tem maneira de fazer isso funcionar?

Se isso funciona

lo = "Se" & i
Me.Controls(lo).Object.Value = Se11.Value

pq isso não

Me.Controls(rngO).Object.Value = Sheets(Plan).Cells(rngO.Row, rngD).Value

onde conteúdo de rngO é o nome de uma variável localizada na planilha (está ok)
e Sheets(Plan).Cells(rngO.Row, rngD).Value é o valor que tem que entrar nessa variável (está ok)

a mensagem de erro é uso indevido da palavra chave me (Me)

 
Postado : 27/03/2014 7:01 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Sinceridade, não entendi, porem creio que na segunda "opção" rngD não foi declarado/definido seu valor

 
Postado : 27/03/2014 7:25 pm
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

explicando
Se1, Se2, Se3,... são variáveis,
lo = "Se" & i
"Se" é um valor de texto
i é um valor 1,2,3,... definido por um loop for i =1 to ...

e no loop (lo) assume esse conteúdo Se(i) (nome das variáveis)

Me.Controls(lo).Object.Value = Se11.Value
funciona como :
Se1.Value = Se11.Value
Se2.Value = Se11.Value
...
pelo menos aqui a macro que fiz funciona assim
MsgBox rngO.Value retorna os nomes das variaveis normalmente
MsgBox Sheets(Plan).Cells(rngO.Row, rngD).Value retorna os valores que tem que entrar nas variaveis normalmente
rngd é apenas o numero da coluna onde o valor está

 
Postado : 27/03/2014 7:43 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Alem do que o Reinaldo citou sobre a Declaração correta das variáveis, pelo que entendi, conforme sua postagem, as variáveis estão sendo carregadas corretamente e pela mensagem de erro o problema é no Objeto ME e deve ser utilizado dentro do procedimento ativo, ou seja dentro do Userform que contem o controle.
Se utilizar em outro formulario ou fora do procedimento que foi chamado ele assumira neste procedimento e poderemos ter este erro se o objeto controle que estamos nos referindo for de outro formulário e não existir neste.

exemplificando: Nome do Formulário = frmMyForm
Private Userform1_Initialize()
Dim stValue As String

stValue = Me!txtMeuTextBox

seria a mesma coisa que:
stValue = frmMyForm!txtMeuTextBox

End sub

ou quando usamos para fechar o formulário

Unload ME estamos nos referindo ao formulário em que se encontra o ME

Então se o ME estiver fora deste procedimento irá assumir o objeto em que ele estiver sendo chamado.

Não sei se consegui explicar direito, tenho a sistematica na cabeça mas passar em palavras é meio complicado.

[]s

 
Postado : 27/03/2014 8:05 pm
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

bem, melhor que eu só tenho na net a base de pesquisa e as vezes testes variados :P

mas bem,

no caso, tem como fazer a mesma coisa que esse comando faz?
declarar o valor de uma variável como se fosse a própria variava, mas essa variavel não sendo parte de um userform?
qual comando faz isso ?

 
Postado : 27/03/2014 8:20 pm
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

Como eu procurei e não achei nada., vou tentar explicar melhor

A minha planilha se constituem de varias planilhas com vários setores de tamanhos diferentes "quantidade de coluna"

as macros tem que trabalhar em todas por igual, copiar de uma plan para outra e outras coisas "já fazem isso"
então como as planilhas "podem" ter os setores diferentes uns dos outros, os endereços desses setores ficam na própria planilha

eu estou tentando melhorar essa macro que define as variaveis.

   
Sub Setores()
Limit
Cis = Range("D10").Value    'coluna inicial de procura dos setores
Lis = Range("C11").Value    ''linha inicial de procura dos setores
sn = 13 'quantidade de setores
If setor <> "" Then
For k = Cis To Cis + sn
If setor = Sheets(Plan).Cells(Lis, k).Value Then 'Localiza setores  na planilha de origem

Ti = Sheets(Plan).Cells(Lis + 1, k).Value
CData = Sheets(Plan).Cells(Lis + 2, k).Value
Ci = Sheets(Plan).Cells(Lis + 3, k).Value
Cf = Sheets(Plan).Cells(Lis + 4, k).Value
Fc = Sheets(Plan).Cells(Lis + 5, k).Value
Cq = Sheets(Plan).Cells(Lis + 6, k).Value   'quantidade colunas de dados do setor
Di = Sheets(Plan).Cells(Lis + 7, k).Value    'diferença de setor entre planilhas
Li = Sheets(Plan).Cells(Lis + 8, k).Value
Lf = Sheets(Plan).Cells(Lis + 9, k).Value
Ge = Range("E12").Value
'cor1 = Sheets(Plan).Cells(Lis + 8, k).Value
'cor2 = Sheets(Plan).Cells(Lis + 9, k).Value

Exit Sub
End If
Next k
End If

End Sub  

E por motivo de aprendizado e de expansão da quantidade de setores tentei fazer algo melhor

Sub Setores()

Cis = 4     'coluna inicial dos nomes dos setores em numero
Cfs = Cis + 14 'coluna inicial nome de setor e Mais quantidade de setores (incluir os vazios)
Civ = Cis - 1
Liv = 12        'linha inicial variaveis    >>ti
Lfv = 20        'linha final variaveis
Lis = Liv - 1

'para teste ///
Plan = ActiveSheet.Name
setor = "da"
' ^^^^para teste

Set rngDi = Sheets(Plan).Range(Cells(Lis, Cis), Cells(Lis, Cfs)).Find(setor) 'localiza a coluna com o nome do setor na planilha (Plan)
If Not rngDi Is Nothing Then
rngD = rngDi.Column
For Each rngO In Sheets(Plan).Range(Cells(Liv, Civ), Cells(Lfv, Civ))   'Localiza valore coluna variaveis na planilha (Plan)

If rngO.Value <> "" Then
'Me.Controls(rngO).Object.Value = Sheets(Plan).Cells(rngO.Row, rngD).Value  <<pensei que isso funcionaria igual no userbox
End If
Next rngO
End If
'MsgBox CData.Value
End Sub
 
Postado : 27/03/2014 11:05 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Edcronos, eu não me aprofundei em um recurso do vba pouco lembrado que são os Modulos de Classe, e pelo que eu entendi tem como você fazer referencias ao ME pelo mesmo fazer parte das Propriedades e Métodos da Classe.
Pesquise sobre Modulos de Classe e sobre "ME" que encontrara varias matérias sobre o assunto, uma delas é a abaixo, vale a pena dar uma olhada.
Módulos de Classe
http://www.ambienteoffice.com.br/office ... de_classe/
"Outra vantagem de se usar o Me é o fato de aparecer o Intellisense com todas Propriedades e Métodos da Classe...."

espero que ajude.

[]s

 
Postado : 28/03/2014 6:28 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

É difícil; pelo menos para mim; entender toda a lógica, apenas com descritivos e parte de rotinas. Mas vamos lá
Na sua primeira rotina (a que funciona) são definidos valores para as variáveis (Cis , Lis, sn, k, setor, Ti, CData, Ci, Cf, Fc, Cq, Di, Li, Ge); sendo que setor, aparentemente, deve ser previamente definido em outra parte/rotina (talvez na Limit); mas assim os valores são passados e funciona OK.
Na segunda rotina, a referencia à Me.controls, gera um erro, pois a palavra "Me" é uma variável de sistema que se refere a um modulo de classe, mas é comumente utilizada em chamadas de controle de formularios (posicione o cursor sobre a palavra "Me" e tecle F1, o help do vba poderá lhe auxiliar melhor), bem como em planilha os objetos não recebem a "classificação" de Controls, então nng0 é uma range e não controle.

 
Postado : 28/03/2014 6:38 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Isto mesmo Reinaldo, "Ranges" são Objetos e não Controles, bem lembrado sobre a ajuda do VBA, ela tem todas as referencias e propriedades, mas encurtando um pouco o caminho podemos ver no site do Julio o seguinte:
Lição 07 - Trabalhando com o Objeto Range
http://juliobattisti.com.br/cursos/exce ... lo6/07.asp
O objeto Range:

O objeto Range representa uma célula, uma linha, uma coluna, uma seleção de células contendo um ou mais blocos contíguos de células ou um intervalo 3D.

Estudaremos as seguintes propriedades do objeto Range:
:: Propriedade Range
:: Propriedade Cells
:: Range e Cells
:: Propriedade Offset
:: Método Union

Use Range(argumento), onde argumento nomeia o intervalo, para retornar um objeto Range representando uma única célula ou um intervalo de células

[]s

 
Postado : 28/03/2014 6:46 am
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

Bem, obrigado a todos pelas respostas.

bem eu não uso range como variavel, apenas valor na range que é o nome de uma variável
lo = "Se" & i <<<como podem ve lo é carregado com um valor que é igual ao nome de uma variável (Sei),
onde i é u uma sequencia numérica,
portando Sei é o nome de uma variavel que muda a cada ciclo, e lo é a variável que carrega esse nome

Me.Controls(=lo).Object.Value = Se11.Value
mesmo me sendo uma função de objeto e só funcionando em lugares específicos, ela está fazendo lo virar Sei
rngO contem o valor que é igual ao nome da variavel, portanto rngO representa lo e o valor da celula representa "Se" & i

Application.Run
mac2 é quase igual mas em vez de definir o valor da variavel como variavel define como macro, eu sempre uso para testar as sequencias de macro apenas digitando os nome em um textbox

ti= coluna de titulo
CDada= coluna de data
Ci=Coluna inicial de dados
Cf=coluna final de dados

cada setor tem sua macro própria

Sub auxa()
Limit
setor = "auxa": Plan = Plan_Aq: Setores
End Sub

Sub auxb()
Limit
setor = "auxB": Plan = Plan_Aq: Setores
End Sub
entre outras

limit é uma macro que define os limites e parâmetros básicos da planilha

então quando eu escrevo auxb comdata por exemplo, auxb vai ser organizada pela data não importa qual seja a quantidade de colunas e onde ela esteja
Sa reagrupa sobe cres , Sa vai ser reagrupado vai subir uma linha e vai ficar em valor crescente Sb copia Sd cola vai copiar sb em sd e assim por diante isso serve para todas as macros que eu fiz

mas vou estudar esse modulo de classe.

 
Postado : 28/03/2014 3:58 pm
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

Creio que oq eu quero é algo como Indireto mas para variáveis
H12="hoje"
A1=H12
B16=indireto(A1)
valor de B16, vai ser igual a "hoje"

para se entender que não uso celula como vaiavel...

Application.Run transforma VALOR de Variavel em nome de macro

mac2 = Range("A1").Value
Application.Run mac2 '<<<vai executar a macro cujo o Nome está escrito em "A1"

Sub copiaaaa()
Range("a2").Value = Range("a1").Value
End Sub


Sub executaA1()
mac2 = Range("A1").Value
Application.Run mac2 '<<<vai executar a macro cujo o nome está escrito em "A1" usei muito isso antes de aprender a fazer um userform
End Sub

Tanto é que essa rotina dentro de um userfom funciona normalmente

Private Sub CommandButton1_Click()
fd = Range("B1").Value
Ko = Range("A1").Value
Controls(Ko).Object.Value = fd  '<funciona com Me ou sem
End Sub

criei um userform com 3 textbox e colocando o nome em "A1" e um valor em B1 no textbox daquele nome entra o valor normalmente

Creio q a única falha no meu raciocínio foi que esse comando não funciona com variaveis apenas com os chamados objetos txtbox, caixas de seleções,

 
Postado : 29/03/2014 12:29 am