You are on page 1of 58

#Aula 12

Inserir cdigo em uma Plan;

Evento Activate;

Selecionar clula atravs de cdigo range().select;


Evento Calculate;
Comentar Cdigo;
Como usar a janela de verificao imediata (ctrl +
g).

Quando abrimos a janela de criao de cdigos, podemos criar cdigos


gerais ou para objetos especficos como para as planilhas (worksheets) e
para a pasta de trabalho (workbook). Dessa maneira, ao definirmos para
qual objeto, podemos definir um evento que ativa o cdigo.
Verificar quando necessrio o funcionamento de cada evento.
Ao selecionar um objeto, no lado esquerdo, pressione F4 para exibir as
propriedades do objeto.
Na janela de verificao imediata possvel alterar a planilha ou informar o
valor de uma clula colocando ? antes da referncia que se deseja
verificar.

#Aula 13
O que so variveis;
Tipos de variveis
- Boolean
- Integer
- String
- Long
- Currency
- Date
A sintaxe para declarao: Dim nome_da_varivel As tipo_da_varivel
Tambm podemos declarar mais do que uma varivel, com um nico comando Dim. Para
isto, basta separar as variveis, com vrgula, conforme exemplificado abaixo:

Dim x As Integer, y As Integer

Se voc no especificar o tipo de dados para cada varivel,


como no seguinte cdigo de Visual Basic, somente a varivel y
configurada como uma varivel integer. A varivel x ser um
tipo variant:
Dim x,y,z As String
Tabela - Subtipos do tipo Variant disponveis no VBA:

Empty

O Valor zero para variveis numricas ou uma String de tamanho zero


(" "), para variveis de texto.

Null

A varivel no contm dados vlidos.

Boolean

Contm variveis que somente podem assumir dois valores:Verdadeiro ou


Falso (True ou False).

Byte

Valor inteiro, na faixa de 0 at 255.

Double (8 bytes)

Integer (2 bytes)

Valor inteiro, na faixa de -32768 at 32767.

Currency

Valores

na

faixa

de

-923.337.203.685.447,5808

at

922.337.203.685.447,5807 (acho q para moeda)

Long (4 bytes)

Valor inteiro, na faixa de -2.147.483.648 at 2.147.483.647.

Date(Time)

um nmero que representa a data entre 01 de Janeiro do ano 100, at


31 de Dezembro de 9999 (Olha o bug do ano 10000 chegando).

String

Texto de tamanho varivel, pode conter, aproximadamente, 2 bilhes de

caracteres.

Object

Pode conter um objeto qualquer, como um Controle Activex, ou um


Objeto COM+

Error

Pode conter um nmero de erro.

Tambm podemos utilizar variveis que no foram, explicitamente,


declaradas com o comando Dim. Com isso, a varivel criada na memria,
no momento da sua utilizao. Para fazer com que toda varivel tenha que
ser, explicitamente, declarada, antes de ser utilizada, devemos utilizar o
seguinte comando na seo de declarao do mdulo:
Option Explicit
Podemos concatenar variveis:
MsgBox x &- & y

#Aula 14
Tipo Worksheet;
Atribuindo variveis com o comando Set
Obs.: Quando definimos a sub-rotina como Private Sub, ao final dessa Sub as
variveis se perdem. Do contrrio, quando so definidas como Public Sub temos
(no sei ainda se a possibilidade ou se automaticamente todas j ficam)
variveis visveis todos os objetos e mdulos do projeto.
Sempre que trabalharmos com objetos, sendo os mais comuns Range, Worksheet e
Workbook, devemos atentar para o uso da instruo Set, seno em vez de armazenar o
intervalo, sero armazenados os valores contidos no intervalo.
Vamos comear preenchendo os seguintes valores no intervalo A1:A4 de uma planilha
chamada Teste da instruo Set
A1: Texto; A2: 64; A3: FALSO; A4: =NO.DISP().
Agora vamos para o cdigo VBA.

Sub Exemplo_Set01()

rg = [A1:A4]
End Sub
Olhando o cdigo, poderamos dizer que atribumos o intervalo [A1:A4] varivel rg?
A resposta no
Na verdade criamos uma varivel que contm apenas os valores presentes no intervalo
A1:A4.
possvel buscar qualquer um desses valores e at realizar operaes com eles, mas os
valores de A1:A4 permanecem inalterados. A varivel apenas um reflexo do contedo do
intervalo e no o prprio intervalo.
Se tentarmos executar qualquer mtodo ou retornar uma propriedade a partir de rg,
obteremos uma mensagem de erro como resultado:

Sub Exemplo_Set01()
rg = [A1:A4]
rg.Font.Name = "Arial"
End Sub
Mensagem de erro:
Erro em tempo de execuo 424.
O objeto obrigatrio.
Essa mensagem significa que a varivel rg no um objeto, portanto no pode ter sua
propriedade Font.Name alterada.
Para atribuir corretamente um objeto a uma varivel temos que adicionar a instruo Set
linha de comando.

Sub Exemplo_Set01()
Set rg = [A1:A4]
rg.Font.Name = "Arial"
End Sub
O cdigo acima, funciona adequadamente e a fonte do intervalo alterada para Arial
conforme desejado.
PODEMOS ATRIBUIR UM OBJETO A UMA VARIVEL, AO INVS DE CHAM-LO TODA VEZ,
CHAMAMOS A VARIVEL, AS VANTAGENS DISSO SO:

A primeira a simplificao do cdigo.


Vejamos duas verses de cdigo.

Sub Exemplo_Set02()
With Worksheets("Teste da instruo Set").Range("A1:A4")
.Font.ColorIndex = 3
.Interior.ColorIndex = 10
End With
With Worksheets("Teste da instruo Set").Range("B1:B4")
.Font.ColorIndex = 10
.Interior.ColorIndex = 3
End With
End Sub
Sub Exemplo_Set02()
Set rg1 = Worksheets("Teste da instruo Set").Range("A1:A4")
Set rg2 = Worksheets("Teste da instruo Set").Range("B1:B4")

With rg1
.Font.ColorIndex = 3
.Interior.ColorIndex = 10
End With
With rg2
.Font.ColorIndex = 10
.Interior.ColorIndex = 3
End With
End Sub
No primeiro cdigo tivemos que escrever todas as definies do objeto em cada lao With, ao
passo que no segundo exemplo, os laos With ficaram bem mais enxutos.
Esses so exemplos simples, mas em cdigos mais complexos torna-se muito melhor
trabalhar com nomes de variveis mais amigveis e utiliz-los para manipular mais
efetivamente os objetos.
A segunda vantagem que com as variveis objeto carregadas na memria, o
processamento se torna mais veloz, o que contribui para tornar os cdigos mais rpidos.
A terceira vantagem a flexibilidade do cdigo. Se quisermos modificar a planilha ou o
intervalo no primeiro cdigo, teremos que garantir que todas as referncias sejam alteradas.

Por outro lado, para realizar a mesma alterao no segundo exemplo de cdigo, basta alterar
a linha de comando que contm a instruo Set.
ATENO PARA ESSA BOA PRTICA

Ao trabalharmos com variveis objeto, uma boa prtica de


programao, que, ao trmino da execuo do cdigo esvaziemos
essas variveis.
Sub Exemplo_Set02()
Set rg1 = Worksheets("Teste da instruo Set").Range("A1:A4")
Set rg2 = Worksheets("Teste da instruo Set").Range("B1:B4")

