Notifications
Clear all

Como pegar o valor de outra sub?

17 Posts
3 Usuários
0 Reactions
4,802 Visualizações
(@robo8268)
Posts: 73
Trusted Member
Topic starter
 

Olá amigos

Desculpe a minha ignorancia, mas sou iniciante em VBA excel, e tenho uma duvida bem simples.

Eu estou criando uma planilha com duas Subs, porém eu preciso pegar um valor armazenado em uma variavel, e utilizar em outra Sub.

Como eu faço isso?

Obrigado.

 
Postado : 08/04/2015 7:16 pm
(@edcronos)
Posts: 1006
Noble Member
 

no caso pode usar variaveis publicas

no corpo do modulo algo como...

Public valorDeSub As String


Public valorDeSub As String

Sub insereValor()
valorDeSub="o valor é esse"
end sub


sub mostraValor()
msgbox valorDeSub
end sub

mas claro que apenas vai mostrar o valor se rodar a macro inserevalor primeiro
tem outras maneiras, mas por enquanto essa é a mais facil

Somente é impossíveis até que alguém faça
A logica está presa na irracionalidade humana, e morta nos que se consideram donos da verdade.

"ALGUM MODERADOR ME EXPULSE DO FÓRUM POR FAVOR"

 
Postado : 08/04/2015 7:47 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

vc tb pode passar a variavel de uma sub para outra....

sub teste1()
call teste2("conteudo da variavel")
end sub

sub teste2(variavel)
msgbox variavel
end sub

esse é o jeito mais simples, sem firulas e sem rodeios.
Claro que há meios bem melhores de fazer isso, mas já te dá uma ideia.

qto ao método do Ecronos, é uma possibilidade tb, usar variáveis globais, e tb funciona. mas conforme as melhores práticas de programação é melhor evitar globais e só usar em último caso.

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 08/04/2015 9:42 pm
(@edcronos)
Posts: 1006
Noble Member
 

fernando.fernandes

me diga uma coisa,
esse metodo serve para qualquer situação em que se queira compartilhar valores de variaveis ?
fora o uso de Type que serviria para compartilhar valores, mas que complica a utilização, não vejo como excluir completamente o uso de variaveis publicas

Creio que depende muito do que ele está querendo fazer
e uma utilização em cascata ?
onde uma macro tem que definir as variaveis
se executa uma que pega os valores desas variaveis e executa um procedimento
e dependendo da situação chama outra macro que vai usar as mesma variaveis para executar outra ação.

mas conforme as melhores práticas de programação

a melhor pratica não é deixar funcionando da melhor maneira possível, sem erros, rápido e eficientemente ?

está bem, eu sou um rebelde que não segue regras
eu não declaro todas as variavei
eu uso goto e gosub para fazer loop
raramente coloco comentários nas macros

minha opinião certamente é a ultima que deveria ser levada em conta, já que sequer trabalho na area
mas acho que nenhum metodo pode ser descartado
pode funcionar para uns e para outros não
e tudo depende do que se quer fazer e das ferramentas que se sabe usar

as variavis que uso em minha planilha

Public Const Plan_Fixa = "Fixa"
Global Const TabelaSetores = "A10:P32"
Public Const AbAux = "AUXIa"

Public ColunO() As Variant
Public ColunD() As Variant

Public Not_Setor As Long    '-----------retorna que setor não existe
Public Naba As String           '-----------indica Nome daba origem

Public frL(1 To 15) As Byte    '-----Valores auterados a cada execução
Public frC(1 To 15) As Byte    '---Valores auterados a cada execução
Public frLs(1 To 15) As Byte    '-----Valores auterados a cada execução
Public frCd(1 To 15) As Byte    '---Valores auterados a cada execução

Public Rang As String     'range de setor Total
Public RangT As String     'range de setor Total
Public RangD As String     'range de setor Dados

Public Ti As String     'Coluna titulo
Public Cd As String  'Coluna Data
Public iC As String
Public Ci As String     'Coluna inicial
Public Cf As String     'Coluna final
Public Fc As String      'colunas suplementares (Formulas e afins)
Public Ff As String
Public Li As Long   'linha inicial
Public Lf As Long   'Linha final

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 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
Public nP As String    'informa de qual plan se origina os dados
Public nPo As String    'informa de qual plan se origina o setor
Public nPi As String    'informa de qual plan se origina a Aba
Public Ord As Byte    'informa ordem na planilha
Public Cor1 As Long
Public Cor2 As Long
Public CorSt() As Long

