Pesquisar este blog

quarta-feira, 30 de outubro de 2013

FUNÇÃO E INSTRUÇÃO DE CONTROLE DO FLUXO DE EXECUÇÃO – WITH...END WITH

With...End With


    Instrução empregada para executar uma série de instruções dentro de um laço, referenciando uma única vez um objeto, de forma a acessar mais rapidamente suas propriedades e reduzir a sintaxe empregada na codificação,utilizando esta sintaxe

With Objeto

           [Instruções]

End With

Onde,
  • Objeto: argumento obrigatório, indicando o nome do o nome do objeto ou tipo definido pelo usuário cujas propriedades você deseja acessar;
  • Instruções: argumento opcional, indica a existência de instruções que serão executadas dentro do laço With...End With;
  • End With: instrução que determina o fim do laço With. Após esta instrução, quaisquer propriedades do Objeto deverão ser acessadas utilizando-se a sintaxe completa, na forma Objeto.Propriedade.
As seguintes considerações são válidas para a instrução With...End With:
  • With permite tornar mais enxuta a sintaxe de acesso às propriedades do objeto referenciado, diminuindo a quantidade de texto a ser digitado e aproveitando-se das características de AutoListar Membros do VBA (basta pressionar o caractere “.” Dentro de um laço With para que uma lista com todas as propriedades do objeto referenciado pela instrução sejam exibidos para você);
  • Não é possível alterar o objeto referenciado dentro de um laço With;
  • É possível aninhar laços, porém, quando um laço mais interno está sendo executado, propriedades idênticas contidas no objeto do laço With mais externo serão mascaradas, exigindo o emprego da sintaxe completa para o objeto de forma a acessá-las;
  • Jamais empregue a instrução GoTo ou GoSub para sair ou entrar em um laço With...End With. Apesar de o VBA permitir esta abordagem, poderão ocorrer erros inesperados em seu aplicativo.
Exemplo: O exemplo a seguir emprega um laço With...End With para referenciar uma vez uma caixa de listagem no Microsoft Access e alterar suas propriedades.

Sub txtIdade_AfterUpdate()

   With txtIdade

            .BackColor = 0        ‘Fundo preto
            .ForeColor = 256     ‘Letras vermelhas
            .Enabled = False
            .Locked = True


   End With

Até a Próxima!!

FUNÇÃO E INSTRUÇÃO DE CONTROLE DO FLUXO DE EXECUÇÃO – WHILE...WEND

While...End


    Instrução empregada para executar uma série de instruções em laço no código, até que enquanto uma determinada expressão for verdadeira (similar a Do While...Loop), utilizando esta sintaxe:

While Condição

     [Instruções]

Wend

Onde,
  • Condição: argumento obrigatório, constituindo-se de uma expressão numérica ou string que retorne o valor True;
  • Instruções: instruções a serem executadas enquanto Condição for verdadeira;
  • Wend: delimita o fim do laço While...Wend. Quando a condição for false, a próxima linha de código após Wend será executada.
As seguintes considerações são válidas para a instrução While...Wend:
  • Instruções While...Wend podem ser aninhadas indefinidamente;
  • While...Wend funciona de forma idêntica a Do...Loop, excetuando-se pelo fato que Do...Loop permite que as instruções contidas dentro do laço sejam executadas pelo menos uma vez, desde que a instrução While esteja no final do laço (Do...Loop While <condição>). Quando se emprega While ,condição>...Wend, as instruções do laço podem não ser executadas uma única vez, desde que <condição> seja falsa na primeira vez que a instrução While é executada.
Exemplo: O exemplo a seguir demonstra como empregar uma instrução While...Wend para processar um arquivo aberto com ADO – Active Data Objects, registro a registro, até atingir o fim do arquivo, desde que a tabela ou conjunto de registros representado pela variável rs possua pelo menos um registro de dados.

Sub ProcessoRegistro(rs as ADODB.RecordSet)

  Dim intl as Integer
 
While Not rs.EOF

           For intl = 0 to rs.Fields.Count

                  Debug.Print rs.Fields(intl).Name & “=”, rs.Fields(intl).Value

           Next

Wend

End Sub

Até a Próxima!!

FUNÇÃO E INSTRUÇÃO DE CONTROLE DO FLUXO DE EXECUÇÃO – STOP