With rg1
.Font.ColorIndex = 3
.Interior.ColorIndex = 10
End With
With rg2
.Font.ColorIndex = 10
.Interior.ColorIndex = 3
End With
Set rg1 = Nothing
Set rg2 = Nothing
End Sub

Ao atribuirmos o valor Nothing s variveis rg1 e rg2, estamos


liberando a memria que havia sido reservada para elas. medida
que os cdigos mais elaborados consomem recursos do sistema
durante a sua execuo, esse tipo de cuidado pode ocasionar uma
grande diferena no tempo final de processamento.
Mais um exemplo pra finalizar
Dim W As Worksheet
Set W = Sheets(Plan 1)
UM CDIGO DE BRINDE

Dim x As Date
x = Date
Armazena a data atual na varivel x.

#Aula 15, 16 e 17
Estruturas de repetio;
Do While
...
igual ao while {} da linguagem C.

Loop

Opition Explicit declarado no topo (geral).


E um ex: Set UltCelula = W.Range(A1048576).End(xlUp)
Do Until
Faa at que.

...

Loop

Tanto until como o while pode ter a condio colocada no fim da rotina (ex:
do ... loop while condio) igual o do while da linguagem C.

#Aula 18, 19 e 20
If .... Then...........Else............End If
For x = 1 To 20 .......... Next
For x = 1 To 20 Step 2 .......... Next (step o passo)
Private Sub btexecuta_Click()
Private Sub btexecuta_Click()
Dim W
Dim cont
Dim valor

As Worksheet
As Integer
As Integer

Set W = Sheets("Plan1")
W.Range("a1").Select
valor = W.Range("b1").Value
For cont = 1 To valor
ActiveCell.Value = cont
ActiveCell.Offset(1,
0).Select

Dim W
Dim cont
Dim valor

Set W = Sheets("Plan1")
W.Range("a1").Select
valor = W.Range("b1").Value
For cont = 1 To valor Step 2
ActiveCell.Value = cont
ActiveCell.Offset(1,
0).Select

Next
Next
End Sub

As Worksheet
As Integer
As Integer

End Sub

#Aula 21 e 22
InputBox (recebe uma resposta do usurio)
For Each ..... Next
Repete um grupo de instrues para cada elemento em uma coleo.
Exemplos:

Private Sub btbloqueia_Click()


'Para cada elemento do conjunto de planilhas;
'(demos o nome de "planilha" ao elemento);
'No definimos o tipo da varivel planilha, mas
'poderia ter sido definida como variant, object, worksheet(eu
acho).
For Each Planilha In Sheets
Planilha.Protect Password:="123"
Next
End Sub
Private Sub btdesbloqueia_Click()
For Each Planilha In Sheets
Planilha.Unprotect Password:="123"
Next
End Sub
Private Sub btbloqueia_Click()
Dim cont As Integer
'funo count conta a quantidade de elementos
'existente em uma coleo, eu acho.
cont = Sheets.Count
For Each Planilha In Sheets
Planilha.Protect Password:="123"
Next
MsgBox "Todas as " & cont & " planilhas foram bloqueadas",
vbOKOnly, "Processo Concludo"
End Sub
Private Sub btbloqueia_Click()
Dim Planilha
Dim Senha

As Variant
As String

Senha = InputBox("Digite uma senha para bloqueio", "Ateno")


For Each Planilha In Sheets
Planilha.Protect Password:=Senha
Next
End Sub
Private Sub btdesbloqueia_Click()
Dim Planilha
As Variant
Dim Senha
As String
Senha = InputBox("Digite uma senha para desbloqueio", "Ateno")
For Each Planilha In Sheets
Planilha.Unprotect Password:=Senha
Next
Observe que essa MsgBox no faz muito sentido pois caso seja
digitada a senha errada, a mensagem informada no corresponder
a realidade
MsgBox As planilhas foram desbloqueadas, vbOkOnly, Processo
Concludo
End Sub
Instruo For...Next (Visual Basic) funciona bem quando voc pode associar cada
iterao de um loop atravs de uma varivel de controle e determinar os valores
inicial e final dessa varivel. No entanto, quando voc est tratando uma coleo, o
conceito de valores inicial e final no significativo, e voc no sabe quantos
elementos necessariamente tem a coleo. Neste tipo dos casos, um loop de For
EachNext geralmente uma opo melhor.

#Aula 23
ENVIRON
Variveis de ambiente do Sistema Operacional.
Como gravar um log com a data de abertura e fechamento de uma
planilha do Excel, com uso dos seguintes recursos:

ENVIRON

FOR ... NEXT

APPLICATION.ENABLEEVENTS
(True or False) desabilita a ocorrncia de eventos. Este exemplo desabilita
eventos antes de um arquivo ser salvo de modo que o
evento BeforeSave no ocorra.

Application.EnableEvents = False

ActiveWorkbook.Save
Application.EnableEvents = True

APPLICATION.SAVE

Private Sub Workbook_BeforeClose(Cancel As Boolean)


Dim W As Worksheet
Dim UltCel As Range
Application.ScreenUpdating = False
Set W = Sheets("Controle de Acessos")
W.Select
W.Range("A2").Select
Set UltCel = W.Range("a1048576").End(xlUp)
UltCel.Select
ActiveCell.Offset(0, 2).Value = Date & " / " & Time
Range("C:C").EntireColumn.AutoFit
'Desliga alertas, como confirmao de fechamento
Application.DisplayAlerts = False
'Permite salvar a pasta
ActiveWorkbook.Save

'Ao fim do cdigo necessrio relig-lo


Application.DisplayAlerts = True
Application.ScreenUpdating = True
'------------------------------------------------------------------

'|SEMPRE QUE UTILIZAR UM ATRIBUTO FALSE PARA UM RECURSO


|
'|DA APLICAO (APPLICATION), LIGUE-O NOVAMENTE AO FINAL DO
CDIGO.|
'------------------------------------------------------------------

End Sub
Private Sub Workbook_Open()
Dim W As Worksheet
Dim UltCel As Range
Set W = Sheets("Controle de Acessos")
W.Select
W.Range("a2").Select
Set UltCel = W.Range("a1048576").End(xlUp).Offset(1, 0)
UltCel.Select
ActiveCell.Value = Environ("Username")
ActiveCell.Offset(0, 1).Value = Date & " / " & Time
Range("B:B").EntireColumn.AutoFit
End Sub
O mtodo Environ retorna informaes do usurio e sua mquina. Podemos
chamar seus dados colocando um nmero dentro dos parnteses (Environ
(n)).
A planilha Mtodos Environ, na pasta Curso Macros e VBA, possui os
possveis atributos desta funo (ver na planilha), adiquiquiridos pelo
cdigo:
Private Sub btExibEnv_Click()
Dim W As Worksheet
Dim x As Integer
Set W = Sheets("Plan1")
W.Select
W.Range("a1").Select
For x = 1 To 100

'o comando cells diferente do range pois permite neste


'caso o uso de uma varivel para endereamento da celula
W.Cells(x, 1).Value = Environ(x)
Next
End Sub

#Aula 24
Bloqueie o acesso a uma planilha da sua pasta de trabalho e
permita o acesso somente a pessoas autorizadas. Uso das funes:

ENVIRON

UOCASE (Converte texto em maisculas)

Private Sub Worksheet_Activate()


