Você está na página 1de 226

Excel 2016 VBA - Módulo II

Excel 2016 VBA -


Módulo II

COD.: TE 1797/2
Excel 2016 VBA -
Módulo II
Créditos

Copyright © Monte Everest Participações e Empreendimentos Ltda.

Todos os direitos autorais reservados. Este manual não pode ser copiado, fotocopiado,
reproduzido, traduzido ou convertido em qualquer forma eletrônica, ou legível por
qualquer meio, em parte ou no todo, sem a aprovação prévia, por escrito, da Monte
Everest Participações e Empreendimentos Ltda., estando o contrafator sujeito a responder
por crime de Violação de Direito Autoral, conforme o art.184 do Código Penal Brasileiro,
além de responder por Perdas e Danos. Todos os logotipos e marcas utilizados neste
material pertencem às suas respectivas empresas.

“As marcas registradas e os nomes comerciais citados nesta obra, mesmo que não sejam assim identificados,
pertencem aos seus respectivos proprietários nos termos das leis, convenções e diretrizes nacionais e
internacionais.”

Excel 2016 VBA -


Módulo II
Coordenação Geral Revisão Ortográfica e Gramatical
Marcia M. Rosa Cristiana Hoffmann Pavan

Coordenação Editorial Diagramação


Henrique Thomaz Bruscagin Carla Cristina de Souza

Autoria
Leonardo de Oliveira Costa Edição nº 1 | 1797_2_WEB
julho/ 2016

Este material constitui uma nova obra e é uma derivação da seguinte obra original,
produzida por TechnoEdition Editora Ltda., em Out/2013: Excel VBA – Módulo II
Autoria: Beatriz Silva Ramos
Sumário

Informações sobre o treinamento........................................................................................ 8

Capítulo 1 - A linguagem SQL ................................................................................................ 9


1.1.  Introdução ............................................................................................10
1.2.  Visão geral da linguagem SQL................................................................ 11
1.3.  Conceitos do SQL...................................................................................12
1.3.1.  Tabela....................................................................................................12
1.3.2.  Campo...................................................................................................13
1.3.3.  Registro.................................................................................................14
1.3.4.  Banco de dados......................................................................................14
1.3.5.  Base de dados........................................................................................15
1.3.6.  Sistema de Gerenciamento de Banco de Dados.......................................15
Pontos principais ................................................................................................ 16
Teste seus conhecimentos ..................................................................................................... 17

Capítulo 2 - Consultas SQL ..................................................................................................... 23


2.1.  Introdução.............................................................................................24
2.2.  O que é uma consulta SQL..................................................................... 24
2.3.  A cláusula SELECT..................................................................................25
2.4.  A cláusula FROM....................................................................................26
2.4.1.  Exibindo algumas colunas usando alias.................................................. 28
2.4.2.  Criando uma coluna virtual.................................................................... 30
2.5.  A cláusula WHERE...................................................................................30
2.5.1.  Trabalhando com critérios – Operadores AND e OR................................31
2.5.2.  Operadores na cláusula WHERE.............................................................. 32
2.5.2.1. Operador BETWEEN................................................................................32
2.5.2.2. Operador LIKE e os curingas.................................................................. 33
2.5.2.3. Operador IN...........................................................................................33
2.6.  A cláusula ORDER BY..............................................................................34
2.6.1.  A palavra-chave DESC.............................................................................35
2.6.2.  A instrução TOP.....................................................................................36
2.7.  A cláusula DISTINCT...............................................................................37
2.8.  A cláusula GROUP BY..............................................................................37
2.9.  A cláusula HAVING.................................................................................39
2.10.  Relacionamentos entre tabelas - INNER JOIN...........................................39
2.11.  A cláusula UNION ALL............................................................................41
Pontos principais................................................................................................. 42
Teste seus conhecimentos ..................................................................................................... 43
Mãos à obra! .................................................................................................................................. 47

Capítulo 3 - DAO – Data Access Object ............................................................................. 53


3.1.  Introdução.............................................................................................54
3.2.  Modelo de objetos DAO......................................................................... 55
3.3.  Importando dados de uma base Access.................................................. 57
3.3.1.  Configurações iniciais............................................................................57
3.3.2.  Construindo o código VBA..................................................................... 60
Pontos principais................................................................................................. 67
Teste seus conhecimentos ..................................................................................................... 69
Mãos à obra! .................................................................................................................................. 73
Excel 2016 VBA - Módulo II

Capítulo 4 - Importando dados de um arquivo XLS .................................................... 75


4.1.  Introdução ............................................................................................76
4.2.  Preparando o ambiente.......................................................................... 76
4.3.  Construindo a rotina..............................................................................78
Pontos principais................................................................................................. 82
Teste seus conhecimentos ..................................................................................................... 83
Mãos à obra! .................................................................................................................................. 87

Capítulo 5 - ADO - ActiveX Data Objects ......................................................................... 89


5.1.  Introdução.............................................................................................90
5.2.  O objeto Connection ADO...................................................................... 90
5.2.1.  Especificando um provedor OLE DB e uma string de conexão.................91
5.3.  Importando dados de uma base Access.................................................. 93
5.3.1.  Configurações iniciais............................................................................93
5.3.2.  Código VBA – String de conexão............................................................ 95
5.3.3.  Código VBA – Objeto Recordset.............................................................. 96
5.3.3.1. Propriedades e métodos do objeto Recordset.........................................100
Pontos principais................................................................................................. 105
Teste seus conhecimentos ..................................................................................................... 107
Mãos à obra! .................................................................................................................................. 111

Capítulo 6 - Inserindo, editando e excluindo dados .................................................. 113


6.1.  Preparando o ambiente.......................................................................... 114
6.2.  INSERT...................................................................................................116
6.3.  UPDATE ................................................................................................119
6.4.  DELETE .................................................................................................124
Pontos principais................................................................................................. 130
Teste seus conhecimentos ..................................................................................................... 131
Mãos à obra! .................................................................................................................................. 135

Capítulo 7 - Importando dados de um arquivo TXT ................................................... 139


7.1.  Introdução ............................................................................................140
7.2.  Preparando o ambiente.......................................................................... 140
7.3.  Construindo a rotina..............................................................................141
7.4.  Atribuindo a rotina a um controle de formulário....................................145
Pontos principais................................................................................................. 148
Teste seus conhecimentos ..................................................................................................... 149
Mãos à obra! .................................................................................................................................. 153

Capítulo 8 - Inserindo gráficos em formulários ............................................................ 155


8.1.  Introdução ............................................................................................156
8.2.  Preparando o gráfico..............................................................................156
8.3.  O formulário de controle........................................................................ 157
8.4.  O formulário Gráfico..............................................................................161
Pontos principais................................................................................................. 165
Teste seus conhecimentos ..................................................................................................... 167
Mãos à obra! .................................................................................................................................. 171

6
Sumário

Capítulo 9 - Programando com o objeto FSO (File System Object) ....................... 175
9.1.  Introdução ............................................................................................176
9.2.  Interagindo com arquivos texto............................................................. 178
9.2.1.  Criando, adicionando dados e fechando um arquivo texto.....................178
9.2.2.  Abrindo um arquivo texto e trazendo dados para a planilha...................181
9.2.3.  Adicionando registros a um arquivo TXT................................................ 183
9.3.  Acessando drives, diretórios e arquivos................................................. 183
9.4.  Propriedades do objeto Drive................................................................. 188
9.5.  Propriedades e métodos do objeto Folder.............................................. 189
9.6.  Propriedades e métodos do objeto File.................................................. 191
Pontos principais................................................................................................. 193
Teste seus conhecimentos ..................................................................................................... 195
Mãos à obra! .................................................................................................................................. 199

Capítulo 10 - Criando e manipulando classes ................................................................ 205


10.1.  Programação orientada a objeto............................................................. 206
10.2.  Conceito de classe de objetos................................................................ 207
10.2.1.  Classe....................................................................................................207
10.2.2.  Objeto...................................................................................................207
10.2.3.  Coleções................................................................................................208
10.2.4.  Parent e Child........................................................................................209
10.2.5.  Propriedades, métodos e eventos........................................................... 209
10.3.  Criando uma propriedade...................................................................... 210
10.4.  Criando um método...............................................................................214
Pontos principais................................................................................................. 217
Teste seus conhecimentos ..................................................................................................... 219
Mãos à obra! .................................................................................................................................. 223

7
Informações sobre este treinamento

Para o melhor aproveitamento do curso Excel 2016 VBA


– Módulo II, é imprescindível ter participado do curso
Excel 2016 VBA – Módulo I, ou possuir conhecimentos
equivalentes.

8
A linguagem SQL
1
99 Visão geral da linguagem SQL;
99 Conceitos do SQL.
Excel 2016 VBA - Módulo II

1.1. Introdução
A linguagem SQL e uma conexão com a fonte de dados nos permitem usar o
Excel como front-end, tornando possível uma interatividade entre ele e uma
base de dados.

É interessante enfatizarmos algumas características básicas e vantajosas do


SQL, como a velocidade. É mais rápido somar os valores de itens vendidos,
por exemplo, utilizando o SQL que uma clássica rotina de acúmulos. Outra é
a legibilidade de código, pois um programa que usa rotinas SQL para realizar
tarefas é de manutenção mais fácil: simples de ler, entender, manter e mudar
se preciso.

Ao criar um projeto em Excel + VBA, podem surgir necessidades específicas em


que o uso de banco de dados é funcional; por exemplo, quando devem existir
tabelas e, dada a quantidade de dados, devem ser realizadas consultas nelas.
Mas, e agora, será que vamos precisar usar outro software? Não necessariamente,
pois esse procedimento pode ser feito dentro do VBA, especificamente, por meio
da linguagem SQL, que será a grande responsável por fazer esse “trabalho” para
nós. Antes de tudo, vamos entender como funciona a linguagem SQL.

SQL significa Linguagem Estruturada de Consulta ou, em inglês, Structured


Query Language e sua finalidade, como o próprio nome sugere, é facilitar o
acesso a informações (por meio de consultas, atualizações e manipulações de
dados) armazenadas em bancos de dados do tipo relacional.

Bancos de dados relacionais são aqueles que armazenam os dados e informações


em tabelas, as quais são formadas por linhas e colunas. As colunas representam os
campos da tabela, como Nome, Endereço, Telefone, etc. As linhas representam
os registros, que são os dados de uma tabela, por exemplo, Simone Alves, Rua
Patriota 35, 5454-5454.

A linguagem de consulta estruturada SQL teve sua origem nos laboratórios


da IBM, em meados da década de 70, com a linguagem SEQUEL, desenvolvida
por Donald Chamberlin e sua equipe. Essa linguagem evoluiu até o mês de
novembro de 1976, no qual a IBM apresentou oficialmente a linguagem SQL.
Na época de seu desenvolvimento, a IBM era considerada a maior empresa de
computadores e, devido ao seu peso no mercado, a linguagem SQL tornou-se
padrão mundial.

10
A linguagem SQL
1
Porém, a grande aceitação dessa linguagem pelo mercado gerou um problema:
cada empresa passou a incorporar comandos próprios à linguagem SQL,
tornando-a despadronizada em relação à sua forma original.
Para solucionar este problema, em 1982, o instituto ANSI (American National
Standards Institute), por intermédio do Comitê para Banco de Dados X3H2,
passou a estabelecer normas e critérios técnicos para definir os padrões para
a linguagem de consulta SQL, denominada, então, ANSI/SQL. Concluídos os
trabalhos de padronização em 1986, criou-se o padrão oficial para linguagem
de consulta estruturada SQL, denominada SQL/86 em alusão ao ano de sua
padronização.

No ano seguinte, o instituto ANSI, juntamente com a organização ISO


(Internacional Standards Organizations), trabalhou para determinar uma
extensão ao padrão da linguagem dessa consulta, gerando um segundo
padrão denominado SQL/89 (em referência ao ano de conclusão).

Os comitês ISO e ANSI continuaram seus trabalhos para determinar novas


expansões, agregando as informações passadas pelo mercado. Assim, em 1992,
apresentaram um novo padrão denominado SQL2 (SQL/92), sendo o terceiro
padrão para a linguagem de consulta estruturada SQL. Por fim, em 1999, surge
oficialmente o quarto padrão da linguagem SQL, denominado SQL3 ou SQL/99.

1.2. Visão geral da linguagem SQL


A maioria dos bancos de dados (Access, Oracle, SQL-Server, Dbase, etc.) usa ou
suporta SQL.

A linguagem SQL é composta por dois grupos de instruções para gerenciar os


processos de administração e controle de bancos de dados: DDL e DML.

A DDL (Data Definition Language ou Linguagem de Definição de Dados) engloba


as instruções que permitem efetuar a criação das estruturas de tabelas, de índices
e de bancos de dados em geral, além de possibilitar alterações nas estruturas
criadas e a remoção das estruturas existentes. Nesse grupo, encontramos as
instruções CREATE TABLE, DROP TABLE, ALTER TABLE, CREATE INDEX e
DROP INDEX.

11
Excel 2016 VBA - Módulo II

As instruções tipo DML (Data Manipulation Language ou Linguagem de


Manipulação de Dados) possibilitam executar a manipulação dos dados que
estejam armazenados nas tabelas de um determinado banco de dados. Sendo
assim, é possível cadastrar, alterar e excluir registros existentes. Nesse grupo,
encontram-se as instruções INSERT, SELECT, UPDATE e DELETE.

Os comandos DML são acompanhados de uma gama de cláusulas que os tornam


muito flexíveis. São elas: FROM, WHERE, GROUP BY, HAVING e ORDER BY, as
quais possibilitam efetuar a aplicação de condições que alteram a forma de
funcionamento das consultas.

Não são muitos os comandos existentes na linguagem SQL. Porém, entre eles, o
SELECT é o mais importante e o que mais vezes será citado neste treinamento,
pois é com ele que se obtém a extração de registros de bases de dados.

Neste treinamento, abordaremos apenas as instruções do tipo DML, pois nosso


foco é a consulta e extração de registros de bases de dados e não a criação,
edição ou exclusão de tabelas, realizadas por meio das instruções DDL.

1.3. Conceitos do SQL
Para que se possa assimilar adequadamente o funcionamento da linguagem
SQL, é de suma importância entender os conceitos que norteiam a utilização
de ferramentas baseadas em sistemas de gerenciamento de bancos de dados
relacionais. Entre tais conceitos, é fundamental saber o que é campo, registro,
tabela, banco de dados, base de dados e Sistema de Gerenciamento de Banco
de Dados. Tais conceitos são descritos nos subtópicos adiante.

1.3.1. Tabela

Denomina-se tabela o conjunto de dados organizados em linhas e colunas. Nas


tabelas de bancos de dados, as colunas são denominadas Campos e as linhas
são denominadas Registros.

12
A linguagem SQL
1
A seguinte imagem ilustra um exemplo de tabela:

Tabela

1.3.2. Campo

Campo está relacionado à menor unidade de informação a ser armazenada


em uma tabela (ou arquivo). Um campo pode armazenar apenas um tipo de
informação que esteja baseado em um único tipo de dado. Cada campo possui
um nome de identificação, a especificação de um tipo de dado, o tamanho de
armazenamento, entre outras informações que sejam necessárias.

A seguir, a imagem ilustra os campos contidos em uma tabela:

Campos

13
Excel 2016 VBA - Módulo II

1.3.3. Registro

Registro é um conjunto de campos existentes em uma tabela, que representa


uma entidade do mundo real, por exemplo, a ficha cadastral de uma pessoa.

A seguir, a imagem ilustra os registros contidos em uma tabela:

Registros

1.3.4. Banco de dados

Ao conjunto de tabelas denominamos banco de dados. Como exemplo, podemos


imaginar um banco de dados de uma determinada loja, o qual possui a tabela
de Clientes, a tabela de Produtos, a tabela de Vendas, a tabela de Pedidos e
tantas outras quanto forem necessárias para acomodar os dados gerados no
dia a dia. A imagem a seguir ilustra esse exemplo:
CLIENTES PRODUTOS

BANCO
DE
DADOS

VENDAS PEDIDOS

14
A linguagem SQL
1
1.3.5. Base de dados

Geralmente confundida com o banco de dados, a base de dados é o conjunto


de banco de dados de uma determinada empresa ou instituição. Na base de
dados, os bancos de dados são relacionados entre si, o que possibilita efetuar
o controle de um determinado tema, como são atualmente os sistemas de ERP
(Enterprise Research Planning), utilizados em várias empresas.

1.3.6. Sistema de Gerenciamento de Banco de Dados

O Sistema de Gerenciamento de Banco de Dados (SGBD) consiste em um software


que possibilita facilitar o gerenciamento, as funções de edição, a consulta, o
controle e a remoção de registros ou de tabelas de um banco de dados. Como
exemplo, temos o Access, o SQL Server, o Oracle, etc.

15
Excel 2016 VBA - Módulo II

Pontos principais
Atente para os tópicos a seguir. Eles devem ser estudados com muita
atenção, pois representam os pontos mais importantes do capítulo.

•• SQL significa Linguagem Estruturada de Consulta ou, em inglês, Structured


Query Language. Como o próprio nome sugere, consiste em um conjunto
de instruções que possibilita a busca e o tratamento de dados de um banco
de dados;

•• A linguagem SQL é composta por dois grupos de instruções para gerenciar


os processos de administração e controle de bancos de dados. São elas:
DDL e DML;

•• O grupo DDL engloba as instruções CREATE TABLE, DROP TABLE, ALTER


TABLE, CREATE INDEX e DROP INDEX;

•• O grupo DML engloba as instruções INSERT, SELECT, UPDATE e DELETE.

16
A linguagem SQL
1
Teste seus conhecimentos
Excel 2016 VBA - Módulo II

1. Qual das alternativas a seguir melhor define a linguagem


SQL?

☐☐ a) É uma linguagem de programação utilizada para mesclar


dados de uma base de um banco relacional.

☐☐ b) É uma linguagem estruturada para tratamento de códigos


de programação VB ou VBA.

☐☐ c) É uma linguagem utilizada para facilitar o acesso a


informações (por meio de consultas, atualizações e
manipulações de dados) armazenadas em bancos de dados
do tipo relacional.

☐☐ d) É uma linguagem de programação utilizada para


armazenar dados e informações em tabelas.

☐☐ e) Nenhuma das alternativas anteriores está correta.

18
A linguagem SQL
1

2. Com relação à linguagem SQL, qual das alternativas a seguir


está correta?

☐☐ a) A linguagem SQL é composta por dois grupos de códigos para


gerenciar os processos de administração e controle de bancos
de dados. São elas: VB e VBA.

☐☐ b) A linguagem SQL é composta por dois grupos de instruções


para gerenciar os processos de administração e controle de
bancos de dados. São elas: DDL e DML.

☐☐ c) A linguagem SQL é composta apenas por dois grupos de


instruções para gerenciar os processos de administração e
controle de bancos de dados. São elas: DTS e DML.

☐☐ d) A linguagem SQL é composta apenas por dois grupos de


instruções para gerenciar os processos de administração e
controle de bancos de dados. São elas: DTS e DDL.

☐☐ e) Nenhuma das alternativas anteriores está correta.

19
Excel 2016 VBA - Módulo II

3. Sobre as instruções da linguagem SQL, qual das alternativas a


seguir está correta?

☐☐ a) A DML (Data Definition Language ou Linguagem de Definição de


Dados) engloba as instruções que permitem efetuar a criação das
estruturas de tabelas, de índices e de bancos de dados em geral,
além de possibilitar alterações nas estruturas criadas e a remoção
das estruturas existentes.

☐☐ b) As instruções tipo DML possibilitam executar a manipulação


dos dados que estejam armazenados nas tabelas de um
determinado banco de dados. Sendo assim, é possível cadastrar,
alterar e excluir registros existentes.

☐☐ c) A DDL engloba as instruções que permitem efetuar a criação


das estruturas de tabelas, de índices e de bancos de dados em
geral, além de possibilitar alterações nas estruturas criadas e a
remoção das estruturas existentes. Nesse grupo, encontram-se as
instruções INSERT, SELECT, UPDATE e DELETE.

☐☐ d) Os comandos DDL são acompanhados de uma gama de


cláusulas que os tornam muito flexíveis. São elas: FROM, WHERE,
GROUP BY, HAVING e ORDER BY, as quais possibilitam efetuar a
aplicação de condições que alteram a forma de funcionamento
das consultas.

☐☐ e) Nenhuma das alternativas anteriores está correta.

20
A linguagem SQL
1
4. Com relação aos comandos DML, qual das alternativas a seguir
está correta?

☐☐ a) Os comandos DML são acompanhados de uma gama de


cláusulas que os tornam muito flexíveis. São elas: FROM, WHERE,
GROUP BY, HAVING e ORDER BY, as quais possibilitam efetuar a
aplicação de condições que alteram a forma de funcionamento
das consultas.

☐☐ b) Os comandos DML são acompanhados de uma gama de


cláusulas que os tornam muito flexíveis. São elas: INSERT, SELECT,
UPDATE e DELETE, as quais possibilitam efetuar a aplicação de
condições que alteram a forma de funcionamento das consultas.

☐☐ c) Os comandos DML são acompanhados de uma gama de


cláusulas que os tornam muito flexíveis. São elas: CREATE TABLE,
DROP TABLE, ALTER TABLE, CREATE INDEXe DROP INDEX, as quais
possibilitam efetuar a aplicação de condições que alteram a forma
de funcionamento das consultas.

☐☐ d) As alternativas A e B estão corretas.

☐☐ e) Nenhuma das alternativas anteriores está correta.

21
Excel 2016 VBA - Módulo II

5. Qual das alternativas a seguir está correta?

☐☐ a) Denomina-se tabela o conjunto de dados organizados em


linhas e colunas. Nas tabelas de bancos de dados, as colunas
são denominadas Campos e as linhas são denominadas
Registros.

☐☐ b) O Sistema de Gerenciamento de Banco de Dados consiste


em um software que possibilita facilitar o gerenciamento,
as funções de edição, a consulta, o controle e a remoção
de registros ou de tabelas de um banco de dados. Como
exemplo, temos o Access, o SQL, o Oracle, etc.