Stop


    Instrução empregada para suspender temporariamente a execução do código de um procedimento, permitindo o exame do valor de suas variáveis, utilizando esta sintaxe:

Stop

As seguintes considerações são válidas para a instrução Stop:
  • Stop paralisa a execução do código no ponto onde se encontra, da mesma forma empregada quando se estabelece um ponto de interrupção;
  • Stop deve ser utilizada apenas no ambiente de desenvolvimento do VBA. Se a instrução Stop for encontrada em um aplicativo compilado (arquivo.exe), ela se comportará como uma instrução End, provocando a finalização do aplicativo, perda do valor das variáveis e liberação da memória por ele utilizada.
Exemplo: O exemplo a seguir demonstra como paralisar o código de um laço que percorre todos os controles de um formulário, quando o mesmo encontra um botão de comando:

Function PesquisaCtrl()

  Dim ctl as Control

  For Each ctk In Me.Controls

        If TypeOf ctl Is CommandButton Then

            Stop

        End If

   Next

End function

Até a Próxima!!

FUNÇÃO E INSTRUÇÃO DE CONTROLE DO FLUXO DE EXECUÇÃO – SHELL

Shell




    Função empregada para se executar um programa externo qualquer (como um aplicativo DOS) e retornar uma Variant contendo um valor Doublé, indicando se o programa executou-se ou não com sucesso, utilizando esta sintaxe:

Shell(CaminhoParaOAplicativo[,TioDeJanela])

Onde,
  • CaminhoParaOAplicativo: argumento obrigatório, pode ser uma string, variável string ou variant contendo uma string, indicando o caminho e nome completo do aplicativo a ser executado, incluindo sua extensão;
  • TipoDeJanela: argumento opcional, na forma de um número Integer (ou variant contendo um Integer), indicando como a janela do programa a ser executado será aberta. Se TipoDeJanela for omitida, o programa será executado minimizado e com o foco do sistema. São válidos os seguintes valores para o argumento TpoDeJanela:








As seguintes considerações são válidas para a instrução Shell:
  • Se a função Shell conseguir executar com sucesso o aplicativo solicitado, ela irá retornar um número Inteiro Longo indicando a identidade única atribuída pelo Windows ao programa. Se o programa não puder ser executado, Shell retornará zero;
  • Shell executa os programas de forma assíncrona, indicando que após a execução da instrução Shell, o programa solicitado pode permanecer em execução até retornar sua ID para o procedimento;
  • Para confirmar que um programa foi executado com a instrução Shell, você deverá utilizá-la sempre em um laço Do...Loop, até que Shell retorne a ID do programa ou retorne zero, indicando sua falha, desta forma:
Dim varID as variant ‘varID possui Empty o ser declarado

Do While varID is Empty

      VarID = Shell (<Aplicativo>, TipoDeJanela)

Loop

Exemplo: O exemplo a seguir demonstra como empregar a função Shell() para executar o comando DOS Tree.com, que retorna toda a estrutura de árvore do disco rígido atual, a partir de um arquivo de lote chamado Tree.bat. O arquivo Tree.bat direciona a saída do comando Tree.com para um arquivo texto c:\Tree.txt. O código do arquivo de lote Tree.bat é:

C:\Windows\system32\tree.com c:\ /a > c:\tree.txt

    A função GerarTree() emprega a instrução Shell() do VBA para executar o arquivo de lote Tree.bat e gerar o arquivo Tree.txt, contendo toda a estrutura de diretório do disco rígido.

    Ela emprega então a instrução Open e as funções Input() e LOF() do VBA para ler o arquivo Tree.txt e retorná-lo como valor de retorno da função GerarTree()

Public Function GerarTree() As String

  Dim varID As Variant
  Dim strTree As String

    Do While IsEmpty(varID)

          VarID = Shell(“c:\tree.bat”)

    Loop

       If varID <> 0 Then

          Open “c:\Tree.txt” For Input As #1
          StrTree = Input(LOF(1),1)
          Close #1        

       End if  

   GerarTree = strTree

End function

    Para verificar a estrutura de pasta de seu disco rígido, atribua o valor retornado por esta função para uma caixa de texto qualquer de um formulário (no Visual Basic, esta caixa da texto deverá ter a propriedade MultiLine definida para True), utilizando esta sintaxe:

