Вы находитесь на странице: 1из 18

30/7/2014 Excel e VB - Importando e Exportando dados

http://www.macoratti.net/excel_vb.htm 1/18
Excel - Visual Basic - Importando e
Exportando dados
Para refrescar a memria sobre o assunto leia os artigos:
1. OLE - Conceitos.
2. Usando VBA
3. Excel - Abrindo uma Planilha e Exportando p/ uma tabela
DDE , OLE , ActiveX ... Vamos direto a questo : " Como eu posso importar e exportar
dados entre minha aplicao Visual Basic e o Excel ? "
A primeira coisa que voc vai ter que fazer uma comunicao entre as aplicaes . O
Excel estar funcionando como um servidor de dados ( ou cliente de dados ) . Para efetivar
esta comunicao voc vai ter que criar um componente na sua aplicao VB que lhe
permita acessar as propriedades e mtodos do Excel.
Para instanciar um componente com essas propriedades voc ter que conhecer quais os
componentes que o Excel expe. Damos abaixo um esquema bem simples do modelo
exposto pelo Excel:
No topo da hierarquia esta
a classe Application
ela que temos que
instanciar em nossa
aplicao Visual Basic para
ter acesso as propriedades
e mtodos das demais
classes expostas pelo
Excel.
Application - a aplicao
Excel
WorkBook - o arquivo
XLS
WorkSheet - a planilha
Excel de TRABALHO
claro que que para tudo isto funcionar corretamente , esta classe dever estar registrada
na MQUINA na qual a aplicao ser executada . Trocando em mdos : O Excel tem que
estar instalado nesta mquina.
A primeira coisa a fazer ao iniciar o seu projeto no Visual Basic habilitar a referncia ao
Excel dentro do seu projeto. Para isto, selecione References no menu Tools ou Project,
dependendo da verso do VB, e marque uma opo semelhante a MICROSOFT Excel x.x
30/7/2014 Excel e VB - Importando e Exportando dados
http://www.macoratti.net/excel_vb.htm 2/18
Object Library, conforme mostra a figura a seguir:
Abrindo uma planilha Excel e exibindo o contedo de uma Clula
Vamos atacar logo de cara com um cdigo bem simples para abrir uma planilha Excel e
obter o contedo de uma clula da planilha. Vamos devagar e sempre...
Crie uma planilha no Excel e coloque qualquer informao na clula da linha 2 e
coluna 3. Eu estarei criando o arquivo texte.xls e na planilha Plan1 na clula da linha 2
, coluna 3 estarei informando : Oi eu aqui (salvos no diretrio c:\teste) veja figura
abaixo:
O nome
do nosso
arquivo
ser :
Teste.xls
O nome
da
planilha
ser :
Plan1
O
arquivo
ser
salvo no
diretrio
:
c:\teste
Agora vamos ao cdigo para fazer este servio :
Ao executar o
cdigo ao lado,
voc ir obter
uma caixa de
mensagem
exibindo o
30/7/2014 Excel e VB - Importando e Exportando dados
http://www.macoratti.net/excel_vb.htm 3/18
Ad by ShopDriop | Close This Ad
Dim xl As New Excel.Application
Dim xlw As Excel.Workbook
'Abrir o arquivo do Excel
Set xlw =
xl.Workbooks.Open("c:\teste\teste.xls")
' definir qual a planilha de TRABALHO
xlw.Sheets("Plan1").Select
'Exibe o contedo da clula na posio 2,3
' variavel = xlw.Application.Cells(2, 3).Value
MsgBox xlw.Application.Cells(2, 3).Value