☐☐ c) Base de dados é o conjunto de tabelas de dados relacionados


entre si, que possibilita efetuar o controle de um determinado
tema, como são atualmente os sistemas de ERP (Enterprise
Research Planning), utilizados em várias empresas. Bases de
Dados também são conhecidas como Banco de Dados.

☐☐ d) Tabelas são um conjunto de dados organizados em linhas


e colunas. A um conjunto de tabelas denominamos banco
de dados. Nas tabelas de bancos de dados, as colunas são
denominadas Campos e as linhas são denominadas Registros.

☐☐ e) As alternativas A, B e D estão corretas.

22
2
Consultas SQL
99 O que é uma consulta SQL;
99 A cláusula SELECT;
99 A cláusula FROM;
99 A cláusula WHERE;
99 A cláusula ORDER BY;
99 A cláusula DISTINCT;
99 A cláusula GROUP BY;
99 A cláusula HAVING;
99 Relacionamentos entre tabelas - INNER JOIN;
99 A cláusula UNION ALL.
Excel 2016 VBA - Módulo II

2.1. Introdução
Neste capítulo, vamos introduzir conceitualmente as consultas SQL. Para isso,
abordaremos com mais detalhes os comandos, as instruções e as cláusulas
utilizadas nelas; em especial, SELECT, FROM, WHERE e ORDER BY. Também
apresentaremos alguns critérios de consulta por meio de operadores. E, por fim,
para fixar os conceitos, mas ainda sem testar os códigos, vamos demonstrar,
em planilhas, como seria o retorno visual de uma tabela quando usássemos
cada instrução.

2.2. O que é uma consulta SQL


Consultas SQL são comandos que possibilitam a recuperação, edição e inserção
de dados em uma tabela de banco de dados. Através delas, o usuário poderá
recuperar dados de uma base de dados utilizando critérios de filtragem, bem
como inserir e alterar dados individualmente ou em grupos de dados.

Existem quatro instruções (DML) fundamentais no SQL para manipular dados


das bases de dados:

•• SELECT: Recupera dados de uma tabela. É a instrução SQL mais utilizada.


As cláusulas SELECT e FROM são necessárias para constituir uma instrução
básica de consulta SELECT. O objeto RECORDSET armazena o conjunto de
dados retornados por uma instrução SELECT;

•• INSERT: Adiciona novos registros em uma tabela;

•• UPDATE: Edita registros de uma tabela;

•• DELETE: Remove registros de uma tabela.

24
Consultas SQL
2
Por enquanto, focaremos na instrução SELECT, que é responsável por retornar
dados para aplicações ou, ainda, para outras instruções SQL. Os dados que ela
é capaz de retornar, normalmente, estão contidos em tabelas.

A consulta aos dados de uma tabela requer a utilização de SELECT junto com
a cláusula FROM. Entretanto, essa instrução não é utilizada somente para a
realização de consultas às tabelas, mas, também, para a obtenção de valores
retornados por funções da SQL.

2.3. A cláusula SELECT


Em consultas SQL, a cláusula SELECT é o centro de toda consulta capaz de
recuperar dados, pois informa, ao motor do banco de dados, quais campos
deverão ser retornados na consulta. Para selecionarmos os registros da tabela a
serem exibidos, precisamos especificar, logo após a palavra SELECT, os campos
dos registros que devem ser retornados. No exemplo adiante, a cláusula é
seguida de um asterisco:

SELECT *

Esta instrução significa selecionar tudo, ou seja, retornar todos os dados. Essa
forma de comando é utilizada quando não há a necessidade de retornar campos
específicos ou grupos de registros que obedeçam a algum tipo de critério.
Porém, para completá-la, será necessário informar a localidade a partir da qual
queremos retornar os dados.

25
Excel 2016 VBA - Módulo II

A sintaxe da instrução SELECT é:

SELECT [tipo] <coluna> FROM <tabela> [condição];

Em que:
[tipo] É um parâmetro opcional que determina o tipo
de registro selecionado.
É/São a(s) coluna(s) retornada(s) na consulta.
Use * (asterisco) para retornar todos os campos
<coluna>
da tabela do banco de dados ou, para especificar
determinados campos, use o nome dos deles
separados por vírgula (,).
<tabela> É a tabela em que será feita a pesquisa.
É um parâmetro opcional que indica a condição
[condição] especial da pesquisa, aceitando valores WHERE,
GROUP BY, ORDER BY (ASC ou DESC).

2.4. A cláusula FROM


O objetivo da cláusula FROM é especificar a origem dos dados selecionados pela
cláusula SELECT. Ao informarmos, por meio da cláusula SELECT, que queremos
recuperar todos os dados, é necessário determinar a localidade a partir da qual
queremos recuperar esses dados, isto é, de qual tabela será feita a recuperação
dos dados. Através da cláusula FROM, é possível informar de qual ou quais
tabelas a consulta irá recuperar os registros.

Imaginemos que temos uma tabela tblFuncionarios e temos de fazer várias


consultas nela. Ainda sem usar os códigos fisicamente, demonstraremos como
seria o resultado e o funcionamento de cada consulta em planilhas do Excel.

26
Consultas SQL
2
Por exemplo, para recuperar todos os registros na tblFuncionarios, a seguinte
instrução SQL deveria ser utilizada:

SELECT * FROM tblFuncionarios

A consulta dessa instrução trará todos os dados da tabela de funcionários,


incluindo todos os campos e registros, conforme demonstrado na imagem a
seguir:

Porém, desejamos que a consulta retorne apenas o nome e o ramal de cada


funcionário. Sendo assim, podemos melhorar a consulta inserindo os nomes
dos campos na instrução SELECT. Para isso, devemos utilizar a instrução a
seguir:

SELECT NOME, RAMAL FROM tblFuncionarios

27
Excel 2016 VBA - Módulo II

Esta consulta retorna apenas os dados dos campos informados, desprezando os


demais campos da tabela tblFuncionarios, conforme demonstrado na imagem
adiante:

Esta técnica apresentada é mais eficiente para retornar dados de uma tabela.
A consulta ficará mais rápida, evitando retrabalho, de modo que o usuário não
precisará eliminar manualmente os dados indesejados.

2.4.1. Exibindo algumas colunas usando alias

Em nosso relatório, podemos usar apelidos para os campos retornados na


consulta. Esse alias permite não apenas renomear colunas, mas também
expressões em uma instrução SELECT. Veja o exemplo a seguir:

SELECT Customers.CompanyName, Customers.City, Customers.Country


FROM Customers;

Esta instrução no banco de dados NWind retorna o seguinte:

28
Consultas SQL
2
Usamos AS para criar apelidos. Note esta mesma intrução agora com alias:

SELECT Customers.CompanyName AS EMPRESA, Customers.City AS


CIDADE, Customers.Country AS PAÍS FROM Customers;

O retorno será este:

Caso o nome do alias ou mesmo o nome de um campo ou da tabela contenha


espaço, use colchetes, conforme o exemplo adiante:

SELECT Customers.CompanyName AS [NOME DA EMPRESA], Customers.City


AS CIDADE, Customers.Country AS PAÍS

O retorno é o seguinte:

29
Excel 2016 VBA - Módulo II

2.4.2. Criando uma coluna virtual

A instrução SELECT também pode ser utilizada para exibir os dados de uma
tabela e, ainda, apresentar uma coluna que fisicamente não existe.

Nesta consulta, podemos acrescentar um campo que não existe na tabela do


banco de dados: TIPO CLIENTE e seu conteúdo será PESSOA JURÍDICA.

SELECT Customers.CompanyName AS [NOME DA EMPRESA], Customers.City


AS CIDADE, Customers.Country AS PAÍS, 'PESSOA JURÍDICA' AS [TIPO
CLIENTE]

O resultado será o seguinte:

2.5. A cláusula WHERE


A utilidade da cláusula WHERE é determinar quais os dados de uma tabela que
serão afetados pelos comandos SELECT, UPDATE e DELETE. Podemos dizer,
então, que esta cláusula determina o escopo de uma consulta, realizando a
filtragem dos dados que estejam de acordo com as condições definidas.

O objetivo da cláusula WHERE é limitar o retorno dos dados. Podemos imaginar


que o usuário necessite apenas de uma listagem dos funcionários do RH da
empresa. Nesta listagem, ele deseja relacionar o nome, o sobrenome e o ramal
de cada funcionário do RH. A cláusula WHERE possibilita esse tipo de filtragem,
por meio da consulta a seguir:

SELECT NOME, SOBRENOME, RAMAL FROM tblFuncionarios


WHERE DEPARTAMENTO = 'RH'

30
Consultas SQL
2
A consulta anterior irá retornar os registros da tabela tblFuncionarios, porém,
serão listados apenas os dados dos campos NOME, SOBRENOME e RAMAL dos
funcionários do departamento RH. Veja a tabela que seria retornada a seguir:

Devemos observar que a instrução utilizada na cláusula WHERE foi uma string
de texto. Isto é, utilizou-se a informação DEPARTAMENTO = 'RH' para filtrar
a consulta. Nesse caso, como se trata de uma string de texto, o delimitador
utilizado deve ser aspas simples (').

2.5.1. Trabalhando com critérios – Operadores AND e OR

Podemos melhorar a consulta inserindo critérios na cláusula WHERE. Imagine


que se queira retornar dados, não apenas dos funcionários do RH, mas o
relatório terá que listar os funcionários do RH e do TI. Para gerar esse tipo de
relatório, podemos adicionar as instruções lógicas AND e OR. Nesse exemplo,
utilizaremos a instrução OR, conforme a consulta modificada a seguir:

SELECT NOME, SOBRENOME, RAMAL FROM tblFuncionarios


WHERE DEPARTAMENTO = 'RH' OR DEPARTAMENTO = 'TI'

A consulta irá retornar o nome, o sobrenome e o ramal dos funcionários dos


departamentos RH e TI, conforme ilustrado na tabela a seguir:

31
Excel 2016 VBA - Módulo II

2.5.2. Operadores na cláusula WHERE

Na abordagem anterior da cláusula WHERE, utilizamos o operador de igualdade,


cujo símbolo é o sinal de igual (=). Porém, nesta cláusula, além do operador de
igualdade, existe a possibilidade de utilização de vários tipos de operadores.
Veja, na tabela a seguir, os operadores que podem ser utilizados com a cláusula
WHERE:

Operador Descrição
< Menor que
<= Menor ou igual a
> Maior que
>= Maior ou igual a
<> Diferente de
BETWEEN Dentro de uma faixa de valores
LIKE Coincidir com um padrão
IN Contido em uma lista de valores
NOT Operador de negação

Todos estes operadores funcionam da mesma


maneira que o operador de igualdade.

2.5.2.1. Operador BETWEEN

O operador BETWEEN retorna todos os registros que estão entre os limites


especificados. Como exemplo, utilizaremos SELECT para retornar todos os
dados de todos os funcionários que ganham entre R$ 1.000,00 e R$ 3.000,00.
Veja a instrução a seguir:

SELECT * FROM tblFuncionarios


WHERE SALARIO BETWEEN 1000 AND 3000

32
Consultas SQL
2
A consulta retornará a seguinte tabela:

2.5.2.2. Operador LIKE e os curingas

O operador LIKE retorna os registros coincidentes com os parâmetros


especificados pela instrução SELECT. Esse padrão, geralmente, é identificado
pelo caractere curinga (%), que indica o “restante de”. Por exemplo, se desejarmos
retornar os registros de todos os funcionários cujo primeiro nome inicia com a
letra V, basta montar uma instrução SELECT, conforme o exemplo a seguir:

SELECT * FROM tblFuncionarios


WHERE NOME LIKE 'v%'

A consulta irá retornar os registros desejados, conforme a tabela adiante:

2.5.2.3. Operador IN

O operador IN é utilizado para retornar uma lista de registros que coincidem


com os parâmetros especificados por este operador. Para listar todos os dados
dos funcionários de RH e TI, por exemplo, basta realizar a seguinte consulta:

SELECT * FROM tblFuncionarios


WHERE DEPARTAMENTO IN ('RH','TI')

33
Excel 2016 VBA - Módulo II

A consulta retornará os registros conforme a tabela a seguir:

2.6. A cláusula ORDER BY


A cláusula ORDER BY permite ordenar as linhas de uma consulta SELECT de
forma ascendente ou descendente. Para determinar em qual ordem essas linhas
devem ser retornadas, use o ASC, para ascendente, ou o DESC, para descendente.
Quando não especificamos ASC ou DESC, o padrão ASC é considerado.

A cláusula ORDER BY tem como finalidade classificar os registros de uma tabela


especificada em ordem crescente ou decrescente por um ou mais campos, de
acordo com o que foi informado na instrução SELECT. Para especificar uma
ordem de classificação, a cláusula ORDER BY deverá ser incluída no final da
consulta SELECT e seguida do campo ou dos campos aos quais devemos aplicar
a ordem de classificação.

Para montar uma consulta que retorne uma tabela com todos os dados dos
funcionários classificados primeiro por filial e em seguida por salário, criamos
a instrução SELECT demonstrada a seguir:

SELECT * FROM tblFuncionarios


ORDER BY FILIAL, SALARIO

34
Consultas SQL
2
A consulta retornará a tabela a seguir:

Os campos da cláusula ORDER BY também podem ser representados pelo


número do campo especificado antes do FROM.

O exemplo anterior também pode ser escrito assim:

SELECT * FROM tblFuncionarios


ORDER BY 7, 10

2.6.1. A palavra-chave DESC

Ao aplicar a cláusula ORDER BY a um ou mais campos de uma tabela, os


registros dos campos indicados na cláusula serão classificados naturalmente em
ordem crescente. Porém, existe uma maneira de classificar um campo numérico
em ordem decrescente, isto é, do maior para o menor valor. Para isso, basta
acrescentar a palavra DESC à cláusula ORDER BY. A consulta a seguir retornará
os campos NOME e SALÁRIO em ordem decrescente de salário:

SELECT NOME, SALARIO FROM tblFuncionarios


ORDER BY SALARIO DESC

35
Excel 2016 VBA - Módulo II

Ou

SELECT NOME, SALARIO FROM tblFuncionarios


ORDER BY 2 DESC

A instrução SELECT deverá produzir o resultado demonstrado a seguir:

2.6.2. A instrução TOP

A instrução TOP possibilita exibir os primeiros ou os últimos registros de uma


tabela. Podemos, por exemplo, exibir apenas os cinco primeiros registros ou
os três últimos registros de uma tabela. A instrução TOP é inserida junto à
cláusula SELECT.

Para exibir os registros de cinco funcionários, do maior salário para o menor,


basta criar a instrução SELECT demonstrada a seguir:

SELECT TOP 5 NOME, SALARIO FROM tblFuncionarios


ORDER BY SALARIO DESC

36
Consultas SQL
2
A instrução deverá produzir a seguinte tabela:

Devemos observar que a instrução foi configurada para exibir os salários em


ordem decrescente, ou seja, do maior para o menor valor, e listar apenas os
cinco primeiros. A linguagem SQL não possui uma instrução BOTTOM. Porém,
como visto na instrução do exemplo, podemos simular a listagem dos últimos
registros de uma tabela classificando-os em ordem decrescente e, em seguida,
extraindo a quantidade de registros desejada.

2.7. A cláusula DISTINCT


A cláusula DISTINCT permite que os dados repetidos de uma consulta SELECT
sejam exibidos uma única vez. No Excel, temos o comando Remover Duplicadas
(grupo Ferramentas da guia Dados) que faz o mesmo efeito. Esta cláusula é
muito utilizada toda vez que criamos uma lista de índices.

SELECT DISCTINCT city FROM customers

A instrução anterior mostrará em quais cidades temos clientes cadastrados,


sem repetir o nome da cidade.

2.8. A cláusula GROUP BY


Com a cláusula GROUP BY é possível agrupar diversos registros com base em
uma ou mais colunas da tabela. Usamos frequentemente a cláusula GROUP BY
com as seguintes funções:

•• SUM(): Função que permite a soma dos registros;

•• COUNT(): Utilizada para contar os registros;

37
Excel 2016 VBA - Módulo II

•• MAX(): Função que retorna o maior valor de um conjunto de valores;

•• MIN(): Função que retorna o menor valor de um conjunto de valores;

•• AVG(): Calcula a média dos valores.

Este exemplo retorna a soma das unidades em estoque, por categorias, da


tabela Products da base de dados nwind.accdb:

SELECT Products.CategoryID, Sum(Products.UnitsInStock) AS


SomaDeUnitsInStock
FROM Products
GROUP BY Products.CategoryID
ORDER BY Sum(Products.UnitsInStock) DESC;

A instrução produzirá a seguinte tabela:

Já esse outro exemplo retorna a soma total das unidades em estoque:

SELECT Sum(Products.UnitsInStock) AS SomaDeUnitsInStock


FROM Products;

A instrução produzirá a seguinte tabela:

38
Consultas SQL
2
2.9. A cláusula HAVING
A claúsula HAVING determina critérios para limitar os resultados obtidos a
partir do agrupamento dos registros. É importante lembrar que você só pode
usar essa cláusula em parceria com GROUP BY.

A cláusula HAVING é diferente da cláusula WHERE. Esta última restringe os


resultados obtidos após a aplicação da cláusula FROM, enquanto que cláusula
HAVING filtra o retorno do agrupamento.

Esse exemplo é o mesmo do tópico anterior, porém, retorna somente as


categorias em que os totais forem maior que 500:

SELECT Products.CategoryID, Sum(Products.UnitsInStock) AS


SomaDeUnitsInStock
FROM Products
GROUP BY Products.CategoryID
HAVING (((Sum(Products.UnitsInStock))>500))
ORDER BY Sum(Products.UnitsInStock) DESC;

O resultado é o seguinte:

2.10. Relacionamentos entre tabelas - INNER


JOIN
Em um sistema de banco de dados relacional, muitas vezes, para compor
relatórios, extraímos dados de mais de uma tabela. Com a instrução SQL JOIN
podemos recuperar registros de mais de uma tabela.

O INNER JOIN é o comando mais comumente utilizado para unir 2 ou mais


tabelas. Esta junção recupera registros das tabelas de correspondência de um
valor de campo que é comum entre elas. Os campos (normalmente chaves
primária e estrangeira) devem ter tipos de dados iguais.

39
Excel 2016 VBA - Módulo II

Para criar um comando INNER JOIN, use a palavra-chave INNER JOIN na cláusula
FROM de uma instrução SELECT e, após isso, use ON informando por qual campo
as duas tabelas se relacionam.

Considere duas tabelas. A cláusula INNER JOIN associa os registros da primeira


tabela com os registros da segunda, de maneira que sejam obtidos os dados
relacionados entre as duas tabelas:

SELECT Customers.City, Count(Orders.OrderID) AS ContarDeOrderID


FROM Customers INNER JOIN Orders ON Customers.CustomerID =
Orders.CustomerID
GROUP BY Customers.City
ORDER BY Count(Orders.OrderID) DESC;

Agora, veja o resultado:

40
Consultas SQL
2
O relacionamento INNER JOIN é o mais utilizado, mas vale saber que existem
outros tipos de relacionamentos, como LEFT JOIN, RIGHT JOIN, CROSS JOIN, que
saem fora do escopo do conteúdo deste treinamento.

2.11. A cláusula UNION ALL


A cláusula UNION ALL permite a união de dados obtidos a partir de vários
comandos SELECT, sem a necessidade de relacionar as tabelas nas quais estes
dados são encontrados. No entanto, essa consulta só poderá ser realizada se o
número de colunas de todos os comandos SELECT utilizados for o mesmo e as
colunas forem do mesmo tipo. Os alias devem ser inclusos no primeiro SELECT.

41
Excel 2016 VBA - Módulo II

Pontos principais
Atente para os tópicos a seguir. Eles devem ser estudados com muita
atenção, pois representam os pontos mais importantes do capítulo.

•• Em consultas SQL, a cláusula SELECT é o centro de toda consulta capaz de


recuperar dados, pois informa ao motor do banco de dados quais campos
deverão ser retornados na consulta;

•• O objetivo da cláusula FROM é especificar a origem dos dados selecionados


pela cláusula SELECT;

•• O objetivo da cláusula WHERE é limitar o retorno dos dados;

•• A cláusula ORDER BY tem como finalidade classificar os registros de uma


tabela especificada, em ordem crescente ou decrescente, por um ou mais
campos informados na instrução SELECT;

•• Com a cláusula GROUP BY é possível agrupar diversos registros com base


em uma ou mais colunas da tabela;

•• A cláusula HAVING determina critérios para limitar os resultados obtidos a


partir do agrupamento dos registros;

•• A associação de tabelas é um procedimento necessário em muitas situações,


por exemplo, quando você precisa converter em informação os dados
existentes em mais de uma tabela;

•• A cláusula INNER JOIN associa os registros de duas tabelas, de maneira


que sejam obtidos apenas os dados relacionados entre elas.

42
Consultas SQL
2
Teste seus conhecimentos
Excel 2016 VBA - Módulo II

1. Qual das alternativas a seguir melhor define a cláusula


SELECT?

☐☐ a) Em consultas SQL, a cláusula SELECT é o centro de toda


consulta que recupera dados. Ela informa ao motor do
banco de dados quais campos deverão ser retornados na
consulta.

☐☐ b) Em consultas SQL, a cláusula SELECT é o centro de toda


consulta que insere dados. Ela informa ao motor do banco
de dados quais campos deverão ser inseridos nas tabelas.

☐☐ c) Em consultas SQL, a cláusula SELECT é o centro de toda


consulta que elimina dados. Ela informa ao motor do banco
de dados quais campos deverão ser apagados na consulta.

☐☐ d) Em consultas SQL, a cláusula SELECT é o centro de toda


consulta que retorna dados. Ela informa ao motor do
banco de dados quais campos deverão ser selecionados na
consulta.

☐☐ e) Nenhuma das alternativas anteriores está correta.

44
Consultas SQL
2
2. Qual das alternativas a seguir melhor define a cláusula
FROM?