TxtText1 = GerarTree()

Até a Próxima!!

FUNÇÃO E INSTRUÇÃO DE CONTROLE DO FLUXO DE EXECUÇÃO – SWITCH

Switch


    Função empregada para avaliar uma lista de expressões em seqüência, da esquerda para a direita, e retorna o valor ou resultado da expressão associado à primeira expressão avaliada como True na lista de expressões, utilizando esta sintaxe:

Switch(Expressão1, Valor1[,Expressão2, Valor2]...[,Expressão-n, Valor-n])   

Onde,
  • Expressão 1-n: argumento obrigatório, indica uma expressão passível de ser avaliada pelo VBA que retorne True ou um valor numérico (0 = False);
  • Valor 1-n:  argumento obrigatório, indica o valor a ser retornado pela função Switch, quando a primeira expressão avaliada, da esquerda para a direita, retornar True.
As seguintes considerações são válidas sobre a função Switch():
  • Switch() funciona como uma extensa instrução If..Then...ElseIf...End, utilizando uma única linha de código. Ela exige que se empregue sempre um par Expressão|ValorRetornado, ou ocorrerá um erro em tempo de execução;
  • Se nenhuma das expressões da lista retornar True, Switch() retornará o valor Null;
  • Qualquer dos pares de expressões|valores pode também retornar Null;
  • Cuidado ao empregar  Switch, pois apesar de retornar apenas o primeiro valor cuja expressão associada seja True, toas as expressões existentes na lista serão avaliadas, podendo fornecer resultados ou erros inesperados no código.
Exemplo: O exemplo a seguir demonstra como empregar a função Switch() para retornar diferentes alíquotas de imposto de renda, dependendo do valor da variável:

Alíquota = Switch(Salário < 1058.01,0, Salário >= 1058.01 and Salário < 2115.01,0.15, Salário > 2115.01 and Salário <= 12696, 0.275, Salário > 12696,423.08)

Até a Próxima!!

FUNÇÃO E INSTRUÇÃO DE CONTROLE DO FLUXO DE EXECUÇÃO – SELECT CASE

Select Case


    Instrução empregada para executar um ou mais grupos de instruções, dependendo do valor da expressão avaliada na cláusula Select Case, utilizando esta sintaxe:

Select Case Expressão
    [Case ValorDaExpressão1
      [Instruções1]
...
[Case ValorDaExpressãon
      [Instruçõesn]
...
Case Else
     [Instruçõeselse]
End Select

Onde, 
  • Expressão argumento obrigatório, indicando a expressão a ser avaliada antes de se tornar uma decisão;
  • ValorDaExpressão1-n: argumento obrigatório, indicando um ou mais valores possíveis para Expressão. Se expressão for igual a ValorDaExpressão1-n, as instruções que seguem a cláusula Case serão executadas;
  • Intruções1-n: lista de comandos a serem executados no caso de Expressão = ValorDaExpressão;
  • Case Else: argumento opcional, indica a cláusula a ser executada quando Expressão é diferente de qualquer um dos valores contidos nas cláusulas Case anteriores;
  • End Select: argumento obrigatório, indica o fim da instrução Select Case.
As seguintes considerações são válidas para a instrução Select Case: 
  • Select Case permite avaliar uma única vez uma expressão e executar uma série de comandos, dependendo do valor que a expressão tomou. Ela é muito mais eficiente que uma instrução If...Then...ElseIf...Else, que exige efetuar novamente o teste para Expressão a cada cláusula ElseIf;
  • Uma vez que o valor de Expressão tenha sido avaliado e seja igual a um dos valores contidos nas diversas cláusulas Case ValorDaExpressão, as instruções daquela cláusula serão executadas;
  • Após as instruções da primeira cláusula Case equivalentes a Expressão de uma instrução Select Case tiverem sido executadas, todas as demais cláusulas serão ignoradas (mesmo aquelas cujo valor sejam iguais ou equivalentes à Expressão), e o controle do fluxo de código continuará após a instrução End Select;
  • Opcionalmente, você pode fornecer uma cláusula Else (recomendável) para ser executada, sempre que Expressão for diferente dos diversos valores empregados nas cláusulas Case anteriores. Esta abordagem permite que o seu programa responda a valores inesperados de Expressão, os quais são sempre possíveis de ocorrer durante a execução de um programa;
  • Você pode avaliar múltiplas expressões em uma única cláusula Case. Por exemplo, supondo que Expressão retorne um valor numérico, como a idade de um cliente, você poderia avaliar esta idade em múltiplas faixas, como em:
Select Case Idade
   Case 18, 19, 20 
  • Quando Expressão se referenciar a uma faixa de valores, empregue a instrução Is:
Select Case Idade
   Case Is > 35
  • Se Expressão retornar uma string, faça a comparação com strings entre aspas:
Select Case Idade
Case “Rio de Janeiro”,”Niteroi”
  • Você pode aninhar instruções Select Case dentro de cláusulas Case, não se esquecendo de usar a instrução End Select para terminá-la, ou ocorrerá um erro de compilação.
Exemplo: O exemplo a seguir demonstra como empregar uma instrução Select Case para retornar diferentes valores de percentual a serem pagos para o imposto de renda em 2003, dependendo do valor da variável Salário.

Function Alíquota(Optional Redução as Single)

  Select Case Salário

     Case < 1058.01
            Alíquota = 0

     Case >= 1058.01 and < 2115.01
            Alíquota = 0.15
            Redução = 158.70

     Case > 2115.01 <= 12696
            Alíquota = 0.275
            Redução = 423.08

Case Else
            Alíquota = 0.3

End Select

End Function

Até a Próxima!!

FUNÇÃO E INSTRUÇÃO DE CONTROLE DO FLUXO DE EXECUÇÃO – RAISEEVENT

RaiseEvent


    Instrução empregada para disparar um evento declarado ao nível do módulo, dentro de uma classe, formulário ou documento, utilizando esta sintaxe:

RaiseEvent NomeDoEvento [(Argumentos)]

Onde,
  • NomeDoEvento: argumento obrigatório, que se refere ao nome de um procedimento de evento declarado como a instrução Event;
  • Argumentos: argumento opcional, refere-se à lista de valores passados para os argumentos do evento declarado, separados por vírgula.
As seguintes considerações são válidas sobre a instrução RaiseEvent:
  • O evento deverá sr necessariamente declarado dentro do módulo a partir do qual ele é disparado com uma instrução RaiseEvent, ou ocorrerá um erro em tempo de execução;
  • Não é possível disparar um evento de controle ou formulário utilizando-se a instrução RaiseEvent. Apenas eventos declarados com a instrução Event poderão ser utilizados ou ocorrerá um erro em tempo de execução;
  • Se o evento declarado possuir argumentos, estes devem ser envolvidos entre parênteses. Se o evento não possuir argumentos, os parênteses não devem ser utilizados ou ocorrerá erro em tempo de execução;
  • Se um evento for declarado com o mesmo nome de um mesmo nome de um evento nativo do formulário, então o evento do formulário deixará de ser disparado. Por exemplo, se você declarar um evento chamado Click em um módulo de formulário, o evento Form_Click não será mais disparado. Porém o evento Form_Click poderá ser executado normalmente a partir de outro procedimento utilizando-se uma instrução Call <NoemDoEvento>.
Exemplo: O exemplo a seguir demonstra como empregar uma instrução RaiseEent para disparar um evento declarado no módulo atual. Neste caso, o módulo é empregado para manipular os dados de um formulário que possui uma caixa de texto (txtTexto) que, ao ser alterada, marca a variável fAlterou para True. Quando o foco sai da caixa de texto, o evento txtTexto_LostFocus dispara e verifica o valor de fAlterou. Se fAlterou for True, a instrução  RaiseEvent dispara o evento TextoAlterado no formulário atual, com uma instrução RaiseEvent, passando-lhe como argumento a variável fCancel, a qual pode ou não ser manipulada pelo evento Form_TextoAlterado, impedindo a alteração da caixa de texto.

Public Event TextoAlterado(Cancel as Integer)

Sub txtTexto_Change

       fAlterou = True

End Sub

Sub txtTexto_LostFocus

Dim fCancel as integer

   If fAlterou Then
       RaiseEvent TextoAlterado(fCancel)

           If fCancel Then
               TxtTexto = “” ‘Usuário cancelou a alteração
           End If

   End If

End Sub

Até a Próxima!!

FUNÇÃO E INSTRUÇÃO DE CONTROLE DO FLUXO DE EXECUÇÃO – ON...GOSUB, ON...GOTO

On...GoSub, On...GoTo


    Instruções empregadas para criar um desvio de código para uma ou maus linhas, dependendo do valor lógico da expressão testada, utilizando a seguinte sintaxes:

On expressão GoSub RótulosDeDestino
On expressão GoTo RótulosDeDestino

Onde,
  • Expressão: argumento obrigatório, indicando qualquer expressão numérica cujo valor seja avaliado para um número inteiro entre 0 e 255. Números reais serão arredondados para o mais próximo inteiro disponível. O valor de expressão será utilizado para determinar quais os rótulos ou números de linha existentes na lista será utilizado como desvio para o fluxo de código;
  • RótulosDeDestino: argumento obrigatório, indicando uma lista de números de linha ou rótulos de destino, separados por vírgulas.
As seguintes considerações são válidas para as instruções On...GoSub e On...GoTo:
  • Esta instrução existe apenas para compatibilidade para trás com versões anteriores do Basic. Seu emprego torna o código extremamente difícil de seguir e depurar, sendo mais aconselhado empregar uma instrução Select Case que faça chamadas a outros procedimentos existentes no projeto;
  • Se Expressão for igual zero ou for um número maior do que o número de itens na lista, o controle será transferido para a primeira instrução após a instrução On...GoSub ou On...GoTo;
  • Se Expressão for um número negativo ou maior do que 255, ocorrerá um erro em tempo de execução;
  • É possível misturar números de linha e rótulos na mesma lista, até um máximo de 255 possíveis pontos de desvio de código;
  • Use uma instrução Return para fazer com que o código retorne à linha que sucede a instrução On...GoTo ou On...GoSub correspondente, sem que outras linhas de código sejam executadas.
Exemplo: O exemplo a seguir demonstra como empregar as instruções On...GoSub e On...GoTo para alterar o fluxo de código do procedimento, retornando o dia da semana correspondente ao número recebido como argumento (você poderia empregar a função Wday() associada a função Format() para obter o mesmo resultado, de forma muito mais elegante):

Public Function DiaDaSemana(intDia as integer) as string

   On intDia GoTo Domingo, Segunda, Terça, Quarta, Quinta, Sexta, Sábado
   Exit Function

Domingo:
   DiaDaSemana = “Domingo”: Return
Segunda:
   DiaDaSemana = “Segunda-feira”: Return
Terça:
   DiaDaSemana = “Terça-feira”: Return
Quarta:
   DiaDaSemana = “Quarta-feira”: Return
Quinta:
   DiaDaSemana = “Quinta-feira”: Return
Sexta:
   DiaDaSemana = “Sexta-feira”: Return
Sábado:
   DiaDaSemana = “Sábado”: Return

Exit Function

Até a Próxima!!

FUNÇÃO E INSTRUÇÃO DE CONTROLE DO FLUXO DE EXECUÇÃO – IIF

IIF


    Função conhecida como Se Imediato, é empregada para efetuar um teste lógico em uma expressão, e dependendo do resultado do teste, retornar um ou outro valor obrigatório na sintaxe da função. A função IIF possui a seguinte sintaxe:

IIF(Expressão, CasoVerdadeiro, CasoFalso)

Onde,
  • Expressão: argumento obrigatório, constituindo-se de uma expressão matemática ou lógica inválida que se deseja avaliar;
  • CasoVerdadeiro: argumento obrigatório, constituindo-se de uma expressão cujo valor será retornado se Expressão for verdadeira (True);
  • CasoFalso: argumento obrigatório, constituindo-se de uma expressão cujo valor será retornado se Expressão for falsa (False).
As seguintes considerações são válidas para a função IIF:
  • A função IIF() sempre avalia Expressão, CasoVerdadeiro e CasoFalso, independente de os mesmos serem expressões simples ou chamadas a outros procedimentos do projeto. Portanto, cuidado ao empregar funções e expressões nos argumentos CasoVerdadeiro e CasoFalso da função IIF(), pois podem ocorrer erros imprevisíveis no código (como por exemplo, a divisão por zero);
  • Você pode aninhar funções IIF() nos argumentos CasoVerdadeiro e CasoFalso. Porém isto pode tornar seu código mais difícil de ser lido e mantido;
  • Quando aninhar funções IIF(), você deverá verificar todos os parênteses de cada ninho, ou ocorrerá um erro de sintaxe.
Exemplo: O exemplo a seguir emprega um ninho de funções IIF() para atribuir diferentes alíquotas de imposto de renda, válidas para o ano de 2003 no Brasil, dependendo do valor do salário passado como argumento para o procedimento. Observe que os valores dos argumentos são separados por vírgulas e as casas decimais por pontos:

Public Function Alíquota(Salário as Currency) as single

   Alíquota = IIF(Salário < 1058.01,0,IIF((Salário < 1058.01 and Salário < 2115.01,0.15,0.27.5))

End Function

Até a Próxima!!

FUNÇÃO E INSTRUÇÃO DE CONTROLE DO FLUXO DE EXECUÇÃO – IF...THEN...ELSE

If...Then...Else


    Instrução que executa condicionalmente um grupo de instruções, dependendo do valor da expressão testada, utilizando uma destas sintaxes:

If condição Then [Instruções] [Else Instruções]

Ou

If condição Then
[Intruções]
[ElseIf OutraCondição Then
[Instruções]...
[Else
[Instruções]]
End If

Onde,
  • Condição e OutraCondição: argumento obrigatório que indica uma expressão cujo valor retornado será avaliado para verdadeiro ou falso, ou uma expressão utilizando a instrução TypeOf <objeto> Is <TipoDeObjeto>, no qual verifica-se se o objeto desejado é ou não de um determinado tipo (Ex.: If TypeOf ctl Is TextBox);
  • Intruções: argumento opcional, especifica o bloco de instruções a serem executadas em cada situação;
  • Then: argumento obrigatório, especifica uma ou mais instruções a serem executadas quando Condição for verdadeira;
  • Else: argumento opcional, especifica uma ou mais instruções a serem executadas quando Condição for false;
  • ElseIf: argumento opcional, especifica um novo testa a ser executado, quando Condição for false.
As seguintes considerações são válidas para a instrução If...Then...Else:
  • Você pode empregar a sintaxe de uma única linha de código ou particioná-la em várias linhas. Tenha em mente que na sintaxe de uma única linha, ambas as expressões empregadas nas cláusulas Then e Else serão avaliadas, podendo provocar erros imprevisíveis, além de se tornar mais difícil de interpretar;
  • Você pode ter quantas cláusulas ElseIf quiser em uma instrução If Then Else, porém apenas uma cláusula Else é permitida;
  • Toda instrução If...Then...Else deve terminar obrigatoriamente com uma instrução End If;
  • Empregue uma instrução Select Case no lugar de uma instrução If...Then...ElseIf que possua várias cláusulas ElseIf, pois ela avalia a condição a ser testada apenas uma vez, tomando seu código mais eficiente;
  • A instrução TypeOf  não pode ser empregada com variáveis que representam tipos de dados, tornando seu código mais eficiente.
Exemplo: O exemplo a seguir demonstra como empregar uma instrução If...Then...Else para atribuir diferentes alíquotas de imposto de renda, válidas para o ano de 2003 no Brasil, dependendo do valor do salário passado como argumento para o procedimento:

Public Function Alíquota(Salário Currency, Optional Redução as Currency) as single

   If Salário < 1058.01 Then
       Alíquota = 0

   ElseIf Salário >= 1058.01 and Salário < 2115.01 Then
       Alíquota = 0.15
       Redução = 158.70

   ElseIf Salário > 2115.01 and Salário < 12696 Then
       Alíquota = 0.275
       Redução = 423.08

   Else
       Alíquota = 0.3

   End If

End Function

    A próxima instrução emprega uma instrução TypeOf para definir a propriedade Transparent para True de um botão de comando:

If TypeOf ctl is CommandButton Then

    Ctl.Transparent = True

End If

    Finalmente, a próxima instrução empregada uma única linha de código para retornar a raiz quadrada de um número qualquer apenas se o número for positivo:

Public Function RaizQuadrada() as Doublé

          If Número > 0 Then RaizQuadrada = Número ^ 0.5 Else RaizQuadrada = 0
          
End Function

Até a Próxima!! 

FUNÇÃO E INSTRUÇÃO DE CONTROLE DO FLUXO DE EXECUÇÃO – GOTO

GoTo


    Instrução empregada para provocar uma quebra intencional no fluxo de execução do código de um procedimento para uma linha ou rótulo específico dentro do procedimento, utilizando esta sintaxe:

GoTo LinhaOuRótulo

Onde,
  • LinhaOuRótulo: argumento obrigatório que define o número da linha ou nome do rótulo para onde o fluxo de código deverá ser desviado. 
As seguintes considerações são válidas para a instrução GoTo:
  • GoTo pode redirecionar o fluxo de código apenas dentro do procedimento onde aparece;
  • Apesar de GoTo poder ser empregado no código, evite o seu uso para impedir que a quebra da estrutura do código, o qual deve ser sempre linear, de cima para baixo, até a última instrução (ou até encontrar uma instrução Exit ou End).
Exemplo: O exemplo a seguir mostra como empregar uma instrução GoTo para forçar o usuário a fornecer um diretório onde se encontra o arquivo desejado. O usuário poderá indicar o caminho quantas vezes quiser, até que o procedimento encontre o arquivo TESTE.LOG solicitado seja encontrado pela função Dir() do VBA.

Public Function CaminhoParaArquivoLog() as string

   Dim strCaminho as string

TentaDeNovo:

   StrCaminho = InputBox(“Forneça o caminho para o arquivo TESTE.LOG:”,”Caminho?”)

   If Len(strCaminho) > 0 Then

       If Len(Dir(strCaminho & “\TESTE.LOG”) = 0 Then
           MsgBox “Arquivo não encontrado em “ & strCaminho
           GoTo TentaDeNovo

        End If

        Else
           CaminhoParaArquivoLog = strCaminho

   End If

End Function

Até a Próxima!!

FUNÇÃO E INSTRUÇÃO DE CONTROLE DO FLUXO DE EXECUÇÃO - GOSUB...RETURN

GoSub...Return


    Instrução tradicional das linguagens Basic, empregada para causar uma quebra no fluxo linear de execução do código de um procedimento para uma sub-rotina dentro do procedimento, utilizando esta sintaxe:

GoSub LinhaOuRótulo
...
LinhaOuRótulo
...
Return

Onde,
  • LinhaOuRótulo: pode ser qualquer número de linha dentro do código, ou qualquer rótulo definido com o emprego de um nome seguido por “-“.
As seguintes considerações são válidas para a instrução GoSub...Return:
  • GoSub e Return existem apenas por compatibilidade para trás com outras versões do Basic, pois provocam a quebra na seqüência lógica e estruturada de execução do código de um procedimento, devendo ser evitado o seu emprego. Em seu lugar, empregue uma instrução Call que faça uma chamada a um outro procedimento;
  • GoSub e Return podem ser empregados em qualquer ponto do procedimento. Tão logo uma instrução GoSub seja encontrada, o fluxo de código será desviado para a linha ou rótulo determinado. Após esta linha ou rótulo, você poderá empregar uma instrução Return para retornar a execução do código para a linha subseqüente àquela na qual foi colocada a instrução GoSub;
  • Você não pode empregar GoSub para executar outros procedimentos. Empregue esta instrução apenas para desviar o fluxo de código dentro de um procedimento qualquer;
  • Para impedir que o fluxo normal do código entre no fluxo de código de uma sub-rotina (como uma sub-rotina de manipulação de erros em tempo de execução), empregue uma instrução Exit Sub antes do rótulo ou linha que define o início da sub-rotina.
Exemplo: O exemplo a seguir demonstra como empregar a instrução GoSub para retornar a raiz quadrada de números capturados por uma instrução InputBox(). Note que quando o valor fornecido não for um número ou for um número negativo, o procedimento é terminado.

Public Sub CalculaRaizQuadrada()
   Dim strValor As Srting

TentaDeNovo:

StrValor = InputBox(“Forneça o número cuja raiz quadrada você deseja”, “Número?”)

If Not IsNumeric(strValor) Or Val(strValor) < 0 Then
   Exit Sub

Else

   GoSub Calcula
   GoSub TentaDeNovo

End If
Exit Sub

Calcula:

   MsgBox “A raiz quadrada de “ & strValor & “ é “ & Sqr(Val(strValor))
   Return

End Sub

Até a Próxima!!