Notifications
Clear all

Declarar Variável como célula

23 Posts
4 Usuários
0 Reactions
8,097 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
(@gtsalikis)
Posts: 2373
Noble Member
 

supondo que seja a célula A1

Para atribuir o valor da variável à célula:

Range("A1").Value = variavel_teste

Para atribuir o valor da célula à variável:

variavel_teste = Range("A1").Value

 
Postado : 17/03/2014 11:56 am
(@jhonycunha)
Posts: 3
Active Member
Topic starter
 

Valeu pela resposta.

Mas o que eu preciso por é indicar uma única vez que a variável e a célula são uma coisa só. E depois sempre trabalhar só com a variável, mas se ela for alterada a célula também será.

Minha ideia seria:

Na abertura da tabela, carregar todas as variáveis e linkar a células à essa variável...... e depois ao longo do programa só trabalho com a variável.

 
Postado : 17/03/2014 2:02 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Variável e célula podem assumir o valor de um ou de outro, mas sempre após um comando de igualdade.
Você pode declarar a variável como global, e utiliza-la em qualquer ponto do seu codigo, porem ao iniciar seu programa deve "fazer" como o Gilmar informou (suavariavel=suacelula.value), quando e se a variavel alterar o valor deve informar à celula o novo valor --> suacelula.value=suavariavel

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

exemplo:

Sub testews()
Dim fdd As Range

Set fdd = Range("a2")
fdd = 1
End Sub

nesse caso fdd vai ser considerado como a celula A2

 
Postado : 18/03/2014 1:50 pm
(@gtsalikis)
Posts: 2373
Noble Member
 

exemplo:

Sub testews()
Dim fdd As Range

Set fdd = Range("a2")
fdd = 1
End Sub

nesse caso fdd vai ser considerado como a celula A2

Nesse caso, vc vai ter um erro de "tipos incompatíveis"

Primeiro vc define fdd como "as range" e depois atribui um valor "as integer".

Teria que ser algo assim:

Global fdd As integer
Global fdd_cell as range

Sub testews()

Set fdd_cell = Sheets("Plan1").Range("a2")
fdd = 1

fdd_cell.value = fdd 'use esse comando toda vez que o valor de fdd for alterado

End Sub
 
Postado : 18/03/2014 2:12 pm
(@edcronos)
Posts: 1006
Noble Member
 

aqui funcionou e em A2 na planilha entrou o valor 1, não deu erro

em que situação seria apresentado esse erro ao executar a macro?
excel 2010

Sub testews()
Dim fdd As Range

Set fdd = Range("a2")
fdd = "fixa"
End Sub
A2 da planilha entrou( Fixa )
totalmente sem erro

 
Postado : 18/03/2014 2:36 pm
(@gtsalikis)
Posts: 2373
Noble Member
 

Edcronos,

Na verdade, eu não sei te explicar bem porque pode gerar um erro. Mas eu me lembro que, durante o curso de VBA que eu fiz (todos na sala estavam com computadores iguais, Excel igual, e inseriram o código exatamente igual), e, em alguns casos, gerava erro. (Pra ter certeza de que o código era igual, nós chegamos a enviar o código e a planilha de um pro outro).

A solução era deixar tudo amarrado.

Eu também já tive casos de fazer um código, ver ele funcionar, e depois de um tempo, parar de funcionar sem motivo (e sem alteração).

A lição que eu levei é sempre fazer códigos o mais amarrados possíveis, e evitar variáveis do tipo "variant" ou "object" (que são meio genéricas).

Então, eu prefiro escrever um pouco mais e ter um código que não me dê os problemas que já tive.

 
Postado : 18/03/2014 3:04 pm
(@edcronos)
Posts: 1006
Noble Member
 

Bem, entendo.
sou novo nisso e não fiz curso então sei apenas oq aprendi fazendo minha planilha que é a única que uso.

tbm tive problemas com algumas macros que fiz, principalmente pq uma chama a outra e 98% da variáveis são publicas "tudo isso para as macros funcionarem não importando que mudança eu faça na planilha"
tenho uma macro que só funciona depois de executar "qualquer" outra macro :P, depois disso funciona normalmente até reabrir a planilha. bem, acontece né

