Notifications
Clear all

Declarar Variável como célula

23 Posts
4 Usuários
0 Reactions
8,101 Visualizações
(@jhonycunha)
Posts: 3
Active Member
Topic starter
 

Boa tarde pessoal.

Gostaria de saber como que eu declaro uma variável para funcionar como uma célula.

Ou seja, ao atribuir um valor a minha variável, automaticamente a minha célula é carregada com este valor e vice-e-versa.

Ex. variavel_teste = "TESTE";
célula "X" = TESTE

Essa variável será utilizado em diversos módulos da minha programação.

Obrigado.

 
Postado : 17/03/2014 11:51 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Ed,
Apenas quis salientar que o dito é a pura verdade. Somente se obterá algum resultado caso siga a lógica da linguagem escolhida.
Posso até ter um pouquinho mais experiência que alguns, mas com certeza tenho muito menos que a maioria, estou constantemente aprendendo e tentando evoluir.
Cursos sobre Excel que participei, eram iniciantes e praticamente só havia apresentação do produto, aprendizado mesmo, só no dia a dia.Tenho também uma certa dificuldade de explanar meu pensamento/tema, mas vamos tentar:
Quanto ao tópico objeto desta--> "Declarar Variável como célula". O autor inicial perguntou:

Boa tarde pessoal.
Gostaria de saber como que eu declaro uma variável para funcionar como uma célula.
Ou seja, ao atribuir um valor a minha variável, automaticamente a minha célula é carregada com este valor e vice-e-versa.

Então, como você mesmo demonstrou, é possível essa declaração, porem o que deve ficar claro e o tal "vice-e-versa",
ou seja se declarou no código:
fdd=range("A2") -->então a variável fdd terá o valor de A2.
Prosseguindo se fizer
fdd="Tudo", esse valor irá ser assumido por fdd e por A2, porem ; agora supondo que o valor de A2 seja alterado por uma outra linha de código ou mesmo outra rotina.
Perceba que essa alteração é valida somente para o valor de A2 e não para a variável fdd:

Sub testews()
Dim fdd As Range
Dim fda As Range
Set fdd = Range("a2")
Set fda = Range("b1:o10000")
fdd = "Tudo"
fda = fdd
Range("a2").Value = "nada"
MsgBox fdd
End Sub

Ou seja se não houver uma nova declaração/alteração para fdd, essa permanecerá com o primeiro valor "passado", o tal vice-e-versa não ocorre naturalmente.
Não sei se consegui me fazer entender

 
Postado : 23/03/2014 6:19 am
(@gtsalikis)
Posts: 2373
Noble Member
 

Creio que falar simplesmente que pode acontecer erro nos levaria a conclusões equivocadas

Amigo, primeiramente, desculpe, não quis criticar o teu código, ou qqr outra coisa do tipo.

'Faz pouco tempo que eu comecei a mexer com VBA. No começo era um sacrifício, pq tive que me virar pra resolver problemas, e só depois de um tempo fiz um curso (básico). Mas, no meu serviço atual, sempre que se fala em planilha, sou eu que faz e resolve. Isso não é minha função, mas sou o mais indicado. Não me importo em fazer, mas, como tenho prazos pra cumprir, eu não posso perder muito tempo fazendo esses "extras" (as planilhas).

Assim, quando eu encontro algum erro ou dificuldade em alguma parte, embora eu queira saber porque gerou aquele erro, eu prefiro procurar outra forma de fazer o código e resolver logo o problema. Além disso, eu já tive casos de fazer certo código, testar, tudo funcionar corretamente, e depois de 2 o 3 dias sem abrir a planilha, o código parar de funcionar ou gerar erro, sem nenhuma alteração ter sido feita. (E até hoje não sei porque isso aconteceu).

O que posso te dar de exemplos de erros que tive:

1.
Tentar usar intersect, pra mim funciona mito bem quando uso o evento Selection_Change, mas nunca consigo usar no evento Change. O problema é que todo mundo usa intersect com o evento Change. Eu já copiei alguns códigos e tentei usar, mas não dá. Minha solução foi trocar o [b/]intersect por target.row e target.column.

2.
Já vi muitos problemas com o uso do comando:

Range("A1") = "teste"

Por isso, para evitar esse erro, uso sempre:

Range("A1").Value = "teste"

Não apenas para atribuir o valor, mas também para pegar o valor. E não apenas com células.

3.
Já tive vários problemas com o uso de comandos como:

Range("A" & alguma_variável)

Por isso prefiro sempre utilizar:

Cells(alguma_variável, 1)

4.
Também já tive problemas de erro no código por "estouro de pilha". O código em si, não causava tinha nenhum erro, porém, em algum momento o computador não conseguia mais prosseguir e travava.

5.
Recentemente tive um problema utilizando validação de dados + controle de eventos. Eu criei uma validação seletiva para uma coluna L e um evento "Change" para a coluna E. Simplesmente, o uso da validação gerava erro no código. Resultado: deixei uma validação simples, e coloquei uma facilidade via código para a coluna L.