Application.ScreenUpdating = False
If UCase(Environ("username")) <> "FELIPEH" Then
Sheets("Plan1").Select
MsgBox "Usurio no autorizado para acessar esta planilha",
vbOKOnly, Ateno
End If
Application.ScreenUpdating = True
End Sub
Clicando sobre o menu ferramentas na janela do VBA - Propriedades de VBA
Project... Protect, possvel colocar senha no cdigo.

#Aula 25
ON ERROR - Tratamento de erros no VBA

On Error GoTo: Redireciona o cdigo de execuo aps o erro;

On Error Resume Next: Executa a prxima instruo, ignorando o


erro;

On Error GoTo 0: Desativa os desvios por erro.

Nas #Aula 21 e 22, quando foram feitos os programas de bloqueio e


desbloqueio das planilhas, ocorreu um inconveniente. Ao clicar para
desbloquear as planilhas e inserir a senha errada, o Excel retorna uma
mensagem de erro, com opo de depurao do cdigo.

Clicando em Depurar, localizamos onde o Erro est sendo gerado.

Private Sub btdesbloqueia_Click()


Dim Planilha
Dim Senha

As Variant
As String

Senha = InputBox("Digite uma senha para desbloqueio", "Ateno")


For Each Planilha In Sheets
On Error Resume Next
Planilha.Unprotect Password:=Senha
Next
'desliga o tratamento para voltar a aparecer os erros.
On Error GoTo 0
'MsgBox As planilhas foram desbloqueadas, vbOkOnly, Processo
'Concludo (este cdigo no faz sentido em caso de senha
'invlida).
End Sub
Private Sub btdesbloqueia_Click()
Dim Planilha
Dim Senha

As Variant
As String

Senha = InputBox("Digite uma senha para desbloqueio", "Ateno")

For Each Planilha In Sheets


On Error GoTo erro_codigo
Planilha.Unprotect Password:=Senha
Next
MsgBox As planilhas foram desbloqueadas, vbOkOnly, Processo
Concludo
Exit Sub
erro_codigo:
MsgBox Planilhas no desbloqueadas. Senha Invlida.
'Finaliza o cdigo, pois seno ele retorna para a prxima
'funo dentro do lao For
Exit Sub
End Sub
Caso queiramos que ao invs de finalizar o cdigo logo aps as MsgBox,
executar um outro cdigo, como por exemplo eliminar alguma varivel do
cdigo, ou qualquer outra coisa
Private Sub btdesbloqueia_Click()
Dim Planilha
Dim Senha

As Variant
As String

Senha = InputBox("Digite uma senha para desbloqueio", "Ateno")


For Each Planilha In Sheets
On Error GoTo erro_codigo
Planilha.Unprotect Password:=Senha
Next
MsgBox As planilhas foram desbloqueadas, vbOkOnly, Processo
Concludo
ponto_saida:
On Error Resume Next
Set W = Nothing
Exit Sub
erro_codigo:
MsgBox Planilhas no desbloqueadas. Senha Invlida.
Resume ponto_sada
End Sub

OBS.: Tentativas de conexo com bancos de dados utiliza-se


bastante a funo On Error.
O bom cdigo aquele que trata bem o seus erros, evitando
craches, que so fechamentos repentinos aps um erro devido a
uma falha no tratamento.

#Aula 26
Rotina para excluir registros de um cadastro.

Criao de Subs;

Comparao de valores com o If;

EntireRow.Delete para apagar uma linha inteira;

Saindo de um loop com o Exit Do.

Mtodo Range.PasteSpecial (Excel)

Sintaxe
expresso.PasteSpecial(Paste, Operation, SkipBlanks, Transpose)
expresso uma varivel que representa um objeto Range.
Obs.: O mtodo Activesheet.paste no utiliza uma expresso tipo range. Este mtodo cola na
seleo atual da planilha ativa.

Parmetros
Nome

Obrigatrio/opcion
al

Tipo de dados

Descrio

Paste

Opcional

XlPasteType

. A parte do
intervalo a ser
colada.

Operation

Opcional

XlPasteSpecialOperatio

. A operao de

colagem.

SkipBlank
s

Opcional

Variant

True para ter


clulas em branco
no intervalo na
rea de
Transferncia que
no deve ser colada
no intervalo de
destino. O valor
padro False.

Transpose

Opcional

Variant

True para transpor


linhas e colunas
quando o intervalo
colado.O valor
padro False.

XlPasteType enumerao (Excel)


Nome

Valo
r

Descrio

xlPasteAll

410
4

Tudo ser colado.

xlPasteAllExceptBorders

Tudo, exceto bordas ser colado.

xlPasteAllMergingConditionalF
ormats

14

Tudo ser colado e formatos


condicionais sero fundidos.

xlPasteAllUsingSourceTheme

13

Tudo ser colado usando o tema


de origem.

xlPasteColumnWidths

largura da coluna copiado


colado.

xlPasteComments

414
4

Comentrios so coladas.

xlPasteFormats

412
2

formato de origem copiado


colado.

xlPasteFormulas

412
3

Frmulas so coladas.

xlPasteFormulasAndNumberFo
rmats

11

Frmulas e formatos de nmero


so coladas.

xlPasteValidation

Validaes so coladas.

xlPasteValues

416
3

Os valores so colados.

xlPasteValuesAndNumberForm
ats

12

Valores e formatos de nmero so


coladas.

XlPasteSpecialOperation enumerao (Excel)


Nome

Valo
r

Descrio

xlPasteSpecialOperationA
dd

Os dados copiados ser adicionado


com o valor na clula de destino.

xlPasteSpecialOperationD
ivide

Os dados copiados vai ser dividido


com o valor na clula de destino.

xlPasteSpecialOperationM
ultiply

dados copiados ser multiplicado pelo


valor na clula de destino.

xlPasteSpecialOperationN
one

414
2

No clculo ser feito na operao de


colar.

xlPasteSpecialOperationS
ubtract

Os dados copiados ir ser subtrado ao


valor na clula de destino.

*A planilha desta aula esta na pasta de Macros e VBA

Ao lado esquerdo da janela de programao, temos os objetos do Excel, e


quando produzimos uma macro, temos os mdulos que so visveis a todos
os objetos.
Podemos criar uma sub com qualquer nome l (o nome deve iniciar com
letras maisculas), nesse caso se tornou necessrio atualizar a ComboBox
na abertura da planilha, na excluso de um cliente e na gravao de um
novo cliente. Neste caso, criamos uma nica sub, e chamamo-la de
qualquer parte do cdigo.
Sub InserirRegistros()
'
' InserirRegistros Macro
'
'
Application.ScreenUpdating = False
Range("C4:D4").Select
Selection.Copy
Sheets("Clientes").Select
Range("A1048576").Select
Selection.End(xlUp).Select
ActiveCell.Offset(1, 0).Select
ActiveCell.PasteSpecial Paste:=xlPasteValues
Sheets("Cadastro").Select
Range("C4:D4").Select

Application.CutCopyMode = False
Selection.ClearContents
Range("c4").Select
AtualizaCombo
MsgBox "Processo concludo...", vbOKOnly, "Concludo"
Application.ScreenUpdating = True

End Sub
Sub AtualizaCombo()
Application.ScreenUpdating = False
Dim W As Worksheet
Set W = Sheets("Clientes")
W.Select
W.Range("a2").Select
Sheets("Cadastro").ComboBox1.Clear
Do While ActiveCell.Value <> ""
Sheets("Cadastro").ComboBox1.AddItem ActiveCell.Value
ActiveCell.Offset(1, 0).Select
Loop
Sheets("Cadastro").Select
Application.ScreenUpdating = True
End Sub
Private Sub Workbook_Open()
'As subs so criadas para evitar duplicidades de programao
AtualizaCombo
End Sub

