none
Passar variável por meio de função ou alterando o escopo da variável? RRS feed

  • Pergunta

  • Olá pessoal.

    É possível passar o valor de uma variável entre procedimentos, dentro do mesmo módulo ou não, por meio de uma função ou declarando a variável como global (para procedimentos em módulos distintos) e de módulo (para procedimentos no mesmo módulo). Certo?

    Bom, a minha dúvida é quando passar por meio de função ou alterando o escopo da variável. Existe alguma indicação de quando seguir um procedimento ou outro? O que diz as boas práticas de programação sobre isto?

    Grato!
    Michel Macário

    sábado, 19 de julho de 2014 01:14

Respostas

  • Já gastei muito tempo pesando sobre isso, e acredito que isso é gosto pessoal. Já tive a fase de usar variáveis de módulo, mas atualmente, estou na fase de usar parâmetros.

    Não sei se existe boas práticas nesse assunto (provavelmente existe), mas sou da opinião de que usar funções passando argumentos é melhor porque é mais fácil reaproveitar o código de um procedimento para outro projeto VBA.

    Exemplo, se você usar uma variável global auxiliar num procedimento e quiser aproveitar essa função em outro projeto, terá que copiar o procedimento e a variável pública para um novo módulo.

    Se você encapsular o máximo do código dentro do procedimento, basta copiar o procedimento. 


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    • Marcado como Resposta Apenas mais um quarta-feira, 23 de julho de 2014 14:46
    segunda-feira, 21 de julho de 2014 21:50
    Moderador
  • Boa noite Michel.

    Concordo plenamente com o Felipe. Uma resposta única pode não ser possível. Penso que a melhor opção depende do gosto e da particularidade de cada projeto. Eu dou sempre preferência a parâmetros, pois assim fica mais fácil ter controle sobre o código e permite o reaproveitamento de código muito mais simples e rápido. Entretanto, para alguns casos específicos eu sempre uso variáveis globais. Nesse caso crio um módulo exclusivo para isso e o nomeio como "mPublico" (padronizo em todos os arquivos para facilitar o uso). Um dos casos que julgo extremamente vantajoso o seu uso é no caso da referência a intervalos nomeados na planilha. Imagina o trabalho que se teria em caso de necessidade de renomear intervalos da planilha! Veja exemplos:

    Public Const Criterios0G As String = "Criterios0G"      
    Public Const Criterios0R As String = "Criterios0R"

    Também utilizo para me referir a certas planilhas que não devem mudar no projeto. Por exemplo, no caso de uma planilha de parâmetros para as macros e para nomes de Tabelas no arquivo, já que assim fica mais fácil gerenciar:

    Public SetNomes As Boolean 'Determina a necessidade ou não de executar a função SetPlan (Definição do Nomes Globais) Public Const Ac As Boolean = True 'Se Verdadeiro Habilita a Aceleração de Código Public pConfigI As Worksheet 'Planilha de Configurações do código vinculadasàs Planilhas (Interna)

    Public TabGastos  As ListObject 'Tabela com as Despesas

    Nesse caso ainda crio um "Função Global", que utilizo para "setar" algumas variáveis:

    Sub SetPlan()
    Set pGastos = Plan1     'Gastos
    Set pConfigI = Plan6    'Planilha com as configurações vinculadas ao código
    
    Set TabGastos = pGastos.ListObjects(1)
    
    SetNomes = True         'Indica nomes definidos na memória
    End Sub

    E em cada função que precisar dessas variáveis:

    If Not SetNomes Then SetPlan

    Um abraço.

    Filipe Magno

    • Marcado como Resposta Apenas mais um quarta-feira, 23 de julho de 2014 14:46
    terça-feira, 22 de julho de 2014 01:10

Todas as Respostas

  • Já gastei muito tempo pesando sobre isso, e acredito que isso é gosto pessoal. Já tive a fase de usar variáveis de módulo, mas atualmente, estou na fase de usar parâmetros.

    Não sei se existe boas práticas nesse assunto (provavelmente existe), mas sou da opinião de que usar funções passando argumentos é melhor porque é mais fácil reaproveitar o código de um procedimento para outro projeto VBA.

    Exemplo, se você usar uma variável global auxiliar num procedimento e quiser aproveitar essa função em outro projeto, terá que copiar o procedimento e a variável pública para um novo módulo.

    Se você encapsular o máximo do código dentro do procedimento, basta copiar o procedimento. 


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    • Marcado como Resposta Apenas mais um quarta-feira, 23 de julho de 2014 14:46
    segunda-feira, 21 de julho de 2014 21:50
    Moderador
  • Boa noite Michel.

    Concordo plenamente com o Felipe. Uma resposta única pode não ser possível. Penso que a melhor opção depende do gosto e da particularidade de cada projeto. Eu dou sempre preferência a parâmetros, pois assim fica mais fácil ter controle sobre o código e permite o reaproveitamento de código muito mais simples e rápido. Entretanto, para alguns casos específicos eu sempre uso variáveis globais. Nesse caso crio um módulo exclusivo para isso e o nomeio como "mPublico" (padronizo em todos os arquivos para facilitar o uso). Um dos casos que julgo extremamente vantajoso o seu uso é no caso da referência a intervalos nomeados na planilha. Imagina o trabalho que se teria em caso de necessidade de renomear intervalos da planilha! Veja exemplos:

    Public Const Criterios0G As String = "Criterios0G"      
    Public Const Criterios0R As String = "Criterios0R"

    Também utilizo para me referir a certas planilhas que não devem mudar no projeto. Por exemplo, no caso de uma planilha de parâmetros para as macros e para nomes de Tabelas no arquivo, já que assim fica mais fácil gerenciar:

    Public SetNomes As Boolean 'Determina a necessidade ou não de executar a função SetPlan (Definição do Nomes Globais) Public Const Ac As Boolean = True 'Se Verdadeiro Habilita a Aceleração de Código Public pConfigI As Worksheet 'Planilha de Configurações do código vinculadasàs Planilhas (Interna)

    Public TabGastos  As ListObject 'Tabela com as Despesas

    Nesse caso ainda crio um "Função Global", que utilizo para "setar" algumas variáveis:

    Sub SetPlan()
    Set pGastos = Plan1     'Gastos
    Set pConfigI = Plan6    'Planilha com as configurações vinculadas ao código
    
    Set TabGastos = pGastos.ListObjects(1)
    
    SetNomes = True         'Indica nomes definidos na memória
    End Sub

    E em cada função que precisar dessas variáveis:

    If Not SetNomes Then SetPlan

    Um abraço.

    Filipe Magno

    • Marcado como Resposta Apenas mais um quarta-feira, 23 de julho de 2014 14:46
    terça-feira, 22 de julho de 2014 01:10
  • Olá Felipe, muito obrigado pela resposta!

    Fiquei "contente" em saber que esta é uma dúvida válida. Enquanto escrevia eu imaginava que seria uma pergunta idiota. Realmente nesta questão de se aproveitar funções faz todo sentido. É bem mais prático. Você tem um "bloquinho" de códigos pronto para funcionar. Bom, pelo jeito este é o tipo de coisa que a experiência vai moldando. 

    Grato!
    Michel Macário
    quarta-feira, 23 de julho de 2014 14:51
  • Olá Filipe, muito obrigado pela resposta!

    Gostei dos seus exemplos de uso para variáveis globais. Parece-me que minhas planilhas ainda não chegaram a este estágio de complexidade, para este tipo de coisa. Mas estão chegando... =)

    Grato!
    Michel Macário
    quarta-feira, 23 de julho de 2014 14:55