☐☐ a) O objetivo da cláusula FROM é especificar o destino


dos dados selecionados pela cláusula SELECT.

☐☐ b) O objetivo da cláusula FROM é ordenar os dados


selecionados pela cláusula SELECT.

☐☐ c) O objetivo da cláusula FROM é especificar a origem


dos dados selecionados pela cláusula SELECT.

☐☐ d) O objetivo da cláusula FROM é limitar o retorno dos


dados selecionados pela cláusula SELECT.

☐☐ e) Nenhuma das alternativas anteriores está correta.

3. Qual das consultas a seguir permite retornar todos os


dados da tabela tblFuncionarios?

☐☐ a) FROM * SELECT tblFuncionarios

☐☐ b) SELECT tblFuncionarios FROM *

☐☐ c) SELECT * FROM tblFuncionarios

☐☐ d) WHERE * SELECT tblFuncionarios

☐☐ e) Nenhuma das alternativas anteriores está correta.

45
Excel 2016 VBA - Módulo II

4. Qual das alternativas a seguir melhor define a cláusula


WHERE?

☐☐ a) O objetivo da cláusula WHERE é ordenar os dados da tabela.

☐☐ b) O objetivo da cláusula WHERE é eliminar os dados de uma


tabela.

☐☐ c) O objetivo da cláusula WHERE é limitar o retorno dos dados.

☐☐ d) O objetivo da cláusula WHERE é especificar a origem dos


dados.

☐☐ e) Nenhuma das alternativas anteriores está correta.

5. Qual das consultas a seguir permite retornar, de todos


os dados da tabela tblFuncionarios, apenas os dados dos
funcionários registrados como ANALISTA ou PROGRAMADOR
no campo CARGO?

☐☐ a) SELECT CARGO FROM tblFuncionarios


WHERE CARGO IN (‘ANALISTA’,’PROGRAMADOR’)

☐☐ b) SELECT ANALISTA, PROGRAMADOR FROM tblFuncionarios


WHERE CARGO IN (‘ANALISTA’,’PROGRAMADOR’)

☐☐ c) SELECT * FROM tblFuncionarios


WHERE CARGO IN (‘ANALISTA’,’PROGRAMADOR’)

☐☐ d) SELECT * FROM tblFuncionarios


WHERE (‘ANALISTA’, ‘PROGRAMADOR’)

☐☐ e) Nenhuma das alternativas anteriores está correta.

46
Consultas SQL
2
Mãos à obra!
Excel 2016 VBA - Módulo II

Laboratório 1

A – Criando consultas SQL

1. Abra o arquivo Exercicio_SQL.xlsm e clique em Exercício 1:

Observe que este UserForm está conectado à base de dados BancoExercicio_


SQL.accdb:

48
Consultas SQL
2
2. Escreva a instrução SQL no campo indicado, clique em Executar e veja o
resultado:

Observe que o enunciado de cada exercício indica o número de registros que a


resposta deve conter. Neste exercício, por exemplo, a resposta da consulta SQL
deve conter 20 registros.

3. Quando chegar à resposta correta, clique em Salvar Seu Código e prossiga


para o exercício seguinte.

49
Excel 2016 VBA - Módulo II

50
Consultas SQL
2

51
DAO – Data Access
3
Object
99 Modelo de objetos DAO;
99 Importação de dados de uma base Access.
Excel 2016 VBA - Módulo II

3.1. Introdução
No decorrer deste capítulo, conheceremos o objeto DAO e aprenderemos como
importar uma tabela de um banco de dados externo para o Excel 2016, por
meio da referência de acesso a dados.

O objeto DAO (Data Access Object ou Objeto de Acesso a Dados) permite


executar consultas, atualizar valores nas tabelas do banco de dados e criar
a estrutura dos bancos de dados, inclusive tabelas, consultas armazenadas e
relações entre tabelas.

O DAO era usado pelos desenvolvedores VB para obter acesso à área de


trabalho e seus bancos de dados cliente/servidor. Mas, com o advento do ADO,
é agora adequado para ser usado, principalmente, com os bancos de dados Jet.
Posteriormente, abordaremos o objeto ADO.

Nosso objetivo, nesse treinamento, é executar consultas para retorno de dados


de tabelas Access e .txt para planilhas do Excel. As consultas que permitirão as
ações de retorno de dados serão escritas em linguagem SQL.

54
DAO – Data Access Object
3
3.2. Modelo de objetos DAO
O modelo de objetos DAO é bem complexo. Ele possui vários tipos de elementos
e coleções, as quais possuem diversos objetos, cada qual com sua propriedade,
método e objetos subordinados próprios. A imagem a seguir demonstra o
modelo DAO:

DBEngine

Workspace

Database

TableDef QueryDef RecordSet Countainer Relation

Field Field Field Field Field

Index Parameter

Field

User

Field

Group

User
Objeto

Error Objeto e Coleção

55
Excel 2016 VBA - Módulo II

Neste capítulo, abordaremos o objeto Database e sua coleção de objetos,


mais especificamente, o RecordSet. As coleções do objeto Database são
representadas pela imagem a seguir:

Objeto Database

PROPRIEDADES MÉTODOS
Colating Order Close
Connect CreateProperty
Objeto Connection CreateQueryDef
Containers CreateRelation
DesignerMasterID Create TableDef
Name Execute
QueryDefs MakeReplica
Query Timeout NewPassword
Records Affected OpenRecordset
Recordsets PopulatePartial
ReplicaID Synchronize
Relations
TableDefs
Transactions
Updatable
Version

Objeto Database

Coleção Properties

Coleção QueryDefs

Coleção RecordSets

Coleção Relations

Coleção TableDefs

56
DAO – Data Access Object
3
3.3. Importando dados de uma base Access
Neste tópico, importaremos dados de tabelas do banco de dados NorthWind
Trade do gerenciador de banco de dados Access. Os dados serão transportados
de uma tabela desta base de dados para uma planilha do Excel.

O banco de dados NorthWind, assim como outros, é


disponibilizado pela Microsoft como bancos de dados de
exemplo. Eles são usados para testes dos desenvolvedores
e, geralmente, vêm instalados junto com alguns softwares,
como Visual Studio, Access ou SQL Server. Como precisaremos
de um banco pronto para consultas, vamos usá-lo dentro do
VBA.

3.3.1. Configurações iniciais

Para iniciar as configurações, o arquivo banco de dados Northwind.mdb, que


acompanha este material, deverá ser instalado em um diretório. Para isso, crie
uma pasta chamada temp em um diretório de sua preferência e, então, insira o
banco de dados Northwind nele. No exemplo a seguir, inserimos o Northwind
no diretório Documentos, na pasta temp:

57
Excel 2016 VBA - Módulo II

Após instalarmos o arquivo Northwind na pasta temp, devemos preparar o


VBA do Excel para trabalhar com DAO. Para isso, siga os passos adiante:

1. Abra uma pasta de trabalho Excel e salve-a na mesma pasta temp em que foi
salvo o banco de dados Northwind;

Este procedimento facilitará a construção do código VBA. Em vez de indicar


a pasta que contém o banco de dados, podemos utilizar o método Path de
ActiveworkBook posteriormente, que informará o endereço da pasta de trabalho
atual. Esse atalho evita que o programador tenha que informar o endereço em
que se encontra o arquivo de banco de dados.

2. Após salvar a pasta de trabalho e abrir o VBE, vamos criar um módulo e


habilitar a referência DAO no VBA. Faça de acordo com as imagens a seguir:
Ative o menu Inserir e
clique sobre Módulo.

Após inserir o módulo, ative o menu


Ferramentas e clique sobre a opção
Referências.

58
DAO – Data Access Object
3
Em seguida, clique sobre o
botão OK para confirmar a
Desça o menu da janela de referência.
diálogo e clique sobre a
referência Microsoft DAO
3.6 Object Library.

Essa biblioteca não importa arquivos com extensão accdb (Access a partir da
versão 2007). Para isso, utilize a biblioteca Microsoft Office Access Database
Engine Object:

59
Excel 2016 VBA - Módulo II

3.3.2. Construindo o código VBA

Concluídas as configurações iniciais, devemos construir o código que irá trazer


os registros da tabela Customers do banco de dados Northwind. Para isso,
siga os passos adiante:

1. Crie uma rotina ImportTbl e declare as seguintes variáveis:

•• Para definir o banco de dados:

Dim Db as Database

•• Para o objeto Recordset (os registros da tabela):

Dim Rs as Recordset

•• Para receber o objeto planilha:

Dim Ws as Object

•• Para a variável do loop For:

Dim i as Integer

O script a seguir demonstra como a rotina deverá ficar após a declaração das
variáveis:

60
DAO – Data Access Object
3
2. Alimente a variável de objeto Ws, que receberá o objeto Plan1. Esta variável
foi criada apenas para facilitar as referências que faremos à planilha durante a
codificação e o elemento é meramente opcional. Observe a imagem a seguir:

Após definir o objeto banco de dados e o objeto planilha, a variável Db receberá


o banco de dados.

O código a seguir define a variável. Observe que a instrução OpenDatabase


recebe o endereço e o nome do banco de dados. O endereço está contido na
instrução ThisWorkbook, a qual informa que o endereço será o mesmo da
pasta de trabalho do código VBA. Essa instrução está concatenada (&) com o
nome do banco de dados entre aspas para completar o endereço.

3. Defina o objeto Recordset. Este objeto representa um conjunto de registros


de uma determinada tabela ou um conjunto de registros resultantes de uma
consulta SQL. Nesse caso, o Recordset retornará todos os dados da tabela
Customers do banco de dados Northwind;

Uma vez definido o banco de dados e o conjunto de registros desta base de


dados que traremos para a planilha, devemos configurá-la para receber estes
dados. Para que o usuário tenha a garantia de que, sempre que carregar os
dados da tabela Access, estes sejam únicos e não se misturem com os dados
anteriores, é conveniente limpar os dados da tabela para que possa receber
dados novos.

61
Excel 2016 VBA - Módulo II

4. Limpe os dados da planilha para que possa receber os novos dados. O objeto
Cells se refere a todas as células da planilha ativa. O método ClearContents
apaga o conteúdo das células indicadas;

5. Com a planilha limpa, descarregue os dados. O loop a seguir monta o


cabeçalho da tabela. Este código também é opcional, pois o usuário poderá ter
uma planilha com cabeçalho próprio, necessitando, apenas, dos dados que são
atualizados periodicamente;

6. Formate o cabeçalho. O código a seguir aplica negrito ao cabeçalho da tabela:

7. Com o cabeçalho da tabela inserido e formatado, descarregue os dados a


partir da célula A2 da planilha. O código a seguir insere todos os registros da
tabela Customers a partir desta célula através da instrução Recordset:

Geralmente, quando importamos dados de outra fonte de dados, estes entram


truncados nas colunas. Invariavelmente, é necessário ajustá-las à largura do
maior registro de cada coluna. É comum, nestas ocasiões, aplicarmos um duplo-
clique na divisa entre duas colunas para que esta se ajuste automaticamente à
largura do maior registro. Este procedimento poderá ser efetuado através de
código VBA, inserindo a instrução AutoFit a todas as células da tabela.

62
DAO – Data Access Object
3
8. Utilize o comando AutoFit para efetuar o ajuste automático. Como é utilizado
o objeto Cells, ele efetua o ajuste automático a todas as células da planilha. Como
essa planilha possui apenas a tabela de dados, isso não acarretará problema
algum. O script a seguir demonstra como esse comando é utilizado:

9. Com a importação dos dados concluída, assim como a formatação da tabela,


encerre os trabalhos (o código) fechando o banco de dados e o objeto RecordSet,
através dos comandos demonstrados na imagem a seguir:

Após inserir este código, a nossa rotina está pronta. E deve estar assim:

63
Excel 2016 VBA - Módulo II

10. Para ativá-la, vamos criar um atalho de teclado: CTRL + SHIFT + H. Primeiro,
devemos nos certificar de que a tecla CAPS LOCK do teclado esteja inativa, ou
seja, o teclado não esteja no modo maiúsculo. Em seguida, faça o seguinte:

10.1 Retorne à pasta de trabalho do Excel e, na guia Exibição, clique no


botão Macros, conforme a imagem adiante:

10.2 Na janela Macro, clique no botão Opções:

10.3 Posicione o cursor do mouse no campo destacado na imagem, mantenha


a tecla SHIFT pressionada e, então, pressione a tecla da letra H;

64
DAO – Data Access Object
3
10.4 Conclua as configurações clicando em OK:
O campo informará o atalho
de teclado.

Clicar no botão OK para


registrar o atalho.

10.5 Na janela Macro, clique em Cancelar.

11. Agora, vamos finalmente executar o código que traz os dados da tabela
Customers da base Northwind. Para isso, posicione a pasta de trabalho na
Plan1 e utilize o atalho de teclado CTRL + SHIFT + H. Observe o resultado final
na imagem a seguir:

65
Excel 2016 VBA - Módulo II

Caracteres curinga DAO

Select CompanyName from Custormers where city = "São Paulo"

Esta consulta retorna o nome das companhias da tabela Customers da


cidade de São Paulo. Porém, se tivermos cadastrado Sao Paulo sem
utilizar o til (~), não haverá retorno. Daí a utilidade de caracteres curinga.

No DAO, o caractere curinga que substitui um caracter é a interrogação


(?). Aplicando ao mesmo exemplo, o código fica assim:

Select CompanyName from Custormers where city like "S?o Paulo"

Enquanto a interrogação (?) representa um caractere, o asterisco (*)


representa vários caracteres no DAO. Logo, a consulta pode ser escrita
assim:

Select CompanyName from Custormers where city like "S*"

Neste caso, ela retorna todas companhias que ficam em cidades cujo
nome começa com a letra S: São Paulo, Strasbourg etc. Note, também,
que quando utilizamos operadores curinga, utilizamos like no lugar do
igual (=).

66
DAO – Data Access Object
3
Pontos principais
Atente para os tópicos a seguir. Eles devem ser estudados com muita
atenção, pois representam os pontos mais importantes do capítulo.

•• O objeto DAO (Data Access Object ou Objeto de Acesso a Dados) permite


executar consultas, atualizar valores nas tabelas do banco de dados e criar
a estrutura dos bancos de dados, inclusive tabelas, consultas armazenadas
e relações entre tabelas;

•• Para utilizar o objeto DAO no Excel VBA, é necessário referenciá-lo no menu


Ferramentas do VBE;

•• O objeto Recordset representa um conjunto de registros de uma


determinada tabela ou um conjunto de registros resultantes de uma
consulta SQL.

67
DAO – Data Access
3
Object
Teste seus conhecimentos
Excel 2016 VBA - Módulo II

1. Qual biblioteca podemos usar quando utilizamos o modelo


de objetos DAO para conectar banco de dados Office 2007 em
diante?

☐☐ a) Microsoft Office 16.0 Access Database Engine Object

☐☐ b) Microsoft DAO 3.6

☐☐ c) Microsoft DAO 3.9

☐☐ d) Microsoft DAO 4.1

☐☐ e) Nenhuma das alternativas anteriores está correta.

2. Com relação a utilização do objeto DAO, qual alternativa


corresponde à(s) atividade(s) que ele permite?

☐☐ a) Executar consultas nas tabelas do banco de dados.

☐☐ b) Incluir, editar e excluir dados em uma tabela de um


banco de dados Access.

☐☐ c) Importar dados de tabelas de bases Access e/ou Excel,


dentre outros.

☐☐ d) As alternativas A, B e C estão corretas.

☐☐ e) Nenhuma das alternativas anteriores está correta.

70
DAO – Data Access Object
3
3. Qual opção melhor define o objeto Recordset?

☐☐ a) É o conjunto de registros resultante de uma


consulta SQL.

☐☐ b) É a instrução Select utilizada.

☐☐ c) É o banco de dados conectado.

☐☐ d) São somente os nomes dos campos recuperados.

☐☐ e) Nenhuma das alternativas anteriores está correta.

4. Qual é a principal finalidade da função OpenDataBase


da biblioteca DAO?

☐☐ a) Armazenar registros resultantes de uma consulta


SQL.

☐☐ b) Executar uma consulta SQL.

☐☐ c) Copiar um Recordset.

☐☐ d) Importar o nome dos campos de uma tabela de um


banco de dados.

☐☐ e) Conectar a um banco de dados.

71
Excel 2016 VBA - Módulo II

5. Qual a principal finalidade da função OpenRecordset


da biblioteca DAO?

☐☐ a) Fechar uma conexão.

☐☐ b) Limpar as variáveis de conexão.

☐☐ c) Executar uma instrução SQL armazenando os dados


resultantes em um objeto Recordset.

☐☐ d) Copiar os dados de um objeto Recordset nas células


do Excel.

☐☐ e) Nenhuma das alternativas anteriores está correta.

72
DAO – Data Access
3
Object
Mãos à obra!
Excel 2016 VBA - Módulo II

Laboratório 1

A – Utilizando o objeto DAO

Neste laboratório, vamos construir um sistema para importar os dados da tabela


Products do banco de dados Northwind, utilizando o objeto DAO, de acordo
com as seguintes instruções:

1. Crie uma pasta com o nome desejado e coloque o arquivo Northwind.mdb


dentro dela;

2. Abra um arquivo do Excel e salve-o como .xlsm dentro da mesma pasta que
você acabou de criar;

3. Crie uma planilha denominada Painel e outra Produtos;

4. Com base no que aprendeu durante o capítulo, crie uma rotina que exerça a
função de transportar os dados da tabela Products para a planilha Produtos;

5. Na planilha Painel, carregue a rotina através de um botão de controle de


formulário chamado Importar Tabela de Produtos.

Ao final da importação, o sistema deverá apresentará a seguinte mensagem:

O número de registros
é uma variável.

Confira o resultado no arquivo Cap3 –ExercicioProductsLab.


xlsm que acompanha este material.

74
Importando dados
4
de um arquivo XLS
99 Preparando o ambiente;
99 Construindo a rotina.
Excel 2016 VBA - Módulo II

4.1. Introdução
A partir da versão 2007, uma planilha do Excel passou a ter 1.048.576 linhas por
16.384 colunas. Com espaço maior para armazenar registros, utilizar um arquivo
Excel como banco de dados se tornou tarefa comum em algumas empresas.
Porém, para utilizá-lo dessa forma, vale considerar algumas recomendações.

Primeiro, ao armazenar os dados, estes devem ser apenas registrados na


planilha; não há a necessidade de formatá-los. Isso porque o usuário analisará
esses dados em sua planilha principal, provavelmente, em formulários VBA ou
outro recurso, os quais tem sua própria formatação. Formatar os dados da base,
além de ser tarefa desnecessária, torna o arquivo mais pesado, principalmente,
se a tabela tiver muitos registros.

Segundo, a planilha base de dados poderá ser instalada em uma pasta da rede
onde todos possam acessá-la e não conterá nenhuma fórmula ou funções.
Novamente, essa tarefa ficará a cargo da pasta de trabalho do usuário que
efetuará a consulta.

Concluindo, a pasta de trabalho banco de dados abrigará apenas dados sem


quaisquer formatações, fórmulas ou funções.

4.2. Preparando o ambiente
O arquivo que utilizaremos neste capítulo é uma tabela de vendas de
medicamentos de uma fictícia indústria farmacêutica e deve estar instalado
em uma pasta. Nesse mesmo local, criaremos uma nova pasta de trabalho,
denominada BDTesteXLS, contendo apenas uma planilha.

76
Importando dados de um arquivo XLS
4
Após salvar o arquivo no endereço recomendado, devemos alternar para o VBE
e inserir um novo módulo. Para importar os dados da planilha, vamos utilizar
recursos de DAO, portanto, antes de iniciarmos a rotina, temos de fazer a
referência a esse objeto no VBA, como fizemos nos capítulos anteriores, até
chegar na janela Referências, demonstrada a seguir:

Selecionar a referência
Microsoft DAO 3.6 Object
Library e clicar no botão OK.

Esta biblioteca não importa arquivos com extensão .xlsx (Excel a partir da versão
2007). Para isso, utilize a biblioteca Microsoft Office Access Database Engine
Object:

77
Excel 2016 VBA - Módulo II

Após determinar a referência e inserir um módulo, devemos iniciar a rotina


RecallBD e criar as variáveis, conforme demonstrado na instrução a seguir:

Em que:

•• A variável MeuBD receberá o objeto Database;

•• A variável MinhaTabela receberá o objeto Recordset para recuperar os


dados do arquivo .xls;

•• A variável Ssql receberá a string SQL que conterá as instruções de recuperação


dos dados do arquivo .xls;

•• A variável ThisPath receberá o caminho da pasta em que está o arquivo


.xls. Esta variável será concatenada com a variável do nome do arquivo .xls
para formar o caminho completo do arquivo;

•• A variável MeuArq receberá o nome do arquivo .xls. Ela será concatenada


com a variável que agrega o endereço do arquivo para compor o comando
que abrirá o arquivo .xls.

4.3. Construindo a rotina
Após definir as variáveis, devemos alimentar, inicialmente, as variáveis de
endereço ThisPath e MeuArq, conforme demonstrado na instrução a seguir:

78
Importando dados de um arquivo XLS
4
Após alimentar as variáveis de endereço, devemos definir a variável MeuBD,
informando o banco de dados a ser aberto. Nesse caso, utilizaremos a pasta de
trabalho Medicamentos.xls que acompanha este material.

O próximo passo será criar a string SQL que informará quais dados iremos
recuperar da tabela de medicamentos. Neste exercício, vamos recuperar a tabela
inteira. Portanto, a instrução SQL que iremos inserir na variável será a seguinte:

SELECT * FROM [Dados$] WHERE MEDICAMENTO is Not Null

Veja a instrução completa a seguir:

Vale ressaltar que iniciamos a alimentação da variável que receberá a instrução


SQL com a variável Empty, a qual indica que nenhum valor inicial foi atribuído
ainda. É uma forma de garantir que ela iniciará vazia, sem nenhum valor residual.

Podemos observar também que, ao final de cada linha, é inserida a constante