6.
Recentemente tive um problema com o uso de onkey e os eventos de EstaPasta_de_Trabalho. Cada vez que a minha chefe alternava entre 2 "pastas de trabalho", ela recebia uma mensagem de erro. Os 2 grandes problemas são:"isso só acontecia com ela, e não comigo; o código trazia uma mensagem de erro, mas funcionava corretamente. Ou seja, não houve "erro", mas havia a mensagem de erro.

7.
Já tive uma mensagem de erro semelhante a esse:

Sub teste()
On error goto FIM

[código]

FIM:
End sub

O erro se deu na linha On error goto FIM O que fazer????

8.
Já tive muitos problemas tentendo definir ranges de uma forma parecida como a que vc indicou, usanto set, por isso eu evito utilizar.

Em todos esses casos (e outros que me ocorreram), eu sempre mando depurar, sigo o código linha a linha. Quando o erro é na construção do código, eu refaço. Mas, quando é um erro onde "tal comando deveria funcionar", eu fico sem resposta. Sei que não é o melhor caminho, mas uma coisa que aprendi em Excel é que, como diz o Fernando Fernandes "existem mil maneiras..." de fazer alguma coisa. Mesmo não sabendo explicar porque algumas delas nem sempre funcionam, eu vou seguindo com as que não me dão transtornos e escolho elas como mais confiáveis.

O que comecei a fazer recentemente, é "programar no meu Excel". Criei vários módulos na minha Pasta de trabalho pessoal de macros onde eu vou mantendo códigos que sempre utilizo, ou linhas de comando que considero "chatas" de ficar escrevendo.

Abraço

 
Postado : 23/03/2014 8:20 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Reinaldo, está certíssimo, por isso que no exemplo que anexei, definimos um valor ao iniciar e este valor permanecerá enquanto não alterarmos o valor em A2.
Apesar que de inicio fiquei em duvida quanto ao titulo, "Declarar Variável como célula",ou seja, aqui estamos tratando em deixar como Variavel Publica um Valor que se encontra em determinada celula, eu estava imaginando que a intensão é deixar o Endereço como sendo uma Variavel, e me lembrava de ter visto algo parecido, então em uma pesquisa rápida encontrei o que talves tenha a ver com o tópico em questão:
Em um Modulo colocamos:

Option Explicit

Global strName As String
Global myStr As String


Sub myReturnStr()
    DoThatAgain
End Sub


Function DoThatAgain()
Dim myRange As Range

Set myRange = Range("A2")

    strName = myRange.Address
    MsgBox "Name: " & strName
    myStr = "Name: " & strName
    
    ActiveCell.Value = myStr

End Function

Assim teremos o Endereço e não o Valor, agora estou de saida e não cheguei a fazer os testes para a utilização deste resultado em uma função, mais tarde ao retornar vejo como utiliza-la.
Vejam a questão no link abaixo:
http://www.ozgrid.com/forum/showthread.php?t=15392

[]s

 
Postado : 23/03/2014 8:29 am
(@edcronos)
Posts: 1006
Noble Member
 

está dificil chegar a uma conclusão.

Bem vc falou que A2 assumiria o valor Fdd, mas a variável fdd não assumiria o valor de A2<< foi oq eu entendi

Sub testew5s()
Dim fdd As Range
Dim fda As Range
Set fdd = Range("a2")
Set fda = Range("b1:o10000")

fdd = "Tudo" <<<define a2 como Tudo aqui foi "ok"
fda = fdd <<<define Range("b1:o10000") como Fdd aqui foi "ok"
Range("a2").Value = "nada" <<<define a2 "diretamente" como Nada aqui foi "ok"
MsgBox fdd <<<mostra valor de "A2" >>>> "NADA"
End Sub

Bem, para entender...
Fdd e Fda só sao valido enquanto a macro roda

cada linha de comando é executada linearmente um depois do outro.

Fda=Fdd foi executado antes de Range("a2").Value = "nada"

Range("a2").Value = "nada" Msg de fdd = "nada"

ainda não entendi onde nossa lógica não batem.
Bem, eu uso do jeito que vc fala Exp. fdd = Range("a2").Value mas no meu caso fdd é uma variável publica definida por outra macro, e falha a atualização da variavel (???)

 
Postado : 23/03/2014 8:48 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Vamos por parte, primeiro para que uma Variavel fique Publica, não podemos Declara-la dentro da SUB:
Sub testew5s()
Dim fdd As Range
Dim fda As Range

No meodelo que enviei, ao executarmos a primeira vez definimos o Valor de A2 como nada e a Variavel Publica fdd assumi este valor:
Sub MostraFDD()
MsgBox fdd
End Sub

Agora se digitarmos outro valor em A2 ou alterarmos este valor atraves de outra rotina, por exemplo
Sub AlteraRgA2()