Private Sub btExcluir_Click()


Application.ScreenUpdating = False
Dim W As Worksheet
Dim Nome As String

Set W = Sheets("Clientes")
Nome = Sheets("Cadastro").ComboBox1.Value
If Nome = "" Then
MsgBox "Nenhum nome selecionado.Processo abortado"
Exit Sub
End If
W.Select
W.Range("a2").Select
Do While ActiveCell.Value <> ""
If ActiveCell.Value = Nome Then
ActiveCell.EntireRow.Delete
MsgBox "Registro apagado."
Exit Do
End If
ActiveCell.Offset(1, 0).Select
Loop
AtualizaCombo
Sheets("Cadastro").Select
Application.ScreenUpdating = True
End Sub

Mtodo ComboBox.AddItem

Sintaxe
expresso.AddItem(Item, Index)
expresso uma varivel que representa um objeto ComboBox.

Nom
e

Obrigatrio/opci
onal

Tipo de
dados

Descrio

Item

Obrigatrio

String

O texto para exibio do novo item.

Inde
x

Opcional

Variant

A posio do item na lista. Se esse


argumento for omitido, o item ser
adicionado ao final da lista.

ctrlComboBox.AddItem Item:=strItem, Index:=0


ctrlComboBox o nome atribudo a um objeto ComboBox;
strItem uma varivel String.

Este mtodo s ser vlido para controles de caixa de listagem ou de caixa


de combinao em formulrios.
Para listas com vrias colunas, use pontos-e-vrgulas para delimitar as cadeias de conexo
para cada coluna (por exemplo, "1010;vermelho;grande" para uma lista de trs colunas). Se
o argumento Item contiver menos cadeias de caracteres do que colunas no controle, os itens
sero adicionados comeando pela coluna mais esquerda. Se o argumento Item contiver
mais cadeias de caracteres do que colunas no controle, as cadeias de caracteres extras
sero ignoradas.
Use o mtodo RemoveItem para remover itens da lista de valores.

#Aula 27
Rotina para alterar registros de um cadastro.
Conceitos:

Comparao de valores com o IF;

Buscando registros para alterao;

Gravando os valores alterado.

Ao pressionar Shift + F2 com o cursor piscando sobre a linha de cdigo


AtualizaCombo, somos direcionados para a Sub que contm o cdigo
AtualizaCombo.

Sub InserirRegistros()
'
' InserirRegistros Macro
'
'
Application.ScreenUpdating = False

'Rotina de checagem
'Verificar se existe o cliente...
'Se existir atualizar os seus dados...
'----------------------------------------------Dim W As Worksheet
Dim WCad As Worksheet
Dim Nome As String
Set W = Sheets("Clientes")
Set WCad = Sheets("Cadastro")
Nome = Sheets("Cadastro").cmbBusca.Value
W.Select
W.Range("A2").Select
Do While ActiveCell.Value <> ""
If ActiveCell.Value = Nome Then
ActiveCell.Value = WCad.Range("c4").Value
ActiveCell.Offset(0, 1).Value = WCad.Range("D4").Value
MsgBox "Dados alterado com sucesso."
'Temos que selecionar um objeto de cada vez
WCad.Select
WCad.Range("C4").Select
AtualizaCombo
Exit Sub
End If
ActiveCell.Offset(1, 0).Select
Loop
'Gravao dos Dados (Novos)
'------------------------------------------------Range("C4:D4").Select
Selection.Copy
Sheets("Clientes").Select
Range("A1048576").Select
Selection.End(xlUp).Select
ActiveCell.Offset(1, 0).Select
ActiveCell.PasteSpecial Paste:=xlPasteValues

Sheets("Cadastro").Select
Range("C4:D4").Select
Application.CutCopyMode = False
Selection.ClearContents
Range("c4").Select
AtualizaCombo
MsgBox "Processo concludo...", vbOKOnly, "Concludo"
Application.ScreenUpdating = True
End Sub
Sub AtualizaCombo()
Application.ScreenUpdating = False
Dim W As Worksheet
Set W = Sheets("Clientes")
W.Select
W.Range("a2").Select
Sheets("Cadastro").ComboBox1.Clear
Sheets("Cadastro").cmbBusca.Clear
Do While ActiveCell.Value <> ""
Sheets("Cadastro").ComboBox1.AddItem ActiveCell.Value
Sheets("Cadastro").cmbBusca.AddItem ActiveCell.Value
ActiveCell.Offset(1, 0).Select
Loop
Sheets("Cadastro").Select
Application.ScreenUpdating = True
End Sub
Private Sub btBuscar_Click()
Application.ScreenUpdating = False
'Definir
Dim W As
Dim WCad
Dim Nome

variveis
Worksheet
As Worksheet
As String

Set W = Sheets("Clientes")
Set WCad = Sheets("Cadastro")

Nome = Sheets("Cadastro").cmbBusca.Value
W.Select
W.Range("A2").Select
'Percorre todas as clulas da planilha clientes
Do While ActiveCell.Value <> ""
'Testa para ver se a clula ativa a que possui o nome
procurado
If ActiveCell.Value = Nome Then
WCad.Range("C4").Value = ActiveCell.Value
WCad.Range("D4").Value = ActiveCell.Offset(0, 1).Value
Exit Do
End If
ActiveCell.Offset(1, 0).Select
Loop
WCad.Select
WCad.Range("C4").Select
Application.ScreenUpdating = True
End Sub

#Aula 28

Apagar dados em todas as planilhas;


Conceito: UsedRange

Ocultar todas as planilhas;


Conceito: Visible = True

Reexibir todas as planilhas ocultadas;


Conceito: Visible = False

Criar uma rotina que oculta e exibe planilhas. Posso utilizar, por exemplo,
nos casos onde o usurio clica em um boto e s exibida a planilha
necessria pra sua utilizao.
Criando a rotina OcultaPlanilhas sempre que retornarmos ao menu de
botes, essa rotina ativada. Quando clicar em algum boto, esse exibe
somente a planilha que ser utilizada.

Private Sub btApagaDados_Click()


'Para cada Planilha (vPlan) no conjuntp
'de planilhas (Sheets)
For Each vplan In Sheets
'Este comando no apaga linhas e colunas, ele apaga
'somente o contedo nas clulas em uso (UsedRange) na
planilha
If vplan.Name <> "Menu" Then
'Este comando no apaga linhas e colunas, ele apaga
'somente o contedo nas clulas em uso (UsedRange) na
planilha
vplan.UsedRange.ClearContents
'Para eliminar as clulas (eliminando as formataes e
tudo
'que existisse com elas) poderia usar:
'vplan.UsedRange.EntireColumn.Delete
End If
Next
MsgBox "Os dados foram apagados"
End Sub
Private Sub btExibePlanilhas_Click()
For Each vplan In Sheets
If vplan.Name <> "Menu" Then
'Exibir a planilha
vplan.Visible = True
End If
Next
End Sub
Private Sub btOcultaPlanilhas_Click()
For Each vplan In Sheets
If vplan.Name <> "Menu" Then
'Ocultar a planilha
vplan.Visible = False
End If
Next
End Sub
w.usedrange.entirecolumn.delete uma sugesto para caso no esteja apagando imagens.

#Aula 29

Procura de nomes duplicados em diversas planilhas;

Identeificar duplicidades em mais de uma planilha.