vbCr, a qual atribui uma quebra de parágrafo ou retorno de carro (CR) ao código.
Esta constante equivale ao caractere chr(13) utilizado comumente para quebrar
texto dentro de MsgBox.

Definida a variável Ssql, devemos definir agora a variável de objeto Recordset,


informando a instrução SQL inserida na variável. A variável do objeto Recordset,
denominada MinhaTabela, informará ao banco de dados quais valores deverão
ser retornados.

79
Excel 2016 VBA - Módulo II

Observe as instruções adiante:

Para finalizar a rotina, devemos distribuir, na planilha, os dados capturados


pela instrução Recordset. Estes dados serão inseridos a partir da segunda linha
da planilha (célula A2). Antes de inseri-los, a rotina criará o cabeçalho da tabela,
conforme a instrução a seguir:

Apaga todos os registros


da planilha ativa. Cria o cabeçalho
da tabela.

Insere os dados a
partir da célula A2.

Ajusta automaticamente
as colunas.

Fecha a conexão com


o banco de dados.

80
Importando dados de um arquivo XLS
4
Ao rodar a rotina, a planilha ativa, que estava em branco, receberá todos os
dados da base .xls com um cabeçalho próprio criado pela rotina, conforme a
imagem a seguir:

81
Excel 2016 VBA - Módulo II

Pontos principais
Atente para os tópicos a seguir. Eles devem ser estudados com muita
atenção, pois representam os pontos mais importantes do capítulo.

•• O Excel poderá ser utilizado como banco de dados, principalmente, após


a versão 2007, na qual o número de linhas e de colunas foi expandido
consideravelmente. Sendo assim, podemos utilizar rotina VBA para recuperar
dados de bases .xls com o recurso DAO;

•• Para utilizar um arquivo Excel como banco de dados, entretanto, devemos


considerar algumas recomendações: os dados devem ser apenas registrados
na planilha; não há a necessidade de formatá-los e a planilha pode ser
instalada em uma pasta da rede onde todos possam acessá-la e não conterá
nenhuma fórmula ou funções;

•• Para preparar o ambiente, após salvar o arquivo no endereço recomendado,


devemos alternar para o VBE e inserir um novo módulo. Para importar os
dados da planilha, vamos utilizar recursos de DAO, portanto, antes de
iniciarmos a rotina, devemos fazer a referência a este objeto no VBA.

82
Importando dados
4
de um arquivo XLS
Teste seus conhecimentos
Excel 2016 VBA - Módulo II

1. Com relação ao método CopyFromRecordset, qual a alternativa


correta?

☐☐ a) Permite trazer o nome dos campos de um objeto Recordset.

☐☐ b) Copia o nome dos campos Recordset nas células do Excel.

☐☐ c) Copia a biblioteca DAO.

☐☐ d) Copia os dados de um objeto Recordset nas células do Excel.

☐☐ e) Nenhuma das alternativas anteriores está correta.

2. Com relação ao nome dos campos e ao método


CopyfromRecordset, qual alternativa está correta?

☐☐ a) Copia e cola (nas células do Excel) o nome dos respectivos


cabeçalhos dos campos selecionados na consulta SQL.

☐☐ b) Cola (nas células do Excel) o nome dos campos


instantaneamente (de uma só vez).

☐☐ c) Não cola (nas células do Excel) o nome dos cabeçalhos,


somente os dados dos campos.

☐☐ d) Só cola (nas células do Excel) o nome dos campos.

☐☐ e) Nenhuma das alternativas anteriores está correta.

84
Importando dados de um arquivo XLS
4
3. Quanto à biblioteca utilizada para importação de dados de
um arquivo Excel, via DAO, qual a alternativa correta?

☐☐ a) A biblioteca Microsoft DAO 3.6 não funciona para


importação de arquivos Excel com a extensão XLSX, ou seja,
a partir da versão 2007 em diante.

☐☐ b) A biblioteca Microsoft Office 16.0 Access Database Engine


Object é recomendada para importação de arquivos Excel
com a extensão XLSX, ou seja, a versão 2007 em diante,
usando a tecnologia DAO.

☐☐ c) Não precisamos adicionar nenhuma biblioteca para a


importação de dados de um arquivo Excel, via DAO.

☐☐ d) As alternativas A e B estão corretas.

☐☐ e) Nenhuma das alternativas anteriores está correta.

4. Quanto aos caracteres curingas, que podem ser utilizados


nas consultas DAO, qual a alternativa correta?

☐☐ a) Não existem caracteres curingas nas consultas SQL DAO.

☐☐ b) O símbolo de porcentagem (%) representa uma cadeia


de caracteres enquanto que o underline (_) substitui um
caractere.

☐☐ c) O asterisco (*) representa uma cadeia de caracteres


enquanto que a interrogação (?) substitui um caractere.

☐☐ d) As alternativas B e C estão corretas.

☐☐ e) Nenhuma das alternativas anteriores está correta.

85
Excel 2016 VBA - Módulo II

5. Com relação à configuração de variáveis para especificar um


banco de dados e um Recordset, qual a alternativa correta?

☐☐ a) Devemos utilizar a instrução Set, pois tanto o Database


como o Recordset são objetos e, no VBA, quando usamos uma
variável objeto, temos que usar essa instrução para especificar
o objeto.

☐☐ b) No DAO, para especificamos o banco de dados, além de Set,


usamos o OpenDataBase, como no exemplo: Set variavel =
OpenDataBase(...).

☐☐ c) No DAO, para especificarmos o Recordset, além de Set,


usamos OpenRecordset, como no exemplo: Set variavel =
db.openrecordset(…), em que db é a variável objeto que
representa o banco de dados.

☐☐ d) Uma boa prática é, no final da macro, fecharmos, por


meio do método Close, o Recordset e a Conexão, além de
limparmos a memória RAM (Set variável = Nothing).

☐☐ e) Todas alternativas anteriores estão corretas.

86
Importando dados
4
de um arquivo XLS
Mãos à obra!
Excel 2016 VBA - Módulo II

Laboratório 1

A – Construindo um sistema para importação de dados de um arquivo XLS

Neste laboratório, vamos construir um sistema para importar os dados do


arquivo Medicamentos.xls, de acordo com as seguintes instruções:

1. Importe os dados somente dos campos MEDICAMENTO e QTDE;

2. Importe os registros em que a quantidade seja maior que 50.

Confira o resultado no arquivo Cap4 –Exercicio


Medicamentos.xlsm que acompanha este material.

88
ADO - ActiveX Data
5
Objects
99 O objeto Connection ADO;
99 Importando dados de uma base Access.
Excel 2016 VBA - Módulo II

5.1. Introdução
O ADO, ou ActiveX Data Objects, criado pela Microsoft, é considerado uma
técnica para acessar bancos de dados a partir de uma página Web. Como o ADO
é fornecido na forma de uma biblioteca ActiveX Server (como são o DAO e o
RDO), esta técnica poderá ser usada em aplicações VB, sem problemas. Muitas
vezes, podemos pensar que é muito mais fácil ter um banco de dados cliente/
servidor usando o ADO do que a alternativa DAO, descrita anteriormente.
Porém, embora a tecnologia ADO seja mais recente e mais rápida que a DAO, a
segunda é mais eficiente no tratamento de dados com VBA.

5.2. O objeto Connection ADO


Nos objetos ADO, podemos usar o objeto Connection para estabelecer uma
conexão com uma fonte de dados. Para informar ao ADO sobre como obter
a fonte de dados, devemos fornecer informações na forma de uma string de
conexão idêntica à string de conexão ODBC. A propriedade ConnectionString
do objeto Connection será utilizada para fazer isso. Também haverá a opção
de escolher qual provedor usar, definindo a propriedade Provider do objeto
Connection.

90
ADO - ActiveX Data Objects
5
5.2.1. Especificando um provedor OLE DB e uma string de
conexão

Devemos especificar um provedor OLE DB usando a propriedade Provider do


objeto Connection ADO. Caso não seja especificado um provedor ou se não for
utilizado um objeto Connection, será considerado o provedor padrão, que é o
provedor ODBC para OLE DB, também conhecido como MSDASQL.

A propriedade Provider do objeto Connection é uma string de texto que informa


à conexão qual provedor OLE DB usar para executar os comandos no servidor.
Para utilizar o provedor ODBC para OLE DB, não será necessário especificar
um provedor, já que ele é o provedor padrão. Contudo, se desejar, poderá
especificá-lo para maior clareza.

Uma string de conexão no ADO será utilizada para fornecer informações sobre
como conectar o servidor do banco de dados. Quando utilizarmos o provedor
ODBC para OLE DB, a string de conexão será igual a uma string de conexão
ODBC. Isso significa que as informações exatas esperadas pelo driver ODBC
poderão variar entre as implementações. Para os outros provedores, a string de
conexão poderá ter uma sintaxe totalmente diferente.

Quando utilizarmos o provedor ODBC, a propriedade ConnectionString poderá


ser um Data Source Name (DSN ou Nome da Fonte de Dados) ou poderá ser uma
conexão sem DSN. A seguir, temos um exemplo de conexão com um banco de
dados que usa o provedor ODBC com um DSN:

Cn.Provider = "MSDASQL"
Cn.ConnectionString = "DSN=Novelty;"

91
Excel 2016 VBA - Módulo II

A posição do objeto Connection ADO no modelo de objetos ADO, assim como


suas propriedades e métodos, é mostrada na imagem a seguir:

Objeto Connection

PROPRIEDADES MÉTODOS EVENTOS


Atributos BeginTrans BeginTransComplete
CommandTimeout Cancel CommitTransComplete
ConnectionString Close ConnectComplete
ConnectionTimeout CommitTrans Disconnect
CursorLocation Execute ExecuteComplete
DefaultDatabase Open InfoMessage
Coleção Errors OpenSchema RollbackTransComplete
IsolationLevel RollbackTrans WillConnect
Mode WillExecute
Coleção Properties
Provider
State
Version

Coleção Errors

Objeto Error

Coleção Properties

Objeto Property

Objeto Command

Objeto Recordset

92
ADO - ActiveX Data Objects
5
5.3. Importando dados de uma base Access
Assim como fizemos no DAO, neste tópico, importaremos dados de tabelas do
banco de dados NorthWind Trade do gerenciador de banco de dados Access.
Os dados serão transportados de uma tabela desta base de dados para uma
planilha do Excel. Os dados da planilha mostrarão o valor total de compras e a
quantidade realizada por cada cliente será vista mais adiante.

5.3.1. Configurações iniciais

Para iniciar as configurações, o arquivo banco de dados Northwind.mdb, que


acompanha este material, deverá ser instalado em um diretório. Crie uma pasta
chamada temp em um diretório de sua preferência e insira o banco de dados
Northwind nele. No exemplo a seguir, inserimos o Northwind no diretório
Documentos, na pasta temp:

Após instalarmos o arquivo Northwind na pasta temp, devemos preparar o


VBA do Excel para trabalhar com ADO. Para isso, siga os passos adiante:

1. Abra uma pasta de trabalho Excel e salve-a na mesma pasta temp em que foi
salvo o banco de dados Northwind;

93
Excel 2016 VBA - Módulo II

Este procedimento facilitará a construção do código VBA. Assim como fizemos


no capítulo sobre DAO, em vez de indicar a pasta em que está o banco de
dados, podemos utilizar o método Path de ActiveworkBook, que informa o
endereço da pasta de trabalho atual.

2. Após salvar a pasta de trabalho, abra o VBE e insira um módulo, igual fizemos
anteriormente: menu Inserir/ Módulo;

Após inserir um módulo, devemos indicar a referência ADO. Atualmente, a


referência Microsoft ADO está em sua sexta versão. Porém, se o objetivo for
desenvolver uma rotina que rode sem preocupações em várias versões do Excel,
situação comum em várias empresas, o melhor a fazer é indicar a referência
Microsoft ADO 2.1. Esta versão é comum a todas as versões do Excel.

3. Para indicar a referência ADO, vamos fazer o mesmo que fizemos


anteriormente para ativar a referência DAO. Siga os passos:

3.1. Clique no menu Ferramentas e escolha a opção Referências;

3.2. Na janela Referências, localize o Microsoft Activex Data Object 2.1


Library, marque a caixa de seleção e, depois, clique em Ok:

Uma boa dica é adicionar a última biblioteca da série


2.n. Neste exemplo, no lugar de 2.1, podemos adicionar
a biblioteca 2.8.

94
ADO - ActiveX Data Objects
5
5.3.2. Código VBA – String de conexão

Concluídas as configurações iniciais, devemos construir o código que trará os


registros da tabela Customers do banco de dados Northwind. Para isso, abra
a rotina ImportTable e declare as seguintes variáveis:

Dim Sql As String


Dim Cn As ADODB.Connection
Dim Rs As ADODB.Recordset
Dim i As Integer

A imagem a seguir demonstra como a rotina deverá ficar após a declaração das
variáveis:

Após declarar as variáveis, devemos estabelecer a conexão com a base de dados


Northwind, conforme o código a seguir:

Observe que, assim como foi feito anteriormente, usamos o ActiveWorkBook.


Path para não precisarmos colocar o caminho do arquivo mdb. Exatamente por
isso, colocamos o arquivo Excel e o banco de dados na mesma pasta (temp).
Isso é útil porque, caso precisemos carregar o projeto em um dispositivo de
armazenamento removível, não precisaremos especificar o caminho novamente,
apenas colocar os arquivos vinculados na mesma pasta.

95
Excel 2016 VBA - Módulo II

5.3.3. Código VBA – Objeto Recordset

A definição do objeto Recordset ADO é parecida com a do objeto DAO. Este


objeto é uma maneira de acessar as informações recuperadas do provedor
de dados e, por possuir muitas das propriedades e métodos do conjunto de
registros do modelo DAO, podemos trabalhar com ele igualmente.

A posição do objeto RecordSet ADO no modelo de objetos ADO, assim como


suas propriedades, é demonstrada na imagem a seguir:

Objeto Recordset

PROPRIEDADES MÉTODOS
AbsolutePage AddNew
AbsolutePosition Cancel
ActiveCommand CancelBatch
ActiveConnection CancelUpdate
BOF Clone
Bookmark CompareBookmarks
CacheSize Delete
CursorLocation Find
CursorType GetRows
DataMember GetString
DataSource Move
EditMode MoveFirst
EOF MoveLast
Coleção Fields MoveNext
Filter MovePrevius
LockType NextRecordset
MarshalOptions Open
MaxRecords Requery
PageCount Resync
PageSize Save
Coleção Properties Supports
RecordCount Update
Sort UpdateBatch
Source
State
Status
StayInSync

Coleção Fields

Objeto Field

Coleção Properties

Objeto Property

96
ADO - ActiveX Data Objects
5
No objeto ADO, é possível criar um objeto RecordSet que não requer
implícito um objeto Connection. É diferente de ter um conjunto de registros
desconectado, pois a conexão existe, apenas não há variável do objeto para
representá-la.

Continuando a construção do sistema de importação de dados da tabela


Customers do banco de dados Northwind, devemos escrever o código com a
instrução SQL que resgata os dados das tabelas do banco de dados:

Como podemos observar, a variável Sql recebe a instrução SELECT para retornar
dados das tabelas Customers, Orders e Order Details e, quando utiliza a
instrução INNER JOIN, ela faz comparação entre os "campos ID's" das tabelas,
podendo, assim, extrair dados do relacionamento entre elas (tabelas).

Da tabela Customers desse banco de dados, utilizamos o


campo CustomerID. Esse campo já está relacionado com a
tabela Orders (para conseguir identificar qual pedido é de qual
cliente). Então, devemos ver a quantidade de cada pedido na
tabela Order Details, referenciando o Order ID dele com o ID
da tabela Orders.

97
Excel 2016 VBA - Módulo II

Após montar a instrução SQL na variável, é definida a instrução Recordset e os


dados são registrados na planilha ativa, conforme a imagem a seguir:

Este trecho cria o cabeçalho


da tabela na planilha ativa.

Este trecho registra os dados


linha a linha na planilha.

Este trecho fecha a conexão


com o banco.

A parte mais importante, que é a importação dos dados, foi concluída. Agora,
podemos finalizar o procedimento, formatando as células do cabeçalho e
ajustando sua largura pois, até o presente momento, o resultado está assim:

Então, insira o código a seguir e execute-o:

98
ADO - ActiveX Data Objects
5

O código completo deverá estar assim:

  99
Excel 2016 VBA - Módulo II

5.3.3.1. Propriedades e métodos do objeto Recordset


 
A seguir, veja as propriedades e métodos mais utilizados do objeto Recordset.

•• As propriedades BOF e EOF


 
Estas propriedades indicam se o ponteiro do objeto Recordset está posicionado
antes de seu primeiro registro (BOF, Begin of File, ou início de arquivo) ou após
o último registro (EOF, End of File, ou final do arquivo). Se o Recordset estiver
vazio, BOF e EOF serão true.

Sub Exemplo_Recordset()
Dim cnt As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim linha as Integer
cnt.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & thisworkbook.path & "\Northwind.accdb;"
rst.Open "SELECT nome, sobrenome, cidade FROM Clientes order by
cidade", cnt

Cells.Clear
linha = 2
With rst
Do While Not .EOF
Cells(linha, 1) = .Fields("Cidade")
Cells(linha, 2) = .Fields("Nome")
Cells(linha, 3) = .Fields("Sobrenome")
.MoveNext
linha = linha + 1
Loop
End With
rst.Close
cnt.Close
End Sub 
  

100
ADO - ActiveX Data Objects
5
•• O método Open
 
Este método abre o objeto Recordset e recupera os dados especificados pelo
argumento de origem. O método Open tem a seguinte sintaxe:

Recordset.Open Source, ActiveConnection, CursorType, LockType,


Options
 
Em que:
indica o conjunto de registros de dados que se deve
Source recuperar. Comumente, é uma string SQL ou o nome de
uma tabela.
É a conexão ou um objeto de conexão que identifica a
ActiveConnection
conexão para ser utilizada.
Especifica o tipo de cursor para usar ao abrir o conjunto
de registros. Nos nossos exemplos, estamos utilizando
CursorType
adOpenKeyset que não bloqueia e permite a total
movimentação do cursor.
Especifica que tipo de trava o provedor deve colocar na
fonte de dados subjacente ao abrir o conjunto de registros.
LockType
Isso é definido usando um dos valores LockTypeEnum. Nos
nossos exemplos, estamos utilizando adLockOptimistic.

•• O método Close
 
Este método fecha o objeto Recordset. Isso não dispensa qualquer memória
usada pelo conjunto de registros. Para liberar a memória usada pelo objeto
Recordset, você deve definir a variável de objeto Recordset igual a Nothing.

101
Excel 2016 VBA - Módulo II

•• Os métodos para movimentação


 
Quando um conjunto de registros é aberto pela primeira vez, o cursor
está posicionado sobre o primeiro registro do Recordset. Os métodos de
movimentação são usados para navegar através dos registros de um Recordset:

Opção Descrição
MoveFirst Move o cursor para sobre o primeiro registro do Recordset.
MoveNext Move o cursor para o próximo registro do Recordset.

Atenção especial para a utilização do método MoveNext dentro


de um loop Do While. Omitir isso é um erro muito comum e
conduzirá a uma condição de loop infinito no seu código.

Caracteres curinga ADO

Select CompanyName from Custormers where city = "São Paulo"

Esta consulta retorna o nome das companhias da tabela Custormers


da cidade de São Paulo. Porém, se tivermos cadastrado Sao Paulo sem
utilizar o til (~), não haverá retorno. Daí a utilidade de caracteres curinga.

No ADO, o caractere curinga que substitui um carácter é o underline (_).


Aplicando ao mesmo exemplo, o código assim:

Select CompanyName from Custormers where city like "S_o Paulo"

Enquanto o underline (_) representa um caractere, o símbolo de


porcentagem (%) representa vários caracteres no ADO. Logo, a consulta
pode ser escrita assim:

Select CompanyName from Custormers where city like "S%"

Neste caso, ela retorna todas companhias que ficam em cidades cujo
nome começa com a letra S: São Paulo, Strasbourg, etc. Note, também,
que quando utilizamos operadores curinga, utilizamos like no lugar do
igual (=).

102
ADO - ActiveX Data Objects
5
Veja o exemplo a seguir, em que utilizamos a cláusula UNION ALL para consolidar
as vendas das filiais do grupo. Considere as 3 tabelas:

•• São Paulo:

•• Ribeirão:

•• Campinas:

103
Excel 2016 VBA - Módulo II

Observe o código:

Sub VendasGrupo()
Dim cn As ADODB.Connection, rs As ADODB.Recordset
Dim sql As String, coluna As Integer, campo As Field
Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset
With cn
.Provider = "Microsoft.ACE.OLEDB.12.0"
.ConnectionString = ThisWorkbook.Path & _
"\base\vendasfiliais.accdb"
.Open
End With
sql = "select 'São Paulo' as FILIAL, produto, quantidade from
[sao Paulo] " & _
" union all select 'Ribeirão', produto, quantidade from ribeirao
" & _
" union all select 'Campinas', produto, quantidade from campinas"
rs.Open sql, cn, adOpenKeyset, adLockOptimistic
Cells.Clear
coluna = 1
For Each campo In rs.Fields
Cells(1, coluna) = UCase(campo.Name)
coluna = coluna + 1
Next campo
Range("a2").CopyFromRecordset rs
Columns.AutoFit
rs.Close
cn.Close
Set rs = Nothing
Set cn = Nothing
End Sub

Note que utilizamos diversos conceitos e


estruturas abordados anteriormente.

104
ADO - ActiveX Data Objects
5
Pontos principais
Atente para os tópicos a seguir. Eles devem ser estudados com muita
atenção, pois representam os pontos mais importantes do capítulo.

•• A tecnologia ADO é mais recente e mais rápida que a DAO;

•• Um provedor OLE DB deve ser especificado usando a propriedade Provider


do objeto Connection ADO;

•• A cláusula UNION ALL permite a união de dados obtidos a partir de vários


comandos SELECT, sem a necessidade de relacionar as tabelas nas quais
estes dados são encontrados.