Range("A2").Value = "TUDO"

End Sub

Uma vez que a Variavel esta Publica ao utilizarmos a rotina acima, fdd será igual a "TUDO" :

Option Explicit

Public fdd As Range

Public fda As Range


Sub testews()
'Dim fdd As Range
'Dim fda As Range

    Set fdd = Range("a2")
    Set fda = Range("B2:G10")
    
    Range("a2").Value = "nada"
    
    fda = fdd

End Sub

Sub VariavelPublica()

    If fdd = "" Then
        MsgBox "Variavel Publica VAZIA"
            
    Else
         
        MsgBox "Variavel Publica " & fdd
            
    End If

End Sub

'Alteramos A2 por meio de outra Sub
Sub AlteraRgA2()

    Range("A2").Value = "TUDO"

End Sub

Sub MostraFDD()
    MsgBox fdd
    
End Sub

E se digitarmos direto na celula e executarmos a rotina Sub MostraFDD() verá que a Variavel fdd assumiu o novo valor.

Pelo menos esta é a logica que estou entendendo em relação ao assunto aqui tratado, se não for isso vou procurar entender melhor.

[]s

 
Postado : 23/03/2014 10:37 am
(@edcronos)
Posts: 1006
Noble Member
 

estou achando que os assuntos se misturaram

O "Autor do tópico" perguntou sobre variável como célula Não especificou que seria Publica

Eu uso variáveis Publicas, Mas Não como range

Range("A1").Value = "teste" <<tbm uso assim
fdd=Range("A1").Value <uso assim

Entendo que para quem tem prazos entender o pq é mais lento que arrumar uma maneira nova.
mas para quem está aprendendo é uma maneira de evitar erros futuros e escrever seus códigos mais eficientemente.

Mauro Coutinho. Você está na mesma lógica que eu sobre variaveis como range "eu acho, não tenho mais certeza de nada :P "

não defino as variaveis publicas nos sub, elas ficam no modulo,

creio que o assunto ficou extenso e complicado para se chegar a uma conclusão

 
Postado : 23/03/2014 11:47 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Edcronos, acredito não ter problemas se estender no tópico, uma vez que não se trata de nenhuma conversa futil, e é um assunto até interessante que pode estar ajudando a muitos a entender um pouco mais sobre Variaveis.
Relendo os tópicos desde o inicio com mais calma até concordo que acabamos misturando um puco, mas é como você disse, o autor não voltou mais para dizer se alguma das respostas serviram para ao fim que ele queria.

E como acabei pegando o bonde andando, acabamos nisso, mas voltando ao primeiro tópico do JhonyCunha ele postou :

Gostaria de saber como que eu declaro uma variável para funcionar como uma célula.
Ou seja, ao atribuir um valor a minha variável, automaticamente a minha célula é carregada com este valor e vice-e-versa.
Ex. variavel_teste = "TESTE";
célula "X" = TESTE
Essa variável será utilizado em diversos módulos da minha programação

Pode até ser que ele queria dizer em deixar o endereço de uma Celula qualquer como fixa, se for assim ele poderia estar utilizando uma Constante e não Variável, a diferença é que as constantes são fixas, não podendo ser atualizadas via código, ou seja, exemplificando:

Option Explicit

Const variavel_teste = "$A$2" 'Valor Fixo

Sub RetornaVariavelConst_Range_Value()
  
  MsgBox "variavel_teste refere-se ao Range : " & variavel_teste
  
  'Utilizando  a variavel_teste definido na Const como Range
  Range(variavel_teste).Value = "TESTE"
  
  'Coloca na Celula qual Range se refere a variavel_teste
  Cells(2, 2).Value = variavel_teste

End Sub

Definimos o valor de "variavel_teste" como $A$2 na constante e este ficará fixo, então podemos utiliza-la como se fosse um objeto Range conforme está na rotina "RetornaVariavelConst_Range_Value"

[]s

 
Postado : 23/03/2014 6:30 pm
(@edcronos)
Posts: 1006
Noble Member
 

As vezes eu fico com dificuldades até pra entender meu próprio raciocínio, imagina ...

eu de certa forma tenho dificuldades de escolher que tipo de variáveis usar, e se quer decorei os tipos "ainda não precisei"
e para falar a verdade a maioria dos termos ainda é grego quando eu leio.

A grande maioria de minhas macros ainda são de deslocamento e relocamento de dados e o único fator que as tonam mais complexas, é que 90% não usam endereços estilo $A$1,usam apenas variáveis e que uma dependem de pelo menos 2 outras macros.

Então, para não complicar ainda mais o meu raciocínio "que não é lá essas coisas" e já que o autor do tópico não voltou ...
eu marco esse tópico como resolvido :P pelo menos para mim,
valeu
Mauro Coutinho, gtsalikis e Reinaldo

Pelo menos aprendi algumas coisa...

 
Postado : 23/03/2014 7:50 pm
Página 2 / 2