Conceito: Sheets.count, Sheets(x), Do While, For ... Next e If

Plan 1

Plan 2

Plan 3

Private Sub btProcura_Click()


Dim
Dim
Dim
Dim

W
UltCel
Nome
Planilha

As
As
As
As

Worksheet
Range
String
String

Set W = Sheets("Plan1")
W.Select
W.Range("b:b").EntireColumn.ClearContents
W.Range("b1").Value = "Aparece em:"
Range("a2").Select
'Loop Principal
'------------------'Objetivo: Percorrer a planilha principal de nomes
'Obs.: Importante NO ter linhas em branco entre os dados
'pois seno o cdigo dever ser adaptado
Do While ActiveCell.Value <> ""
'Verificar e guardar o nome procurado
Nome = ActiveCell.Value
'Guarda a ltima clula utilizada na planilha principal
Set UltCel = ActiveCell

'Estrutura de repetio que percorrer todas as planilhas


'em busca do nome
For a = 2 To Sheets.Count
'esta funo carrega a planilha de acordo com a
'ordem em que aparece neste caso "Plan1" a primeira,
'mas poderia ser qualquer outra. Bastaria aparecer em
'primeiro na ordem das planilhas.
Sheets(a).Select
ActiveSheet.Range("a2").Select
'Guardar o nome da planilha
Planilha = Sheets(a).Name
'Loop interno
'Que vai procurar o nome
Do While ActiveCell.Value <> ""
If ActiveCell.Value = Nome Then
'Seleciona a planilha principal
W.Select
'Verifica se h valor lanado na coluna B, acho
q s o comando
'no else j era suficiente, sem precisar checar
se ta vazio, mas
'vai assim mesmo.
If ActiveCell.Offset(0, 1).Value = "" Then
ActiveCell.Offset(0, 1).Value = Planilha
Sheets(a).Select
Exit Do
Else
ActiveCell.Offset(0, 1).Value =
ActiveCell.Offset(0, 1).Value & " / " & Planilha
End If
End If
ActiveCell.Offset(1, 0).Select
Loop
Next
W.Select
UltCel.Select
ActiveCell.Offset(1, 0).Select
Loop
End Sub

#Aula 30
Arranjos (n,2) dinmicos entre nmeros utilizando:

Contadores de controle;

Gravao de dados em outras colunas;

Do While;

For ... Next.

Private Sub btGeraVertical_Click()


Dim
Dim
Dim
Dim
Dim

W
UltCel
UltLin
Valor
A

As
As
As
As
As

Worksheet
Range
Range
Long Poderia ser string e usar letras tb
Integer

Set W = Sheets("Plan1")
W.Select
W.Range("a1").Select
'Vamos guardar o valor da primeira clula
'Na sequncia combinar esse valor com as
'demais clulas, uma por vez
'Guardar a ltima clula que foi feita combinaes
Set UltCel = ActiveCell
'Apagar os resultados anteriores
W.Range("c:C").EntireColumn.ClearContents
W.Range("C").Value = "Combinaes Vertical"
'Estrutura de repetio principal.
'Vai percorrer todos os valores para iniciar as combinaes
Do While ActiveCell.Value <> ""
'Guardar valor da clula principal
Valor = ActiveCell.Value
'Repetir as combinaes entre Valor (varivel)
'e os demais nmeros da coluna. A funo
'Application.WorksheetFunction.CountA(W.Range("a:a"))
'equivalente a funo contar valores.
For A = 1 To
Application.WorksheetFunction.CountA(W.Range("a:a"))

'Seleciona a clula para a gravao da combinao


W.Cells(A, 1).Select
Set UltLin = W.Range("c1048576").End(xlUp).Offset(1, 0)
'Checa se a clula ativa tem valor igual da ultima
clula
'Se for diferente, grava a combinao na coluna C.
If ActiveCell.Value <> UltCel.Value Then
'UltLin.Row retorna o nmero coreespondente a linha
'da clula armazenada na varivel UltLin
W.Range("C" & UltLin.Row).Value = "'" & Valor & " /
" & ActiveCell.Value
'Se for diferente, desce para a prxima linha
Else
ActiveCell.Offset(1, 0).Select
End If
Next
UltCel.Offset(1, 0).Select
Set UltCel = ActiveCell
Loop
End Sub
Propriedade Application.WorksheetFunction (Excel)
Retorna o objeto WorksheetFunction. Somente leitura.

Sintaxe
expresso.WorksheetFunction
expresso Uma varivel que representa um objeto Application.
Este exemplo exibe o resultado da aplicao da funo de planilha Min ao
intervalo A1:A10.
Set myRange = Worksheets("Sheet1").Range("A1:C10")
answer = Application.WorksheetFunction.Min(myRange)
MsgBox answer

Objeto WorksheetFunction (Excel)


Usado como um continer para as funes de planilha do Microsoft Excel que
podem ser chamadas do Visual Basic. Contm todas as funes do Excel.
Este exemplo usa a funo de planilha CountA para determinar quantas clulas
da coluna A contm um valor. Para este exemplo, os valores da coluna A devem
ser texto. Este exemplo faz uma verificao ortogrfica em cada valor da coluna

A e, se o valor for escrito incorretamente, insere o texto "Incorreto" na coluna B;


caso contrrio, ele insere o texto "OK" na coluna B.
Sub StartSpelling()
Dim iRow As Integer
On Error GoTo ERRORHANDLER
For iRow = 1 To WorksheetFunction.CountA(Columns(1))
If Application.CheckSpelling( _
Cells(iRow, 1).Value, , True) = False Then
Cells(iRow, 2).Value = "Wrong"
Else
Cells(iRow, 2).Value = "OK"
End If
Next iRow
Exit Sub
ERRORHANDLER:
MsgBox "The spell check feature is not installed!"
End Sub

#Aula 31 Pulei esta aula


Arranjos (p,p) dinmicas entre nmeros utilizando:

Contadores de controle;

Gravao de dados em outras colunas;

Do While;

For ... Next.

#Aula 32
Utilizar funes do Excel diretamente no cdigo

Application.WorksheetFunction;

Funo VlokUp (procv);

Dicas de uso / Recomendaes;

Private Sub btExecuta_Click()


Dim UltCel As Range
Dim W As Worksheet
Set W = Sheets("ProcV")
W.Select
W.Range("H2").Select
Set UltCel = W.Range("f1048576").End(xlUp)
Do While ActiveCell.Row <= UltCel.Row
'-----------------------------------------------------'
Observe que ele no escreve a frmula na clula,
'mas somente o resultado.
'
O espao seguido do _ permite a quebra da do texto.
'
Quando fazemos via Excel, copiando a frmula para
'baixo, o Excel demora mais executar todas as frmulas.
'
Quando feito dessa maneira, com VBA, muito mais
'rpido.
'-----------------------------------------------------ActiveCell.Value = Application.WorksheetFunction.VLookup( _
W.Range("g" & ActiveCell.Row).Value, _
W.Range("A1:C13"), 2, 0)
ActiveCell.Offset(1, 0).Select
Loop
End Sub

Outra maneira:
Private Sub btSegundaForma_Click()
Dim UltCel As Range
Dim W As Worksheet
Dim A As Integer
Set W = Sheets("ProcV")
W.Select
For A = 1 To 2
If A = 1 Then
W.Range("H2").Select
Else
W.Range("I2").Select
End If
Set UltCel = W.Range("f1048576").End(xlUp)
Do While ActiveCell.Row <= UltCel.Row
ActiveCell.Value =
Application.WorksheetFunction.VLookup( _
W.Range("g" & ActiveCell.Row).Value, _
W.Range("A1:C13"), A + 1, 0)
ActiveCell.Offset(1, 0).Select
Loop
Next
End Sub