tenho que fazer uma limpa pq tem umas 3 ou 4 que são usadas apenas por macros antigas
e não sei se ainda estão na ativa,
mas tbm com 224 procedimentos, 3.305 linhas qualquer um se perderia

Somente é impossíveis até que alguém faça
A logica está presa na irracionalidade humana, e morta nos que se consideram donos da verdade.

"ALGUM MODERADOR ME EXPULSE DO FÓRUM POR FAVOR"

 
Postado : 09/04/2015 9:53 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

me diga uma coisa,

Digo, rs

esse metodo serve para qualquer situação em que se queira compartilhar valores de variaveis ?

Sim. Vale para todas as situações em que há compartilhamento de valores. A passagem de parâmetros torna a variável local trabalhável. Mantém a tipagem dela com fácil leitura, faz a variável aparecer na janela de visualização de variáveis locais em tempo de execução.

fora o uso de Type que serviria para compartilhar valores, mas que complica a utilização, não vejo como excluir completamente o uso de variaveis publicas

O Type não serve para compartilhar valores. O Type serve para definir uma variável com vários valores e assim ela pode ser usada tanto como global quanto como passagem de parâmetos. Daí ao invés de passar várias variáveis, vc pode passar só uma, que tem diversos valores. É como se uma variável fosse um cartão, e um type coleciona algumas variáveis, alguns cartões, como numa carteira. Vc pode definir o Type Usuario, com as subvariáveis: Nome, Username, Senha, Telefone. Daí vc passa a variável usuario_qualquer declarada como tipo Usuario, e fica mais fácil levar a variavel pra la e pra cá.

Creio que depende muito do que ele está querendo fazer e uma utilização em cascata ? onde uma macro tem que definir as variaveis
se executa uma que pega os valores desas variaveis e executa um procedimento
e dependendo da situação chama outra macro que vai usar as mesma variaveis para executar outra ação.

Ok, acho que com "uma macro", vc quer dizer rotina. Podemos ter rotinas que determinam os valores das variávels, e podemos passar qtos parâmetros quisermos, do tipo que quisermos, objetos, variáveis, tipos, enums, etc. Nada é perdido. Sim, usar uma rotina para determinar os valores das variáveis é boa ideia. Mas nem por isso as variáveis tem que ser globais.

A melhor pratica não é deixar funcionando da melhor maneira possível, sem erros, rápido e eficientemente ?

Não. "Melhores Práticas" vão além. A melhor maneira possível sem erros rápido e eficiente é o mínimo que se espera de um sistema. As melhores práticas da programação também levam em consideração o próprio desenvolvimento, as atualizações, a facilidade de leitura e entendimento do código, a manutenção, os próximos desenvolvedores que poderão entrar em contato com o código dps da ausência do autor, até o idimoa, se vc desenvolve para distribuir ou para uso próprio e minha cereja, a beleza do código. Claro que o mundo todo tenta padronizar formas de desenvolvimento. Algumas pessoas se adaptam, outras nem tanto, outras nem um pouco. Mas os padrões internacionais de melhores práticas não deixam de existir nem perdem sua importância.

está bem, eu sou um rebelde que não segue regras eu não declaro todas as variavei eu uso goto e gosub para fazer loop raramente coloco comentários nas macros

Sim vc é rebelde e já tivemos essa discussão antes. Vc não vai mudar por isso desisti.

minha opinião certamente é a ultima que deveria ser levada em conta, já que sequer trabalho na area mas acho que nenhum metodo pode ser descartado pode funcionar para uns e para outros não e tudo depende do que se quer fazer e das ferramentas que se sabe usar as variavis que uso em minha planilha

Eu não diria que é a última, mas eu diria que vc tb poderia aprender com as dicas de quem trabalha na área. Quanto ao descarte de métodos, em nenhum momento eu disse pra nunca usar globais, eu disse pra evitar ao máximo, a não ser que seja fundamentalmente necessário. Todos os métodos existem e podem ser usados a vontade *(vc é um bom exemplo disso).

Tenho que fazer uma limpa pq tem umas 3 ou 4 que são usadas apenas por macros antigas e não sei se ainda estão na ativa, mas tbm com 224 procedimentos, 3.305 linhas qualquer um se perderia

