Escolar Documentos
Profissional Documentos
Cultura Documentos
dados
1. OLE - Conceitos.
2. Usando VBA
3. Excel - Abrindo uma Planilha e Exportando p/ uma tabela
DDE , OLE , ActiveX ... Vamos direto a questão : " Como eu posso importar e exportar dados entre minha aplicação
Visual Basic e o Excel ? "
A primeira coisa que você vai ter que fazer é uma comunicação entre as aplicações . O Excel estará funcionando
como um servidor de dados ( ou cliente de dados ) . Para efetivar esta comunicação você vai ter que criar um
componente na sua aplicação VB que lhe permita acessar as propriedades e métodos do Excel.
Para instanciar um componente com essas propriedades você terá que conhecer quais os componentes que o
Excel expõe. Damos abaixo um esquema bem simples do modelo exposto pelo Excel:
É ela que temos que instanciar em nossa aplicação Visual Basic para
ter acesso as propriedades e métodos das demais classes expostas
pelo Excel.
É claro que que para tudo isto funcionar corretamente , esta classe deverá estar registrada na máquina na qual a
aplicação será executada . Trocando em míúdos : O Excel tem que estar instalado nesta máquina.
A primeira coisa a fazer ao iniciar o seu projeto no Visual Basic é habilitar a referência ao Excel dentro do seu
projeto. Para isto, selecione References no menu Tools ou Project, dependendo da versão do VB, e marque uma
opção semelhante a Microsoft Excel x.x Object Library, conforme mostra a figura a seguir:
C rie uma planilha no Excel e coloque qualquer informação na célula da linha 2 e coluna 3. Eu estarei criando o arquivo
texte.xls e na planilha Plan1 na célula da linha 2 , coluna 3 estarei informando : Oi eu aqui (salvos no diretório
c:\teste) veja figura abaixo:
Dim xl As New Excel.Application Ao executar o código ao lado, você irá obter uma caixa de mensagem
Dim xlw As Excel.Workbook exibindo o conteúdo da célula da planilha Plan1 do arquivo teste.xls ,
localizada na linha 2 e coluna 3.
'Abrir o arquivo do Excel
Set xlw = -Primeiro eu criei o componente Application do Excel e o atribui
xl.Workbooks.Open("c:\teste\teste.xls") a variável objeto xl ( poderia ser outro nome )
' definir qual a planilha de trabalho -Depois eu criei a classe Workbook e atribui a variável objeto
xlw.Sheets("Plan1").Select xlw
'Exibe o conteúdo da célula na posição -A seguir abri o arquivo teste.xls atribuindo a xlw
2,3
' variavel = xlw.Application.Cells(2, -Defini a minha planilha de trabalho (Plan1)
3).Value
MsgBox xlw.Application.Cells(2, 3).Value -E , obtive o valor (Value) da célula (Cells) da planilha
-Para encerrar encerrei a aplicação e liberei memória.
' Fechar a planilha sem salvar
alterações
' Para salvar mude False para True
xlw.Close False
Nota : Se você quiser trabalhar com o conteúdo da célula pode salvá-lo em uma variável para posterior
tratamento(veja de codigo variavel=xlw.Application.Cells(2, 3).Value )
Option Explicit
Dim EApp As Object Define as variáveis objetos que deverão ser visíveis em todo o
Dim EwkB As Object formulário
Dim EwkS As Object
Código do botão de comando CmdExell - Ativa o Excel insere dados nas células e cria o gráfico
End Sub
Nota: Usam os a instrução CreatObject para criar o obje to Ex ce l , e m bora Usar Dim com a cláusula Ne w se ja m ais rápido .
- Esconde o formulário do VB
Private Sub cmdsair_Click()
- Fecha o arquivo e encerra o Excel
Me.Hide
' fecha o arquivo xls Abaixo o gráfico gerado
'
EwkB.C lose
EApp.Application.Quit
End
End Sub
Vamos converter os dados da tabela Titles presente no banco de dados Biblio.mdb para em uma planilha Excel.
Para fazer o serviço vamos usar uma função 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 ??? Não !!! Então leia o artigo - Recordsets : Tables, Dynasets e Snapshots.
O projeto :
Vamos ao código :
Option Explicit
Dim oExcel As Object
Dim objExlSht As Object
Dim db As Database
-Define as variáveis objetos que deverão ser visíveis
Dim Sn As Recordset ' Recordset do tipo
em todo o formulário tanto para o Excel como para o
Snapshot
banco de dados
Private Type ExlC ell
row As Long
col As Long
End Type
Agora o código do botão de comando cmdExcel : Prepara o Excel , abre o Recordset e chama a função -
CopiarTabelaExcel().
Sub CmdExcel_Click()
Dim stC ell As ExlC ell
Set db = OpenDatabase("c:\teste\BIBLIO.MDB")
Set Sn = db.OpenRecordset("Titles",
dbOpenSnapshot)
oExcel.Visible = True
frmexcelvb.Show
End Sub
O código da Função CopiarTabelaExcel: A função recebe como parâmetros o Recordset, a planilha e a célula inicial
e copia os registros para a planilha
rs.MoveLast
ReDim Vetor(rs.RecordC ount + 1, rs.Fields.C ount)
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 células da planilha ( linha de código azul)
O código do botão cmdSair: Encerra o Excel e libera memória das variáveis objeto.
End Sub
Agora eu vou mostrar como fazer o mesmo serviço usando código mais enxuto: o método CopyFromRecordset do
objeto Range.
O método CopyFromRecordset do objeto Range é muito útil para importar dados de uma aplicação externa para
uma planilha Excel. O único problema porém, é que ele só funciona com a DAO e não suporta recordsets ADO.
Abaixo temos o código que faz o mesmo serviço do exemplo acima abordado.
'Criamos um recordset selecionando todos os campos da tabela Titles do banco de dados Biblio.mdb onde
o código PubId for menor que 10
Set Rs1 = Db1.OpenRecordset(Name:="Select * from titles where PubId < 10", Type:=dbOpenDynaset)
objExlSht.SaveAs "C:\teste\teste.xls"
oExcel.Visible = True
set db1=nothing
Usando DAO - método CopyFromRecordset
Como já disse , se voce quiser a ADO para acessar o banco de dados , não vai poder usar o método
CopyFromRecordset , mas calma , podemos usar outro recurso o método Transpose.
A seguir o código que executa a mesma tarefa ( apenas restringimos a quantidade de registros usando uma
instrução SQL - Se le ct Title From Title s W HER E pubID < 5 O R DER BY Title ).
R s1.O pe n Source :="Se le ct Title From Title s W HER E pubID < 5 O R DER BY Title ", _
Active C onne ction:="DBQ =C :\TESTE\biblio.MDB;Drive r={Microsoft Acce ss Drive r
(*.m db)};", _
C ursorType :=adO pe nStatic, _
Lock Type :=adLock O ptim istic, _
O ptions:=adC m dTe x t
R s1.C lose
Se t R s1 = Nothing
Usando A DO - método Transpose
Observe que:
- Não fizemos uma referência direta a um banco de dados no código , na verdade usamos somente o objeto
Recordset da ADO
- Quando invocamos o método Open do objeto Recordset passamos a informação da conexão com o argumento
ActiveConnection
- Os dados do recordset são organizados em um tabela de duas dimensões onde cada coluna representa um
registro e cada linha representa um campo. Vamos então copiar os registros para as linhas e os campos para as
colunas.
- Usamos o método Getrows do objeto Recordset da ADO para gerar um array que é passado via método
Transpose para a planilha.
Claro que tem . Vamos mostrar o acesso usando ADO primeiro usando um driver ODBC e depois usando OLE DB.
Vamos abrir a planilha chamada teste.xls presente no diretório c:\teste usando um driver ODBC e exibir três
colunas da planilha. (Esta planilha foi gerada pela exportação da tabela Titles do banco de dados Biblio.mdb)
Para navegar pela 'planilha' vamos criar dois botões de comando : command1(<) - navega para trás e command2
( > ) - navega para frente ; quando o usuário clicar nos botões os valores serão exibidos nas caixas de texto.
Usaremos um terceiro botão - cmdAcessaExcel - para criar uma conexão 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 formulário do
projeto:
Primeiro o código da seção General Declarations : Declaramos as variáveis objeto Connection e Recordset.
O código do evento Click do botão - cmdAcessaExcel - é o que vai fazer todo o serviço , vejamos :
preenche_controles
End Sub
Perceba que:
- 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 três
registros que vamos exibir.
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 código associado aos botões command1 ( < ) e command ( > ) que permitem a navegação pela
planilha:
Agora é só executar , veja abaixo a tela com os dados da planilha exibidos no formulário:
Vamos fazer o mesmo serviço usando um provedor OLE DB para acessar a planilha teste.xls que esta no diretório
c:\teste. A novidade é o botão Novo , onde podemos incluir dados diretamente na planilha ; O código principal
esta associado ao botão que carrega os dados da planilha. O layout do formulário é o seguinte:
Primeiro o código da seção General Declarations : Declaramos as variáveis objeto Connection e Recordset e
command:
A seguir o código principal associado ao botão - Acessar Planilha Excel usando OLE DB.
'exibe os dados
preenche_controles
End Sub
Nota : na string de conexão "HDR=Yes" significa que existe um cabeçalho na planilha referente as células e o
provedor NÃO vai incluir a primeira linha da seleção no Recordset gerado. Para incluir esta linha defina "HDR=No".
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
Percebemos então que temos diversas formas de acessar as informações 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 não muito distante... até láaaaa....