#Aula 33
Funes do Excel diretamente no cdigo.

Mximo (MAX)

Mnimo (MIN)

Mdia (AVERAGE)

Cont.Valores (COUNTA)

Cont.Nm (COUNT)

ContarVazio (COUNTBLANK)

Maior (LARGE)

Menor (SMALL)

1
2
3
4
5
6
7
8
9
10

A
AMOSTRA 1
0,220
0,361
0,621
0,718
0,629
0,529
0,082
0,927
0,240

B
AMOSTRA 2
0,261
0,587
Erro
Erro
0,142
0,242
0,326
0,642
0,406

C
AMOSTRA 3
0,668
0,797
0,142
0,488

0,895
0,674

D
AMOSTRA 4
0,659
0,493
0,171
0,584
0,995
0,861
0,075
0,859
0,573

Private Sub btResolver_Click()


Dim Dados As Range
Dim W As Worksheet
Set W = Sheets("Estatstica")
W.Select
Set Dados = W.Range("a2:d10")
'Funo MXIMO
W.Range("F2").Value = Application.WorksheetFunction.Max(Dados)
'Funo MNIMO
W.Range("F6").Value = Application.WorksheetFunction.Min(Dados)
'Funo MDIA
W.Range("F10").Value =
Application.WorksheetFunction.Average(Dados)
'Funo CONT.VALORES (Qualquer contedo inserido numa clula
'considerado valor)
W.Range("H2").Value =
Application.WorksheetFunction.CountA(Dados)
'Funo CONT.NM
W.Range("H6").Value = Application.WorksheetFunction.Count(Dados)
'Funo CONTAR.VAZIO
W.Range("H10").Value =
Application.WorksheetFunction.CountBlank(Dados)
'Funo MAIOR (x, y)
W.Range("J2").Value = Application.WorksheetFunction.Large(Dados,
5)

'Funo MENOR (x, y)


W.Range("J6").Value = Application.WorksheetFunction.Small(Dados,
28)
End Sub

#Aula 34
Planilha que corrige automaticamente exerccios feitos.

Conceitos aula passada;


ActiveCell.Interior.Color = RGB (255,0,0)
pinta de vermelho

#Aula 35
Planilha que corrige automaticamente exerccios feitos.

Funo SUM (soma) no VBA;


Vrias formas diferentes de aplicar a funo;
Utilizando gravador de macros para aprendizado;
Frmulas padro R1C1
Copiar e colar as funes inseridas na clula (VBA)

Private Sub btresolver_Click()


Dim W As Worksheet
Dim UltCel As Range
Set W = Sheets("Somatria")
W.Select
W.Range("a6").Select
ActiveCell.Value =
Application.WorksheetFunction.Sum(W.Range("a1:a5"))
W.Range("o1").Select
ActiveCell.Value =
Application.WorksheetFunction.Sum(W.Range("c1:n1"))
W.Range("c11").Select
Set UltCel = W.Range("c1048576").End(xlUp)
ActiveCell.Value = Application.WorksheetFunction.Sum _
(W.Range("C3:f" & UltCel.Row))
Range("L3:L46").Select
'Observe que como as referncias de clulas so relativas
'ele referencia os valores a serem somados em forma de distancia
'Sua Sintaxe melhor descrita:
'R[n1]C[n2]:R[n1]C[n2], se n for omitido ser zero
Selection.FormulaR1C1 = "=SUM(RC[-2]:RC[-1])"

Range("L3").Select
End Sub

#Aula 36
Funes do Excel diretamente no cdigo.

ESQUERDA (Left)

DIREITA (Right)

EXT.TEXTO (Mid)

ARRUMAR (Trim)

MAISCULA (Ucase)

MINSCULA (Lcase)

Private Sub CommandButton1_Click()


Dim W As Worksheet
Set W = Sheets("Plan1")
W.Select
'Extrair textos a esquerda
'-----------------------------------

'Funo ESQUERDA
W.Range("a9").Value = Left(W.Range("a2").Value, 6)
W.Range("B9").Value = "Left"
'Extrair textos a direita
'----------------------------------'Funo DIREITA
W.Range("a10").Value = Right(W.Range("a3").Value, 8)
W.Range("b10").Value = "Right"
'
Retirar espaos desnecessrios (somente Antes e Depois do
texto).
'------------------------------------------------------------------------'
Diferente da funo ARRUMAR que retira excesso espao entre as
palavras.
'
Se chamarmos a funo diretamente do aplicativo Excel, a ela
identica
'a funo ARRUMAR, retirando tambm espaos intermedirios.
'
W.Range("a11").Value = Trim(W.Range("a4").Value)
W.Range("a11").Value =
Application.WorksheetFunction.Trim(W.Range("a4").Value)
W.Range("b11").Value = "Trim"
'Converter em maiscula
'----------------------------------'Funo MAISCULA
W.Range("a12").Value = UCase(W.Range("a5").Value)
W.Range("b12").Value = "UCase"
'Converter em minscula
'----------------------------------'Funo MINSCULA
W.Range("a13").Value = LCase(W.Range("a6").Value)
W.Range("b13").Value = "LCase"
'Extrair texto
'----------------------------------'Funo EXT.TEXTO
W.Range("a14").Value = Mid(W.Range("a7").Value, 8, 3)
W.Range("b14").Value = "Mid"
End Sub

#Aula 37

Criar formulrios;

Iniciando formulrio com um boto;

Iniciando formulrio com uma tecla de atalho;

Iniciando formulrio ao abrir uma planilha;

Application.Onkey definio de teclas de atalho

Formulrios devem ser inseridos. Clicando em Inserir UserForm.


Os formulrios no so de janelas redimensionveis e j devem ser criados
no tamanho a ser utilizado.

Private Sub btExecuta_Click()


frmMenu.lblNome.Caption = "Hello World!"
End Sub

Private Sub btLimpar_Click()


frmMenu.lblNome.Caption = ""
End Sub

Private Sub btSair_Click()


Unload Me
End Sub

Private Sub Workbook_Open()


'OnKey associa um comando, substitui
'esse comando caso ja esteja em uso, e
'chama um procedimento que criamos nos
'mdulos.
Application.OnKey "{F3}", "MostrarForm"
End Sub

Sub MostrarForm()
frmMenu.Show
End Sub

Private Sub btCarrega_Click()


frmMenu.Show
End Sub

#Aula 38
Como trabalhar com uma caixa de combinao (parte 1).

Inserindo dados por cdigo

Inserindo dados pela propriedade do objeto

Apagar dados de uma caixa de combinao

Atualizao da caixa na abertura de um formulrio

Private Sub UserForm_Activate()


Dim W As Worksheet
Set W = Sheets("Plan1")
W.Select
W.Range("a2").Select
'Estrutura de repetio
'Do While
'Apaga os dados anteriores da caixa de combinao
frmUH.cmbUH.Clear
Do While ActiveCell.Value <> ""
'Verificar o valor da clula ativa
'e cadastra-lo na caixa de combinao
frmUH.cmbUH.AddItem ActiveCell.Value
ActiveCell.Offset(1, 0).Select
Loop

End Sub