Tá aí uma desvantagem do uso de globais. Quando as rotinas não referenciam mais, vc vai ter que caçar e lembrar quais não são mais usadas para apagá-las, ou ainda, vai ter que deixá-las ocupando memória desnecessária. Aliás, falando em memória, todas as variáveis criadas utilizam memória, que fica reservada pra o uso quando este acontecer. Se forem globais, o espaço fica reservado durante todo o tempo de execução, se forem locais, só existe a reserva do espaço em memória durante a execução daquela rotina.

Enfim, eu sei que vc discorda de mim Ed... Não vou me desculpar por tb discordar de você. Eu trabalho nesta área há 11 anos, aprendi muita coisa, me adaptei bastante, fiz sistemas para russos, indianos, brasileiros e americanos. Não faço tudo perfeito, mas continuo tentando. Gosto de ver meu código como uma obra de arte. Sempre pensando no outro, em quem vai pegar esse código dps que eu entregar ou eu morrer.
Entonces... Acho que respondi todas suas dúvidas e colocações.

Eu deixaria essa discussão pra aquele nosso tópico que começamos há um tempo, pq aqui o mais importante é a dúvida do robo8268...

Robo8268, vc conseguiu entender as partes referentes a sua dúvida ?

FF

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 09/04/2015 10:57 am
(@edcronos)
Posts: 1006
Noble Member
 

não creio ser irrelevante para o autor da perguta, pq o assunto tem a ver

e igual a mim, quando não sabia a diferença nem sequer a existencia de macros com referencias e fiz a mesma pergunta em outro topico
para mim variaveis publicas foram as mais fáceis e as que se adaptaram ao que eu queria fazer

e olha que até hoje não consegui outro jeito sem usar as tais famigeradas variables
mesmo se fosse para fazer tudo do zero, ainda não sei como eliminá-las completamente sem complicar a criação das macros e meu entendimento do fluxo de execução

olha sinceramente não discordo de vc,
e discussões sobre, sempre vão existir em um forum
apenas discordo sobre simplesmente eliminar o uso e aprendizado para alguem que não sabe todas a maneira possíveis
isso pq as ferramentas que as pessoas simplesmente decretam abominação sobre o uso, foram as que eu melhor me adaptei

sobre eu usar as variaveis publicas
eu estou disposto a eliminar o uso se tiver ajuda para tal e que a solução não complique a criação das macro e o fluxo de execução

Somente é impossíveis até que alguém faça
A logica está presa na irracionalidade humana, e morta nos que se consideram donos da verdade.

"ALGUM MODERADOR ME EXPULSE DO FÓRUM POR FAVOR"

 
Postado : 09/04/2015 11:23 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

sobre simplesmente eliminar o uso e aprendizado para alguem que não sabe todas a maneira possíveis

De novo: eu não eliminei o uso nem o aprendizado. Eu disse que o método funciona, mas não é indicado, conforme as melhores práticas. Só isso.

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 09/04/2015 11:37 am
(@edcronos)
Posts: 1006
Noble Member
 

mas para quem ainda não sabe oq funciona e como funciona vai considerar a opinião de alguem mais experiente como uma especie de lei,
por achar que é algo falho e que pode simplesmente acarretar falhas no codigo, não pela estrutura mas pelo simples uso

conforme as melhores práticas.

oq definem essas melhores praticas,
essa pergunta pode influenciar na escolha do autor da pergunta

em que momento o uso pode vim a dar problema sem que seja diretamente ligado na capacidade da pessoa em estruturar a rotina e o uso ?

eu não uso find, for each nem offset em minhas macros, pq achei lento, confuso ou pq em algum momento bagunçaram a minha planilha
mas isso é escolha minha, e pq encontrei maneiras diferentes de fazer oq eu queria

ps. eu me perdir na minha planilha não por causa das variaveis publicas,
mas por causa das centenas de mudanças, adaptações, reaproveitamentos das macros e estrutura da planilha que vem deste que eu estava aprendendo o mais basico.
e pq ainda não sei onde quero chegar com a planilha,
eu não posso sair apagando macros pq elas trabalham em cadeia

mas sei exatamente como funciona cada macro tanto é que adiciono e modifico as macros até hoje, e mesmo algumas novas utilizam as antigas, já que tem variaveis unicas de controle e eu não preciso ficar caçando oq está utilizando oq, apenas me apego ao que a macro faz

Somente é impossíveis até que alguém faça
A logica está presa na irracionalidade humana, e morta nos que se consideram donos da verdade.

