Instrução Sub

Declara o nome, argumentos e o código que formam o corpo de um procedimento Sub.

Sintaxe

[ Particular | Público | Amigo ] [ Estático ] Sub nome [( arglist )]
[instruções]
[ Exit Sub ]
[instruções]
End Sub

A sintaxe da instrução Sub tem estas partes:

Parte Descrição
Public Opcional. Indica que o procedimento Sub é acessível para todos os outros procedimentos em todos os módulos. Se usado em um módulo que contém uma instrução Option Private, o procedimento não está disponível fora do projeto.
Private Opcional. Indica que o procedimento Sub é acessível somente para outros procedimentos no módulo em que é declarado.
Friend Opcional. Usado somente em um módulo de classe. Indica que o procedimento Sub fica visível durante todo o projeto, mas não é visível para um controlador de uma instância de um objeto.
Static Opcional. Indica que as variáveis locais do procedimento Sub são preservadas entre chamadas. O atributo Static não afeta variáveis que são declaradas fora do Sub, mesmo que sejam usadas no procedimento.
name Obrigatório. Nome do Sub; segue as convenções de nomenclatura padrão para variáveis.
listadeargumentos Opcional. A lista de variáveis que representa os argumentos passados para o procedimento Sub quando ele é chamado. Diversas variáveis separadas por vírgulas.
instruções Opcional. Qualquer grupo de instruções a serem executadas dentro do procedimento Sub.

O argumento listadeargumentos tem as seguintes sintaxe e partes:

[ Opcional ] [ ByVal | ByRef ] [ ParamArray ] varname [ ( ) ] [ As type ] [ = defaultvalue ]

Parte Descrição
Opcional Opcional. Palavra-chave indicando que um argumento não é necessário. Se for usado, todos os argumentos subsequentes em arglist também deverão ser opcionais e declarados usando a palavra-chave Optional. Optional não podem ser usados para um argumento se ParamArray for usado.
ByVal Opcional. Indica se o argumento será passado por valor.
ByRef Opcional. Indica se o argumento será passado por referência. ByRef é padrão no Visual Basic.
ParamArray Opcional. Usado apenas como o último argumento em arglist para indicar que o argumento final é uma matriz Opcional de elementos Variantes. A palavra-chave ParamArray permite que você forneça um número aleatório de argumentos. ParamArray não pode ser usada com ByVal, ByRef ou Optional.
nomedavariável Obrigatório. Nome da variável que representa o argumento passado; segue as convenções de nomenclatura de variável padrão.
tipo Opcional. Tipo de dados do argumento passado ao procedimento; pode ser Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal (sem suporte atualmente), Date, String (somente comprimento variável), Object, Variant ou um tipo de objeto específico. Se o parâmetro não for Optional, um tipo definido pelo usuário também poderá ser especificado.
valorpadrão Opcional. Qualquer constante ou expressão constante. Válido somente para parâmetros Optional. Se o tipo for Object, um valor padrão explícito só poderá ser Nothing.

Comentários

Se não forem especificados explicitamente usando Public, Private ou Friend, os procedimentos Sub serão públicos por padrão.

Se Static não for usado, o valor de variáveis locais não será preservado entre chamadas.

A palavra-chave Friend só pode ser usada em módulos de classe. No entanto, procedimentos Friend podem ser acessados por procedimentos em qualquer módulo de um projeto. Um procedimento Friend não aparece na biblioteca de tipos de sua classe pai, e um procedimento Friend não ser pode associado tardiamente.

Procedimentos Sub podem ser recursivos, ou seja, podem chamar a si mesmos para realizar determinada tarefa. No entanto, a recursão pode levar a um estouro de pilha. A palavra-chave Static geralmente não é usada com procedimentos Sub recursivos.

Todo código executável deve estar em procedimentos. Não é possível definir um procedimento Sub dentro de outro procedimento Sub, Function ou Property.

As palavras-chave Exit Sub causam o encerramento imediato de um procedimento Sub. A execução do programa continua com a instrução após a instrução que chamou o procedimento Sub. Qualquer número de instruções Exit Sub pode aparecer em qualquer lugar em um procedimento Sub.

Assim como um procedimento Function, Sub é um procedimento separado que pode usar argumentos, executar uma série de instruções e alterar o valor de seus argumentos. No entanto, diferentemente de um procedimento Function, que retorna um valor, um procedimento Sub não pode ser usado em uma expressão.

Você chama um procedimento Sub usando o nome do procedimento seguido da lista de argumentos. Confira a instrução Call para obter informações específicas sobre como chamar procedimentos Sub.

As variáveis usadas em procedimentos Sub se enquadram em duas categorias: as que são declaradas dentro do procedimento e as que não são. As variáveis que são declaradas explicitamente em um procedimento (usando Dim ou o equivalente) são sempre locais para o procedimento. As variáveis que são usadas, mas não declaradas explicitamente em um procedimento, também são locais, a menos que sejam declaradas explicitamente em algum nível superior fora do procedimento.

Um procedimento pode usar uma variável que não é declarada explicitamente no procedimento, mas um conflito de nomenclatura poderá ocorrer se algo que você definiu no nível de módulo tiver o mesmo nome. Se o procedimento se refere a uma variável não declarada que tem o mesmo nome que outro procedimento, constante ou variável, pressupõe-se que o procedimento faça referência a esse nome de nível de módulo. Para evitar esse tipo de conflito, declare as variáveis explicitamente. Use uma instrução Option Explicit para forçar a declaração explícita de variáveis.

Observação

Não é possível usar GoSub, GoTo nem Return para entrar ou sair de um procedimento Sub.

Exemplo

Este exemplo usa a instrução Sub para definir o nome, os argumentos e o código que formam o corpo de uma instrução Sub.

' Sub procedure definition. 
' Sub procedure with two arguments. 
Sub SubComputeArea(Length, TheWidth) 

   Dim Area As Double ' Declare local variable. 

   If Length = 0 Or TheWidth = 0 Then 
      ' If either argument = 0. 
      Exit Sub ' Exit Sub immediately. 
   End If 
   
   Area = Length * TheWidth ' Calculate area of rectangle. 
   Debug.Print Area ' Print Area to Debug window. 

End Sub

Confira também

Suporte e comentários

Tem dúvidas ou quer enviar comentários sobre o VBA para Office ou sobre esta documentação? Confira Suporte e comentários sobre o VBA para Office a fim de obter orientação sobre as maneiras pelas quais você pode receber suporte e fornecer comentários.