Ele pode testar da maneira mais simples e se vim a dar problema melhora.

 
Postado : 18/03/2014 4:06 pm
(@edcronos)
Posts: 1006
Noble Member
 

Engraçado que o autor do tópico sumiu,

como me interessa o assunto mas gosto de manter as macros o mais simples possível
queria saber em que momento poderia gerar erros

será que uma variável Range não funciona muito bem quando se vai fazer cálculos então tem que se jogar os valores para outros tipos de variáveis compatíveis com cálculos naquela faixa de valores?

será que dependendo como são definida as variáveis as áreas da memoria ocupadas por elas podem ser invadidas por outros dados gerando assim falhas intermitentes ?

seria esses erros por causa de tempo de execução entre vba e excel? "tempo de leitura escrita de células e variáveis"

poderiam ser pelos recursos do sistema no momento da execução ?...

Já tive vários erros de macros hora funcionava hora Não. "afinal estou aprendendo ainda e a cada erro aprendo mais um pouco"

Todos eles percebi que era erro de meus "se não posso fazer o excel se adaptar a mim, eu tenho que me adaptar à lógica do excel"

macro(c) chama macro(A) >>funcionava a maioria do tempo
macro(A) chama "macro(B) que pega valor de células e define variáveis publicas"

macro(c) chama macro(A) E macro(B) >>>funciona direto ( ??? )

Creio que falar simplesmente que pode acontecer erro nos levaria a conclusões equivocadas
e definindo os caso poderemos fazer mais otimizados para cada caso.

O que poderia ser feito para evitar erros sem complicar o código ?

 
Postado : 22/03/2014 1:52 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Perfeito quando diz

"se não posso fazer o Excel se adaptar a mim, eu tenho que me adaptar à lógica do Excel"