"ALGUM MODERADOR ME EXPULSE DO FÓRUM POR FAVOR"

 
Postado : 09/04/2015 12:55 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

mas para quem ainda não sabe oq funciona e como funciona vai considerar a opinião de alguem mais experiente como uma especie de lei,

Ed, A opinião de alguém mais experiente não deve ser considerado uma espécie de lei, mas deve sim ser no mínimo considerada e analisada. Ao invés de ser refutada por teimosia infantil até. Cada um usa o que quer, como quer. Conforme eu disse antes, vc é a prova número 1 disso. Mas existem sim padrões internacionais, regras de codificação e você é o único que não quer seguir e prefere ensinar as piores maneiras. E que fique claro, ninguém o está impedindo de fazer isso. Sugiro procurar no google "melhores práticas da programação" e "boas práticas da programação", sugiro tb procurar no google sobre pq não usar variáveis globais. Eu até tenho tempo pra te ensinar, mas vc além de rebelde, é teimoso. Então não vou perder meu tempo.

oq definem essas melhores praticas

Pessoas com muitos anos a mais de experiência do que você, estão aí para ensinar as melhores formas de programar e as melhores maneiras de consumir os recursos de máquina. Formas de declarar variáveis, as vantagens e desvantagens de ter um código bom, bonito, funcional, de fácil manutenção etc. Pode buscar por melhores práticas em qualquer linguagem e abra um pouco essa sua cabeça para o que é novo. O fato de algo funcionar não significa que é a melhor forma. E o fato de nós, experientes, evitarmos globais, não significa que não podem ser usadas (aliás, eu já disse isso umas 7 vezes só neste tópico).

E eu digo mais, quando sugeri não continuarmos essa conversa aqui, é pq essa discussão já ocorreu noutro tópico e eu não mudei, sempre continuarei ensinando do MEU jeito, e tb não vai mudar, vc vai continuar ensinando do SEU jeito. A diferença é que o MEU jeito foi moldado por muita leitura, muita pesquisa e adaptação. O SEU, não. O seu é o seu. Quando eu gerencio projetos, quem não segue MEU padrão, que é baseado em padrões de especialistas no mundo todo, a pessoa não fica nem 1 dia na minha equipe. Vc não tem obrigação nenhuma de seguir o MEU. Cada um faz como quer. Né ?

eu não uso find, for each nem offset em minhas macros, pq achei lento, confuso ou pq em algum momento bagunçaram a minha planilha
mas isso é escolha minha, e pq encontrei maneiras diferentes de fazer oq eu queria

Mais uma vez fugindo do assunto do tópico, mas vamos lá, já que vc insiste:
Vc não usa pq "acha" lento. Eu sugiro que vc faça testes, descubra se é mesmo lento. Crie planilhas com código e contadores de tempo, e teste as diversas formas possíveis, claro uma vez que vc entenda como elas funcionam. Assim vc poderá ter CERTEZA se é mais lento ou não, se é mais prático ou não. Se usar isso bagunçou sua planilha é pq vc não soube usar, não é pq o recurso é ruim. Se há maneiras diferentes de fazer, que te atendem, vai fundo. Mas daí a dizer que essas maneiras são melhores, não... não são. Loopar uma coleção de planilhas (pelo índice), por exemplo, funciona, claro, mas vc referenciará cada planilha pelo índice ao invés de um nome de objeto LOCAL específico que facilitaria com o intellisense toda vez que vc apertar o ponto.

ps. eu me perdir na minha planilha não por causa das variaveis publicas, mas por causa das centenas de mudanças, adaptações, reaproveitamentos das macros e estrutura da planilha que vem deste que eu estava aprendendo o mais basico. e pq ainda não sei onde quero chegar com a planilha, eu não posso sair apagando macros pq elas trabalham em cadeia

Perder-se num código, numa planilha é resultado de uma série de fatores. E eu tenho certeza que o uso de públicas é um deles. Mesmo vc tentando se convencer que não.
Vc precisa necessariamente pegar tudo que vc tem nesse frankstein e reescrever com tudo que vc já aprendeu (quando vc começar a aprender). Eu tenho códigos de 10 ano atrás que eu dou risada quando olho. Pq hoje eu sei mais. Códigos podem ser reaproveitáveis e podem ser reescritos. Macros em cadeia são bem vindas e aceitáveis. Vc poderia reescrever cada uma delas, conforme vc vai entrando nelas, conforme a demanda.