105
ADO - ActiveX Data
5
Objects
Teste seus conhecimentos
Excel 2016 VBA - Módulo II

1. Com relação ao DAO e ADO, qual a alternativa correta?

☐☐ a) Muitas empresas ainda usam a tecnologia DAO, pois é


mais antiga que ADO.

☐☐ b) No ADO, temos mais possibilidades nos controles dos


dados quanto à movimentação do cursor e bloqueio de
dados.

☐☐ c) O ADO, além de ser universal, permite também mais


configurações de conexão.

☐☐ d) Normalmente, em uma conexão entre Excel e Access,


o DAO é mais rápido que o ADO.

☐☐ e) Todas as alternativas estão corretas.

2. Qual propriedade do objeto Connection usamos, no


ADO, para definirmos uma string de conexão?

☐☐ a) Provider

☐☐ b) CursorType

☐☐ c) LockType

☐☐ d) ConnectionString

☐☐ e) Nenhuma das alternativas anteriores está correta.

108
ADO - ActiveX Data Objects
5
3. Quais são os dois objetos mais utilizados na biblioteca
ADO?

☐☐ a) Database e Connection.

☐☐ b) Database e Recordset.

☐☐ c) Connection e Recordset.

☐☐ d) Worksheet e Workbook.

☐☐ e) Nenhuma das alternativas anteriores está correta.

4. Qual(is) das alternativas a seguir corresponde(m) a um


looping muito utilizado para percorrer os registros de um
Recordset?

☐☐ a) Do While not recordset.EOF. Ou seja, faça enquanto não


for final do arquivo.

☐☐ b) Do Until recordset.EOF. Ou seja, faça enquanto não for


final do arquivo.

☐☐ c) Do While not recordset.BOF. Ou seja, faça enquanto não


for início do Recordset.

☐☐ d) As alternativas B e C estão corretas.

☐☐ e) Nenhuma das alternativas anteriores está correta.

109
Excel 2016 VBA - Módulo II

5. Quais são os caracteres curingas no ADO que representam


um caractere e uma cadeia de caracteres, respectivamente?

☐☐ a) Interrogação (?) e asterisco (*).

☐☐ b) Interrogação (?) e porcentagem (%).

☐☐ c) Underline (_) e asterisco (*).

☐☐ d) Underline (_) e porcentagem (%).

☐☐ e) Nenhuma das alternativas anteriores está correta.

110
5
ADO - ActiveX Data
Objects
Mãos à obra!
Excel 2016 VBA - Módulo II

Laboratório 1

A – Construindo um sistema para a importação de dados utilizando o objeto


ADO

Neste laboratório, vamos construir um sistema para importar os dados da tabela


Products, do banco de dados NorthWind, utilizando o objeto ADO, de acordo
com as seguintes instruções:

1. Assim como fizemos no capítulo deste laboratório, importe o campo


Customer ID da tabela Customers (que já tem relacionamento com a tabela
Orders por causa da sua identificação), referenciando, pelo INNER JOIN, a
relação do ID de cada customer com a quantidade e o preço na tabela Order
Details (Unit Price e Quantity). Se houver dúvida com os nomes de campos
e como eles funcionam, abra o arquivo Northwind.mdb no Access e verifique
as tabelas, campos e relacionamentos;

2. Depois, registre todos os dados em uma planilha, com os nomes Código,


Quantidade e Valor Unitário;

3. Selecione todas as células preenchidas e atribua um nome, por exemplo,


reg_dados. E referencie-o na propriedade Row Source de um List box em um
formulário fmr_Orders. Ele deve ficar semelhante à imagem a seguir:

Confira o resultado no arquivo Cap5 –ExercicioOrdersLab.


xlsm que acompanha este material.

112
Inserindo, editando
6
e excluindo dados
99 Preparando o ambiente;
99 INSERT;
99 UPDATE;
99 DELETE.
Excel 2016 VBA - Módulo II

6.1. Preparando o ambiente
Antes de abordarmos as macros que inserem, editam e deletam registros na base
de dados, iremos preparar o ambiente, adicionando a biblioteca, declarando as
variáveis com escopo público e criando as macros de conexão e desconexão.

É uma boa prática usar variáveis públicas para o objeto Connection e, com isso,
deixar mais dinâmico o projeto, não necessitando da repetição do código toda
vez que for conectar.

1. Adicione a Biblioteca ADO 2.8:

2. Em um arquivo novo, crie dois módulos e nomeie como VrPublic e


ConectarDesconectar:

•• No módulo VrPublic:

Public cn As ADODB.Connection
Public rs As ADODB.Recordset
Public sql As String

114
Inserindo, editando e excluindo dados
6
•• No módulo ConectarDesconectar:

Sub Conectar()
Set cn = New ADODB.Connection
With cn
.Provider = "Microsoft.ACE.OLEDB.12.0"
.ConnectionString = ThisWorkbook.Path & _
"\base\vendas.accdb"
.Open
End With
End Sub

Sub Desconectar()
cn.Close
Set cn = Nothing
End Sub

A partir de agora, sempre que formos conectar ou desconectar, basta chamarmos


estas duas macros (que usam variáveis públicas).

3. Adicione os seguintes módulos ao projeto:

•• INSERIR_DADOS;
•• EDITAR_DADOS;
•• DELETAR_DADOS.

115
Excel 2016 VBA - Módulo II

4. Crie um subdiretório (pasta) Base e, dentro dele, uma base de dados (arquivo
Access) com o nome VENDAS.accdb, contendo uma tabela VENDAS com os
campos exibidos na imagem a seguir:

O arquivo Access VENDAS.accdb está disponível no


Material de Apoio deste treinamento.

Essa tabela está vazia e será alimentada pela macro Excel:

6.2. INSERT
Usamos a instrução INSERT INTO para adicionar registro a uma tabela. Você
precisa especificar cada um dos campos do registro para os quais um valor deve
ser designado e um valor para este campo. Quando você não especifica cada
campo, o valor padrão ou Null é inserido nas colunas omitidas. Os registros são
adicionados no final da tabela.

'INSERT INTO table_name (column1,column2,column3,...)


'VALUES (value1,value2,value3,...);

Esse exemplo cria um novo registro na tabela Funcionários:

INSERT INTO Funcionários (Nome,Sobrenome, Título)


VALUES ("André", "Pereira", "Estagiário");

116
Inserindo, editando e excluindo dados
6
Continuando com o nosso exemplo, siga os passos adiante:

1. No módulo de inserção de dados, crie a seguinte macro:

Sub Inserir_01()

Dim cliente As String, produto As String, valor As Currency


Conectar
cliente = InputBox("Informe o Nome do Cliente", "VENDAS")
produto = InputBox("Informe o Produto", "VENDAS")
valor = InputBox("Informe o Valor", "VENDAS")

sql = "INSERT INTO VENDAS (CLIENTE, PRODUTO, VALOR) " & _


" VALUES ('" & cliente & "', '" & produto & "', " &
Replace(valor, ",", ".") & ");"

cn.Execute (sql)
MsgBox "DADOS INCLUÍDOS COM SUCESSO", vbInformation, "VENDAS"

Desconectar
End Sub

Ao executá-la, teremos o seguinte:

117
Excel 2016 VBA - Módulo II

2. Para que o usuário possa inserir o valor decimal com vírgula, use a função
Replace no código VBA:

Replace(valor, ",", ".")

3. No Access, confira o registro inserido:

4. Insira mais alguns registros:

118
Inserindo, editando e excluindo dados
6
Note que o ID foi adicionado automaticamente pelo banco de dados por ser
um campo configurado com Numeração Automática, por ser Chave Primária,
neste caso.

Para o INSERT, UPDATE e DELETE, não precisamos criar um


objeto Recordset, apenas usamos o método Execute do
objeto Connection, que emite os comandos SQL às fontes
de dados.

6.3. UPDATE
A instrução UPDATE altera os valores dos campos em uma tabela com base em
critérios específicos. Veja sua sintaxe:

UPDATE tabela
SET campo e valor novo
WHERE critério;

Com o comando UPDATE, é possível alterar os valores dos itens em uma tabela
de banco de dados. O exemplo a seguir usa este comando para mudar os
campos Nome da tabela Clientes para Jeff a cada campo Sobrenome contendo
o Smith:

Sql = "atualização clientes SET FirstName = 'Jeff' WHERE LastName


= 'Smith'"

UPDATE também é útil quando você quer alterar muitos registros. Você pode
alterar vários campos ao mesmo tempo. O exemplo adiante aumenta o valor
do pedido em 10% e o valor do frete em 3% para embarques a partir do Reino
Unido:

UPDATE Pedidos SET ValorPedido = ValorPedido * 1.1, Frete = Frete


* 1.03 WHERE PaísEmbarque = "RU";

UPDATE não gera um conjunto de resultados. Se você quiser saber quais


resultados serão alterados, examine primeiro os resultados da consulta SELECT
usando os mesmos critérios e, então, execute a atualização com UPDATE.

119
Excel 2016 VBA - Módulo II

O exemplo a seguir aumenta o PreçoUnit de todos os produtos não suspensos


do fornecedor 8 em 10%:

UPDATE Produtos SET PreçoUnit = PrecoUnit * 1.1


WHERE FornecedorID = 8 AND Suspenso = 'N';

Continuando com o nosso exemplo, siga os passos adiante:

1. No módulo Editar_Dados, crie esta macro:

Sub Editar_01()
Dim cliente As String, produto As String, valor As Currency
Dim LINHA As Integer, id As Integer, resposta As Integer

Set rs = New ADODB.Recordset

Conectar

id = InputBox("Qual ID Você deseja alterar?", "EDITAR")


cliente = InputBox("Para qual Cliente:", "EDITAR")
produto = InputBox("Para qual Produto?", "EDITAR")
valor = InputBox("Para qual Valor?", "EDITAR")

With rs
.ActiveConnection = cn
.CursorType = adOpenKeyset
.LockType = adLockOptimistic
sql = "SELECT CLIENTE, PRODUTO, VALOR FROM VENDAS WHERE ID =
" & id
.Open Source:=(sql)
End With

resposta = MsgBox("Deseja mesmo alterar o cliente de ID: " & id &


vbCrLf & _
"Nome: " & rs.Fields(0) & vbCrLf & "Produto: " & rs.Fields(1) &
vbCrLf & _
"Valor: " & Format(rs.Fields(2), "currency") & vbCrLf & vbCrLf &
"Para Cliente: " & _
cliente & vbCrLf & "Produto: " & produto & vbCrLf & "Valor: " & _
Format(valor, "currency") & "?", vbQuestion + vbYesNo + vbDe-
faultButton2)

120
Inserindo, editando e excluindo dados
6
If resposta = vbYes Then
sql = "UPDATE VENDAS SET CLIENTE='" & cliente & "', PRODU-
TO='" & _
produto & "', VALOR =" & valor & " WHERE ID = " & id & ";"
cn.Execute (sql)
MsgBox "Dados Alterados com Sucesso!!!", vbInformation, "VEN-
DAS"
Else
MsgBox "Dados NÃO ALTERADOS!!!", vbInformation, "VENDAS"
End If
rs.Close
Set rs = Nothing
Desconectar
End Sub

2. Execute a macro:

3. Como não inserimos tratamento de erros nesse código (não é o foco aqui),
digite um ID existente na tabela com sobrenome:

4. Digite um novo produto:

121
Excel 2016 VBA - Módulo II

5. Digite, também, um novo valor:

6. A seguinte caixa é exibida. Clique em Não e veja que o registro não foi
alterado pois, no código, usamos uma estrutura de decisão If:

7. Confira os dados ainda não alterados no Access:

122
Inserindo, editando e excluindo dados
6
8. Agora, repita a operação e, no final, confirme a alteração clicando em Sim:

9. Confirme a alteração no Access:

Em macroexcel.com.br, você pode conferir diversas


outras possibilidades.

123
Excel 2016 VBA - Módulo II

6.4. DELETE
Remove registros de uma ou mais tabelas listadas na cláusula FROM que satisfaz
a cláusula WHERE. Veja sua sintaxe:

DELETE [tabela.*]
FROM tabela
WHERE critério

Para remover registros específicos de uma tabela de banco de dados, utilize


o comando SQL DELETE. O exemplo a seguir remove todas as linhas da tabela
Clientes cujo último nome é Smith:

"DELETE FROM Clientes WHERE LastName = 'Smith'"

Certifique-se de incluir uma cláusula WHERE, que especifica


os registros exatos a serem excluídos, caso contrário, todos
registros da tabela são excluídos.

Após remover os registros usando uma consulta de exclusão, você não poderá
desfazer a operação. Se quiser saber quais arquivos foram excluídos, primeiro,
examine os resultados fazendo uma consulta SELECT que use o(s) mesmo(s)
critério(s) e, então, execute a consulta de exclusão.

Mantenha os backups de seus dados. Se você excluir os registros errados,


poderá recuperá-los a partir dos backups.

O exemplo a seguir exclui todos os registros de funcionários cujo cargo esteja


como Estagiário:

DELETE *FROM Funcionarios WHERE cargo = "Estagiário";

124
Inserindo, editando e excluindo dados
6
Continuando com o nosso exemplo, siga os passos adiante:

1. No módulo Deletar_Dados, crie a seguinte macro:

Sub Deletar_01()
'DELETE FROM table_name
'WHERE some_column=some_value;

Dim id As Integer
Conectar
id = InputBox("Qual ID Vc deseja Deletar?", "EXCLUIR VENDAS")
sql = "delete from vendas where id= " & id & ";"

cn.Execute (sql)
Desconectar
End Sub

2. Execute e teste a macro:

3. Confirme, no banco de dados, a exclusão:

125
Excel 2016 VBA - Módulo II

Note que sempre podemos melhorar o código. No exemplo anterior, antes da


exclusão, podemos colocar uma tela de confirmação de modo que, se o cliente
clicar em não, o registro não será excluído. Também podemos incluir uma rotina
para o caso de o ID informado pelo cliente não existir, como na macro a seguir:

Sub Deletar_02()
Dim cliente As String, produto As String, valor As Currency
Dim LINHA As Integer, id As Integer, resposta As Integer

Set rs = New ADODB.Recordset

Conectar

id = InputBox("Qual ID Vc deseja Deletar?", "EXCLUIR VENDAS")

With rs
.ActiveConnection = cn
.CursorType = adOpenKeyset
.LockType = adLockOptimistic
sql = "SELECT CLIENTE, PRODUTO, VALOR FROM VENDAS WHERE ID =
" & id
.Open Source:=(sql)
End With
If rs.BOF <> True Or rs.EOF <> True Then

resposta = MsgBox("Deseja mesmo Excluir o Pedido do cliente


de ID: " & id & vbCrLf & _
"Nome: " & rs.Fields(0) & vbCrLf & "Produto: " & rs.Fields(1)
& vbCrLf & _
"Valor: " & Format(rs.Fields(2), "currency") & "?", _
vbQuestion + vbYesNo + vbDefaultButton2, _
"EXCLUIR VENDAS")

If resposta = vbYes Then


sql = "delete from vendas where id= " & id & ";"
cn.Execute (sql)
MsgBox "Dados Excluídos com Sucesso!!!", vbInformation,
"EXCLUIR VENDAS"
Else

126
Inserindo, editando e excluindo dados
6
MsgBox "Venda NÃO EXCLUÍDA!!!", vbInformation, "EXCLUIR
VENDAS"
End If
Else
MsgBox "ID não encontrado!!" & vbCrLf & _
"Confirme o ID do Pedido!!", vbCritical, "EXCLUIR VENDAS"
End If
rs.Close
Set rs = Nothing
Desconectar
End Sub

4. Execute e teste a macro:

5. Propositalmente, informe um ID que não existe:

127
Excel 2016 VBA - Módulo II

6. Execute novamente a macro, informando agora um ID existente:

7. Clique em Não e observe a mensagem:

8. Confira se a venda continua no banco de dados Access:

128
Inserindo, editando e excluindo dados
6
9. Agora, repita a operação e confirme a exclusão, clicando em Sim:

10. Veja, no banco de dados, se esse registro foi excluído:

129
Excel 2016 VBA - Módulo II

Pontos principais
Atente para os tópicos a seguir. Eles devem ser estudados com muita
atenção, pois representam os pontos mais importantes do capítulo.

•• Antes de utilizar as macros que inserem, editam e deletam registros na


base de dados, é necessário preparar o ambiente, adicionando a biblioteca,
declarando as variáveis com escopo público e criando as macros de conexão
e desconexão;

•• Os comandos DML SELECT, INSERT, UPDATE e DELETE são utilizados para


realizar consultas, inclusões, alterações e exclusões de dados em registros
nas tabelas. Essas quatro tarefas podem ser realizadas em diversos registros
de várias tabelas;

•• Usamos a instrução INSERT INTO para adicionar registro a uma tabela. Você
precisa especificar cada um dos campos do registro para os quais um valor
deve ser designado e um valor para este campo. Quando você não especifica
cada campo, o valor padrão ou Null é inserido nas colunas omitidas. Os
registros são adicionados no final da tabela;

•• A instrução UPDATE altera os valores dos campos em uma tabela com base
em critérios específicos. UPDATE também é útil quando você quer alterar
muitos registros;

•• Remove registros de uma ou mais tabelas listadas na cláusula FROM que


satisfaz a cláusula WHERE.

130
Inserindo, editando
6
e excluindo dados
Teste seus conhecimentos
Excel 2016 VBA - Módulo II

1. Com relação a utilizar o ADO para inserir, editar e deletar


registros, qual a alternativa correta?

☐☐ a) Com apenas o objeto Connection e o método Execute


(sem mesmo um Recordset) é possível inserir, editar e
excluir registros.

☐☐ b) Usamos a instrução SQL Insert Into para inserir dados em


uma tabela de um banco de dados.

☐☐ c) Usamos a instrução SQL Update para editar dados em uma


tabela de um banco de dados.

☐☐ d) Usamos a instrução SQL Delete para excluir registros em


uma tabela de um banco de dados.

☐☐ e) Todas alternativas anteriores estão corretas.

2. Qual o comando SQL utilizado para inserir dados em uma


tabela de um banco de dados?

☐☐ a) INSERT INTO tabela (campo1,campo2,campo3,...) VALUES


(valor1,valor2,valor3,...);

☐☐ b) INSERT INTO tabela VALUES (valor1,valor2,valor3,...);

☐☐ c) UPDATE tabela SET campo = valor novo WHERE critério;

☐☐ d) As alternativas A e B estão corretas.

☐☐ e) Nenhuma das alternativas anteriores está correta.

132
Inserindo, editando e excluindo dados
6
3. Qual o comando SQL utilizado para editar dados em
uma tabela de um banco de dados?

☐☐ a) INSERT INTO tabela (campo1,campo2,campo3,...)


VALUES (valor1,valor2,valor3,...);

☐☐ b) DELETE FROM tabela WHERE critério;

☐☐ c) UPDATE tabela SET campo = valor novo WHERE


critério;

☐☐ d) As alternativas A e B estão corretas.

☐☐ e) Nenhuma das alternativas anteriores está correta.

4. Qual o comando SQL utilizado para excluir dados em


uma tabela de um banco de dados?

☐☐ a) INSERT INTO tabela (campo1,campo2,campo3,...)


VALUES (valor1,valor2,valor3,...);

☐☐ b) DELETE FROM tabela WHERE critério;

☐☐ c) UPDATE tabela SET campo = valor novo WHERE


critério;

☐☐ d) As alternativas A e B estão corretas.

☐☐ e) Nenhuma das alternativas anteriores está correta.

133
Excel 2016 VBA - Módulo II

5. Com relação à edição e exclusão de dados de uma tabela


de um banco dados, qual a alternativa correta?

☐☐ a) Para editar, o comando padrão é: UPDATE tabela


SET campo = valor novo WHERE critério. Para excluir, é
DELETE FROM tabela WHERE critério.

☐☐ b) É possível editar e excluir sem a cláusula WHERE.

☐☐ c) Quando usamos o UPDATE sem usar a cláusula WHERE,


teremos todos os registros da tabela alterados. Por
exemplo, UPDATE produtos SET estoque = 0. Aqui, o
estoque de todos os produtos será zerado, pois não foi
especificado nenhum produto único.

☐☐ d) Quando usamos o DELETE sem usar a cláusula


WHERE, teremos todos os registros da tabela excluídos.
Por exemplo, DELETE FROM produtos. Aqui, todos os
produtos serão deletados, pois não foi especificado
nenhum produto único.

☐☐ e) Todas alternativas anteriores estão corretas.

134
6
Inserindo, editando
e excluindo dados
Mãos à obra!
Excel 2016 VBA - Módulo II

Laboratório 1

A – Criando uma macro para inserir vários registros em uma base de dados

Neste laboratório, vamos criar uma macro que vai inserir, na base, vários
registros.

1. Considere a planilha Inserindo n Registros.xlsm, com 100 registros de


vendas:

2. Crie a seguinte macro, para inserir, na base, todos os registros:

Sub Inserir_n_Registros()

Dim cliente As String, produto As String, valor As Currency


Dim LINHA As Integer
Conectar

For LINHA = 2 To Cells(Rows.Count, 1).End(xlUp).Row

cliente = Cells(LINHA, 1)
produto = Cells(LINHA, 2)
valor = Cells(LINHA, 3)

136
Inserindo, editando e excluindo dados
6
sql = "INSERT INTO VENDAS (CLIENTE, PRODUTO, VALOR) " & _
" VALUES ('" & cliente & "', '" & produto & "', " & valor & ");"

cn.Execute (sql)
Next LINHA
MsgBox "DADOS INSERIDOS COM SUCESSO", vbInformation, "VENDAS"

Desconectar
End Sub

3. Teste e veja que, em apenas uma macro, inserimos "N" registros na base de
dados.

137
7
Importando dados
de um arquivo TXT
99 Preparando o ambiente;
99 Construindo a rotina;
99 Atribuindo a rotina a um controle de formulário.
Excel 2016 VBA - Módulo II