Caso no seja uma lista dinmica, caso a lista seja esttica e nunca altere a
quantidade de itens, posso inserir os dados diretamente nas Propriedades
do Objeto, em RowSource.

#Aula 39
Como trabalhar com uma caixa de combinao (parte 2).

Exibindo informaes em rtulos com base no item


selecionado

Neste contexto temos duas ComboBox, e cada uma alimentada de uma


maneira. Observe o formulrio e as propriedades de cada ComboBox.

Formulrio

Propriedades da ComboBox cmbUH.

Propriedades da ComboBox cmbUH2.


Os programas criados tambm foram diferentes:
Private Sub cmbUH_Change()
'O evento change engloba qualquer mudaa, como,

'por exemplo, selecionar outro item da caixa


Dim W As Worksheet
Set W = Sheets("Plan1")
W.Range("a2").Select
Do While ActiveCell.Value <> ""
If frmUH.cmbUH.Value = ActiveCell Then
frmUH.lblEstado.Caption = ActiveCell.Offset(0, 1).Value
Exit Do
End If
ActiveCell.Offset(1, 0).Select
Loop
End Sub
Private Sub cmbUH2_Change()
'
Como a cmbUH2 foi alimentada em suas propriedades
'podemos buscar diretamente nela um valor.
'
Atribuimos a ela duas colunas e podemos extrair
'qualquer dado, informando a coluna
frmUH.lblEstado2.Caption = frmUH.cmbUH2.Column(1)
End Sub
Programas criados para o boto Sair e para a ativao do formulrio.
Private Sub btSair_Click()
Unload Me
End Sub

Private Sub UserForm_Activate()


Dim W As Worksheet
Set W = Sheets("Plan1")
W.Select
W.Range("a2").Select
'Estrutura de repetio
'Do While
'Apaga os dados anteriores da caixa de combinao
frmUH.cmbUH.Clear
Do While ActiveCell.Value <> ""
'Verificar o valor da clula ativa
'e cadastra-lo na caixa de combinao
frmUH.cmbUH.AddItem ActiveCell.Value

ActiveCell.Offset(1, 0).Select
Loop
End Sub

Resultado

#Aula 40
Caixa de seleo (checkbox).

Uso do recurso With / End With;

Capturando resultados das caixas de seleo;

Voltando a execuo da depurao para uma linha anterior


Basta arrastar aquela setinha para cima.

Private Sub CheckBox1_Click()


UserForm1.lblC1.Caption = UserForm1.CheckBox1.Value
End Sub
Private Sub CheckBox2_Click()
UserForm1.lblC2.Caption = UserForm1.CheckBox2.Value
End Sub
Private Sub CommandButton1_Click()
Dim Nome As String
Dim Opc1 As Boolean
Dim Opc2 As Boolean
Nome = UserForm1.TextBox1.Text
Opc1 = UserForm1.CheckBox1.Value
Opc2 = UserForm1.CheckBox2.Value
'O with permite faz com que eu no precise escrever
'o ActiveSheet em cada comando, ele faz isso por mim.
With ActiveSheet 'Poderia ser Sheets ("Plan2") por exemplo
'mas nesse caso daria errado se no
selecionssemos
'a plan 2 antes como no comentrio a seguir
.Range("a1").Value = "Nome"
.Range("b1").Value = "Estuda?"
.Range("c1").Value = "Trabalha?"

.Range("a2").Value = Nome
.Range("b2").Value = Opc1
.Range("c2").Value = Opc2
'.select
.Range("a1").Select
End With
End Sub

#Aula 41 Pulei esta aula, mas interessante


Boto de Opo.

Boto de Opo ( possvel limp-los atribuindo o


.value=false);

Capturando o retorno do boto;

Agrupando controles com a caixa de Grupo.

#Aula 42
Boto de Ativao ou Toggle Button

Como utilizar;

Criando rotinas de formatao na clulas com o Toggle


Button;

Retorno do Boto de Ativao;

Aplicar formatao a partir de uma clula ou seleo;

Ocultando e exibindo controles com o Boto de Ativao.

Aquele comando UserForm1.Show possui um parmetro. Por exemplo,


quando quero que seja possvel mexer nas clulas enquanto o formulrio
estiver sendo executado utilizamos:
UserForm1.Show vbModeless
Para ocultar botes basta:
NomedoBoto.Visible = False

#Aula 45
Caixa de Listagem ou ListBox

Como trabalhar com a caixa de listagem;

Adicionando uma coluna de dados;

Adicionando mais de uma coluna de dados.

O BoundColumn refere-se a qual coluna servir como referncia para


retorno de valores de acordo com o cdigo:
ActiveSheet.Range("d1").Value = _
Me.ListBox1.Value

As duas alternativas para cdigo so:


Private Sub Gravar_Click()
ActiveSheet.Range("d1").Value = _
Me.ListBox1.Value
ActiveSheet.Range("d2").Value = _
Me.ListBox1.Column(0)
End Sub
Private Sub Gravar_2_Click()

Podemos tambm ter um listbox de mltiplas selees, modificando a


propriedade MultiSelect.
O cdigo a seguir capta essas selees e armazena os valores de ambas as
coluna em clulas do Excel.
Dim W As Worksheet
Dim i As Integer
Dim Ln As Integer
Set W = Sheets("Plan1")
i = 0
Ln = 7
'
A propriedade ListCount mostra quantas linhas
'existem dentro da listbox;
'
O -1 foi usado porque a contagem comea
'em zero.
For i = 0 To Me.ListBox2.ListCount - 1
'O Selected verifica se est selecionado a linha i
'da lista.
If Me.ListBox2.Selected(i) Then
'O mtodo list vai listar, retornando o item
'da lista presente na (linha, coluna) especificada
W.Cells(Ln, 4).Value = Me.ListBox2.List(i, 0)
W.Cells(Ln, 5).Value = Me.ListBox2.List(i, 1)
Ln = Ln + 1
End If
Next
End Sub

Existe um cdigo para adicionar itens a listbox:


Me.LisBox1.AddItem Felipe

#Aula 46
Controle TabStrip.

O que o TabStrip;

Combinando controles de formulrio em uma TabStrip;

Propriedades do Controle: ColumnCount, ColumnWidht,


RowSource;

Compilao do cdigo VBA (clique em Depurar - Compilar


VBAProject) e qualquer erro ser acusado.

O TabStrip como uma MultiPage, porm os controles de formulrios so


compartilhados pra todas as pginas, no entanto possvel configurar de
maneira diferente cada controle dependendo da aba da TabStrit
selecionada, de acordo com o retorno desta aba selecionada.
Lembrando que as abas do TabStrit no possuem caption, e devem ser
renomeadas clicando com o boto direito-Renomear.

Private Sub TabStrip1_Change()


'Essa uma funo semelhante ao Switch Case da linguagem c
Select Case TabStrip1.Value
Case 0
Me.ListBox1.RowSource = _
Sheets("Plan1").Range("a1:b14").Address
Case 1
Me.ListBox1.RowSource = _
Sheets("Plan1").Range("d1:d14").Address

End Select
End Sub
Private Sub UserForm_Activate()
Me.ListBox1.ColumnCount = 2
Me.ListBox1.ColumnWidths = "25pt;100pt"
TabStrip1_Change 'Poderia usar o call
End Sub