Ah, mais uma característica perigosíssima das variáveis públicas, elas retém seu valor até mesmo quando seu tempo de execução já terminou. Tem que tomar muito cuidado e tenta usar isso a seu favor. Elas só perdem valor quando vc usa um "End" no código. End Sub não mata a global.

mas sei exatamente como funciona cada macro tanto é que adiciono e modifico as macros até hoje, e mesmo algumas novas utilizam as antigas, já que tem variaveis unicas de controle e eu não preciso ficar caçando oq está utilizando oq, apenas me apego ao que a macro faz

Até o dia que vc morrer e alguém jogar suas macros fora, pq não servem de legado pra nada. Claro que eqto vc for dono delas e estiver vivo e presente e rodando-as, isso n"ao vai mudar em nada sua vida. Eu faço sistemas e por isso preciso sempre pensar no futuro dos meus códigos. E por isso as regras existem e por isso eu não as invento, eu as sigo.

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

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

rsss
depois que eu morrer não estou nem aí
vc mesmo relatou sobre uso indevido de seu trabalho que estava sendo vendido enquanto vc disponibilizou gratuitamente
pelo menos a pessoa para roubar oq eu fiz vai ter um monte de dor de cabeça :P

sobre variaveis globais eu sei das consequências
uma delas é variaveis de mesmo nome em duas planilhas abertas

e elas não tem area protegida na memoria
se eu deixar o excel em segundo plano e usar a internet muito tempo,
ver videos , a area parece ser subscrita gerando erro na macro quando eu volto para o excel e executo macros "claro que eu poderia colocar tratamento de erro"

sim eu uso o valor guardado, por isso mesmo eu uso variaveis publicas
tem até variáveis que são alteradas a cada execução para gerar deslocamentos sincronizados

se tem varios setores e se executa um deslocamento para cima por exemplo
mas
o setor um tem que subir 2 linhas mas apenas depois de executar a macro 3 vezes
o setor 2 tem que ser invertido e deslocar 1 vez cada 2 vezes que se executa a macro
...
não vi outra maneira de fazer isso sem usar array publica

Private Sub Lado_Click(SobeDesce As Long, EsquerdaDireita As Long)
    If Limit = 1 Then GoTo Saida

mL = SobeDesce: mc = EsquerdaDireita
    Inicio

    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''*

    For cs = 1 To 12    '-------------Controla a Frequencia
        If mL <> 0 Then
            freL = "freL" & cs
            If Me.Controls(freL).Value = "" Then frL(cs) = 0
            If Me.Controls(freL).Value <> "" And frL(cs) = 0 Then frL(cs) = Me.Controls(freL).Value + 1
        End If
        If mc <> 0 Then
            freC = "freC" & cs
            If Me.Controls(freC).Value = "" Then frC(cs) = 0
            If Me.Controls(freC).Value <> "" And frC(cs) = 0 Then frC(cs) = Me.Controls(freC).Value + 1
        End If
    Next

    For cs = 1 To 12
        loo = "lo" & cs:    'setores
        '-------------------------------------------------------------------(  SOBE E DESCE  )-------------
        If mL <> 0 Then
            incrL = "incrL" & cs    '----------------------------------------------------------------incremento linha
            If frL(cs) > 0 Then frL(cs) = (frL(cs) - 1)    '-----------------------------------frequencia linha
            revL = "revL" & cs:    '-------------------------------------------------------inverte Linha
            If Me.Controls(revL) = True Then NL = mL * -1 Else NL = mL   '-----------------------inverte direção
            If Me.Controls(incrL) <> "" Then NL = Me.Controls(incrL) * NL Else NL = 1 * NL    '-----------------quantidade do incrento
        Else
            NL = 0
        End If
        '--------------------------------------------------------------------------------------( DIREITA E ESQUEDA )----------------------------------------
        If mc <> 0 Then
            incrC = "incrC" & cs    '-----------------------------------------------incremento
            If frC(cs) > 0 Then frC(cs) = (frC(cs) - 1)    '---------------frequencia coluna
            revC = "revC" & cs:    '-----------------------------------inverte coluna
            If Me.Controls(revC) = True Then Dc = -1 Else Dc = 1                                'inverte direção
            If Me.Controls(incrC) <> "" Then nc = Me.Controls(incrC) Else nc = 1                ' quantidade do incrento
        End If

        If Me.Controls(loo) = True Then
            If frC(cs) = 0 Or frL(cs) = 0 Then: SetorL cs: GoSub Lad1      'executa o setor
        End If
    Next
    If mc <> 0 Then nc = incrC
    If mL <> 0 Then NL = incrL
    '--------------------------------------(  Controle Movimento de Tela  )------
    If Telavalor = "" Then Telavalor = 1
    If MoveTela = True Then ActiveWindow.SmallScroll Down:=(Telavalor * -1) * mL

    GoTo Saida