7.1. Introdução
Nos capítulos anteriores, observamos a importação de arquivos de tabelas de
uma base de dados Access. Este procedimento é comum em empresas que
utilizam esse gerenciador de banco de dados como ponte entre uma base SQL
ou Oracle e as planilhas dos usuários. Porém, em algumas situações, o usuário
poderá obter dados diretamente da base SQL ou Oracle, através do Excel. Nesse
caso, o usuário solicitará os dados ao administrador da base, o qual irá gerar os
dados em arquivo .txt.

Quando o usuário solicita dados diretamente ao responsável pela base, sem a


necessidade de utilização do Access como ponte entre a base e as planilhas, é o
próprio responsável pela base que criará as consultas dentro do SQL ou Oracle,
as quais retornarão exatamente o que o usuário necessita da base corporativa.
Nesse caso, o usuário deverá, apenas, transferir os dados para a planilha.

Neste capítulo, vamos acompanhar o desenvolvimento de uma rotina para


capturar arquivos .txt para uma planilha Excel.

7.2. Preparando o ambiente
O arquivo TabMedic.txt, que utilizaremos neste capítulo, é uma tabela de vendas
de medicamentos de uma fictícia indústria farmacêutica, e deve ser instalado na
mesma pasta temp que você criou e usou nos capítulos anteriores. No mesmo
local, vamos criar uma nova pasta de trabalho, denominada BDTesteTxt,
contendo apenas uma planilha.

Após salvar o arquivo no endereço recomendado, devemos alternar para o VBE e


inserir um novo módulo. Neste módulo, devemos inserir as seguintes variáveis,
demonstradas na imagem adiante:

140
Importando dados de um arquivo TXT
7
Em que:
Receberá apenas o caminho da pasta em que está o arquivo
.txt (temp). Esta variável será concatenada com a variável do
Caminho
nome do arquivo .txt para formar o caminho completo do
arquivo
Receberá apenas o nome do arquivo .txt instalado na pasta
NomeArq (TabMedic.txt). Esta variável será concatenada com a variável
de endereço para formar o caminho completo do arquivo.
Receberá o caminho completo do arquivo .txt. Isto é, o
endereço da pasta (temp) e o nome do arquivo TabMedic.txt.
CamiArq
Esta variável será utilizada no comando que abrirá o arquivo
.txt.
Receberá o nome do arquivo principal, BDTesteTxt.xlsm. Ela
Arq será necessária para facilitar a ativação do arquivo principal
em um determinado momento da rotina.
Receberá o objeto Application. Este procedimento facilitará a
escrita da rotina, pois, para obter uma propriedade ou método
App de Application, não haverá a necessidade de digitar o nome
completo do objeto, bastará digitar "App." e selecionar a
propriedade, método ou objeto desejado.

7.3. Construindo a rotina
Devemos iniciar a construção da rotina alimentando a variável de objeto App.
Dessa maneira, a digitação dos códigos será simplificada. Observe a imagem a
seguir:

141
Excel 2016 VBA - Módulo II

Em seguida, devemos alimentar as variáveis de endereço Arq, Caminho,


NomeArq e CamiArq, de acordo com a imagem a seguir:

Observe que a variável Arq recebe a instrução ActiveWorkbook.Name. Esta


instrução captura o nome da workbook (pasta de trabalho) ativa. Como a rotina
é iniciada na pasta de trabalho BDTesteTxt, a variável receberá o nome desta
pasta.

Na variável Caminho, veja também que utilizamos a instrução ThisWorkBook.


Path, que captura o caminho de acordo com a pasta do arquivo atual. A variável,
então, recebe o caminho referente à localização do arquivo, seja ela qual for.

Outra questão a observar é a alimentação da variável CamiArq. Após alimentar


as variáveis Caminho com o endereço do arquivo .txt e NomArq com o nome
do arquivo .txt, a variável CamiArq recebe a variável Caminho concatenada com
a barra e a variável NomeArq. Sendo assim, essa variável agregará o caminho
completo do arquivo .txt.

Após alimentar as variáveis de endereço, devemos ajustar a pasta de trabalho.


A parte da rotina a seguir verifica a quantidade de planilhas existentes na pasta:

A variável n recebe o número


de planilhas da pasta de
trabalho.

142
Importando dados de um arquivo TXT
7
Em seguida, através do loop demonstrado na imagem adiante, a rotina elimina
as planilhas excedentes (se houverem), deixando apenas uma:

O loop rodará até que n seja


igual a 1.

Exclui a planilha número n.

Decrementa 1 ao número n a
cada loop.

Após configurar a pasta de trabalho, a próxima instrução da rotina irá abrir o


arquivo .txt e transformá-lo em uma nova planilha na pasta de trabalho ativa.
O comando utilizado é similar à ação de ativar a guia Arquivo na pasta de
trabalho, selecionar o comando Abrir e indicar o local, nome e tipo de arquivo a
ser aberto. O comando OpenText informa que o arquivo aberto será tipo texto.
Veja as instruções a seguir:

Define o tipo de campo O método OpenText informa


como delimitado, ou seja, que o tipo de arquivo a abrir
caracteres como vírgula ou será arquivo texto.
tabulação separam cada
campo. Nome e endereço completo
do arquivo .txt.

Informa que o caractere Define que o qualificador de


separador de campo será textos será aspas.
Tab (tabulação) e desabilita
os demais (ponto e vírgula,
vírgula e espaço).

A instrução anterior abrirá o arquivo .txt em forma de nova planilha, incluindo


todos os dados. O resultado obtido é o mesmo quando abrimos um arquivo
.txt através da pasta de trabalho. Por padrão, o Excel cria uma nova pasta de
trabalho com apenas uma planilha contendo os dados do arquivo .txt.

143
Excel 2016 VBA - Módulo II

Na próxima etapa, devemos transferir essa planilha para a pasta de trabalho


BDTesteTxt. A instrução da imagem adiante transfere a planilha (única) para a
workbook principal e a instala após a primeira planilha:

Move a planilha ativa da


workbook.
Define que a movimentação
deve ser para o lado direito
(depois) da primeira planilha
da pasta de trabalho
BDTesteTxt.

O comando da instrução anterior fecha automaticamente a pasta de trabalho da


planilha que foi transferida. Isso ocorre porque ela possui apenas uma planilha
(a do arquivo .txt). Normalmente, esse procedimento gera uma mensagem
informando o ocorrido, porém, no início da rotina, desabilitamos os avisos do
sistema através da instrução App.DisplayAlerts = False. Observe a instrução a
seguir, que mostra o início da rotina:

Desabilita os avisos do
sistema.

Após instalar a planilha com os dados do arquivo texto na pasta de trabalho


atual, o próximo passo é configurar os dados da pasta. Como são muitos dados
e de vários tamanhos, eles aparecem truncados nas colunas. A instrução a seguir
apenas aplicará o ajuste automático às colunas:

As próximas instruções devolverão ao estado normal a atualização de tela e os


avisos do sistema:

144
Importando dados de um arquivo TXT
7
7.4. Atribuindo a rotina a um controle de
formulário
Para finalizar, devemos inserir um controle de formulário na primeira planilha
e atribuir a rotina a esse controle. Assim, quando o usuário desejar importar
o arquivo .txt, bastará clicar sobre o botão de controle. Veja as instruções a
seguir:

1. Na guia Desenvolvedor, grupo Controles, clique no botão Inserir e escolha


a ferramenta Botão na área de Controles de Formulário, conforme a imagem
adiante:

2. Clique em algum lugar da planilha para inserir o botão. Depois, clique no


nome da macro que o botão deverá executar (Import_Arq_Texto) e, então, em
OK:

145
Excel 2016 VBA - Módulo II

3. Utilize as alças de redimensionamento para alterar o tamanho do botão:

4. Selecione o texto do botão enquanto este apresentar as alças de


redimensionamento:

5. Digite o novo texto e, em seguida, clique em qualquer célula da planilha para


sair do modo edição e torná-lo funcional.

146
Importando dados de um arquivo TXT
7
Após esse procedimento, o arquivo .txt poderá ser importado, bastando, para
isso, um clique simples sobre o botão da planilha. O resultado deve ser o
seguinte:

147
Excel 2016 VBA - Módulo II

Pontos principais
Atente para os tópicos a seguir. Eles devem ser estudados com muita
atenção, pois representam os pontos mais importantes do capítulo.

•• Em muitas situações, o usuário poderá receber dados diretamente de uma


base SQL, Oracle ou outra base, sem a necessidade de filtrá-los no Access.
Nestes casos, o administrador da base de dados criará as consultas para
selecionar os dados necessários na base e exportá-los para um arquivo .txt;

•• Para preparar o ambiente, após salvar o arquivo .txt no endereço


recomendado, devemos alternar para o VBE e inserir um novo módulo.
Neste módulo, serão inseridas diversas variáveis. Entre elas, a variável App,
que receberá o objeto Application;

•• Após configurar a pasta de trabalho, a próxima instrução da rotina deve abrir


o arquivo .txt e transformá-lo em uma nova planilha na pasta de trabalho
ativa. É o comando OpenText que informa que o arquivo aberto será tipo
texto;

•• Quando inserimos um controle de formulário na primeira planilha e


atribuímos a rotina a esse controle, o usuário pode importar o arquivo .txt,
somente clicando sobre o botão de controle.

148
Importando dados
7
de um arquivo TXT
Teste seus conhecimentos
Excel 2016 VBA - Módulo II

1. Com relação à importação de dados de um arquivo TXT,


qual a alternativa correta?

☐☐ a) Devemos utilizar a biblioteca Microsoft DAO 3.6.

☐☐ b) Devemos utilizar a biblioteca Microsoft ADO 2.8.

☐☐ c) Não há a necessidade de adicionar nenhuma biblioteca


para importar dados de um TXT.

☐☐ d) As alternativas A e B estão corretas.

☐☐ e) Nenhuma das alternativas anteriores está correta.

2. Com relação ao método OpenText, qual a alternativa


correta?

☐☐ a) Pertence ao objeto Workbook, importando o arquivo


texto, por padrão, para dentro da pasta de trabalho em que
está escrita a macro.

☐☐ b) Pertence à coleção Workbooks, importando o arquivo


texto, por padrão, para um arquivo Excel novo.

☐☐ c) Nos parâmetros deste método, definimos se a importação


será pelo Delimitar ou Largura Fixa, bem como vários outros
detalhes, como o nome do arquivo TXT a ser importado.

☐☐ d) As alternativas B e C estão corretas.

☐☐ e) Nenhuma das alternativas anteriores está correta.

150
Importando dados de um arquivo TXT
7
3. Com relação ao parâmetro FileName do método OpenText
da coleção Workbooks, qual a alternativa correta?

☐☐ a) Devemos especificar o nome completo do arquivo


(caminho, nome e extensão), sendo muito útil o comando
Thisworkbook.path, caso o arquivo TXT a ser importado
esteja na mesma pasta do arquivo Excel (em que está
escrita a macro).

☐☐ b) Devemos especificar o arquivo TXT e a pasta Excel que


receberá este arquivo.

☐☐ c) Devemos especificar apenas o nome do arquivo e


extensão. Por exemplo, Estoque.txt.

☐☐ d) Não devemos especificar o nome completo do arquivo


TXT a ser importado.

☐☐ e) Nenhuma das alternativas anteriores está correta.

151
Excel 2016 VBA - Módulo II

4. Qual o objetivo de utilizar o seguinte looping?

Do Until sheets.count = 1
Sheest(sheets.count).delete
Loop

☐☐ a) Excluir todas as planilhas da pasta de trabalho ativa, com


exceção da primeira planilha.

☐☐ b) Excluir todas as planilhas da pasta de trabalho ativa.

☐☐ c) Excluir todas as planilhas da pasta de trabalho ativa, com exceção


da planilha atual.

☐☐ d) As alternativas A e C estão corretas.

☐☐ e) Nenhuma das alternativas anteriores está correta.

5. Qual a alternativa que corresponde à atividade realizada pelo


comando a seguir?

ActiveSheet.move After:=thisworkbook.sheets(1)

☐☐ a) A planilha ativa será movida para a segunda planilha do arquivo


em que está escrita a macro.

☐☐ b) A planilha ativa será movida para a última planilha do arquivo


em que está escrita a macro.

☐☐ c) A planilha ativa será movida para a primeira planilha do arquivo


em que está escrita a macro.

☐☐ d) A planilha ativa será movida para depois da planilha ativa do


arquivo em que está escrita a macro.

☐☐ e) Nenhuma das alternativas anteriores está correta.

152
Importando dados
7
de um arquivo TXT
Mãos à obra!
Excel 2016 VBA - Módulo II

Laboratório 1

A – Criando um sistema para a importação de dados de um arquivo TXT

Neste laboratório, vamos construir um sistema para importar os dados do


arquivo indicado na tabela, conforme demonstrado na imagem:

1. Considere as instruções adiante:

•• A planilha deverá estar protegida;

•• O usuário poderá selecionar apenas as células B2 e B3;

•• Ao clicar sobre o botão Importar TXT, o sistema importará os dados do


arquivo .txt da célula selecionada para a segunda planilha.

Confira o resultado no arquivo Cap7 –ExercicioTxtLab.xlsm


que acompanha este material. Os arquivos TabMedic.txt e
Customers.txt também estão disponíveis para o exercício
no Kit Apostila.

154
Inserindo gráficos
8
em formulários
99 Preparando o gráfico;
99 O formulário de controle;
99 O formulário Gráfico.
Excel 2016 VBA - Módulo II

8.1. Introdução
Imagens valem muito mais que mil palavras. Este é um ditado antigo e muito
bem aplicado em apresentações. As massas de dados armazenadas em bancos
de dados podem ser analisadas por meio de gráficos que as representem. Até
o momento, tratamos de apresentação de massas de dados em planilhas ou
formulários VBA, cujos dados foram importados de tabelas Access, planilhas
do Excel ou arquivos .txt. Neste capítulo, abordaremos a apresentação destes
dados em formulários VBA através de gráficos.

A inserção de gráficos em formulários VBA é relativamente simples. Primeiro,


devemos gerar um gráfico em uma planilha e, depois, criar uma rotina para
exportá-lo no formato imagem (.gif, .jpeg, etc.). Em seguida, devemos importar
esta imagem para um objeto imagem de um formulário.

8.2. Preparando o gráfico
Antes de escrever a rotina, devemos construir o gráfico que será apresentado
no formulário. Para isso, abra uma pasta de trabalho e insira um gráfico de
barras, como o da imagem a seguir:

O gráfico deverá ser instalado na primeira planilha e a tabela que o alimenta


deverá ser instalada na mesma posição da ilustração, ou seja, a partir da célula
A1.

156
Inserindo gráficos em formulários
8
8.3. O formulário de controle
Com o formulário montado na planilha, devemos abrir o editor do VBA (VBE) e
inserir dois formulários: um receberá o gráfico da planilha e outro carregará os
controles do gráfico.

O primeiro formulário que iremos criar será o de controle, o qual controlará a


inserção de valores nos campos que alimentam o gráfico, além de carregar o
formulário do gráfico. Veja as instruções a seguir:
Insira dois textboxes, dois
rótulos, dois spinbuttons e
dois commandbuttons.

157
Excel 2016 VBA - Módulo II

1. Nomeie, posicione e redimensione os objetos, de modo que o formulário


fique com a aparência a seguir:

ufm_Controle
spb_VrSul
tbx_VrNortel

tbx_VrSul spb_Vr|Norte

cmb_Grafico cmb_Sair

Aplique um duplo-
clique sobre o
objeto spinbutton.

2. Insira esta rotina no evento Change do objeto:

3. Altere as propriedades do spinbutton conforme a imagem a seguir:

Altere a propriedade
Max para 100.

Altere a propriedade
Min para 10.

Altere a propriedade
SmallChange para
10.

158
Inserindo gráficos em formulários
8
Na imagem anterior, a rotina construída no evento Change do spinbutton fará
com que, ao clicar sobre qualquer das setas (para cima ou para baixo) desta
ferramenta, o valor do spinbutton seja inserido no Textboxtbx_VrSul e na
célula B1. Pelo fato de as propriedades Max, Min e SmallChange terem sido
alteradas, a cada clique nas setas, o valor do spinbutton será alterado de dez
em dez, sendo o mínimo 10 e o máximo 100.

4. Nomeie o formulário como ufm_Controle e abra-o novamente:

Aplique um duplo-
clique sobre o
objeto spinbutton.

5. Em seguida, insira esta rotina no evento Change do objeto:

6. Altere as propriedades do spinbutton, conforme a imagem adiante:

Altere a propriedade
Max para 100.

Altere a propriedade
Min para 10.

Altere a propriedade
SmallChange para
10.

159
Excel 2016 VBA - Módulo II

Na ilustração anterior, a rotina construída no evento Change do spinbutton


fará com que, ao clicar sobre qualquer das setas (para cima ou para baixo)
desta ferramenta, o valor do spinbutton seja inserido no Textboxtbx_VrNorte
e na célula B1. Assim como na rotina anterior, pelo fato de as propriedades
Max, Min e SmallChange terem sido alteradas, a cada clique nas setas, o valor
do spinbutton será alterado de dez em dez, considerando o valor mínimo de
10 e máximo de 100.

7. Retorne ao formulário e aplique um duplo-clique sobre o botão Exibir Gráfico:

8. Em seguida, insira esta rotina no evento Click do objeto cmb_Grafico:

A rotina inserida no evento Click do objeto cmb_Grafico desliga o formulário


ufm_Controle e abre o formulário ufm_Chart.

9. Para finalizar, retorne para o formulário e atribua o comando UnloadMe ao


objeto cmb_Sair para que, ao clicar sobre este botão, o usuário possa fechar o
formulário:

160
Inserindo gráficos em formulários
8
8.4. O formulário Gráfico
Este formulário é o objeto principal deste capítulo. Ele reproduzirá o gráfico que
montamos na planilha e possuirá apenas dois objetos: um frame de imagem e
um botão para fechá-lo.

1. Insira os objetos indicados no formulário:

2. Redimensione, posicione e atribua nomes aos objetos, conforme as instruções


a seguir:
ufm_Chart

img_Grafico

cmb_Fechar

161
Excel 2016 VBA - Módulo II

3. Aplique um duplo-clique no corpo do formulário e, em seguida, alterne para


o evento Initialize:

4. Crie a variável privada GrafEd para acomodar o endereço completo do objeto


gráfico:

5. Crie a rotina indicada no evento Initialize:

Para inserir um gráfico em um formulário VBA, primeiro, a rotina exporta o objeto


gráfico como uma imagem. Na rotina da imagem anterior, este procedimento é
representado pela seguinte instrução:

ActiveChart.Export GrafEd, "jpg"

Observe que a variável GrafEd carrega o endereço e o nome do arquivo gráfico


a ser exportado. Neste caso, o gráfico foi denominado grafico1.jpg e será
instalado na pasta que estiver o arquivo de Excel atual.

162
Inserindo gráficos em formulários
8
Agora que o gráfico está instalado na pasta como uma imagem, o arquivo .jpg
criado será carregado no objeto Picture img_Grafico do formulário:

Me.Image1.Picture = LoadPicture(GrafEd)

A última instrução da rotina apenas realiza o ajuste da imagem do gráfico ao


objeto Picture do formulário, sem o qual a imagem do gráfico ficaria distorcida:

Me.Image1.PictureSizeMode = fmPictureSizeModeStretch

Observe que, à propriedade PictureSizeMode do objeto Pictureimg_Grafico,


é atribuída a definição fmPictureSizeModeStretch. Esta definição, que contém
o valor 1, estica a figura para que ela preencha todos os espaços do objeto
imagem, tanto na vertical quanto na horizontal. Portanto, ao indicar esse tipo
de definição, é aconselhável não exagerar na forma do objeto imagem.

Além da definição de ajuste de imagem, a propriedade PictureSizeMode possui


outras duas definições:

•• fmPictureSizeModeClip: Esta definição mantém o tamanho original da


imagem e, caso a imagem exceda o tamanho do objeto Picture, ela corta
a imagem e mostra apenas a parte que cabe no objeto. Esta definição é
padrão da propriedade e possui o valor 0;

•• fmPictureSizeModeZoom: Esta definição amplia a imagem dentro do objeto


Picture, mas não a distorce. Ela mantém as proporções da imagem e possui
o valor numérico 2.

163
Excel 2016 VBA - Módulo II

Após definir os valores de Sul e Norte no formulário Controle, basta clicar no


botão Exibir Gráfico e o formulário aparecerá na tela com a seguinte aparência:

164
Inserindo gráficos em formulários
8
Pontos principais
Atente para os tópicos a seguir. Eles devem ser estudados com muita
atenção, pois representam os pontos mais importantes do capítulo.

•• Para apresentar gráficos em um formulário VBA do Excel, é necessário,


primeiramente, criá-los na planilha;

•• O gráfico criado na planilha será transformado em imagem pela rotina VBA


e exportado para uma determinada pasta;

•• A rotina VBA carregará a imagem do gráfico para um objeto Picture inserido


em um formulário VBA.

165
Inserindo gráficos
8
em formulários
Teste seus conhecimentos
Excel 2016 VBA - Módulo II

1. Qual o controle padrão de um UserForm?

☐☐ a) Um objeto Chart que permite criar um gráfico.

☐☐ b) Um objeto Image que pode carregar a imagem de um


gráfico.

☐☐ c) Um objeto Picture que carrega uma imagem.

☐☐ d) As alternativas A e C estão corretas.

☐☐ e) Nenhuma das alternativas anteriores está correta.

2. Com relação ao gráfico que será carregado em um objeto


Image, qual a alternativa correta?

☐☐ a) Deve estar em uma planilha e ser exportado como


figura.

☐☐ b) Por padrão, está no Access e será importado direto do


arquivo Access.

☐☐ c) Será carregado pela propriedade Picture do objeto Image.

☐☐ d) As alternativas A e C estão corretas.

☐☐ e) Nenhuma das alternativas anteriores está correta.

168
Inserindo gráficos em formulários
8
3. Com relação à atualização (alteração) de um gráfico no
UserForm, qual a alternativa correta?