Mudando de assunto:
PROCEDIMENTOS SUB: Executam diversos mtodos.
Damos um nome e abrimos e fechamos parnteses, dentro dos
quais podemos inserir os argumentos.
PROCEDIMENTOS FUNCTION: So frmulas. Executam uma funo e
retornam um nico valor. Dessa maneira, podemos criar funes que
ficaro disponveis para uso na planilha.
Ex:
Function QUARTA_POT (x As Interger)
QUARTA_POT = x ^ 4
End Function
Em ambos os procedimentos o nome dado pode conter letras e nmeros,
mas devem ser iniciados sempre com letras. No aceita espaos nem
pontos. No distingue minsculas de maisculas. Os nomes devem
conter no mximo 255 caracteres (1 byte). Os caracteres #$%@!^ no
so aceitos.
Quando chamamos uma sub, supondo que essa sub realiza um clculo,
logo devemos configurar essa sub pra receber o parmetro que
armazenar o valor informado quando fizermos a chamada dessa sub.
Esse valor informado ser o argumento, que requisitado justamente
porque foi definido o parmetro.

Parmetros e
argumentos de
procedimento (Visual
Basic)
Um parmetro representa um valor que o procedimento espera que voc fornea
quando voc o chama. A declarao do procedimento define os seus parmetros.
Voc pode definir um procedimento sem parmetros, um parmetro, ou mais de
um.
Um argumento representa o valor que voc fornece para um parmetro do
procedimento, quando voc chama o procedimento O cdigo de chamada fornece
os argumentos quando chama o procedimento. A parte da chamada de
procedimento que especifica os argumentos chamada alista de argumentos.
A ilustrao a seguir mostra o cdigo para chamar o
procedimento safeSquareRoot em dois locais diferentes. A primeira chamada
passa o valor da varivel x (4.0) para o parmetro numbere o valor de retorno
de root (2.0) atribudo varivel y. A segunda chamada passa o valor literal 9.0
paranumbere atribui o valor de retorno (3.0), a varivel z.

Passar um argumento para um parmetro

Um parmetro permite que o cdigo passe um valor ao procedimento quando ele o


chama.

Passagem por valor


Voc passa um argumento por favor especificando a palavra-chave ByVal (Visual
Basic) para o parmetro correspondente na definio do procedimento. Quando
voc usa este mecanismo de passagem, o Visual Basic copia o valor do elemento de
programao oculto numa varivel local do procedimento. O odigo do
procedimento no tem nenhum acesso ao elemento no cdigo de chamada.

Passagem por referncia


Voc passa um argumento por referncia especificando a palavra-chave ByRef
(Visual Basic) para o parmetro correspondente na definio do
procedimento. Quando voc usa esse mecanismo de passagem, o Visual Basic d
ao procedimento uma referncia direta ao elemento oculto no cdigo de chamada.

ByVal (Visual Basic)


Especifica que um argumento passado de tal forma que o procedimento ou
propriedade chamado no pode alterar o valor de uma varivel subjacente ao
argumento no cdigo de chamada.

Module Module1
Sub Main()
' Declarar uma instncia da classe e atribuir um valor para o
seu campo.
Dim c1 As Class1 = New Class1()
c1.Field = 5
Console.WriteLine(c1.Field) ' Tipo printf
' Output: 5
' O ByVal no impede a alterao do valor de um campo ou
qualquer propriedade.
ChangeFieldValue(c1)
Console.WriteLine(c1.Field)
' Output: 500
' ByVal impede a alterao do valor de c1.

ChangeClassReference(c1)
Console.WriteLine(c1.Field)
' Output: 500
Console.ReadKey()
End Sub
Public Sub ChangeFieldValue(ByVal cls As Class1)
cls.Field = 500
End Sub
Public Sub ChangeClassReference(ByVal cls As Class1)
cls = New Class1()
cls.Field = 1000
End Sub
Public Class Class1
Public Field As Integer
End Class
End Module

ByRef (Visual Basic)


Especifica que um argumento passado de tal forma que o procedimento chamado
pode alterar o valor de uma varivel subjacente ao argumento no cdigo de
chamada.

Para definir um parmetro de


procedimento
1. Na declarao de procedimento, adicione o nome de parmetro lista de
parmetros do procedimento, separando-o de outros parmetros por
vrgulas.
2. Decida o tipo de dados do parmetro.
3. Siga nome do parmetro com uma clusula As para especificar o tipo de
dados.
4. Decida o mecanismo passante que voc deseja para o
parmetro. Normalmente voc passa um parmetro por valor, a no ser que
voc deseje que o procedimento seja capaz de alterar seu valor no cdigo de
chamada.

5. Preceda o nome de parmetro por ByVal (Visual Basic) ou ByRef (Visual


Basic) para especificar o mecanismo passante.
6.

Se o parmetro for opcional, preceda o mecanismo passante por Optional


(Visual Basic) e siga o tipo de dados do parmetro por um snal de igual (=) e
um valor padro.

O exemplo a seguir define linhas gerais de um procedimento Sub com trs


parmetros. Os dois prmeiros so exigidos e o terceiro opcional.As
declaraes de parmetro so separadas na lista de parmetros por vrgulas.

Sub updateCustomer(ByRef c As customer, ByVal region As String,


Optional ByVal level As Integer = 0)
' Insira cdigo para atualizar um objeto personalizado.
End Sub

Capacidade de Modificar
Quando voc passa um elemento no-modificvel como argumento, o procedimento
nunca pode modific-lo no cdigo de chamada, se passado ByVal ou ByRef.
Para um elemento modificvel, a seguinte tabela resume a interao entre o tipo de
elemento e o mecanismo de passagem.

Tipo de elemento

Passado ByVal

Passado ByRef

Tipo de valor
(contm apenas um
valor)

O procedimento no pode
mudar a varivel ou qualquer
um dos seus membros.

O procedimento pode
mudar a varivel e seus
membros.

Tipo de referncia
(contm um ponteiro
para a instncia de
classe ou estrutura).

O procedimento no pode
mudar a varivel mas pode
mudar membros da instncia
para qual ele aponta.

O procedimento pode
mudar a varivel e mudar
membros da instncia para
qual ele aponta.

Elementos modificvel e No-modificvel


Um elemento de programao pode ser tanto um elemento modificvel, o qual
pode ter seu valor alterado, ou um elemento no modificvel, que tem um valor fixo
aps ele ter sido criado.
A tabela a seguir lista elementos de programao modificveis e no modificveis.

Elementos modificveis

Elementos no modificveis

Variveis locais (declaradas dentro de


procedimentos), incluindo variveis de objeto,
exceto para somente leitura

Variveis somente-leitura,
campos e propriedades

Campos (membro variveis de mdulos, classes e


estruturas), exceto para somente leitura

Literais e constantes

Propriedades, exceto para somente leitura

Membros de enumerao

Elementos da matriz

Expresses (mesmo se seus


elementos so modificveis)

Um argumento modificvel um com um elemento subjacente


modificvel. O cdigo de chamada pode armazenar um novo valor a
qualquer momento, e se voc passar o argumento ByRef (Visual
Basic), o cdigo no procedimento tambm pode modificar o elemento
subjacente no cdigo de chamada.
Um argumento no modificvel quer tem um elemento subjacente no
modificvel ou passado ByVal (Visual Basic). O procedimento no
pode modificar o elemento subjacente no cdigo de chamada, mesmo
que seja um elemento modificvel. Se um elemento no modificvel,
o prprio cdigo de chamada no pode modific-lo.

O procedimento chamado pode modificar a sua cpia local de um


argumento no modificvel, mas que a modificao no afeta o
elemento subjacente no cdigo de chamada.
Mais informaes na documentao oficial no site de VB.