Lad1:
    C = mc * Dc
...

bem, eu vou ser teimoso até achar uma logica para não usar, não pela experiencia de outros, mas pela minha propria
não é questão de vida ou morte, nem contra lei, não vicia, e não prejudica ninguém "já vi muitas macros piores que as minhas :D "
sobre ensinar, eu apenas passo oq eu sei fazer, e no máximo tento por que nem sei tanto assim

mas até me sinto honrado por um profissional com 11 anos de carreira levar em consideração a teimosia de alguem que só sabe brinca com a própria planilha
:D

mas vc não pode negar que minhas macros funcionam, e posso dizer que a maioria não dá nem para piscar mesmo mudando valores de 93 colunas e 5000 linhas

Somente é impossíveis até que alguém faça
A logica está presa na irracionalidade humana, e morta nos que se consideram donos da verdade.

"ALGUM MODERADOR ME EXPULSE DO FÓRUM POR FAVOR"

 
Postado : 10/04/2015 8:49 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

bem, eu vou ser teimoso até achar uma logica para não usar, não pela experiencia de outros, mas pela minha propria
não é questão de vida ou morte, nem contra lei, não vicia, e não prejudica ninguém "já vi muitas macros piores que as minhas :D "

Exatamente. Não adianta eu te dar mil razões lógicas, vc não vai ouvir (ler) nenhuma.

mas vc não pode negar que minhas macros funcionam, e posso dizer que a maioria não dá nem para piscar mesmo mudando valores de 93 colunas e 5000 linhas

Esse desempenho é o mínimo esperado de alguém que só trabalha com matrizes, locais ou globais, a matriz e os dicionários são a melhor coisa que tem no VBA.

Aliás, uma sugestão pra vc que usa muito as matrizes unidimensionais...
Tente usa o VBA.Strings.Filter... Vou criar um tópico pra vc ver que bacana que é pra filtrar matrizes... muito louco !

FF

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 10/04/2015 9:26 am
(@robo8268)
Posts: 73
Trusted Member
Topic starter
 

Sinto muito ter causado atrito entre vocês, fiquei até com "preguiça" de ler textos tão grandes.. rsrs.. mas infelizmente ainda não consegui... coloquei uma textbox para textar se está pegando o valor da varíavel, porém a textbox vem vazia.

Vou explicar o objetivo da minha planilha:

Eu fiz planilha que preenche automaticamente os campos, e envio tudo isso por email através do outlook.

Eu queria colocar um botão "gravar", para gerar uma base com os dados preenchidos do formulario, porém para gravar, é necessário que a sub Preencher seja executada primeiro, pois eu quero pegar os valores das variáveis dela.

Não coloco tudo em uma sub só, porque o usuário pode optar por não gravar as informações na base.. a não ser que eu coloque uma mensagem de confirmação perguntando se ele deseja gravar na base ou não.. porém gostaria de saber como fazer de outra forma.

Agradeço muito o esforço de vocês e a vontade de sanar a minha dúvida.

Fico no aguardo.

 
Postado : 14/04/2015 9:13 am
(@robo8268)
Posts: 73
Trusted Member
Topic starter
 

Public Sub Preencher()
'variáveis
Public operador As String
Dim supervisor As String
Dim coordenador As String
Dim celula As String
Dim polo As String
Dim funcional As String
Dim analista As String
Dim hora As String
Dim i As Integer
Dim j As Integer
Dim telefone As String

'atribuindo os valores imputados pelo usuário às variáveis
funcional = InputBox("Digite a funcional do operador")
Data = InputBox("Digite a data da ligação")
hora = InputBox("Digite o horário da ligação")
cpf = InputBox("Digite o CPF do Cliente (apenas os números)")
cpf = Left(cpf, 3) + "." + Mid(cpf, 4, 3) + "." + Mid(cpf, 7, 3) + "-" + Right(cpf, 2)
If cpf = "..-" Then
cpf = "Não identificado"
End If