☐☐ a) Não é possível alterar ou atualizar um gráfico.

☐☐ b) Devemos utilizar o evento Change já alterando o


gráfico dentro do objeto Image.

☐☐ c) Pelo objeto Image, devemos já alterar o gráfico


contido nele.

☐☐ d) Primeiro, devemos alterar o gráfico existente


na planilha, exportar e carregar no objeto Image
novamente.

☐☐ e) Nenhuma das alternativas anteriores está correta.

4. Quanto ao evento Initialize do UserForm, qual a


alternativa correta?

☐☐ a) Permite definir comandos para serem executados


quando o UserForm for inicializado.

☐☐ b) Permite exportar o gráfico da planilha para um


arquivo e carregá-lo no objeto Image do UserForm.

☐☐ c) É o evento mais utilizado do objeto UserForm.

☐☐ d) As alternativas A, B e C estão corretas.

☐☐ e) Nenhuma das alternativas anteriores está correta.

169
Excel 2016 VBA - Módulo II

5. Com relação à função LoadPicture, qual a alternativa


correta?

☐☐ a) Estica a figura para que ela preencha todos os espaços


do objeto imagem.

☐☐ b) Define o ajuste da imagem no objeto Image.

☐☐ c) Lê/Carrega o arquivo (imagem) no objeto Image.

☐☐ d) Mantém o tamanho original da imagem.

☐☐ e) Nenhuma das alternativas anteriores está correta.

170
8
Inserindo gráficos
em formulários
Mãos à obra!
Excel 2016 VBA - Módulo II

Laboratório 1

A – Criando um sistema para a exibição de um formulário com gráfico

Neste laboratório, vamos construir um sistema para exibir um formulário com


um gráfico, conforme a imagem a seguir:

172
Inserindo gráficos em formulários
8
1. Considere as instruções adiante:

•• A planilha do gráfico deverá ficar oculta;

•• O usuário deverá imputar os valores diretamente nas células;

•• Para exibir o gráfico, o usuário deverá clicar sobre o botão Exibir Formulário.

Confira o resultado no arquivo Cap8 –Exercicio Grafico.


xlsm que acompanha este material.

173
Programando com
9
o objeto FSO
(File System Object)
99 Interagindo com arquivos texto;
99 Acessando drives, diretórios e arquivos.
Excel 2016 VBA - Módulo II

9.1. Introdução
Pelo FSO (File System Object), podemos manipular objetos como Drive, File,
Folder e TextStream. Podemos obter informações sobre arquivos e diretórios
de uma maneira simples.

•• ObjetoFSO Objects FSO


 
Objeto Descrição
FileSystemObject Permite interagir com arquivos, Folders e Drives.
Permite examinar as informações em disquete, CD-
Drive
ROM, disco RAM, e unidades de rede.
O objeto File é usado para examinar e manipular
File object
arquivos.
O objeto Folder é usado para examinar e manipular
Folder object
pastas.
TextStream Utilizado para ler e gravar arquivos texto.
 

176
9
Programando com o objeto FSO
(File System Object)

Para trabalhar com as classes que nos proporcionam esses recursos, primeiro,
devemos criar uma referência à DLL do Microsoft Scripting Runtime. No menu
Ferramentas / Referências, procure por Microsoft Scripting Runtime:

Veja quais são os principais métodos e propriedades de FileSystemObject


(FSO):

•• BuildPath; •• Drives; •• GetFile;


•• CopyFile; •• FileExists; •• GetFileName;
•• CopyFolder; •• FolderExists; •• GetFolder;
•• CreateFolder; •• GetAbsolutePathName; •• GetParentFolderName;
•• CreateTextFile; •• GetBaseName; •• GetSpecialFolder;
•• DeleteFile; •• GetDrive; •• GetTempName;
•• DeleteFolder; •• GetDriveName; •• MoveFile;
•• DriveExists; •• GetExtensionName; •• MoveFolder;
•• OpenTextFile.

177
Excel 2016 VBA - Módulo II

9.2. Interagindo com arquivos texto


A classe TextStream dessa biblioteca permite a criação, leitura ou alteração de
arquivos de texto a partir do código VBA.

9.2.1. Criando, adicionando dados e fechando um arquivo


texto

•• O método CreateTextFile cria um arquivo texto;

•• O método WriteLine escreve uma string para o arquivo de texto e termina-o


com o novo caractere de linha.

O código a seguir cria um arquivo TXT e adiciona linhas de texto:

Sub FSO_01()
Dim fso As FileSystemObject, arqTxt As TextStream
Set fso = New FileSystemObject
Set arqTxt = fso.CreateTextFile( _
ThisWorkbook.Path & "\dados.txt", True, False)
arqTxt.WriteLine "PRODUTO - ESTOQUE"
arqTxt.WriteLine "CANETA - 10"
arqTxt.WriteLine "CADERNO - 15"
arqTxt.WriteLine "LIVRO - 8"
arqTxt.Close
Set fso = Nothing
Set arqTxt = Nothing
End Sub

Execute e teste a macro.

Observe que o diretório atual antes da macro ser executada estava somente
com o arquivo fso.xlsm:

178
9
Programando com o objeto FSO
(File System Object)

Após a execução dessa parte da macro, encontraremos também o arquivo


dados.txt:

Dim fso As FileSystemObject, arqTxt As TextStream


Set fso = New FileSystemObject
Set arqTxt = fso.CreateTextFile( _
ThisWorkbook.Path & "\dados.txt", True, False)

O método WriteLine insere as linhas do conteúdo:

arqTxt.WriteLine "PRODUTO - ESTOQUE"


arqTxt.WriteLine "CANETA - 10"
arqTxt.WriteLine "CADERNO - 15"
arqTxt.WriteLine "LIVRO - 8"

Observe, então, o conteúdo do arquivo dados.txt criado pelo método


CreateTextFile da classe FyleSystemObject e os conteúdos inseridos pelo
método WriteLine do objeto ArqTxt, que representa o arquivo da classe
TextStream da biblioteca Microsoft Scripting Runtime.

179
Excel 2016 VBA - Módulo II

Com relação à classe TextStream e à macro FSO_01, podemos observar o


seguinte:

•• O método OpenTextFile abre um arquivo texto;

•• O método ReadLine retorna uma string contendo a linha atual do arquivo


texto e move o cursor para a linha seguinte;

•• O método ReadAll retorna, em uma string, todo o arquivo texto;

•• A propriedade AtEndOfStream retorna True quando o cursor está no final


do arquivo;

•• O método SkipeLine move o cursor para a próxima linha;

•• A função Split, como o nome sugere, é uma função poderosa do VBA que
divide uma string com base em critérios específicos (delimitador), retornando
uma matriz com a string dividida.

Veja a sintaxe da função Split:

Split (text_string, delimiter, limit, compare)

Em que:
text_string É a string completa.
delimiter É o delimitador.
É um argumento opcional. Especifica o número máximo de
limit
partes em que as substrings devem ser divididas.
É um argumento opcional que especifica o método
compare de comparação a ser usado. compare 0 executa uma
comparação binária e 1 executa uma comparação textual.

180
9
Programando com o objeto FSO
(File System Object)

9.2.2. Abrindo um arquivo texto e trazendo dados para a


planilha

O código adiante abre o arquivo dados.txt criado no exemplo anterior, usando


o método OpenTextFile for Reading, faz uma estrutura de repetição com a
propriedade AtEndOfStream, usa o método ReadLine para ler linha a linha,
com a função Split do VBA, separa a string pelo seu delimitador e, em outro
loop, envia para cada coluna da planilha a respectiva string.

Sub FSO_02()
Dim fso As FileSystemObject, arqTxt As TextStream
Dim n As Integer, linha As Integer, textoLinha() As String
Set fso = New FileSystemObject
Set arqTxt = fso.OpenTextFile( _
ThisWorkbook.Path & "\dados.txt", ForReading)
Cells.Clear
linha = 1
Do Until arqTxt.AtEndOfStream
textoLinha = Split(arqTxt.ReadLine, "-")
For n = LBound(textoLinha) To UBound(textoLinha)
Cells(linha, n + 1) = textoLinha(n)
Next n
linha = linha + 1
Loop
Columns.AutoFit
arqTxt.Close
Set fso = Nothing
Set arqTxt = Nothing
End Sub

Vamos executar passo a passo:

Abrimos o arquivo dados.txt com o método OpenTextFile da classe


FileSystemObject:
Dim fso As FileSystemObject, arqTxt As TextStream
Dim n As Integer, linha As Integer, textoLinha() As String
Set fso = New FileSystemObject
Set arqTxt = fso.OpenTextFile( _
ThisWorkbook.Path & "\dados.txt", ForReading)

181
Excel 2016 VBA - Módulo II

Com o arquivo dados.txt aberto, criamos um looping até a última linha deste
arquivo:
Do Until arqTxt.AtEndOfStream

Usamos o método ReadLine do arquivo aberto e uma função Split para


desmembrá-lo pelo delimitador, atribuindo esse resultado a um array (variável
declarada como array):

textoLinha = Split(arqTxt.ReadLine, "-")

Criamos um loop com início e final coincidentes com os dessa matriz, enviando
esse texto à respectiva célula:

For n = LBound(textoLinha) To UBound(textoLinha)


Cells(linha, n + 1) = textoLinha(n)
Next n
linha = linha + 1
Loop

Observe que declaramos a variável textLinha como array:

textoLinha() As String

Como elemento desse array, teremos a linha do arquivo .txt separada pelo
delimitador que, no Excel, pela estrutura de repetição For / Next, é colocada
em cada coluna da linha atual da planilha.

Note que o looping tem como contagem inicial LBound, que representa o
primeiro índice de um array e Ubound, que representa o último índice de um
array. Isso permite uma dinâmica em que, na linha do arquivo TXT, podemos
ter várias colunas, ou seja, uma linha com o delimitador delimitando vários
dados. Com essa lógica, no Excel, eles estarão em colunas diferentes.

A função Split, como já comentado, divide a string conforme o delimitador,


retornando um array em que cada elemento é uma string 'entre' o delimitador.

182
9
Programando com o objeto FSO
(File System Object)

9.2.3. Adicionando registros a um arquivo TXT

Na macro adiante, adicionaremos dados a partir da última linha do arquivo


dados.txt. Vamos abrir o arquivo com o método OpenTextFile usando o
argumento ForAppending e, novamente, usaremos o método WriteLine.

Sub FSO_03()
Dim fso As FileSystemObject, arqTxt As TextStream
Set fso = New FileSystemObject
Set arqTxt = fso.OpenTextFile( _
ThisWorkbook.Path & "\dados.txt", ForAppending)
arqTxt.WriteLine "NOTEBOOK - 4"
arqTxt.WriteLine "CELULAR - 9"
arqTxt.Close
Set fso = Nothing
Set arqTxt = Nothing
End Sub

Dim fso As FileSystemObject, arqTxt As TextStream


Set fso = New FileSystemObject
Set arqTxt = fso.OpenTextFile( _
ThisWorkbook.Path & "\dados.txt", ForAppending)
arqTxt.WriteLine "NOTEBOOK - 4"
arqTxt.WriteLine "CELULAR - 9"

9.3. Acessando drives, diretórios e arquivos


A instrução Kill remove arquivos, a MkDir cria um diretório e a instrução RmDir
remove diretórios.

É possível fazer uso dos caracteres especiais do Windows asterisco (*) e


interrogação (?) para remover vários arquivos ou diretórios. Podemos fazer
como no MS-DOS:

Kill Thisworkbook.Path & "\dados.txt"


MkDir Thisworkbook.Path & "\Pasta_Teste"
RmDir Thisworkbook.Path & "\Pasta_Teste"

183
Excel 2016 VBA - Módulo II

Se você tentar usar a instrução RmDir em um diretório ou pasta que contém


arquivos, um erro será gerado. Use a instrução Kill para excluir todos os arquivos
antes de tentar a remoção de um diretório ou pasta.

Com o método Saveas do objeto workbook, podemos redirecionar um arquivo


(inclusive renomeando-o) para o local (pasta, diretório) que quisermos. Porém,
é importante considerar a importância de comandos práticos como: FileCopy,
Kill, MkDir, RmDir e Name.

Na próxima macro, veremos que a instrução FileCopy tanto copia como renomeia
(se preciso) o arquivo copiado. MkDir cria um diretório. A instrução Name tanto
renomeia um arquivo (file) como um diretório (pasta, folder).

Sub arquivos_e_diretorios()

'cria diretório (ainda não existente):


MkDir ThisWorkbook.Path & "\teste"

'cria outro diretório (subdiretório):


MkDir ThisWorkbook.Path & "\teste\teste"

'cria uma cópia do arquivo dados.txt:


FileCopy ThisWorkbook.Path & "\dados.txt",ThisWorkbook.Path
& "\teste\dados.txt"

'Renomeia (movendo) arquivo para outro diretório


Name ThisWorkbook.Path & "\teste\dados.txt" As
ThisWorkbook.Path & "\teste\teste\dados_estoque.txt"

'Renomeia pasta
Name ThisWorkbook.Path & "\teste\teste" As ThisWorkbook.
Path & "\teste\teste2"

'deleta arquivo
Kill ThisWorkbook.Path & "\teste\teste2\dados_estoque.txt"

'remove diretório vazio


RmDir ThisWorkbook.Path & "\teste\teste2"

'remove diretório vazio


RmDir ThisWorkbook.Path & "\teste"

End Sub

184
9
Programando com o objeto FSO
(File System Object)

Agora, veja o passo a passo desse exemplo:

Primeiro, usando a MkDir, criamos um diretório na pasta em que está o arquivo


da macro:

'cria diretório (ainda não existente):


MkDir ThisWorkbook.Path & "\teste"

•• Antes estava assim:

•• Depois de executar a instrução anterior pelo VBA, teremos o seguinte:

Depois, executamos a outra instrução MkDir. Veja o resultado:

MkDir ThisWorkbook.Path & "\teste\teste"

185
Excel 2016 VBA - Módulo II

Então, criamos uma cópia do arquivo dados.txt para dentro do diretório teste:

FileCopy ThisWorkbook.Path & "\dados.txt",ThisWorkbook.Path & "\


teste\dados.txt"

Com o comando Name, movemos para o outro diretório e o renomeamos:

Name ThisWorkbook.Path & "\teste\dados.txt" As ThisWorkbook.Path


& "\teste\teste\dados_estoque.txt"

Novamente utilizando o comando Name, apenas alteramos o nome do


subdiretório teste para teste2:

Name ThisWorkbook.Path & "\teste\teste" As ThisWorkbook.Path & "\


teste\teste2"

186
9
Programando com o objeto FSO
(File System Object)

Deletemos o arquivo dados_estoque.txt:

Kill ThisWorkbook.Path & "\teste\teste2\dados_estoque.txt"

Deletamos as pastas vazias:

RmDir ThisWorkbook.Path & "\teste\teste2"


RmDir ThisWorkbook.Path & "\teste"

Com a instrução Dir (arquivo), podemos verificar a existência ou não de um


arquivo. Teste o exemplo:

Sub Verificando_arquivo()
Dim arq as string
arq = InputBox("Digite o caminho e o nome completo do
arquivo." , "VERIFICANDO EXISTÊNCIA DO ARQUIVO")
If Dir(arq) <> "" Then
MsgBox "O arquivo: " & Chr(13) & Chr(13) & arq & Chr(13) &
Chr(13) & " existe!!"
Else
MsgBox "O arquivo: " & Chr(13) & Chr(13) & arq & Chr(13) &
Chr(13) & " não existe!!"
End If
End Sub

187
Excel 2016 VBA - Módulo II

Também podemos usar (ainda sem o File System Object) as instruções


FileDateTime (arquivo) para termos acesso à data de modificação do arquivo e
FileLen (arquivo) para o tamanho (em bytes) do arquivo:

Sub filelen_e_filedatatime()
Cells(1, 1) = FileLen(ActiveWorkbook.FullName)
Cells(2, 1) = FileDateTime(ActiveWorkbook.FullName)
End Sub

9.4. Propriedades do objeto Drive

Propriedades Descrição
A quantidade de espaço, em bytes, disponível em
AvailableSpace
disco.
DriveLetter Letra da unidade (por exemplo, C).
Tipo da unidade, podendo ser: 0 (desconhecido),
DriveType 1 (removível), 2 (fixo), 3 (remoto), 4 (CD-ROM) e 5
(RAM Disk).
FileSystem Sistema de arquivos (FAT, FAT32, NTFS, etc.)
FreeSpace O mesmo que AvailableSpace.
Um valor booleano que indica se a unidade está
IsReady
pronta para uso.
Path Drive é o caminho (por exemplo, C: \)
A pasta de objeto que contém a pasta raiz da
RootFolder
unidade.
Um valor longo que contém o número de série da
SerialNumber
unidade.
Com unidades de rede, retorna uma string contendo
ShareName
o nome do compartilhamento da rede.
TotalSize O tamanho total do disco em bytes.
VolumeName Um valor string contendo o nome do volume Drive.
 

188
9
Programando com o objeto FSO
(File System Object)

Veja um exemplo de utilização:

Sub drivers_desta_maquina()
On Error Resume Next
Dim fso As FileSystemObject, linha As Integer
Dim fso_drive As Drives, f As Drive
Set fso = New FileSystemObject
Set fso_drive = fso.Drives
linha = 1
Cells.Clear
Cells(linha, 1) = "Drive:"
Cells(linha, 2) = "Tipo:"
Cells(linha, 3) = "Espaço Livre:"
Cells(linha, 4) = "Espaço Ocupado:"
linha = linha + 1
For Each f In fso_drive
Cells(linha, 1) = f.DriveLetter
Cells(linha, 2) = f.DriveType
Cells(linha, 3) = f.FreeSpace / 1024 / 1024 / 1024
Cells(linha, 4) = f.TotalSize / 1024 / 1024 / 1024
linha = linha + 1
Next f
Columns.AutoFit
End Sub

9.5. Propriedades e métodos do objeto Folder


•• Propriedades do objeto Folder
 
Propriedade Descrição
0 (Normal), 1 (ReadOnly), 3 (Oculto), 4 (System), 8
Atributes (Volume), 16 (Directory), 32 (Arquivo), 64 (Alias) e 128
(comprimidos).
DateCreated A data que a pasta foi criada.
DateLastAccessed A data que a pasta foi acessada pela última vez.
DateLastModified A data que a pasta foi modificada pela última vez.
Drive A unidade onde a pasta está localizada.
Um booleano que indica se ou não uma pasta é a pasta
IsRootFolder
raiz.
Name Nome da pasta.

189
Excel 2016 VBA - Módulo II

Propriedade Descrição
ParentFolder Nome da pasta pai.
Path Caminho da pasta.
Nome da pasta expressa em MS-DOS compatível ("8.3"),
ShortName
nome abreviado.
Caminho da pasta expressa em (MS-DOS compatível),
ShortPath
caminho curto.
O tamanho total, em bytes, de todas as subpastas e
Size
arquivos.
Uma string contendo o tipo de pasta (por exemplo, pasta
Type
de arquivos).
 
•• Métodos do objeto Folder
 
Método Descrição
Delete O mesmo que DeleteFolder de FileSystemObject.
Move O mesmo que MoveFolder de FileSystemObject.
Copy O mesmo que CopyFolder de FileSystemObject.
 
A macro a seguir usa um looping For Each e percorre todas as subpastas de
um driver:

Sub foreach_fso()

On Error Resume Next

Dim fso As FileSystemObject, linha As Integer


Dim pasta As Folder, subpastas As Folders, p As Folder

Set fso = New FileSystemObject


Set pasta = fso.getfolder("E:\")
Set subpastas = pasta.subfolders

linha = 1
Cells.Clear
Cells(linha, 1) = "Pasta:"
Cells(linha, 2) = "Espaço em Bytes:"
linha = linha + 1
For Each p In subpastas

190
9
Programando com o objeto FSO
(File System Object)

Cells(linha, 1) = p.Name
Cells(linha, 2) = p.Size
linha = linha + 1
Next p
Columns.AutoFit
Range(Cells(1, 1), Cells(linha - 1, 2)).Sort _
key1:=Range("b1"), Order1:=xlDescending
End Sub

9.6. Propriedades e métodos do objeto File


•• Propriedades do objeto File
 
Propriedade Descrição
0 (Normal), 1 (ReadOnly), 3 (Oculto), 4 (System), 8
Attributes (Volume), 16 (Directory), 32 (Arquivo), 64 (Alias)
e 128 (comprimidos).
DateCreated A data que o arquivo foi criado.
DateLastAccessed A data que o arquivo foi acessado pela última vez.
A data que o arquivo foi modificado pela última
DateLastModified
vez.
Drive A unidade onde o arquivo está localizado.
Name Nome do arquivo.
ParentFolder Pasta pai do arquivo.
Path Caminho do arquivo.
ShortName Nome curto do arquivo expresso em MS-DOS.
ShortPath Caminho curto do arquivo expresso em MS-DOS.
Size O tamanho total, em bytes, do arquivo.
Uma string contendo o tipo de arquivo (por
Type
exemplo, Microsoft Word Document).

191
Excel 2016 VBA - Módulo II

•• Métodos do objeto File


 
Método Descrição
Delete O mesmo que DeleteFile de FileSystemObject.
Move O mesmo que MoveFile de FileSystemObject.
Copy O mesmo que CopyFile do FileSystemObject.
Retorna um objeto TextStream que pode ser
CreateTextFile
usado para trabalhar com o arquivo recém-criado.
Abre um arquivo de texto existente e retorna um
OpenAsTextStream
objeto TextStream.

Veja o exemplo:

Sub Informacoes_deste_Arquivo()
Dim fso As New FileSystemObject, arq as File
Set fso = New FileSystemObject
Set arq = fso.GetFile(ThisWorkbook.FullName)
Cells.Clear
With arq
Cells(1, 1) = "Tamanho : " _
& vbTab & FormatNumber(.Size, 0)
Cells(2, 1) = "Data de criação : " & vbTab & .DateCreated
Cells(3, 1) = "Último acesso : " & vbTab & _
.DateLastAccessed
Cells(4, 1) = "Última alteração : " & vbTab & _
.DateLastModified
Cells(5, 1) = "nome abreviado : " & vbTab & .ShortName
End With
Columns.AutoFit
End Sub

192
9
Programando com o objeto FSO
(File System Object)

Pontos principais
Atente para os tópicos a seguir. Eles devem ser estudados com muita
atenção, pois representam os pontos mais importantes do capítulo.

•• Pelo FSO, podemos manipular objetos como Drive, File, Folder e TextStream,
adicionando a Biblioteca Microsoft Scripting Runtime;

•• A classe TextStream dessa biblioteca permite a criação, leitura ou alteração


de arquivos de texto a partir do código VBA;

•• O método CreateTextFile cria um arquivo texto e o método WriteLine


escreve uma string para o arquivo de texto;

•• O método OpenTextFile abre um arquivo texto e o método ReadLine lê a


linha do arquivo texto;

•• Nas macros, podemos utilizar a instrução FileCopy para copiarmos um


arquivo.

193
Programando com
9
o objeto FSO
(File System Object)
Teste seus conhecimentos
Excel 2016 VBA - Módulo II

1. Com relação à utilização objeto FSO (File System Object),


qual(is) a(s) alternativa(s) correta(s)?

☐☐ a) Permite interagir com arquivos, folders e drives.

☐☐ b) Permite examinar as informações em disquete, CD-ROM,