' Fechar a planilha sem salvar alteraes
' Para salvar mude False para True
xlw.Close False
' Liberamos a memria
Set xlw = Nothing
Set xl = Nothing
contedo da
clula da
planilha Plan1
do arquivo
teste.xls ,
localizada na
linha 2 e coluna
3.
-Primeiro eu
criei o
componente
Application do
Excel e o
atribui a
varivel objeto
xl ( poderia ser
outro nome )
-Depois eu criei
a classe
Workbook e
atribui a
varivel objeto
xlw
-A seguir abri o
arquivo
teste.xls
atribuindo a xlw
-Defini a minha
planilha de
TRABALHO
(Plan1)
-E , obtive o
valor (Value) da
clula (Cells) da
planilha
-Para encerrar
encerrei a
aplicao e
liberei
memria.
30/7/2014 Excel e VB - Importando e Exportando dados
http://www.macoratti.net/excel_vb.htm 4/18
Nota : Se voc quiser trabalhar com o contedo da clula pode salv-lo em uma varivel
para posterior tratamento(veja de codigo variavel=xlw.Application.Cells(2, 3).Value )
Inserindo dados em uma planilha Excel e criando um Grfico
Vamos para uma tarefa mais interessante: Agora vamos criar uma planilha , inserir alguns
valores e montar o grfico dos valores inseridos e exibir o grfico.
Inicie um novo projeto no Visual Basic
Faa referncia a livraria Microsof Excel X.0 Object Library
Insira no formulrio dois botes de comando : cmdExcel e cmdSair
Insira o cdigo no formulrio conforme explicado a seguir:
Cdigo da seo General Declarations :
Option Explicit
Dim EApp As
Object
Dim EwkB As
Object
Dim EwkS As
Object
Define as variveis objetos que
devero ser visveis em todo o
formulrio
Cdigo do boto de comando CmdExell - Ativa o Excel insere dados nas clulas e cria o
grfico
Ad by ShopDriop | Close This Ad
Private Sub CmdExcel_Click()
Dim a, b As String
Dim i As Integer
Dim Exlc As New Chart
'
' Cria a componente da classe application
-Define as variveis locais
-Cria os componentes e
atribui as variveis objeto
-Torna o Excel Visivel
-Inclui valores nas clulas A1
a A10 e B2 a B10
-Selecione a faixa das
clulas de B2 a B10
-Cria um grfico de barras
com esta seleo
-Torna o formulrio do VB
visivel
Abaixo as clulas com os
valores e a seleo
30/7/2014 Excel e VB - Importando e Exportando dados
http://www.macoratti.net/excel_vb.htm 5/18
Private Sub
cmdsair_Click()
Me.Hide
' fecha o arquivo xls
'
EwkB.Close
- Esconde o formulrio do VB
- Fecha o arquivo e encerra o
Excel
Abaixo o grfico gerado
' inclui um novo arquivo e uma nova planilha
'
Set EApp = CreateObject("excel.application")
Set EwkB = EApp.Workbooks.Add
Set EwkS = EwkB.Sheets(1)
'
' exibe a aplicao Excel
'
EApp.Application.Visible = True
' Preenche a primeira e a segunda coluna
' com alguns valores numricos
'
For i = 1 To 10
a = "A"
b = "B"
Range(a & i).FormulaR1C1 = Str(i)
Range(b & i).FormulaR1C1 = Str(i / 2)
Next i
'seleciona da clula b2 at a b10
Range("B2:B10").Select
'Cria e exibe o grfico
Set Exlc = EApp.Charts.Add
'torna o formulrio do VB visvel para poder fechar
o Excel
frmexcelvb.Show
End Sub
Nota: Usamos a instruo CreatObject para criar o objeto Excel , embora Usar Dim com a
clusula New seja mais rpido .
Cdigo do boto de comando cmdSair - Encerra o Excel e a aplicao VB








30/7/2014 Excel e VB - Importando e Exportando dados
http://www.macoratti.net/excel_vb.htm 6/18
' encerra o excel e sai
EApp.Application.Quit
End
End Sub
Convertendo os dados de uma
tabela em uma Panilha Excel
Que tal agora fazer algo mais
prtico : Converter os dados de
uma tabela em uma planilha.
Vamos converter os dados da tabela
Titles presente no banco de dados Biblio.mdb para em uma planilha Excel. Para fazer o
servio vamos usar uma funo chamada CopiarTabelaExcel que ir obter os dados da
tabela e criar a planilha Excel para receber os dados. (Article ID: Q172058 da Microsoft)
Estaremos a DAO para acessar o banco de dados e a tabela. Vamos criar um recordset do
tipo SnapShot. Lembra disto ??? No !!! Ento leia o artigo - Recordsets : Tables, Dynasets
e Snapshots.
O projeto :
Inicie um novo projeto no Visual Basic
Faa referncia a livraria Microsof Excel X.0 Object Library
Insira no formulrio dois botes de comando : cmdExcel e cmdSair e uma etiqueta
label1.(para exibir mensagens)
Insira o cdigo no formulrio conforme explicado a seguir:
Vamos ao cdigo :
Cdigo da seo General Declarations : Define variveis
Option Explicit
Dim oExcel As Object
Dim objExlSht As Object
Dim db As Database
Dim Sn As Recordset '
Recordset do tipo Snapshot
Private Type ExlCell
row As Long
col As Long
End Type
-Define as variveis objetos que
devero ser visveis em todo o
formulrio tanto para o Excel como
para o banco de dados