'localizando o nome do analista
If UsuarioRede = "rodrwan" Then
analista = "Rodrigo W. Ferreira"
ElseIf UsuarioRede = "luvesou" Then analista = "Luana Alves Souza"
ElseIf UsuarioRede = "agovino" Then analista = "Thiago Medeiros Agovino"
ElseIf UsuarioRede = "jufrema" Then analista = "Juliana Martinho Lourenço"
ElseIf UsuarioRede = "taliang" Then analista = "Talita da Silva Angeli"
ElseIf UsuarioRede = "dottine" Then analista = "Nestor Dotti Jr."
ElseIf UsuarioRede = "axosoii" Then analista = "Anderson Xavier Oliveira"
ElseIf UsuarioRede = "leanfin" Then analista = "Leandro Oliveira Finatto"
ElseIf UsuarioRede = "bonigio" Then analista = "Giovana Boni Aguiar"
ElseIf UsuarioRede = "kenjith" Then analista = "Thiago Kenji Kashiwagui"
ElseIf UsuarioRede = "scapine" Then analista = "Anderson Scapine"
ElseIf UsuarioRede = "foahocc" Then analista = "Fabio Oliveira Almeida"
ElseIf UsuarioRede = "eduveng" Then analista = "Eduardo Venesio Gomes"
ElseIf UsuarioRede = "reisrai" Then analista = "Raimundo Notato Santana Reis"
ElseIf UsuarioRede = "vincosf" Then analista = "Vinicius Costa Ferrari"
ElseIf UsuarioRede = "amavits" Then analista = "Amanda Vitorino Silva"
ElseIf UsuarioRede = "crisiar" Then analista = "Iara Cristiane A. Pereira"
ElseIf UsuarioRede = "apavxjb" Then analista = "Alessandra Pinheiro Alves"
ElseIf UsuarioRede = "albnune" Then analista = "Adriana Hermogenes Souza Nunes"
ElseIf UsuarioRede = "lsbmbgq" Then analista = "Leandro da Silva Batista"

Else
analista = UsuarioRede
End If

'localizando o telefone do analista
If UsuarioRede = "rodrwan" Then
telefone = "11 3629-2340"
ElseIf UsuarioRede = "luvesou" Then telefone = "11 2227-9777"
ElseIf UsuarioRede = "agovino" Then telefone = "11 2757-5288"
ElseIf UsuarioRede = "jufrema" Then telefone = "11 2757-5084"
ElseIf UsuarioRede = "taliang" Then telefone = "11 2757-5020"
ElseIf UsuarioRede = "dottine" Then telefone = "11 2757-1155"
ElseIf UsuarioRede = "axosoii" Then telefone = "11 2225-2340"
ElseIf UsuarioRede = "leanfin" Then telefone = "11 2757-1086"
ElseIf UsuarioRede = "bonigio" Then telefone = "11 3629-2191"
ElseIf UsuarioRede = "kenjith" Then telefone = "11 3629-2186"
ElseIf UsuarioRede = "scapine" Then telefone = "11 3629-2534"
ElseIf UsuarioRede = "foahocc" Then telefone = "11 2225-5589"
ElseIf UsuarioRede = "eduveng" Then telefone = "11 2225-5007 "
ElseIf UsuarioRede = "vincosf" Then telefone = "11 2225-5077"
ElseIf UsuarioRede = "amavits" Then telefone = "11 2225-5568"
ElseIf UsuarioRede = "reisrai" Then telefone = "11 3629-2461"
ElseIf UsuarioRede = "crisiar" Then telefone = "11 2225-9047"
ElseIf UsuarioRede = "apavxjb" Then telefone = "11 2225-5598"
ElseIf UsuarioRede = "albnune" Then telefone = "11 2225-5547"
ElseIf UsuarioRede = "lsbmbgq" Then telefone = "11 2225-5461"

Else
telefone = ""
End If

Application.ScreenUpdating = False

Sheets("Base").Select

'Pesquisando o operador
For i = 1 To 20000
If (Range("B" & i).Value = funcional) Then

'Atribuindo os valores encontrados às variáveis
operador = Worksheets("Base").Cells(i, 4)
supervisor = Worksheets("Base").Cells(i, 5)
coordenador = Worksheets("Base").Cells(i, 9)
polo = Worksheets("Base").Cells(i, 6)
celula = Worksheets("Base").Cells(i, 3)

End If
Next i

Sheets("modelo").Select

'atribuindo o valor das variáveis ao formulario

'operador

ActiveSheet.Shapes("qOperador").Select
ActiveSheet.Shapes("qOperador").TextFrame.Characters.Text = operador