disco RAM e unidades de rede.

☐☐ c) Permite examinar e manipular arquivos.

☐☐ d) Permite examinar e manipular pastas.

☐☐ e) Todas as alternativas estão corretas.

2. Com relação ao objeto TextStream, qual a alternativa


correta?

☐☐ a) Permite ler e gravar arquivos TXT.

☐☐ b) Permite acessar o conteúdo de um TXT linha a linha,


delimitador por delimitador.

☐☐ c) Permite ler e gravar uma tabela Access.

☐☐ d) As alternativas A e B estão corretas.

☐☐ e) Nenhuma das alternativas anteriores está correta.

196
9
Programando com o objeto FSO
(File System Object)

3. Em qual biblioteca adicionamos os objetos FSO?

☐☐ a) Microsoft File System Obect

☐☐ b) Microsoft FSO Library

☐☐ c) Microsoft Scripting Runtime

☐☐ d) FSO – File System Object Library

☐☐ e) Nenhuma das alternativas anteriores está correta.

4. O que fazem, respectivamente, os métodos CreateTextFile


e WriteLine?

☐☐ a) Criar um arquivo texto e escrever uma string para o


arquivo de texto, terminando com o novo caractere de linha.

☐☐ b) Inserir e criar linhas do conteúdo.

☐☐ c) Abrir e inserir linhas do conteúdo.

☐☐ d) As alternativas A, B e C estão corretas.

☐☐ e) Nenhuma das alternativas anteriores está correta.

197
Excel 2016 VBA - Módulo II

5. O que os métodos OpenTextFile e ReadLine fazem,


respectivamente?

☐☐ a) Abrir um arquivo texto e o retornar em uma string.

☐☐ b) Abrir um arquivo texto e retornar uma string contendo


a linha atual do arquivo texto, movendo o cursor para a
linha seguinte.

☐☐ c) Retornar True quando o cursor está no final do arquivo


e mover o cursor para a próxima linha.

☐☐ d) As alternativas A e C estão corretas.

☐☐ e) Nenhuma das alternativas anteriores está correta.

198
Programando com
9
o objeto FSO
(File System Object)
Mãos à obra!
Excel 2016 VBA - Módulo II

Laboratório 1

A – Trazendo imagens para a planilha

Neste laboratório, vamos usar um looping For / Each dentro da pasta Imagens,
trazendo todas as imagens para um ListBox. Assim, ao clicar no nome da
imagem, ela será carregada no objeto Image ao lado. É importante considerar
as instruções a seguir:

•• Dentro de uma planilha, terá dois objetos ActiveX: ComboBox e Image;

•• No evento Open dos objetos Workbook e ActiveSheet, será executada


uma macro que percorrerá os arquivos do diretório Produtos, preenchendo
o ComboBox da planilha com os nomes dos arquivos existentes (sem a
extensão). Quando o usuário clicar em um nome, a respectiva figura será
"lida" no objeto Image.

1. Insira, na planilha, os objetos Activex ComboBox e Image:

200
9
Programando com o objeto FSO
(File System Object)

A planilha ficará assim:

2. Agora crie, em um módulo público, a macro que, através de um For / Each,


usando o modelo de objeto FSO, preencherá o ComboBox com o nome de
todos arquivos existentes no diretório Produtos:

Sub Preenchendo_Combo()
Set fs = CreateObject("Scripting.FileSystemObject")
Set ff = fs.GetFolder(ThisWorkbook.Path & "\Produtos")
Set fc = ff.Files
Sheets("Plan1").ComboBox1.Clear
For Each f1 In fc
Sheets("Plan1").ComboBox1.AddItem _
Left(f1.Name, Len(f1.Name) - 4)
Next f1
Sheets("Plan1").Image1.Picture = LoadPicture()
End Sub

3. Em seguida, crie a macro que preenche o objeto Image em função de uma


opção do Combo:

Sub Preenchendo_Image()
On Error GoTo yu
Sheets("Plan1").Image1.Picture = _
LoadPicture(ThisWorkbook.Path & "\Produtos\" _
& Sheets("Plan1").ComboBox1 & ".jpg")
Exit Sub
yu:
Sheets("Plan1").Image1.Picture = LoadPicture()
End Sub

201
Excel 2016 VBA - Módulo II

4. Teste as macros e verifique que devemos alterar algumas propriedades do


objeto Image.

Uma das maneiras para acessar as propriedades de um objeto inserido na


planilha é clicar em Modo de Design e, com o botão direito do mouse sobre o
objeto, selecionar a opção Propriedades:


5. Altere a propriedade PictureSizeMode:

202
9
Programando com o objeto FSO
(File System Object)

6. Saia do Modo de Design (guia Desenvolvedor, grupo Controles);

7. Testadas as macros, programe os eventos, ou seja, quando elas serão


executadas:

203
Criando e
manipulando classes
10
99 Programação orientada a objeto;
99 Conceito de classe de objetos;
99 Criando uma propriedade;
99 Criando um método;
Excel 2016 VBA - Módulo II

10.1.  Programação orientada a objeto


Nos capítulos anteriores, manipulamos uma variedade de códigos VBA, nos
quais utilizamos vários tipos de objetos, aos quais indicamos propriedades,
métodos e objetos pertencentes a estes objetos. Contudo, ao utilizar os objetos,
a maioria dos programadores desconhece a sua origem. Observe a instruções
a seguir:

Ao declarar a variável Plan como objeto


Workbook, o VBA nos oferece a lista de objetos
caracterizada pela figura.

A variável Plan, que agora contém o objeto


Workbook, apresenta a lista de propriedades
e métodos deste objeto.

Quando um programador constrói uma rotina para calcular a média de valores


de um determinado grupo de células, não é necessário dispor de uma infinidade
de linhas de programação para executar tal tarefa. Para isso, basta utilizar o
método Average (função Média) do objeto WorksheetFunction, contido no
objeto Application, e indicar o range de células que ele quer calcular a média.
Concluímos, então, que programar orientado a objetos é, na realidade, manipular
métodos e propriedades de objetos do código VBA.

206
Criando e manipulando classes
10
10.2.  Conceito de classe de objetos
Neste tópico, apresentaremos o conceito de classe. As rotinas utilizadas
nos exemplos servirão apenas para ilustrar os conceitos apresentados, pois,
inicialmente, elas não terão funcionalidade. Adiante, estas rotinas se tornarão
funcionais.

10.2.1. Classe

Podemos considerar classe como algo abstrato, um elemento genérico.


Tomemos como exemplo um pensamento, uma imaginação. Imagine um carro
qualquer. O pensamento em um carro é algo abstrato e genérico, pois, a partir
dele, podemos derivar uma infinidade de tipos e modelos de carros.

Carro

10.2.2. Objeto

Se classe é um elemento abstrato e genérico, podemos considerar o objeto


como algo específico. Seguindo com o nosso exemplo, objeto seria o modelo
do carro em que pensamos.

207
Excel 2016 VBA - Módulo II

Ao imaginarmos um carro, ele pode ser de qualquer marca. Enquanto a classe


representa o genérico, o objeto representa algo mais específico e único. O objeto
carro só poderá ser de uma marca. Já a classe carro pode ser de qualquer marca.

A classe é o início de tudo. Sem ela, não existiriam os objetos. Assim como sem
o pensamento em um carro não existiria o pensamento na marca do carro.

Em uma linguagem mais técnica, podemos dizer que a classe é a especificação


de como será um objeto. Ainda pensando no exemplo, ela possui atributos
como nome, marca e também define o comportamento deles (métodos – que
são ações aplicadas a objetos).

O objeto é a instanciação dessa classe, ou seja, criar um objeto carro e atribuir


valores (características) a ele; neste caso, um nome específico e uma marca
específica. Instanciando-se vários carros, teremos vários objetos diferentes,
porém, com a mesma estrutura (atributos).

10.2.3. Coleções

Coleções são conjuntos de itens pertencentes ao mesmo objeto. Considerando


o nosso exemplo, pensamos em um carro, o qual pertence a alguma montadora.
Esta montadora possui uma gama de tipos de automóveis. Quanto a estes tipos,
temos utilitários, de passeio, de carga etc.

Da mesma maneira, temos a classe. Dentro de cada classe, há vários objetos.


Cada objeto apresenta uma infinidade de coleções. Finalmente, dentro destas
coleções, há objetos, propriedades e métodos variados.

Podemos definir nosso modelo da seguinte forma:

•• Carro=Classe;
•• Montadora=Objeto;
•• Tipo=Coleções.

208
Criando e manipulando classes
10
É importante destacar que, embora a coleção de tipos de veículos seja igual no
âmbito abstrato, uma vez que todos são carros, cada tipo de carro é diferente,
portanto, um objeto diferenciado. Cada carro poderá ser diferenciado pelo ano
de fabricação, tipo, modelo, cor, potência de motor e tantas outras características
que os tornam únicos dentro de uma coleção.

Assim ocorre com objetos, propriedades e métodos. Se pensarmos no objeto


Range, ele possui uma infinidade de propriedades e métodos que o tornam
único em uma rotina (o range selecionado).

10.2.4. Parent e Child

A classe Parent e a classe Child são abstratas. A diferença, entretanto, é que a


classe Child possui uma classe acima dela, da qual pode herdar as propriedades
e métodos, que é a classe Parent.

Considerando nosso exemplo, o carro é um objeto que pertence a uma


montadora. Se a montadora é quem produz o carro, e não o contrário, então,
a montadora é Parent e o carro é Child. A classe Child também possuirá suas
próprias propriedades e métodos, mas também herdará características de
Parent.

10.2.5. Propriedades, métodos e eventos

Podemos considerar Propriedades as características físicas do objeto em


questão. Como exemplo, podemos citar a propriedade PictureSizeMode do
objeto imf_Grafico, utilizado anteriormente.

Método pode ser definido como uma ação. No exemplo do carro, a capacidade
de inserir combustível ou de calcular a quantidade de litros por quilometro
rodado pode ser considerada um método. Em um código VBA, podemos utilizar
como exemplo as ações de copiar (Copy), recortar (Cut), entre outras.

209
Excel 2016 VBA - Módulo II

Eventos podem ser conceituados como ações possíveis durante a execução


do objeto ou ações que são desencadeadas devido a uma determinada ação
sobre o objeto. Quando aplicamos um clique simples sobre o botão Exibir
Gráfico do formulário Controle (utilizado anteriormente), por exemplo, ele
abre o formulário que contém o gráfico. O evento em questão é o evento Click.
Podemos considerar Evento como uma reação a uma ação realizada sobre
determinado objeto.

10.3.  Criando uma propriedade


Neste tópico, vamos aprender a definir as propriedades e a recuperá-las.
Aprenderemos, também, as formas de criação dos métodos e sua utilização. O
primeiro passo será a criação e a aplicação das classes.

Para iniciarmos, devemos abrir uma pasta de trabalho, alternar para o VBE e
inserir um Módulo de classe. Para inserir um Módulo de classe, acompanhe a
imagem a seguir:

210
Criando e manipulando classes
10
Após inserir o Módulo de classe, devemos alterar seu nome padrão para cls_
Salario. A regra utilizada para nomear a classe contempla as três letras iniciais
que identificam o objeto, nesse caso, o Módulo de classe. Para isso, siga a
instrução adiante:

Aplique um duplo-clique
neste campo e altere o
nome genérico Classe1
para cls_Salario.

Após inserir o módulo Módulo de classe e renomeá-lo, devemos inserir a


rotina. O primeiro passo é declarar a variável string, conforme demonstrado
na imagem a seguir:

As propriedades podem ser definidas como somente leitura, somente escrita


ou leitura e escrita. Let indica que a propriedade será de leitura. Get indica que
a propriedade será de escrita. Nesse exemplo, a propriedade assumirá os dois
estados.

211
Excel 2016 VBA - Módulo II

Na rotina anterior, a variável meuSalario foi declarada como string para receber
uma string de texto. Logo em seguida, foi aberta a instrução Property Let,
que tem como função atribuir um valor à propriedade Merreca. A propriedade
ainda contém o argumento ByVal, indicando que a variável VrEntrada entrará
com o valor de parâmetro e passará para a propriedade Merreca.

A propriedade seguinte é Property Get, que define a propriedade Merreca


também como string. E especifica, como retorno de Merreca, a variável
meuSalario, que também é string. Ela não possui argumentos ou parâmetros
adicionais, pois apenas está retornando um valor de atributo.

A propriedade Get funciona como uma função, ela retorna o valor da propriedade
em questão, quando chamada. No exemplo, a propriedade Let define o valor da
propriedade e a instrução Get recupera o valor da mesma propriedade.

Após construir as propriedades, devemos inserir um módulo para criar a rotina


que irá iniciar a classe que criamos e, em seguida, utilizá-la. Devemos inserir
um módulo e, dentro dele, a rotina, conforme a instrução a seguir:

Primeiro, declaramos a variável meuVencimento como cls_Salario. Em seguida,


inserimos a rotina iniciarSalario para iniciar a classe que criamos. Quando
criamos uma classe, temos que iniciá-la antes de poder utilizá-la. Nesse caso,
a variável meuVencimento receberá a classe que criamos.

212
Criando e manipulando classes
10
Em seguida, criamos a rotina para testar a classe cls_Salario. Nessa rotina,
a variável string VrDoSalario recebe o valor do InputBox. Como podemos
observar, o valor do InputBox padrão é R$ 500. Ao executar a linha do InputBox,
este aparecerá na tela com o campo já preenchido:

O campo já vem preenchido com o


valor, porque este foi inserido na
propriedade Default do InputBox.

A linha seguinte contém o objeto meuVencimento. Este objeto, por sua vez,
contém a propriedade Merreca que, conforme definido na linha do código,
receberá o valor do InputBox (R$500).

Por fim, a Msgbox receberá o objeto meuVencimento, com sua propriedade


Merreca já carregada pelo valor do InputBox, e o exibirá conforme a imagem
a seguir:

213
Excel 2016 VBA - Módulo II

10.4.  Criando um método


1. Crie um novo arquivo;

2. Crie um módulo de classe com o nome Salário, pelo código adiante:

Option Explicit

Private meuSalario As String


'Let Grava
'Get Leitura

Property Let SalarioAtual(ByVal VrEntrada As String)

If VrEntrada < 500 Then

meuSalario = 500

ElseIf VrEntrada > 3000 Then

meuSalario = 3000

Else

meuSalario = VrEntrada

End If

End Property

Property Get SalarioAtual() As String

SalarioAtual = meuSalario

End Property

Function INSS(meuSalario)
INSS = meuSalario * 0.08
End Function

214
Criando e manipulando classes
10
Neste exemplo, colocamos uma estrutura de decisão dentro do módulo de
classe. Com isso, mesmo antes de o valor da propriedade Let SalarioAtual ser
gravado, ele será avaliado por uma regra de negócio.

Para criarmos um método para o objeto que for instanciado na classe, no módulo
de classe, basta criar uma Function. Neste exemplo, criamos o módulo INSS e
determinamos o cálculo de 8% do salário.

Veja as propriedades e métodos deste objeto ao programá-lo em um módulo


padrão:

3. Insira, então, esse código em um módulo padrão e teste-o:

Option Explicit
Private ObjetoSalario As Salario
Sub VrSalario()
Set ObjetoSalario = New Salario
Dim VrdoSalario As String
VrdoSalario = Application.InputBox("Digite o valor do
salário" & Chr(13) & Chr(13) & "Valor Mínimo: 500." & Chr(13) &
"Valor Máximo: 3000", , "R$ 500")
ObjetoSalario.SalarioAtual = VrdoSalario
MsgBox "Seu Salário (considerando a regra de negocio) é :" &
_
Format(ObjetoSalario.SalarioAtual, "currency") _
& Chr(13) & "E o INSS é: " & _
Format(ObjetoSalario.INSS(ObjetoSalario.SalarioAtual),
"currency")
End Sub

Neste exemplo, instanciamos uma variável Objeto chamada ObjetoSalario na


classe Salario:

Private ObjetoSalario As Salario


Sub VrSalario()
Set ObjetoSalario = New Salario

215
Excel 2016 VBA - Módulo II

Note que acrescentamos o código que chama o método INSS desse objeto:

MsgBox "Seu Salário (considerando a regra de negocio) é :" & _


Format(ObjetoSalario.SalarioAtual, "currency") _
& Chr(13) & "E o INSS é: " & _
Format(ObjetoSalario.INSS(ObjetoSalario.SalarioAtual),
"currency")

4. Execute e teste a macro, a classe, a propriedade e o método:

216
Criando e manipulando classes
10
Pontos principais
Atente para os tópicos a seguir. Eles devem ser estudados com muita
atenção, pois representam os pontos mais importantes do capítulo.

•• Uma classe contém vários objetos. Cada objeto contém várias coleções,
as quais possuem seus próprios objetos, propriedades e métodos;

•• A classe Parent e a classe Child são abstratas. A diferença, entretanto, é


que a classe Child possui uma classe acima dela, Parent, da qual pode
herdar as propriedades e métodos;

•• Uma classe deverá ser escrita em um módulo Classe. Para inserir o módulo
Classe, devemos abrir o menu Inserir, encontrado na janela do VBE;

•• As propriedades podem ser somente leitura (LET), somente escrita (GET)


ou leitura-escrita (LET-GET);

•• Para uma classe funcionar, ela deverá ser inicializada. A rotina que inicializa
a classe deve ser instalada em um módulo comum;

•• As Functions programadas no módulo de classe são métodos disponíveis


aos objetos instanciados nessa classe.

217
Criando e
10
manipulando classes
Teste seus conhecimentos
Excel 2016 VBA - Módulo II

1. Com relação a classe e ao objeto, qual a alternativa


correta?

☐☐ a) A classe é abstrata, genérica.

☐☐ b) O objeto é a instância de uma classe.

☐☐ c) Criar um objeto é definir, uma vez que ele esteja


instanciado, como será esse objeto com suas respectivas
propriedades e métodos.

☐☐ d) Na classe, podemos fazer “regras de negócio”, não


sendo necessário que essas regras apareçam num módulo
padrão VBA.

☐☐ e) Todas as alternativas anteriores estão corretas.

2. Quanto as propriedades poderem ser Leitura e/ou


Gravação, qual a alternativa correta?

☐☐ a) No módulo de classe, o procedimento Property Get lê,


retorna o valor atribuído àquela propriedade.

☐☐ b) No módulo de classe, o procedimento Property Let


grava (atribui) um valor naquela propriedade.

☐☐ c) Todas as propriedades são de Leitura e Gravação.

☐☐ d) As alternativas A e B estão corretas.

☐☐ e) Nenhuma das alternativas anteriores está correta.

220
Criando e manipulando classes
10
3. No VBA Excel, em cada módulo de classe, podemos
construir até quantas classes?

☐☐ a) 1

☐☐ b) 2

☐☐ c) 10

☐☐ d) 5

☐☐ e) Nenhuma das alternativas anteriores está correta.

4. O que melhor caracteriza um método (em um módulo


de classe)?

☐☐ a) É um procedimentos Property Let.

☐☐ b) É um procedimentos Property Get.

☐☐ c) É uma Function.

☐☐ d) As alternativas A e B estão corretas.

☐☐ e) Nenhuma das alternativas anteriores está correta.

221
Excel 2016 VBA - Módulo II

5. Quanto as classes, qual a alternativa correta?

☐☐ a) Para uma classe funcionar, ela deverá ser inicializada.


A rotina que inicializa a classe deve ser instalada em um
módulo comum.

☐☐ b) As Functions programadas no módulo de classe são


métodos disponíveis aos objetos instanciados nessa
classe.

☐☐ c) Instanciamos uma classe com o construtor de objetos


New.

☐☐ d) As alternativas A, B e C estão corretas.

☐☐ e) Nenhuma das alternativas anteriores está correta.

222
Criando e 10
manipulando classes
Mãos à obra!
Excel 2016 VBA - Módulo II

Laboratório 1

A – Criando uma classe para gerar uma mensagem ao usuário

Neste laboratório, vamos criar uma classe em que a propriedade nome do objeto
alimentará a mensagem gerada no botão do formulário, conforme demonstrado
nas imagens adiante.

1. Considere as instruções a seguir:

•• O formulário será carregado a partir de um botão na planilha;

•• O usuário digitará qualquer nome no campo Cliente e clicará sobre o botão


Mensagem;

224
Criando e manipulando classes
10
•• A mensagem apresentada pelo MsgBox conterá o nome do cliente em letra
maiúscula;

•• Ao clicar no botão OK da mensagem, ela será fechada, assim como o


formulário Cliente, retornando o cursor para a planilha.

Confira o resultado no arquivo Cap10 –Exercicio Classe.


xlsm que acompanha este material.

225