Agora o cdigo do boto de comando cmdExcel : Prepara o Excel , abre o Recordset e
chama a funo - CopiarTabelaExcel().
30/7/2014 Excel e VB - Importando e Exportando dados
http://www.macoratti.net/excel_vb.htm 7/18
Ad by ShopDriop | Close This Ad
Sub CmdExcel_Click()
Dim stCell As ExlCell
MousePointer = vbHourglass ' Muda o
ponteiro do mouse
Set oExcel =
CreateObject("Excel.Application")
oExcel.Workbooks.Add 'inclui o
workbook
Set objExlSht =
oExcel.ActiveWorkbook.Sheets(1)
Set db =
OpenDatabase("c:\teste\BIBLIO.MDB")
Set Sn = db.OpenRecordset("Titles",
dbOpenSnapshot)
' Inclui os dados a partir da celula A1
stCell.row = 1
stCell.col = 1
CopiarTabelaExcel Sn, objExlSht, stCell
' Salva a planilha
objExlSht.SaveAs "C:\teste\teste.xls"
oExcel.Visible = True
frmexcelvb.Show
End Sub
30/7/2014 Excel e VB - Importando e Exportando dados
http://www.macoratti.net/excel_vb.htm 8/18
O cdigo da Funo CopiarTabelaExcel: A funo recebe como parmetros o Recordset, a
planilha e a clula inicial e copia os registros para a planilha
Private Sub CopiarTabelaExcel(rs As
Recordset, ws As Worksheet,
StartingCell As ExlCell)
Dim Vetor() As Variant
Dim row As Long, col As Long
Dim fd As Field
rs.MoveLast
ReDim Vetor(rs.RecordCount + 1,
rs.Fields.Count)
' Copia as colunas do cabecalho para um
vetor
col = 0
For Each fd In rs.Fields
Vetor(0, col) = fd.Name
col = col + 1
Next
' copia o rs par um vetor
rs.MoveFirst
For row = 1 To rs.RecordCount - 1
For col = 0 To rs.Fields.Count - 1
Vetor(row, col) = rs.Fields(col).Value
'O Excel no suporta valores NULL
em uma clula.
If IsNull(Vetor(row, col)) Then
Vetor(row, col) = ""
Next
rs.MoveNext
Next
ws.Range(ws.Cells(StartingCell.row,
StartingCell.col),ws.Cells(StartingCell.row
+ rs.RecordCount + 1, _
StartingCell.col + rs.Fields.Count)).Value
= Vetor
End Sub
Nota: Primeiro copiamos os nomes dos campos e depois o recordset para o array(Vetor); a
seguir atribuimos os valores as clulas da planilha ( linha de cdigo azul)
30/7/2014 Excel e VB - Importando e Exportando dados
http://www.macoratti.net/excel_vb.htm 9/18
O cdigo do boto cmdSair: Encerra o Excel e libera memria das variveis objeto.
Close
Ad by ShopDriop | Close This Ad
Private Sub
cmdsair_Click()
Label1.Caption =
"Encerrando o Excel"
Label1.Refresh
objExlSht.Application.Quit
Set objExlSht = Nothing '
remove a variavel objeto
Set oExcel = Nothing '
remove a variavel objeto
Set Sn = Nothing '
reomove a variavel
objeto
Set db = Nothing '
reomove a variavel
objeto
MousePointer =
vbDefault ' Restaura o
ponteiro do mouse.
Label1.Caption = "Muito
bem, deu certo ! "
Label1.Refresh
End Sub
A tabela Titles exportada para o Excel
Agora eu vou mostrar COMO FAZER o mesmo servio usando cdigo mais enxuto: o
mtodo CopyFromRecordset do objeto Range.
O mtodo CopyFromRecordset do objeto Range muito til para importar dados de uma
aplicao externa para uma planilha Excel. O nico problema porm, que ele s funciona
com a DAO e no suporta recordsets ADO. Abaixo temos o cdigo que faz o mesmo servio
do exemplo acima abordado.
Dim oExcel As Object
Dim objExlSht As Object
Dim Db1 As Database
Dim Rs1 As Recordset
Set oExcel = CreateObject("Excel.Application")
30/7/2014 Excel e VB - Importando e Exportando dados
http://www.macoratti.net/excel_vb.htm 10/18
oExcel.Workbooks.Add
'inclui o workbook
Set objExlSht = oExcel.ActiveWorkbook.Sheets(1)
'Abrindo o banco de dados
Set Db1 =
DBEngine.OpenDatabase("c:\teste\biblio.mdb")
'Criamos um recordset selecionando todos os campos da
tabela Titles do banco de dados Biblio.mdb onde o
cdigo PubId for menor que 10
Set Rs1 = Db1.OpenRecordset(Name:="Select * from
titles where PubId < 10", Type:=dbOpenDynaset)
'Limpamos qualquer informao existente na planiha e
copiamos o recordset criado
With Worksheets("Plan1").Range("A1")
.CurrentRegion.Clear
.CopyFromRecordset Rs1
End With
objExlSht.SaveAs "C:\teste\teste.xls"
oExcel.Visible = True
'Fechamos o banco de dados
Db1.Close
set db1=nothing
Usando DAO - mtodo CopyFromRecordset
Como j disse , se voce quiser a ADO para acessar o banco de dados , no vai poder usar o
mtodo CopyFromRecordset , mas calma , podemos usar outro recurso o mtodo
Transpose.
A seguir o cdigo que executa a mesma tarefa ( apenas restringimos a quantidade de
registros usando uma instruo SQL - Select Title From Titles WHERE pubID < 5 ORDER BY
Title ).
Dim oExcel As Object
Dim objExlSht As Object
Dim Rs1 As ADODB.Recordset
Set oExcel = CreateObject("Excel.Application")
oExcel.Workbooks.Add 'inclui o workbook
30/7/2014 Excel e VB - Importando e Exportando dados
http://www.macoratti.net/excel_vb.htm 11/18
Set objExlSht = oExcel.ActiveWorkbook.Sheets(1)
Set Rs1 = New ADODB.Recordset
Rs1.Open Source:="Select Title From Titles WHERE
pubID < 5 ORDER BY Title", _
ActiveConnection:="DBQ=C:\TESTE\biblio.MDB;Driver=
{Microsoft Access Driver (*.mdb)};", _
CursorType:=adOpenStatic, _
LockType:=adLockOptimistic, _
Options:=adCmdText
With Worksheets("Plan1")
.Range("A1").CurrentRegion.Clear
Application.Intersect(.Range(.Rows(1),
.Rows(Rs1.RecordCount)), _
.Range(.Columns(1),
.Columns(Rs1.Fields.Count))).Value = _

Application.Transpose(Rs1.GetRows(Rs1.RecordCount))
End With
objExlSht.SaveAs "C:\teste\teste901.xls"
oExcel.Visible = True
Rs1.Close
Set Rs1 = Nothing
Usando ADO - mtodo Transpose
Observe que:
- No fizemos uma referncia direta a um banco de dados no cdigo , na verdade usamos
somente o objeto Recordset da ADO
- Quando invocamos o mtodo Open do objeto Recordset passamos a informao da
conexo com o argumento ActiveConnection
- Usamos outros parmetros do mtodo Open (CursorType, LockType , Options)
- Os dados do recordset so organizados em um tabela de duas dimenses onde cada coluna
representa um registro e cada linha representa um campo. Vamos ento copiar os registros
para as linhas e os campos para as colunas.
- Usamos o mtodo Getrows do objeto Recordset da ADO para gerar um array que
passado via mtodo Transpose para a planilha.
30/7/2014 Excel e VB - Importando e Exportando dados
http://www.macoratti.net/excel_vb.htm 12/18
Acessando diretamente uma planilha Excel com ADO
E se voce quiser acessar diretamente uma planilha do Excel a partir de sua aplicao Visual
Basic ? Tem jeito ?
Claro que tem . Vamos mostrar o acesso usando ADO primeiro usando um driver ODBC e
depois usando OLE DB.
1- Usando um drive ODBC para acessar uma planilha do Excel
Vamos abrir a planilha chamada teste.xls presente no diretrio c:\teste usando um driver
ODBC e exibir trs colunas da planilha. (Esta planilha foi gerada pela exportao da tabela
Titles do banco de dados Biblio.mdb)
Para navegar pela 'planilha' vamos criar dois botes de comando : command1(<) - navega
para trs e command2 ( > ) - navega para frente ; quando o usurio clicar nos botes os
valores sero exibidos nas caixas de texto.
Usaremos um terceiro boto - cmdAcessaExcel - para criar uma conexo com a planilha e
gerar um recordset a partir do qual iremos acessar os dados da planilha.
-Inicie um novo projeto no VB e insira os controles como indicados acima. Veja abaixo o
layout do formulrio do projeto:
Primeiro o cdigo da seo General Declarations : Declaramos as variveis objeto
Connection e Recordset.
Dim oConn As ADODB.Connection
Dim ors As ADODB.Recordset
O cdigo do evento Click do boto - cmdAcessaExcel - o que vai fazer todo o servio ,
vejamos :
Private Sub
cmdAcessaExcel_Click()
' cria uma conexo ADO
Set oConn = New
ADODB.Connection
oConn.Open "Driver=
30/7/2014 Excel e VB - Importando e Exportando dados
http://www.macoratti.net/excel_vb.htm 13/18
{Microsoft Excel Driver
(*.xls)};" & _
"FIL=excel
8.0;" & _

"DefaultDir=C:\teste;" & _

"MaxBufferSize=2048;" & _

"PageTimeout=5;" & _

"DBQ=C:\teste\Teste.xls;"
' Cria o Recordset
Set ors = New
ADODB.Recordset
' abre o recordset pelo
nome da planilha
ors.Open "[Plan1$]",
oConn, adOpenStatic,
adLockBatchOptimistic,
adCmdTable
preenche_controles
End Sub
Perceba que:
- Estamos usando o driver ODBC - Driver={Microsoft Excel Driver (*.xls)};
- Informamos o diretrio de localizao da panilha - "DefaultDir=C:\teste;" & _
- A fonte de dados ser o arquivo - "DBQ=C:\teste\Teste.xls;"
- O recordset foi criado com base na planilha - Plan1 - ors.Open "[Plan1$]", oConn,
adOpenStatic, adLockBatchOptimistic, adCmdTable
- A seguir invocamos a procedure preenche_controles que ir carregar as caixas de texto
com os valores dos trs registros que vamos exibir.
O cdigo da Procedura Preenche_Controles :
Private Sub preenche_controles()
Text1.Text = ors(2) 'numero isbn
30/7/2014 Excel e VB - Importando e Exportando dados
http://www.macoratti.net/excel_vb.htm 14/18
Text2.Text = ors(1) 'ano
Text3.Text = ors(0) 'nome
publicao
End Sub
Onde: ors(2) o campo ISBN , ors(1) o campo Year Published e ors(0) o campo Title.
Poderiamos ter usado a sintaxe : ors.fields(2) , ors.fields(1) e ors.fields(0)
Finalmente o cdigo associado aos botes command1 ( < ) e command ( > ) que
permitem a navegao pela planilha:
Private Sub
Command1_Click()
ors.MovePrevious

preenche_controles
End Sub
Private Sub
Command2_Click()
ors.MoveNext
preenche_controles
End Sub
Boto command1 -
vai para o registro
anterior
Boto command2 - vai
para o prximo registro
Agora s executar , veja abaixo a tela com os dados da planilha exibidos no formulrio:
2- Usando um provedor OLE DB para acessar uma planilha do Excel
Vamos fazer o mesmo servio usando um provedor OLE DB para acessar a planilha teste.xls
que esta no diretrio c:\teste. A novidade o boto Novo , onde podemos incluir dados
diretamente na planilha ; O cdigo principal esta associado ao boto que carrega os dados
da planilha. O layout do formulrio o seguinte:
- Aqui
temos
um
boto
que
permite
30/7/2014 Excel e VB - Importando e Exportando dados
http://www.macoratti.net/excel_vb.htm 15/18
incluir
registros
- O total
de
registros

exibido
na label1

Primeiro o cdigo da seo General Declarations : Declaramos as variveis objeto
Connection e Recordset e command:
Dim oConn As ADODB.Connection
Dim oCmd As ADODB.Command
Dim oRS As ADODB.Recordset
A seguir o cdigo principal associado ao boto - Acessar Planilha Excel usando OLE DB.
Private Sub Command5_Click()
' abre uma conexao com a planilha excel
Set oConn = New ADODB.Connection
oConn.Open
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data
Source=c:\teste\teste.xls;" & _
"Extended
Properties=""Excel 8.0;HDR=Yes;"";"
' cria o objecto command e define a
conexao ativa
Set oCmd = New ADODB.Command
oCmd.ActiveConnection = oConn
' abre a planilha
oCmd.CommandText = "SELECT * from
[Plan1$]"
' cria o recordset com os dados
Set oRS = New ADODB.Recordset
oRS.Open oCmd, , adOpenKeyset,
adLockOptimistic
30/7/2014 Excel e VB - Importando e Exportando dados
http://www.macoratti.net/excel_vb.htm 16/18
'exibe os dados
preenche_controles
End Sub
Nota : na string de conexo "HDR=Yes" significa que existe um cabealho na planilha
referente as clulas e o provedor NO vai incluir a primeira linha da seleo no Recordset
gerado. Para incluir esta linha defina "HDR=No".
O cdigo do boto Novo e Atualizar permitem a incluso de dados na planilha:
Private Sub
Command3_Click()
' limpa as caixas de texto
Text1.Text = ""
Text2.Text = ""
Text3.Text = ""
Command3.Enabled =
False
End Sub
Private Sub
Command4_Click()
'inclui o registro na
planilha
oRS.AddNew
oRS(0).Value =
Text3.Text 'titulo
oRS(1).Value =
Text1.Text 'isbn
oRS(2).Value =
Text2.Text 'ano
oRS.Update
Command3.Enabled =
True
preenche_controles
End Sub
O restante do cdigo apenas permite a navegao pelos dados da planilha:
Private Sub
Command1_Click()

oRS.MovePrevious

preenche_controles
30/7/2014 Excel e VB - Importando e Exportando dados
http://www.macoratti.net/excel_vb.htm 17/18
End Sub
Private Sub
Command2_Click()
oRS.MoveNext

preenche_controles
End Sub
Private Sub
Command7_Click()
oRS.MoveLast

preenche_controles
End Sub
Private Sub
Command8_Click()
oRS.MoveFirst

preenche_controles
End Sub
Percebemos ento que temos diversas formas de acessar as informaes de uma planilha
Excel usando o Visual Basic. E para acessar uma planilha na Internet , como seria ???
(Ainda vamos mostrar COMO FAZER ...)
Vamos ficando por aqui , voltaremos ao tema num futuro no muito distante... at
laaaa....
Gostou ? Comparti lhe no Facebook Comparti lhe no Twi tter
Veja os Destaques e novidades do SUPER DVD
Visual Basic (sempre atualizado) : clique e
confira !
Quer migrar para o VB .NET ?
Veja mais sistemas completos para a
plataforma .NET no Super DVD .NET , confira...
Quer APRENDER C# ??
Chegou o Super DVD C# com exclusivo material
de suporte e vdeo aulas com curso bsico sobre
C#.
30/7/2014 Excel e VB - Importando e Exportando dados
http://www.macoratti.net/excel_vb.htm 18/18
Veja tambm os Cursos com vdeo aulas e
projetos exemplos:
VB .NET Bsico - Vdeo Aulas
C# Bsico - Vdeo Aulas
Referncias:
Seo VB .NET do Si te Macoratti .net
Super DVD .NET - A sua porta de entrada na plataforma .NET
Super DVD Vdeo Aulas - Vdeo Aula sobre VB .NET, ASP .NET e C#
Seo C# do si te Macoratti .net
Seo Visual Basic 6 do site Macoratti .net
Jos Carlos Macoratti

Вам также может понравиться