Então quando utiliza:
dim fdd as range
Set fdd = Range("a2")
fdd = "fixa"
não irá "causar' (normalmente) um erro, mas sim a célula a2 da planilha ativa irá assumir o valor "fixa". Porem a reciproca não é verdadeira, ou seja se alterar o valor na célula A2, a variavel não assumira automaticamente esse valor.
Ou seja o primeiro input (range A2 = "fixa") foi dado, mas o segundo (seria algo +/- assim variável fdd= range('A2")), não foi "passado".
Então é preciso uma declaração de ida ([A2]="fixa") e uma delcaração de volta (fdd=[a2])

 
Postado : 22/03/2014 5:56 pm
(@edcronos)
Posts: 1006
Noble Member
 

tentei isso

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

Range("a2").Value = "nada"
fda = fdd
End Sub

bem funcionou , mas pode ter algo falho na minha logica.

Desculpe insistir no assunto, é que estou com problemas numa macro que pega valores de variáveis publicas que são definidas por outras macro que pega valores de células da planilha. e vira e volta dá a louca na macro :(
estou até com um post aqui no forum.
e o fato da minha indagação é que a macro funciona muito bem, não fecho o excel nem nada, apenas faço outra coisa como le um monte de coisa no fórum ve um anime, quando voltei pro excel e executo a macro funciona de maneira equivoca e se eu aciono outra macro que ela passa a funcionar direito.

maluquice né
a macro pega valores das celulas assim:
Cf = Sheets(Plan).Cells(Lis + 4, k).Value
Fc = Sheets(Plan).Cells(Lis + 5, k).Value
Cq = Sheets(Plan).Cells(Lis + 6, k).Value

então saber oq ocasiona os erros ou falhas de logicas ajudaria a definir a melhor estrutura das macro

 
Postado : 22/03/2014 7:14 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Procurando opinar sobre o tópico e levando em conta o pouco que aprendi por conta própria sem fazer nenhum curso a respeito, eu já passei por muitos inconvenientes devido a varios tipos de erros, e os mais comuns que aprendi a corrigir e vejo que muitos ainda cometem é devido as não Declaração das Variáveis, Declaração de Tipo errada ou no decorrer de outras rotinas alterar sem perceber os valores ou o Tipo e acabar em "Erros" que às vezes dificulta localizar de onde está gerando o erro.
Por conta disto, não sei ao certo se é disto que estamos falando aqui, mas no link abaixo fala sobre Variaveis e Constantes e a causa de possiveis erros que por vezes não identificamos, e um item importante, esta eu sabia, que quando não declaramos o tipo de uma variável a mesma assume o Tipo Variant, e o que eu acabei de saber é que este tipo de Variavel ocupa muito mais Memoria do que se estivéssemos Declarando os Tipos corretamente.
Vale a pena ler o artigo:
Excel VBA Tutorial Part 2 - VBA Variables & Constants
http://www.excelfunctions.net/VBA-Varia ... tants.html

Anexo um exemplo com a Variavel Publica assumindo o Valor do Range, não tenho certeza se é bem disso que está a ser questionado neste tópico, mas achei mais fácil um modelo do que descrever os passos.

Variavel Publica

No exemplo, ao abrirmos o arquivo e clicarmos em um dos botões "Variavel é Publica" e "Preencher Range com a Nova Variavel é Publica" teremos um erro devido a Variavel estar Vazia (não definida), depois se clicarmos em "Preencher celula com o Valor da Variável " o range A2 receberá o texto "nada" e esta ficará como Publica e preencherá os Ranges definidos, e se acionarmos novamente o botão "Variavel é Publica" teremos a msg da variavel armazenada que poderá ser uitilizada enquanto não a alterarmos, na sequencia, se alterarmos o Valor de A2, este será o novo Valor da Variavel Publica, para termos certeza que ela ficou armazenada em Memoria é só clicar no Botão "Preencher Range com a Nova Variavel é Publica".

Vejam se é sobre isto que tratamos, se não for, desculpem-me pela intromissão, rsrsrs

[]s

 
Postado : 22/03/2014 9:25 pm
(@edcronos)
Posts: 1006
Noble Member
 

Vamos as explicações...

O autor do tópico "que sumiu" perguntou se era possível definir uma variável como célula, não pediu que fosse variável publica.
falaram que não dava, eu postei uma macro que explicava o funcionamento.
e falaram que gerava erros, aqui pelo menos em nenhum teste que fiz gerou erro "variável Não publica"

E como eu enfrentei instabilidades em algumas macros 2 de 30 " as mais simples" me interessei em saber O Porque ocorre Erros

Bem, eu Não uso variáveis como Range, mas 98% das minhas variáveis são publicas e as macros funcionavam 100% antes de reformular a planilha e definir os valores das variaveis com valores da planilha.

as variaveis que uso e as macros que definem as variáveis com valores das células "ainda tenho que refinar"

'Variveis  &  Comandos
'*****************************VARIAVEIS
Public fr(1 To 10) As Byte
Public Linc As Long  'quantidade de linhas preenchidas
Public Inilin As Long 'Primeira linha com dados
Public Fimlin As Long 'Ultima linha com dados
Public setor As String
'Public Lis As Long
'Public Cis As Long

Public Fimcel As String

Public ci1 As Long '=coluna Gd em numero
Public cf1 As Long '   'coluna inicial em numero + QUANTIDADE de Colunas da Origem = coluna final em numero

Public Plan_Aq As String         'Planilha Ativa
Public Plan_Princ As String     'Planilha Principal
Public Plan_Ori As String         'Planilha Origem
Public Plan_Des As String        'Planilha destino
Public Plan As String                 'Planilha variavel usado para gurdar nome de planilha monetaneamente


Public Mak1 As String
Public Mak2 As String

Public Ab As Long
Public Ac As Long
Public Ma As Long

Public Temp As Date
'*************************DE SETORES
Public Ti As String     'Coluna titulo
Public CData As String  'Coluna Data
Public Ci As String     'Coluna inicial
Public Cf As String     'Coluna final
Public Li As Long   'linha inicial
Public Lf As Long   'Linha final
Public Di As Byte   'indica mudaça  nos setores entre planilhas
Public Cq As Long   'indica quantidade de colunas do setor

'Public cor1 As Long 'AINDA SEM USO
'Public cor2 As Long 'AINDA SEM USO
Public Fc As String   
'****************************ENDEREÇO DE SETOR AUXILIAR
Public Gd As String  'Coluna Aux 2 Antigo "GO" para trabalhos de macros que ficam lentas quando tem muita formatação ou que as alteram
Public Ge As String    'Coluna Aux  1 para transferencias de outras planilhas começa em Ti tem que ter a largura do maior setor

Public Ti_O As String     'Coluna titulo
Public CData_O As String  'Coluna Data
Public Ci_O As String     'Coluna inicial
Public Cf_O As String     'Coluna final
Public Li_O As Long  'linha inicial
Public Lf_O As Long   'Linha final
Public Di_O As Byte   'indica mudaça  nos setores entre planilhas
Public Cq_O As Byte   'indica quantidade de colunas do setor


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

Sub Limit()
Li = 100
Lf = 5000
Di = Cells(18, 16).Value
Ge = Range("E12").Value     'Coluna Aux  1 para transferencias de outras planilhas começa em Ti
Gd = Range("D14").Value      'Coluna Aux 2 Antigo "GO"
Plan_Aq = ActiveSheet.Name       'Planilha Ativa
Plan_Princ = Range("E10").Value       'Planilha Principal

End Sub

Sub Sa()  '<<<macro de setor define as posições
Ti = "W"        'Coluna titulo
CData = "X"
Ci = "Z"        'Coluna inicial
Cf = "AI"       'Coluna final
Limit
If Di > 0 Then setor = "Sa": Plan = Plan_Aq: Setores
End Sub

uma das macros que apresenta instabilidade "vai ser chamada por outras macros"

Sub ColunasN()

Limit  '<<<coloquei para não falhar Afinal pq chamando essa macro não ocorre o problema  ????
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

Mac = Range("v1").Value  '<<<não vai ser usado 
k = Range("u1").Value   '<<<não vai ser usado <<<<quantidade de colunas de ci até cf vai ser uma variavel publica definida por outra macro :P

If k > 3 And Mac <> "" Then

Application.Run Mac    '>>>chama SA

c = Range(Ci & "6", Cf & "6").Columns.Count
ci1 = Range(Ci & "1").Column
cf1 = Range(Cf & "1").Column

If c < k Then
n = k - c
Range(Cells(6, ci1 + 2), Cells(1, ci1 + (n + 1))).EntireColumn.Insert
Range(Cells(6, ci1), Cells(9, ci1 + 1)).AutoFill Destination:=Range(Cells(6, ci1), Cells(9, cf1 + n)), Type:=xlFillDefault '
End If

If c > k Then
n = c - k
Range(Cells(6, ci1 + 2), Cells(1, ci1 + (n + 1))).EntireColumn.Delete
Range(Cells(6, ci1), Cells(9, ci1 + 1)).AutoFill Destination:=Range(Cells(6, ci1), Cells(9, cf1 - n)), Type:=xlFillDefault '
End If
End If

Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

End Sub

Como podem ver meio complicado. o engraçado é que macros mais complexas que chamam até 8 outras macros direta ou indiretamente funcionam sem problemas trabalhando com as mesma macros e variaveis.

Creio que deveria ser aberto outro tópico para o assunto

 
Postado : 22/03/2014 10:51 pm
(@edcronos)
Posts: 1006
Noble Member
 

Ola Mauro Coutinho,
Eu tbm não fiz curso e estou aprendendo aos poucos.

O seu post e seu exemplo veio provar oq eu imaginava,
pode sim vim a dar erro se for mal estruturado o código da macro, assim como qualquer macro.

Eu ainda não precisei de variáveis como range, mas deixar de usar pq apresentou erros algumas vezes, sem procurar saber o pq gerou o erro, é apenas descartar possibilidades úteis para se fazer ótimas macros.

Reinaldo, essa frase minha que vc citou, oq eu queria dizer é que eu tenho que "entender" como funciona a logica do excel, não posso me adaptar se não entender.

Mensagem por Reinaldo » Ontem, 20:56
Perfeito quando diz

"se não posso fazer o Excel se adaptar a mim, eu tenho que me adaptar à lógica do Excel"

voce provavelmente tem mais experiência que eu no excel, "espero poder contar com essa experiência sua no futuro"

então sabe que existe varias maneiras de se fazer a mesma coisa, e existem varias coisas sendo feitas da mesma maneira :P
assim como minha experiência não vai evitar que eu erre, e meus erros não evitam que eu aprenda nem provam que eu estava "totalmente" equivocado . :)

 
Postado : 23/03/2014 1:01 am
Página 1 / 2