'supervisor

ActiveSheet.Shapes("qSupervisor").Select
ActiveSheet.Shapes("qSupervisor").TextFrame.Characters.Text = supervisor

'coordenador

ActiveSheet.Shapes("qCoordenador").Select
ActiveSheet.Shapes("qCoordenador").TextFrame.Characters.Text = coordenador

'polo

ActiveSheet.Shapes("qPolo").Select
ActiveSheet.Shapes("qPolo").TextFrame.Characters.Text = polo

'celula

ActiveSheet.Shapes("qCelula").Select
ActiveSheet.Shapes("qCelula").TextFrame.Characters.Text = celula

'funcional

ActiveSheet.Shapes("qFuncional").Select
ActiveSheet.Shapes("qFuncional").TextFrame.Characters.Text = funcional

'data

ActiveSheet.Shapes("qData").Select
ActiveSheet.Shapes("qData").TextFrame.Characters.Text = Data

'hora

ActiveSheet.Shapes("qHora").Select
ActiveSheet.Shapes("qHora").TextFrame.Characters.Text = hora

'cpf

ActiveSheet.Shapes("qCPF").Select
ActiveSheet.Shapes("qCPF").TextFrame.Characters.Text = cpf

'Descrição

ActiveSheet.Shapes("qDescricao").Select
ActiveSheet.Shapes("qDescricao").TextFrame.Characters.Text = ""

'Data do envio

ActiveSheet.Shapes("qDataEnvio").Select
ActiveSheet.Shapes("qDataEnvio").TextFrame.Characters.Text = Left(Date, 3) + Mid(Date, 4, 2) + Right(Date, 5)

'nome do analista
ActiveSheet.Shapes("qAnalista").Select
ActiveSheet.Shapes("qAnalista").TextFrame.Characters.Text = analista

'telefone analista
ActiveSheet.Shapes("qTelefone").Select
ActiveSheet.Shapes("qTelefone").TextFrame.Characters.Text = telefone

'retorna essa mensagem caso o operador não for encontrado
If operador = "" Then
MsgBox "Operador não localizado", vbCritical
End If
Application.ScreenUpdating = True

Call Teste(operador)

End Sub

 
Postado : 14/04/2015 9:20 am
(@edcronos)
Posts: 1006
Noble Member
 

a intriga é antiga esquenta não

mas bem,
vou pedir para vc disponibilizar um exemplo com oq vc tem aplicado para um melhor entendimento
talvez não seja necessário o uso de variaveis publicas

só para explicar melhor
oq o fernando passou foi um referenciamento de valores ou atributos

tipo
vc tem uma macro e um dos valores é variavel

sub nomeX(Valor_x)
range("A1")=Range("A1") & Valor_x
end sib

para essa usb funcionar vc tem que chamar ela adicionando o Valor_X, não dá para executar ela sozinha

sub adicionavalor()
valor= range("b2")
call nomex(valor)
end sub

no caso a macro adiciona valor vai ler a celula b2, vai chamar a macro nomeX e especificar o valor de b2

já variaveis publicas
tem que estar em um modulo comum
e estar nas primeiras linhas
não podem estar dentro de um sub
elas são mais diretas
no caso a primeira macro adiciona um valor nela e a segunda pode le ou adicionar outro valor sem se fazer referencias de macros

mas como o fernando falou pode gerar problemas
no meu caso é para hobby apesar de eu achar de ser apenas uma questão de estrutura de codigo "qualquer coisa pode dar problemas se não for bem estruturados (não importa oq se use)"

mas o fernando trabalha na area e tem que lidar com maior responsabilidades e adicionar mais segunranças, e diminuir os riscos de falhas seja dele ou de uso de atributos problemáticos

bem, minha opinião é a ultima a poder ser levada em conta
para mim, se a pessoa está aprendendo tem que usar aquilo que entende melhor e ir aperfeiçoando

se depende de segurança e não pode arriscar a errar e está apenas aprendendo, o melhor é nem tentar e pagar alguem para fazer

Somente é impossíveis até que alguém faça
A logica está presa na irracionalidade humana, e morta nos que se consideram donos da verdade.

"ALGUM MODERADOR ME EXPULSE DO FÓRUM POR FAVOR"

 
Postado : 14/04/2015 10:09 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Por favor disponibilize um modelo, compactado.

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 14/04/2015 10:20 am
Página 1 / 2