Você está na página 1de 722

Acesso 2007

Bblia VBA
Para aplicativos centrados em dados de Microsoft Office

Helen Feddema
01_047026 ffirs.qxp 02\/04\/07 21:39 pgina iii
01_047026 ffirs.qxp 02\/04\/07 21:39 pgina ii
Bblia de VBA do Access 2007

01_047026 ffirs.qxp 02\/04\/07 21:39 pgina i


01_047026 ffirs.qxp 02\/04\/07 21:39 pgina ii
Acesso 2007

Bblia VBA
Para aplicativos centrados em dados de Microsoft Office

Helen Feddema
01_047026 ffirs.qxp 02\/04\/07 21:39 pgina iii
Acesso

Bblia VBA 2007: para aplicativos centrados em dados de Microsoft Office

Publicado por
Wiley Publishing, Inc.
10475 Crosspoint Boulevard
Indianapolis, IN 46256
www.Wiley.com
Copyright 2007 por Wiley Publishing, Inc., Indianapolis, Indiana
Publicado pela Wiley Publishing, Inc., Indianapolis, Indiana
Publicado simultaneamente no Canad
ISBN: 978-0-470-04702-6
Fabricado nos Estados Unidos da Amrica
10 9 8 7 6 5 4 3 2 1
Nenhuma parte desta publicao pode ser reproduzida, armazenada em um sistema de recuperao ou transmitida sob qualquer forma ou por qualquer meio,
eletrnica, mecnica, fotocpia, gravao, digitalizao ou de outra forma, exceto conforme permitido no sees 107 ou 108 de
Lei de direitos autorais de 1976 Estados Unidos, sem prvia permisso por escrito da editora, ou atravs de autorizao
pagamento da taxa por cpia apropriada para o Copyright Clearance Center, 222 Rosewood Drive, Danvers, MA 01923,
(978) 750-8400, fax (978) 646-8600. Solicitaes para a editora para permisso devem ser enviadas para o judicirio
Departamento, Wiley Publishing, Inc., 10475 Crosspoint Blvd., Indianapolis, IN 46256, (317) 572-3447 fax (317) 572-4355,
ou online em http:\/\/www.wiley.com\/go\/permissions.
Limite de responsabilidade\/iseno de garantia: A editora e o autor no fazem nenhuma representao ou garantias com
que diz respeito exatido ou completude do contedo deste trabalho e especificamente excluem todas as garantias, incluindo
sem limitao, garantias de adequao a uma finalidade especfica. Nenhuma garantia pode ser criada ou estendida por vendas ou
materiais promocionais. O aconselhamento e estratgias contidas neste documento podem no ser adequadas para cada situao. Este trabalho vendido
com o entendimento de que a editora no est envolvida no processamento legais, contbeis ou outros servios profissionais. Se
ajuda profissional necessria, os servios de uma pessoa competente e profissional devem ser procurados. Nem a editora
nem o autor ser responsvel por danos decorrentes. O fato de que uma organizao ou site referido neste
trabalhar como uma citao e\/ou uma fonte potencial de informao complementar no significa que o autor ou a editora apoia
podem fornecer as informaes que a organizao ou site ou pode fazer recomendaes. Alm disso, os leitores devem ser
ciente de que a Internet sites listados neste trabalho podem ter alterado ou desapareceu entre quando este trabalho foi escrito
e quando ele lido.
Para informaes gerais sobre nossos outros produtos e servios ou para obter suporte tcnico, entre em contato com nosso cliente
Departamento de atendimento dentro dos EUA em (800) 762-2974, fora dos Estados Unidos em (317) 572-3993 ou fax (317) 572-4002.
Biblioteca de dados de catalogao-na-publicao do Congresso:
Feddema, Helen Bell.
Bblia de VBA do Access 2007: Para aplicativos centrados em dados Microsoft Office \/ Helen Feddema.
p. cm.
Inclui ndice.
ISBN 978-0-470-04702-6 (site\/jornal)
1. Microsoft Access. 2. Database management. 3. Microsoft Visual Basic for applications. I. ttulo.
QA76.9.D3F435 2007
005.75 65 - dc22
2007007061
Marcas comerciais: Wiley, o logotipo Wiley, vestido de comrcio relacionados so marcas comerciais ou registradas da John Wiley
Inc. e\/ou suas filiais, nos Estados Unidos e outros pases e no podem ser usadas sem permisso por escrito.
Microsoft e acesso so marcas comerciais ou marcas registradas da Microsoft Corporation nos Estados Unidos e\/ou
pases. Todas as outras marcas so de propriedade de seus respectivos proprietrios. Wiley Publishing, Inc., no est associada com
qualquer produto ou fornecedor mencionado neste livro.
Wiley tambm publica seus livros em uma variedade de formatos eletrnicos. Algum contedo que aparece na impresso pode no estar disponvel em
livros eletrnicos.
01_047026 ffirs.qxp 02\/04\/07 21:39 pgina iv
Sobre o autor
Helen Feddema um desenvolvedor independente especializada em aplicativos do Microsoft Office, concentrao -
trating (desde 1996) e Access, Word, Outlook. Ela tem escrito ou co-autor de vrios livros
no Access e outros aplicativos do Office, incluindo Inside Microsoft Access (Novos pilotos, 1992),
Formas de poder para o Microsoft Access e Poder de relatrios para o Microsoft Access (Pinnacle, 1994), Acesso como-
Tos(Waite Group Press, 1995), MCSD: Guia de estudo Access 95 (Sybex, 1998), Modelo de objeto DAO: O
Guia definitivo(O ' Reilly, de janeiro de 2000), e Access 2002 de dentro para fora (Microsoft Press, 2001), que
foi #1 julgados na categoria de livro de Desktop e aplicativos do Office 2004 Waterside conferem-
ENCE. Seu livro mais recente Desenvolvimento de aplicativos de um especialista Microsoft Access
(Wiley\/Wrox, 2003).
Ela tambm contribuiu com captulos de uma srie de livros de escritrio multi-autor, incluindo Especial
Edio: Usando o Microsoft Outlook 97 (Que, 1997),Escritrio aborrecimentos (O ' Reilly, 1997),Outlook
Aborrecimentos (O ' Reilly, 1998),Edio especial: Usando Microsoft Project 98 (Que, 1997),Ensine-se Yourself
Projeto(Sams, 1998), e Edio especial: Outlook 2000 (Que, 2000). Helen foi um regular con-
tributor a Pinnacle Acesso inteligente e Office Developer revistas, informanteMicrosoft Office e
Programao VBA (agoraSolues do Office ), e Escritrio subterrneo de Woody Boletim e ela cur-
rently editor do Acesso relgio Ezine (anteriormente Relgio de acesso do Woody ), para que ela escreve a
Coluna de Arconte de acesso.
01_047026 ffirs.qxp 02\/04\/07 21:39 pgina v
Crditos
Editor Executivo
Bob Elliott
Editor de desenvolvimento
Kelly Talbot
Editor tcnico
Mary Hardy
Editor de produo
Eric Charbonneau
Copy Editor
Kim Cofer
Gerente editorial
Mary Beth Wakefield
Gerente de produo
Tim Tate
Vice-Presidente e o grupo executivo
Editora
Richard Swadley
Vice-Presidente e editor executivo
Joseph B. Wikert
Coordenador do projeto
Adrienne Martinez
Grficos e especialistas de produo
Sean Decker
Jennifer Mayberry
Heather Papa
Amanda Spagnuolo
Tcnicos de controle de qualidade
Melanie Hoffman
Robert Springer
Brian paredes
Reviso e indexao
Aptara
Projeto do logotipo do aniversrio
Richard Pacifico
Kerry e Jean King, bons vizinhos e bons amigos
01_047026 ffirs.qxp 02\/04\/07 21:39 Page vi
About the Author . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . v
Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . XIII
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xv
Parte i: os componentes do Office e o que fazem melhor 1
Captulo 1: Armazenar e exibir dados no Access.... 3
Uma breve histria do intercmbio de dados do escritrio...3
Storing Data in Access ..........................................................................................................4
Exibindo dados em relatrios e formulrios de acesso...5
Criar cartas de formulrio de acesso...8
Criando relatrios do tipo planilha no acesso...11
Plain Datasheet Reports ..................................................................................11
PivotTables ......................................................................................................19
PivotCharts......................................................................................................22
Summary ............................................................................................................................25
Captulo 2: Criao de documentos de palavra de acesso. 27
Documentos de preenchimento do Word com dados de acesso, usando o mtodo TypeText...27
Utilizando modelos do Word para criar documentos do Word formatado...30
Bookmarks ................................................................................................................31
Document Properties ................................................................................................39
Form Field Documents........................................................................................................45
Summary ............................................................................................................................48
Captulo 3: Anlise de dados com o Excel... 49
Exportar dados do Access para uma planilha no formatada...50
Usando modelos do Excel para criar formatado planilhas preenchidas com dados de acesso...52
Formatao de planilhas do Excel no VBA cdigo...62
Summary ............................................................................................................................69
Captulo 4: Organizao e comunicando-se com o Outlook. 71
Exportao de compromissos e tarefas para o Outlook...72
Exportar informaes de jornal para Outlook...79
Criando E-mails de uma tabela do Access...81
Summary ............................................................................................................................85
VII
02_047026 ftoc.qxp 02\/04\/07 21:40 pgina vii
Parte II: Escrevendo cdigo VBA para trocar dados entre
Componentes do Office 87
Captulo 5: Trabalhando com dados de acesso... 89
Trabalhando com bancos de dados de formato mais velhos no Access 2007...91
Disambiguating referncias a componentes de modelo de objeto...91
O objeto DAO modelo (antigo e novo)...96
Novos objetos no modelo de objeto do Access 2007 DAO...97
Objetos escondidos no modelo de objeto do Access 2007 DAO...98
Databases ........................................................................................................99
Recordsets........................................................................................................99
QueryDefs ....................................................................................................104
TableDefs and Fields......................................................................................106
The ADO Object Model ..........................................................................................110
Connection....................................................................................................110
Command......................................................................................................113
Recordset ......................................................................................................116
Record ..........................................................................................................129
Stream ..........................................................................................................129
Converso cdigo DAO para ADO cdigo...129
Summary ..........................................................................................................................131
Captulo 6: Trabalhando com modelos e documentos do Word. . 133
Exportao de built-in Word no Office 2007...135
Exportar dados do Access para o Word usando automao cdigo...138
The Word Object Model ..........................................................................................139
Criando um documento do Word novo e em branco...140
Criando um documento do Word baseado em um modelo...141
Usando uma consulta para concatenar dados para exportao...143
Escolhendo um mtodo para mesclar dados de acesso palavra...145
Trabalhar com propriedades de documento do Word...146
Word Bookmarks ..........................................................................................165
The TypeText Method ....................................................................................170
Word Mail Merge ..........................................................................................175
Summary ..........................................................................................................................182
Captulo 7: Trabalhando com planilhas de Excel.. 183
Simplesmente exportar dados do Access para o Excel...184
The Excel Object Model ....................................................................................................187
Planilhas minimamente formatadas...191
Tabulares planilhas formatadas do cdigo...195
Timesheets ........................................................................................................................202
Summary ..........................................................................................................................218
VIII
Contedo
02_047026 ftoc.qxp 02\/04\/07 21:40 pgina viii
Captulo 8: Trabalhando com itens do Outlook. 219
Exportar dados do Access para Outlook itens...220
Usando o grupo de dados coletar...220
Usando o grupo de importao para importar ou Link de dados do Outlook...221
Usando bancos de dados de amostra e formas...230
The Outlook Object Model ..............................................................................................234
Explorer, Inspetor e outros objetos do Outlook...234
Sintaxe para fazer referncia a objetos do Outlook...235
Referenciar itens do Outlook no cdigo VBA...240
Trabalhando com compromissos do Outlook...241
Working with Outlook Tasks ............................................................................................247
Trabalhar com contatos do Outlook...254
Summary ..........................................................................................................................262.
Captulo 9: Trabalhando com arquivos e pastas... 263
Trabalhando com pastas do Windows Explorer...264
O escritrio objeto FileDialog...264
The FileSystemObject..............................................................................................271
Backing up Your Database ................................................................................................277
Working with Text Files ....................................................................................................282
Writing Data to Text Files ........................................................................................282
ADO ..............................................................................................................291
FileSystemObject ..........................................................................................292
VB ................................................................................................................292
Lendo dados de arquivos de texto...292
ADO ..............................................................................................................296
FSO ..............................................................................................................296
VB ................................................................................................................296
Trabalhando com campos de anexo...297
Carregando arquivos em anexo campos...299
Salvar anexos de arquivos...302
Summary ..........................................................................................................................304
Captulo 10: Trabalhando com dados externos. 305
Trabalhando com arquivos de texto usando o mtodo TransferText...306
Criando uma especificao de exportao ou importao...306
Importar e exportar dados de arquivo de texto no cdigo VBA...312
Importing Text Data ......................................................................................312
Exporting Text Data ......................................................................................320
Trabalhando com arquivos de planilha e banco de dados do legado...324
Importing Database Files ........................................................................................324
Importando arquivos de planilha...328
Exportando arquivos de planilha e banco de dados...336
IX
Contedo
02_047026 ftoc.qxp 02\/04\/07 21:40 pgina ix
Trabalhando com XML e arquivos HTML...338
Importando arquivos XML e HTML...338
Exportar HTML e XML arquivos...341
Enviando arquivos de texto exportado...348
Summary ..........................................................................................................................350
Captulo 11: Sincronizao de acesso e contatos do Outlook. 351
Criando uma tabela desnormalizada de um conjunto de tabelas vinculadas...352
Comparando o Outlook e contatos de acesso...359
Re-criando as tabelas do arquivo simples de acesso e dados do Outlook...361
Copiar dados do Access para Outlook (ou vice-versa)...374
Working with Attachments................................................................................................391
Summary ..........................................................................................................................396
Captulo 12: Indo alm do bsico.. 397
Criar palavra extravagante etiquetas de envio...397
Criando grficos dinmicos do Excel de consultas de acesso...415
E-mail de envio e reordenao de relatrios...426
Summary ..........................................................................................................................432
Parte III: Adicionando mais funcionalidades ao Office 427
Captulo 13: Criando os suplementos de com Visual Basic 6.... 435
Criar um suplemento usando o Visual Basic 6.0...436
Usando o modelo de suplemento COM...436
Criando o controle de LNB renomeando COM Add-in...440
The SharedCode Module ..............................................................................440
O mdulo de AccessDesigner...442
Creating the DLL ..........................................................................................463
Installing a COM Add-in ........................................................................................463
Solucionando problemas de um suplemento de COM...466
Using a COM Add-in ........................................................................................................467
Comparando os suplementos com acesso Adicionar-ins...469
Summary ..........................................................................................................................469
Captulo 14: Criando acesso Adicionar-ins... 471
A finalidade de acesso Add-ins...472
Add-in Types ....................................................................................................................472
Creating a Library Database ..............................................................................................473
Menu Add-ins ........................................................................................................478
Wizards ..................................................................................................................479
Property Builders ....................................................................................................480
Coisas que voc precisa saber quando escrever suplementos...481
Requisitos especiais para o cdigo de suplemento...481
Dicas sobre adicionar-em construo...482
x
Contedo
02_047026 ftoc.qxp 02\/04\/07 21:40 pgina x
The Extras Add-in Code....................................................................................................483
Extras Options ........................................................................................................483
basExtras Module ....................................................................................................486
Back up Database ....................................................................................................489
Back up Back End Database ....................................................................................491
List Query Fields ....................................................................................................495
List Table Fields ......................................................................................................497
Other Procedures ....................................................................................................499
Finalizing the Add-in ..............................................................................................502
Troubleshooting Add-ins ..................................................................................................503
Interpretao de mensagens de erro de Adicionar-in...506
Installing an Add-in ..........................................................................................................507
Using the Extras 2007 Add-in ..........................................................................................510
Extras Options ........................................................................................................511
Back up Database ....................................................................................................512
Back up Database Back End ....................................................................................512
List Query Fields ....................................................................................................513
List Table Fields ......................................................................................................514
Summary ..........................................................................................................................514
Captulo 15: Personalizar a faixa de opes com XML em bancos de dados Access
and Add-ins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515
Ferramentas teis para criao e edio de cdigo XML...517
XML Notepad 2007 ................................................................................................517
VB 2005 XML Editor ..............................................................................................518
Office 2007 Custom UI Editor...518
Personalizar a faixa de opes em um banco de dados do Access...519
Creating the XML Code ..........................................................................................522
Adicionando uma nova guia, grupo e controles da faixa de opes...527
Remover uma guia ou grupo da faixa de opes...528
VBA Code................................................................................................................542
Form Ribbons..........................................................................................................547
Personalizar a faixa de opes com um suplemento de acesso...549
Summary ..........................................................................................................................558
Captulo 16: Como personalizar a faixa de opes de acesso com um Visual Studio 2005
Shared Add-in. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 559
Preparando-se para escrever um suplemento do Visual Studio...559
Adicionando suporte .NET para escritrio...559
Modificar o cdigo do mdulo de classe Connect...573
Adicionando funcionalidade para o suplemento compartilhado...575
Debugging the Add-in ............................................................................................582
Construir e instalar o Add-in...583
Using the Add-in ....................................................................................................588
Summary ..........................................................................................................................589
XI
Contedo
02_047026 ftoc.qxp 02\/04\/07 21:40 xi de pgina
Captulo 17: Criando Scripts Standalone com Windows Script Host. . . . 591
Ferramentas para trabalhar com o Windows Script Host de Scripts...591
O Editor de scripts Microsoft...592
The VBScript Help File............................................................................................597
Diferenas entre o cdigo do VBScript e VBA...599
Useful Scripts ....................................................................................................................603
Setup Scripts ..........................................................................................................603
Office Scripts ..........................................................................................................611
Miscellaneous Scripts ..............................................................................................616
Agendamento de um Script de Backup com o Agendador de tarefas do Windows Vista...619
Summary ..........................................................................................................................626
Captulo 18: Trabalhando com dados do SQL Server. 627
Getting SQL Server 2005 ..................................................................................................628
Preparando um banco de dados do Access para o Upsizing para o SQL Server...629
Configurando o SQL Server 2005 para acesso a dados...631
Comeando pelo Firewall...640
Windows XP..................................................................................................640
Windows Vista ..............................................................................................643
Outros bloqueios de segurana...647
Using the Upsizing Wizard................................................................................................648
Converso de tabelas do Access para tabelas do SQL Server...649
Criando um aplicativo cliente\/servidor...657
Vinculao de dados em tabelas do SQL Server...662
O Assistente de migrao do servidor SQL para acesso...671
Summary ..........................................................................................................................672
Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 673
XII
Contedo
02_047026 ftoc.qxp 02\/04\/07 21:40 pgina xii
M
qualquer graas ao meu editor tcnico, Mary Hardy, para capturar erros e fazendo muitos
sugestes valiosas que melhoraram a qualidade do livro (e bancos de dados de amostra), e
para editores Kelly Talbot e Brian Hermann para suas sugestes e apoio.
XIII
03_047026 flast.qxp 02\/04\/07 21:40 pgina xiii
03_047026 flast.qxp 02\/04\/07 21:40 pgina xiv
W
elcome para o Bblia de VBA do Access 2007 . Como todos os livros da srie da Bblia, voc pode esperar
encontrar tutoriais prticos e informaes de aplicao prtica do mundo real, como
bem como informaes de referncia e o plano de fundo que fornece um contexto para o que voc est
aprendizagem. Este livro um recurso bastante abrangente sobre como escrever cdigo VBA para troca de dados
entre o escritrio principal aplicaes (Access, Word, Excel e Outlook), usando o acesso como o cen-
Tral aplicativo para armazenar dados e usando outros aplicativos para produzir atraente formato-
Ted documentos de vrios tipos. Quando voc tiver concludo o Bblia de VBA do Access 2007 , voc
vai estar bem preparado para escrever cdigo VBA automao que usa seus dados de acesso para produzir a palavra
cartas, etiquetas e outros documentos (sem a sobrecarga de mala direta), de discusso para criar o Excel
planilhas e grficos dinmicos e para criar compromissos do Outlook, as mensagens de email, contatos, e
artigos de jornal, com ou sem anexos. Alm disso, voc ser capaz de sincronizar contato
(ambos os sentidos) de dados entre o Access e Outlook.
Quem deve ler este livro
O livro escrito para o Access\/Office developer ou usurio avanado que est familiarizado com o trabalho
com aplicativos do Office (particularmente acesso) na interface, e tem pelo menos uma familiaridade bsica com
escrever cdigo VBA, mas precisa de mais informaes sobre como escrever cdigo de automao para trabalhar com a palavra,
Excel e objetos do Outlook, de modo a ser capaz de usar cada aplicativo do Office para criar documentos
que so sua especialidade, ao armazenar a maioria dos dados em bancos de dados Access.
Como este livro est organizado
O livro comea em parte eu com uma descrio dos componentes do Office (Access, Word, Excel, e
Outlook) e o que eles fazem melhor, como um guia para selecionar o componente Office apropriado para um
tarefa especfica.
Na parte II, cobertura mais especfica fornecida para cada componente do Office, com bancos de dados de amostra
que ilustram o trabalho com dados de acesso, documentos do Word e modelos, planilhas de Excel, e
Itens do Outlook. Esta parte tambm inclui um captulo sobre como trabalhar com arquivos e pastas usando o
FileSystemObject e outro sobre a sincronizao de contatos de acesso com contatos do Outlook. Este
permite que voc mantenha seus contatos em um conjunto de tabelas vinculadas corretamente normalizados no Access, enquanto
tambm ter a capacidade de referenciar e usar contatos do Outlook, sem ter que fazer dupla entrada ou
manualmente atualizar informaes de contato. Finalmente, o ltimo captulo na parte lida com vrios
Tpicos avanados, trabalhando com objetos de Word e Excel.
XV
03_047026 flast.qxp 02\/04\/07 21:40 pgina xv
Parte III aborda tpicos que adicionam mais funcionalidade ao escritrio, incluindo a criao de suplementos COM
com VB 6, Access add-ins e Visual Studio 2005 Shared add-ins. Trata-se tambm como personalizar o
Office 2007 Ribbon com XML em bancos de dados Access e adicionar-ins de vrios tipos. Alm disso,
h um captulo sobre a criao de scripts standalone com Windows Script Host e outro captulo
em usando o Access como front-end para trabalhar com dados do SQL Server.
Convenes e caractersticas
H muitos recursos organizacionais e tipogrficos diferentes ao longo deste livro projetado
para ajud-lo a obter o mximo de informaes.
Sempre que os autores querem trazer algo importante para sua ateno, as informaes sero
aparecem em uma ponta, nota ou precauo.
Esta informao importante e partiu em um pargrafo separado com um cone especial.
Cuidados fornecem informaes sobre coisas a observar, se simplesmente inconve -
amostras ou potencialmente perigosos para seus dados ou sistemas.
Dicas geralmente so usadas para fornecer informaes que podem facilitar seu trabalho especial
atalhos ou mtodos para fazer algo mais fcil do que a norma.
Notas fornecem informaes adicionais, acessrias que til, mas um pouco fora de
a apresentao atual da informao.
Novidades introduzem componentes ou funcionalidades que so novos ou melhorados na
software em comparao comparado verses anteriores.
O que est no Site do companheiro
No site do companheiro voc encontrar o cdigo de exemplo. Cada captulo tem sua prpria subpasta na
Web site. Em subpastas encontrar todos os bancos de dados de amostra e outros arquivos (como o Word e Excel
modelos ou scripts do Windows Script Host) que foram discutidos em cada captulo.
Requisitos mnimos
Para executar o cdigo de exemplo neste livro, voc precisa de um computador capaz de executar pelo menos Windows
XP e, claro, voc precisa de Office 2007. Porque o Office 2007 funciona bem no Windows XP, voc no
precisa de Windows Vista, mas o Office 2007 funciona ainda melhor no Vista. Se voc pretende rodar o Vista, voc
precisa de um computador pronto para Vista. Se voc comprar um computador novo, a olhar para o \"Windows Vista Capable\"
adesivo; no entanto, um computador mais antigo pode apoiar a Vista mesmo que ele no tem a etiqueta (embora
provavelmente no o vidro Aero interface, que requer uma placa de vdeo de alta potncia).
NOVO RECURSO NOVO RECURSO
NOTA NOTA
DICA DICA
CUIDADO CUIDADO
XVI
Introduo
03_047026 flast.qxp 02\/04\/07 21:40 pgina xvi
Onde ir a partir daqui
Voc deve tirar este livro a capacidade de selecionar o componente do Office que faz o melhor
trabalho para a tarefa em mos. Voc tambm deve levar como escrever cdigo VBA automao para transferir
dados de acesso aos documentos criados com outros componentes do Office e formatar os documentos como
necessrios; Isto lhe permitir criar procedimentos que podem ser executados a partir de eventos de formulrio ou botes da barra de ferramentas para
Automatize as tarefas relacionadas ao Office que voc precisa fazer em uma base regular.
(Meu web site www.helenfeddema.com ) tem pginas com artigos de acesso Archon e amostras de cdigo
muitos dos que lidam com troca de vrios tipos de dados entre aplicativos do Office. V-los
fora voc pode achar que a soluo que voc est procurando j est l, pronto para baixar e usar.
XVII
Introduo
03_047026 flast.qxp 02\/04\/07 21:40 pgina xvii
03_047026 flast.qxp 02\/04\/07 21:40 pgina xviii
O escritrio
Componentes e
O que eles fazem melhor
NESTA PARTE
Captulo 1
Armazenar e exibir dados em
Acesso
Captulo 2
Criao de documentos do Word
Acesso
Captulo 3
Anlise de dados com Excel
Captulo 4
Organizao e comunicao
com o Outlook
04_047026 pt01.qxp 02\/04\/07 21:40 pgina 1
04_047026 pt01.qxp 02\/04\/07 21:40 pgina 2
S
Ince seus primeiros dias cerca de 14 anos acesso foi um real -
cional programa de banco de dados, armazenando os dados em tabelas e usando o seu prprio
consultas, formulrios e relatrios para classificar, filtragem, exibir e imprimir dados. Com
sucessivas verses do Office, movimentao de dados entre os componentes do Office (espe-
cialmente de Word, Excel e Outlook) tornou-se muito mais fcil que agora
muitas vezes mais eficiente usar um outro componente do Office em vez de um acesso
relatrio para uma tarefa, como impresso de cartas ou anlise de dados numricos.
Alm disso, usando outros componentes do Office para exibir ou imprimir dados de
Acesso torna os dados armazenados em tabelas do Access mais amplamente acessveis. Muitos
Os usurios do Office tem uma edio do Office que no inclui acesso mas eles
todos tm o Word e Excel, e muitos tambm tm o Outlook, para que eles possam facilmente
trabalhar com documentos do Word, mensagens do Outlook ou nomeaes e Excel
planilhas, preenchido com dados de tabelas do Access.
Se voc planeja apresentar seus dados como um relatrio do Access, grfico dinmico, ou
Tabela dinmica; ou um documento do Word ou planilha do Excel, os dados so armazenados em
Tabelas do Access e entrou e editado em formulrios de acesso.
Uma breve histria do escritrio
Troca de dados
Como o sistema operacional Windows progrediu do Windows 3.0 para
Windows XP e Vista, transferncia de dados tcnicas melhoraram, de simples
cortar e colar usando o clipboard do Windows 3.0, a troca de dados dinmica
(DDE) e Open Database Connectivity (ODBC), automao (originalmente
3
NESTE CAPTULO
Uma breve histria dos dados do escritrio
troca
Armazenamento de dados no Access
Exibindo dados de acesso em formas
e relatrios
Trabalhando com texto rico em
Campos de memorando
Nova interatividade de relatrio
Usando o Access como um controle
Centro para trabalhar com
Documentos do Office
Armazenar e exibir
Dados no Access
05_047026 ch01.qxp 02\/04\/07 21:41 pgina 3
chamado objeto vinculao e incorporao [OLE], em seguida, automao OLE) e Extensible Markup
Language (XML).
Em verses anteriores do Windows e Office, DDE e ODBC eram difceis de usar, irritadio e no confivel
em operao e ODBC em particular muitas vezes necessria instalao elaborada. Eu sei eu usei ambos DDE
e ODBC, quando eles eram as nicas ferramentas de conectividade disponveis. Mas deixei-lhes alegremente quando
OLE tornou-se disponvel no Windows 95\/Office 95, porque oferecia uma maneira muito mais simples para se conectar
Aplicaes de escritrio, embora no incio apenas de forma limitada.
Antes o Office 97, havia uma distino entre os componentes do Office que foram servidores OLE, que
poderia ser manipulada pelo cdigo executando a partir de outros aplicativos e clientes OLE, o que poderia
trabalhar com objetos nos modelos de objeto dos aplicativos de servidor OLE. Nos tempos de acesso 1.0 ou
os desenvolvedores do Access 2.0 mesmo, que tinha algumas ferramentas disponveis para conexo com outros aplicativos do Office
como o Word ou Excel. Acesso, por exemplo, era apenas um cliente, Considerando que a palavra era apenas um servidor.
No Office 95 AccessBasic foi atualizado para o padro Office VBA e Access tornou-se um servidor OLE
(anteriormente era apenas um cliente OLE). Office 2000, todos os principais aplicativos do Office (Access,
Word, Excel, Outlook e PowerPoint) tinham sido atualizado para oferecer suporte a automao tanto como clientes
servidores e, portanto a distino de cliente\/servidor OLE no mais significativa.
Voc pode escrever cdigo de automao em qualquer aplicativo do Office principal para se conectar a qualquer outro cargo
do aplicao dados e funcionalidade (e tambm alguns aplicativos de terceiros).
Armazenamento de dados no Access
Acesso foi projetado desde o incio para armazenar dados, assim (se voc tem uma escolha que no sempre o
caso) o lugar onde voc deve armazenar seus dados. Voc pode precisar usar esses dados para produzir
Letras da palavra, listas do SharePoint, planilhas de Excel, ou mensagens de email do Outlook, mas os dados em si
devem ser mantidos em tabelas do Access, a menos que haja uma razo muito forte para armazen-lo em outro lugar.
Uma exceo vlida armazenar os dados em bancos de dados SQL Server back-end, usando o acesso como
o front-end. SQL Server normalmente a escolha para bancos de enormes dados corporativos, no pequeno-
para bancos de dados mdios usados por indivduos ou pequenas empresas, onde o acesso pode facilmente manipular
o nmero de registros. Ver captulo 18 para obter mais informaes sobre essa opo.
Entrada de dados e edio, tambm, devem ser feitos no Access, na maior parte, porque voc pode criar
Formas de acesso que oferecem uma interface atraente para inserir e editar dados. Voc pode escrever cdigo VBA
que decorre de eventos de formulrio e controle para fins de tratamento de erros e criar funes que
Automatize as operaes de processamento de dados repetitivas.
Em meu livro anterior, Um especialista Microsoft Application Development Eu discutida a criao de
Aplicaes de acesso, com detalhes sobre como usar consultas, formulrios, relatrios e cdigo. Eu no vou duplicar esta
informaes aqui, mas em vez neste captulo concentrar-me recursos novos ou aperfeioados no Access
2007, que aumentar a utilidade dos relatrios e formulrios de acesso.
REFERNCIA CRUZADA REFERNCIA CRUZADA
4
Os componentes do Office e o que fazem melhor
Parte I
05_047026 ch01.qxp 02\/04\/07 21:41 pgina 4
Exibindo dados em formulrios do Access e
Relatrios
s vezes voc no precisa ir l fora para apresentar seus dados de acesso se voc estiver criando um
Pedido de acesso, exibindo dados em formulrios e em relatrios da impresso podem ser tudo que voc precisa.
Ao longo dos anos, foi significativamente atualizados os relatrios e formulrios de acesso. No Access
2007, um longo-solicitado recurso chegou, finalmente, de forma vivel (lembro-me uma
precoce e confivel aplicao que fez uma breve apario no Access 95). Campos MEMO pode
agora armazenar e exibir texto rico, usando a propriedade Text Align, que assume um valor ou texto sem formatao
ou Rich Text. Quando voc selecionar Rich Text para essa propriedade, voc pode aplicar vrias fontes, cores, e
outros atributos de partes selecionadas do texto em um campo de tabela ou um controle vinculado ao campo.
Em verses anteriores do Office, se voc quiser gerar uma letra ou outro documento, incluindo um bloco
texto com cor, negrito ou outros atributos aplicados a selecionado palavras ou frases dentro do
bloco, voc tinha que criar uma carta de palavra e usar palavra da formatao de recursos. No Access 2007, voc
pode produzir relatrios de acesso com formatao variada dentro de blocos de texto, exibindo o texto entrado em
Campos de memorando de acesso em uma caixa de texto em um formulrio.
O banco de dados de amostra para esta seo RichText.accdb.
Para criar um campo que pode armazenar dados em formato Rich Text (nos bastidores, isso feito usando
Cdigo HTML, mas voc no precisa se preocupar sobre como escrever o cdigo), comece criando um campo de tabela de
o tipo de dados memorando e selecionar Rich Text como o valor do formato de texto (Ver Figura 1.1).
FIGURA 1.1
Criando um campo de memorando para armazenar dados de Rich Text.
NOTA NOTA
NOVO RECURSO NOVO RECURSO
5
Armazenar e exibir dados no Access
1
05_047026 ch01.qxp 02\/04\/07 21:41 pgina 5
Se voc selecionar um bloco de texto em um campo Memorando de Textenabled Rich, voc ver um flutuante
barra de ferramentas que permite que voc aplique alguma formatao, incluindo o recuo ou recuar para a esquerda, semelhante
a palavra (isso funciona bem; ver Figura 1.2). No entanto, se voc aplicar marcadores ou numerao a partir desta ferramenta -
bar, voc vai ter os marcadores ou nmeros, mas o texto que corre ao longo de uma linha no ser recuado prop-
Erly, conforme mostrado na Figura 1.3. Por esse motivo, eu recomendo contra o uso desses recursos, a menos que todos os
itens em suas listas so no mais de uma linha de comprimento.
FIGURA 1.2
Recuo de texto na barra de ferramentas flutuante em um campo de Rich Text.
FIGURA 1.3
Indentao incorreta de um item em uma lista numerada em um campo de Rich Text.
Criar um formulrio vinculado a tabela com o campo de memorando; voc pode agora entrar dados esta caixa de texto
controlar e format-lo com fontes diferentes, cores, negrito e outros atributos, como voc iria ao
em uma palavra documento de trabalho. Quando voc colocar o cursor em um controle com Rich Text habilitado, um
Grupo de formatao da faixa de opes do formulrio est habilitado, com uma variedade de selees de formatao, como mostrado
na Figura 1.4.
A Figura 1.5 mostra a forma com uma variedade de atributos de formatao aplicada ao texto na caixa de texto.
AVISO AVISO
6
Os componentes do Office e o que fazem melhor
Parte I
05_047026 ch01.qxp 02\/04\/07 21:41 pgina 6
FIGURA 1.4
Selecionar a formatao de uma poro de texto em um textbox Rich Textenabled em um formulrio.
FIGURA 1.5
Uma caixa de texto Rich Textenabled com uma variedade de formatao aplicada a partes do seu texto.
7
Armazenar e exibir dados no Access
1
05_047026 ch01.qxp 02\/04\/07 21:41 pgina 7
Depois de ter aplicado formatao ao texto em um formulrio, voc pode criar um relatrio baseado na tabela,
e a formatao ser exibido o relatrio tambm (veja figura 1.6).
FIGURA 1.6
Um relatrio mostrando Rich Text formatao aplicada em uma caixa de texto em um formulrio.
Criar cartas de formulrio de acesso
Um exemplo mais realista de Rich Text formatao seria um relatrio de letra de forma, com o corpo de
o texto da carta proveniente de um campo de Rich Textenabled e as informaes de nome e endereo do
uma tabela de contatos ou clientes. Eu criei uma tabela chamada tblLetterText no banco de dados exemplo, com
um campo de Rich Textenabled Memo para armazenar o texto de corpo da carta e um ID e um campo de texto LetterType.
O campo de LetterBody prende texto formatado, como mostrado na Figura 1.7 (a Rich Text formatao pode ser
visto diretamente na tabela, embora voc vai encontr-lo mais fcil de criar e editar o texto rico em um textbox
controle em um formulrio).
Voc pode copiar e colar texto formatado a partir de um documento do Word em um campo memorando com
Rich Text habilitado ou um textbox vinculados a esse campo, e a formatao ser pre-
servido. No entanto, marcadores e listas numeradas no ser alinhadas corretamente, ento melhor desligar aqueles
caractersticas antes de copiar o texto para acesso.
Tambm criei uma tabela de uma linha para manter informaes para utilizar o banco de dados; Neste caso, tem
dois campos de memorando de Textenabled Rich para as informaes de cabealho e a assinatura da carta. O formulrio
fdlgSelectLetter (vinculado tabela de informaes, zstblInfo) permite que voc edite o cabealho e assinatura
(Figura 1.8) e selecione um tipo de letra e de um contato.
DICA DICA
8
Os componentes do Office e o que fazem melhor
Parte I
05_047026 ch01.qxp 02\/04\/07 21:41 pgina 8
FIGURA 1.7
Uma tabela com texto de corpo de letra formatada.
FIGURA 1.8
Uma forma de dilogo para editar o cabealho e as informaes de assinatura de bloco e selecionar uma carta e contato.
9
Armazenar e exibir dados no Access
1
05_047026 ch01.qxp 02\/04\/07 21:41 pgina 9
Clicando no boto criar carta abre um relatrio de acesso filtrado exibindo dados nome e endereo
o registro de contato selecionado, e o corpo de letra do tipo de letra selecionada, conforme representado na
Figura 1.9.
Com Rich Text formatao agora oferece suporte acesso formulrios e relatrios, talvez voc no precise pro-
Duce uma letra da palavra para obter a aparncia que voc quer em documentos impressos. No entanto, em comparao com a palavra,
Relatrios de acesso usando campos Rich Textenabled Memo tem uma limitao significativa. No Word, voc
pode colocar campos de mesclagem ou DocProperty campos dentro de um bloco de texto, para que a fuso de dados ou dados
armazenados no documento propriedades sero impresso em um determinado ponto no texto, com o texto ao redor
acondicionamento, conforme necessrio, dependendo do comprimento do texto nos campos. Isso no possvel com um
Campo memorando em um relatrio do Access, ento se voc precisar inserir mesclar campos ou DocProperty campos dentro de
o texto de corpo da carta, voc ainda precisar criar documentos do Word.
Consulte o captulo 2 para obter informaes sobre como criar documentos do Word de vrios tipos, preenchidos com
Dados de acesso.
FIGURA 1.9
Um relatrio com texto formatado.
REFERNCIA CRUZADA REFERNCIA CRUZADA
10
Os componentes do Office e o que fazem melhor
Parte I
05_047026 ch01.qxp 02\/04\/07 21:41 pgina 10
Criando relatrios do tipo planilha no acesso
Se voc precisa para produzir um relatrio formatado em colunas e linhas da planilha-tipo familiar, voc pode
fazer isso com um relatrio do Access. Relatrios de acesso 2007 tem alguns novos recursos, permitindo que voc classificar e fil-
ter interativamente e se voc quer interatividade plena, voc pode criar um formulrio de tabela dinmica ou de grfico dinmico.
Para demonstrar estas caractersticas, eu usei uma variao do banco de dados de exemplo Northwind, com objetos
renomeado de acordo com a Conveno de nomenclatura Leszynski.
Relatrios de folha de dados simples
O banco de dados de amostra para esta seo modificado Northwind.accdb.
A consultaqryNorthwindAll links de todas as tabelas no banco de dados Northwind modificado. Para produzir
um relatrio de folha de dados simples, iniciar, selecionando qryNorthwindAll e selecionando Assistente de relatrio no
Grupo relatrios na guia criar da faixa de opes, como mostrado na Figura 1.10.
NOTA NOTA
11
Armazenar e exibir dados no Access
1
Usando uma Conveno de nomenclatura
EU
primeiro, percebi que um problema trabalhar em um banco de dados com nenhuma conveno de nomenclatura quando tomei
ao longo de um banco de dados criado por outro programador. O banco de dados tinha uma tabela, uma consulta, um formulrio, um
relatrio, uma funo e cinco ou seis variveis (de diferentes tipos de dados) chamaram vendas (isso foi apenas um
de um nmero de conjuntos de objetos com o mesmo nome). Isto significava que, quando eu encontrei a palavra
\"Vendas\" no cdigo VBA, eu no tinha idia se era uma referncia a uma tabela, formulrio, consulta, funo, ou
varivel, a menos que o contexto deixou claro. Houve inmeros erros devido utilizao do
mesmo nome para diferentes tipos de objetos, porque (entre outras possveis fontes de erros), voc pode
Defina o valor de um campo com uma varivel, ou com uma funo e se diversas variveis e uma funo
so todos chamados de vendas, o cdigo pode usar a pessoa errada.
Voc tambm pode obter erros de referncia circular, quando um controle tem o mesmo nome que o campo a que se
est vinculado que ainda o caso no Access 2007, quando voc cria um formulrio vinculado a uma tabela usando o
Assistente de formulrio. Para evitar esses erros de referncia, uma excelente ideia de usar uma Conveno de nomenclatura para
objetos de banco de dados, controles e variveis. Usar uma Conveno de nomenclatura tambm faz com que seu banco de dados auto-
documentao (em certa medida, pelo menos) e evita confuso ao selecionar um objeto de um
na lista suspensa.
Cerca de 10 anos atrs, eu escrevi um Access 97 suplemento (LNC Rename.mda) para automatizar o processo de giv-
ing as marcas apropriadas para objetos de banco de dados e controles em formulrios e relatrios, usando o Leszynski
Conveno de nomenclatura (LNC). Este suplemento foi atualizado para o Access 2000, e que a verso ainda trabalha em
Access 2007; est disponvel no cdigo de exemplo #10 (Access 2000 ou mais bancos de dados) do
Pgina de amostras de cdigo do meu site,
www.helenfeddema.com
.
05_047026 ch01.qxp 02\/04\/07 21:41 pgina 11
FIGURA 1.10
Selecionando o Assistente de relatrio para criar um relatrio.
Selecione os campos a serem includos no relatrio (Ver Figura 1.11) e clique em Avanar.
FIGURA 1.11
Seleo de campos para um relatrio.
12
Os componentes do Office e o que fazem melhor
Parte I
05_047026 ch01.qxp 02\/04\/07 21:41 pgina 12
Na tela seguinte do assistente (veja figura 1.12), selecione o agrupamento de nvel superior que voc deseja para o
relatrio (neste caso, eu aceito a seleo padro de OrderQuarter, cliente, OrderDate).
FIGURA 1.12
Selecionando um nvel de agrupamento principal para um relatrio.
A prxima tela permite que voc selecione subgrupos, se desejado; Eu aceito o padro (no mais sub-
Agrupamento, conforme mostrado na Figura 1.13).
FIGURA 1.13
Selecione nveis de subgrupo para um relatrio.
13
Armazenar e exibir dados no Access
1
05_047026 ch01.qxp 02\/04\/07 21:41 pgina 13
Em seguida, selecione Classificar e resumir as opes; Selecionei ProductName para classificao, conforme
Figura 1.14.
FIGURA 1.14
Selecionando as opes de classificao e resumindo para um relatrio.
Na tela de layout do relatrio, representada na Figura 1.15, selecionei a opo de bloquear.
FIGURA 1.15
Selecionando a opo de layout de relatrio do bloco.
14
Os componentes do Office e o que fazem melhor
Parte I
05_047026 ch01.qxp 02\/04\/07 21:41 Page 14
Selecione um estilo na prxima tela, mostrado na Figura 1.16 (tenha em mente que alguns dos mais artsticos
estilos no vai olhar boas quando impressa em uma impressora preto e branco). Eu selecionei None para um relatrio simples.
FIGURA 1.16
Selecionar um estilo de relatrio.
Nomeie o relatrio na tela do revestimento (Figura 1.17) chamei-lhe rptNorthwindSales. Selecione
o design do relatrio \"Modificar\" opo para abrir o relatrio no modo design e clique em concluir.
FIGURA 1.17
A tela de concluir o Assistente de relatrio.
15
Armazenar e exibir dados no Access
1
05_047026 ch01.qxp 02\/04\/07 21:41 pgina 15
Voc vai precisar fazer alguns ajustes ao design do relatrio na folha de propriedades; se
no abrir, clique no boto folha de propriedades no grupo ferramentas na guia Design do
a faixa de opes, como mostrado na Figura 1.18.
FIGURA 1.18
Abrir a folha de propriedades.
Por padro, no layout do relatrio de bloquear apenas as clulas com valores tm bordas visveis, ento, para criar um
layout geral do tipo planilha, selecionar todos os controles na seo de detalhe do relatrio e desligar
exibir valores de dados duplicados, definindo a propriedade de esconder duplica no na guia formato de
a folha de propriedades, como mostrado na Figura 1.19.
FIGURA 1.19
Definindo a propriedade de esconder duplica para no para eliminar dados duplicados em um relatrio.
Embora geralmente no um problema para controles de relatrio ter os mesmos nomes que seu limite
campos (porque eles so raramente, se sempre, referenciado no cdigo), eu gostaria de dar as marcas apropriadas para o
controles vinculados pelo menos. Para fazer isso manualmente, d as caixas de texto txt o prefixo. (Um relatrio criado
pelo Assistente de relatrio, rtulos so nomeados com o sufixo no padronizado _Label.)
DICA DICA
16
Os componentes do Office e o que fazem melhor
Parte I
05_047026 ch01.qxp 02\/04\/07 21:41 pgina 16
O Assistente de relatrio geralmente aplica-se o alinhamento padro para cada rtulo de coluna, que
pode resultar em alinhamento inconsistente. Que no parece bom, ento (se necessrio) ajustar o
alinhamento de ttulos de coluna rotula como desejado (geralmente eles devem ser tudo alinhado esquerda ou
tudo centrado); sobre o relatrio de exemplo fiz-lhes tudo centralizado.
Caso voc precise ajustar a largura de uma coluna individual, pode ser necessrio desativar o agrupamento de controle
(um recurso novo no Access 2007). Para fazer isso, primeiro selecione os controles na seo de detalhe
e clique na ncora do grupo amarelo que deve agora estar visvel (embora no muito visvel Microsoft
deve ter selecionado uma cor com mais contraste do que maante mostarda amarela) no canto superior esquerdo
do grupo, em seguida, boto direito do mouse qualquer controle no grupo e selecione Remover no submenu Layout
(veja figura 1.20).
FIGURA 1.20
Desligar o agrupamento de controle.
A Figura 1.21 mostra o relatrio de planilha-tipo de concluso.
Interativamente, voc pode classificar e filtrar um relatrio no modo de exibio de relatrio por exemplo, quando voc deseja exibir
registros de apenas um cliente, como mostrado na Figura 1.22.
NOVO RECURSO NOVO RECURSO
17
Armazenar e exibir dados no Access
1
05_047026 ch01.qxp 02\/04\/07 21:41 Page 17
FIGURA 1.21
Um relatrio de acesso do tipo de planilha.
FIGURA 1.22
A filtragem de um relatrio por um valor selecionado na rea de cliente.
18
Os componentes do Office e o que fazem melhor
Parte I
05_047026 ch01.qxp 02\/04\/07 21:41 pgina 18
Depois de fazer a seleo, o relatrio mostra apenas Gourmet Lanchonetes registros (Figura 1.23).
FIGURA 1.23
Um relatrio filtrado por um valor para o cliente.
Tabelas dinmicas
Se voc precisar de mais avanada de interatividade, voc pode fazer uma tabela dinmica com base na mesma
qryNorthwindAll consulta. No Access 2007, o processo de criao de uma tabela dinmica tem sido implicao-
cados; apenas selecione a tabela ou consulta de fonte de dados, selecione, conforme representado na Figura 1.24, tabela dinmica
no menu mais formas do grupo na guia criar formulrios da faixa de opes.
19
Armazenar e exibir dados no Access
1
05_047026 ch01.qxp 02\/04\/07 21:41 pgina 19
FIGURA 1.24
Criando uma tabela dinmica.
Um novo formulrio baseado na fonte de dados abre-se na dinmica exibir (Ver Figura 1.25), com o campo
Lista aberta, assim que voc pode arrastar os campos para as zonas de gota da tabela dinmica, um campo de cada um para a linha
Campos, campos de coluna e (opcionalmente) campos de filtro soltar zonas, que so indicadas em texto cinza no
o canto superior esquerdo do formulrio. O campo de dados a ser exibido no corpo da tabela arrastado
para a zona de gota no centro do formulrio; Acesso automaticamente criar um campo de contagem ou soma
se for caso disso.
Consulte o captulo 5 do meu livro, especialista-em-um desenvolvimento de aplicativos Microsoft, para
obter mais informaes sobre como criar e usar tabelas dinmicas e grficos dinmicos.
Figura 1.26 mostra a tabela dinmica com vendedor selecionado como o campo de linha e NomeDaCategoria como
o campo de coluna, com o preo que o campo totais.
REFERNCIA CRUZADA REFERNCIA CRUZADA
20
Os componentes do Office e o que fazem melhor
Parte I
05_047026 ch01.qxp 02\/04\/07 21:41 pgina 20
FIGURA 1.25
Uma dinmica recm-criado, pronta para selecionar os campos.
FIGURA 1.26
Uma tabela dinmica concluda.
21
Armazenar e exibir dados no Access
1
05_047026 ch01.qxp 02\/04\/07 21:41 pgina 21
Grficos dinmicos
Fazer um grfico dinmico ainda mais fcil: selecione a tabela ou consulta de fonte de dados e clique em grfico dinmico
boto no grupo na guia criar formulrios da faixa de opes. Figura 1.27 mostra o novo, em branco
Grfico dinmico com zonas de gota na parte superior e lado direito do formulrio.
FIGURA 1.27
Um grfico dinmico novo e em branco.
Como com uma tabela dinmica, voc simplesmente arrasta campos da lista de campos para as zonas de gota apropriado.
Eu arrastei o campo OrderQuarter para a categoria soltar do campo, o campo de fornecedor para a srie
zona de rebaixamento, o CategoryName a zona para soltar filtro e o campo de preo para a zona de queda de dados,
e eu selecionei a categoria de produtos lcteos para filtrar os dados. Figura 1.28 mostra o grfico dinmico
Neste ponto.
22
Os componentes do Office e o que fazem melhor
Parte I
05_047026 ch01.qxp 02\/04\/07 21:41 Page 22
FIGURA 1.28
O grfico dinmico com campos atribudo s suas zonas de gota.
O prximo passo dar nomes aos eixos de vertical e horizontal do grfico. Para citar os eixos, selecione um
Rtulo do ttulo de eixo, abra a folha de propriedades e selecione o guia formato; Digite o nome que voc quer para dis-
joga de eixo na propriedade legenda, como mostrado na Figura 1.29. Repita para o outro rtulo de eixo.
FIGURA 1.29
Nomeando o eixo vertical de um grfico dinmico.
23
Armazenar e exibir dados no Access
1
05_047026 ch01.qxp 02\/04\/07 21:41 Page 23
Para fazer a legenda do grfico visvel (geralmente uma boa idia), clique no boto de legenda no
Mostrar\/ocultar grupo do guia de Design da faixa de opes, como mostrado na Figura 1.30.
FIGURA 1.30
Legenda do grfico dinmico tornando visvel.
O grfico de piv terminou mostrado na Figura 1.31.
FIGURA 1.31
Um grfico dinmico preenchido.
Acesso 2007 informa ter alguma interatividade e tabelas dinmicas e grficos dinmicos tm quase unlim-
ITED interatividade, mas ambos tm uma limitao sria: a interatividade s est disponvel quando voc est
trabalhando no banco de dados Access; Quando voc envia um relatrio de acesso, tabela dinmica ou grfico dinmico para
algum que no tem acesso, dizer como um arquivo PDF, o destinatrio recebe uma imagem somente leitura do
relatrio, tabela dinmica ou grfico dinmico, com nenhuma interatividade. Este pode ser o que voc quer em alguns casos;
mas se voc precisa entregar dados em um formato grfico ou planilha que os usurios podem interagir com voc
necessidade de criar um grfico ou planilha do Excel a partir de seus dados de acesso, ao invs de um relatrio de tabela dinmica,
ou de grfico dinmico.
24
Os componentes do Office e o que fazem melhor
Parte I
05_047026 ch01.qxp 02\/04\/07 21:41 pgina 24
Consulte o captulo 3 para obter informaes sobre a criao de planilhas Excel e grficos cheios
Repleta de dados de acesso e o captulo 12 para obter informaes sobre como criar grficos dinmicos do Excel
Dados de acesso.
Resumo
Neste captulo voc aprendeu sobre algumas novidades do Access 2007, especialmente aquelas relacionadas
a produo de relatrios de acesso para exibir dados armazenados em tabelas do Access. Mas s vezes voc precisa dis-
jogar seus dados em documentos do Word ou planilhas do Excel, em vez de relatrios de acesso; ou voc pode
precisa criar compromissos, tarefas, contatos ou mensagens de email, usando o acesso como um controle de Outlook
Centro para trabalhar com documentos do Office.
Quando voc precisa para produzir documentos do Word, planilhas do Excel ou itens do Outlook, ou para fazer
Use as caractersticas especiais desses componentes do Office ou para distribuir seus dados em formatos que pode
ser usado por quem tem o Office, voc tem duas opes: usar as built-in selees de exportao em
faixa de opes, ou escrever um cdigo VBA para criar os documentos do Office e ench-los com dados de acesso. O
prximos trs captulos descrevem como criar documentos do Word, planilhas do Excel ou grficos, e
Itens do Outlook e ench-los com dados de acesso.
REFERNCIA CRUZADA REFERNCIA CRUZADA
25
Armazenar e exibir dados no Access
1
05_047026 ch01.qxp 02\/04\/07 21:41 Page 25
05_047026 ch01.qxp 02\/04\/07 21:41 Page 26
EU
f que voc precisa produzir documentos com formatao mais sofisticados
do que est disponvel em um relatrio do Access, sua melhor opo criar palavra
documentos e ench-los com dados de acesso. Existem muitas maneiras de
exportar dados do Access para o Word; depende de qual deles usar circum-
posies, o tipo de dados para exportao e as preferncias do usurio. Este captulo dis-
cusses os vrios tipos de documentos do Word que voc pode criar e os mtodos
voc pode usar para preench-las com dados, com exemplos bsicos.
Para exemplos mais complexos e realistas de exportao
Acessar dados em documentos do Word, consulte os captulos 6 e 12.
O banco de dados de amostra para este captulo o acesso a
Word.accdb.
Documentos do Word enchimento com
Acessar dados usando o TypeText
Mtodo
Voc pode criar um documento do Word em branco (baseado no padro Word tem
placa) com duas linhas de cdigo:
Set appWord = GetObject (, \"Word. Application\")
Conjunto doc = appWord.Documents.Add
NOTA NOTA
REFERNCIA CRUZADA REFERNCIA CRUZADA
27
NESTE CAPTULO
Modelos e documentos do Word
Trabalhando com marcadores de palavra
Trabalhando com o TypeText
mtodo
Trabalhando com documentos do Word
Propriedades
Trabalhando com campos de formulrio
Trabalhando com tabelas
Criao de documentos do Word
de acesso
06_047026 ch02.qxp 02\/04\/07 21:41 Page 27
Na maior parte da minha automao de cdigo trabalhando com outros aplicativos do Office (Word, Excel,
e Outlook), eu uso o
GetObject
funo no corpo de um procedimento, para definir uma refer-
ENCE a instncia em execuo do pedido, se houver; manipulador de erro do procedimento executado
CreateObject
se o aplicativo no estiver em execuo (consulte os exemplos de cdigo no final deste captulo
para obter exemplos). Isso impede que a criao de vrias instncias do Word, Excel ou Outlook.
Se voc no precisa de qualquer fantasia formatao, apenas um documento de texto sem formatao, voc pode preencher um em branco palavra docu-
mento com texto usando o TypeText mtodo. O FillWithTypeText procedimento listado em seguida
Cria um documento em branco do Word, ento entra um ttulo do documento, l o texto de campos em um
Tabela do Access e grava-lo diretamente para o documento do Word e finalmente aplica algum formato simples -
Ting, usando comandos do Word:
Private Sub FillWithTypeText)
No erro GoTo ErrorHandler
Dim appWord como Word. Application
Dim doc como Word.Document
Dim dbs como DAO.Banco de dados
Dim rst como DAO.Conjunto de registros
Set appWord = GetObject (, \"Word. Application\")
Conjunto doc = appWord.Documents.Add
Inserir e formatar ttulo do documento:
Com appWord.Selection
._ TypeText \"corrente contatos a partir de\"
& Format(Date, Long Date)
.TypeParagraph
.Unidade de MoveLeft: = wdWord, Count: = 11, _
Estender: = wdExtend
.Font = 14
.Bold = wdToggle
.MoveDown unidade: = wdLine, Count: = 1
Terminar com
Inserir uma tabela de duas colunas para armazenar dados de contato (uma coluna para nomes de contato, o outro usurio
Comentrios):
doc.Tables.Add Range:=Selection.Range _
NumRows: = 1, _
NumColumns: = 2, _
DefaultTableBehavior: = wdWord9TableBehavior, _
AutoFitBehavior: = wdAutoFitFixed
Com appWord.Selection.Tables(1)
Se for.Estilo <>\"Grade de mesa\", em seguida
.Style = \"Table Grid\"
End If
NOTA NOTA
28
Os componentes do Office e o que fazem melhor
Parte I
06_047026 ch02.qxp 02\/04\/07 21:41 Page 28
.ApplyStyleHeadingRows = True
.ApplyStyleLastRow = False
.ApplyStyleFirstColumn = True
.ApplyStyleLastColumn = False
.ApplyStyleRowBands = True
.ApplyStyleColumnBands = False
Terminar com
Inserir dados de contato da tabela do Access tabela do Word:
Conjunto dbs = CurrentDb
Set rst = dbs.OpenRecordset(\"tblContacts\")
Fazer enquanto no rst.EOF
Com appWord.Selection
.TypeText rst![Sobrenome]
.MoveRight unidade: = wdCell, Count: = 2
Terminar com
RST.MoveNext
Loop
Exclua a linha em branco, ltima:
appWord.Selection.Rows.Delete
Classificao entre em contato com nomes em ordem alfabtica:
doc.Tables(1).Selecione
appWord.Selection.Sort ExcludeHeader: = False, _
FieldNumber: = \"coluna 1\", _
SortFieldType: = wdSortFieldAlphanumeric, _
SortOrder: = wdSortOrderAscending
ErrorHandlerExit:
Set appWord = Nothing
Exit Sub
ErrorHandler:
Se errar = 429 ento
Palavra no est em execuo; Abra o Word com CreateObject :
Set appWord = CreateObject(\"Word.Application\")
Retomar em seguida
Outra coisa
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End If
End Sub
29
Criando documentos de palavra de acesso
2
06_047026 ch02.qxp 02\/04\/07 21:41, na pgina 29
Se voc no conhece a sintaxe do VBA para uma operao, voc pode gravar uma macro do Word para
criar um procedimento que contm o cdigo, embora voc pode ter que cortar fora o excesso
macros gravadas geralmente definir cada argumento nico de um mtodo, ou no so necessrios.
O documento da lista de contatos acabado mostrado na Figura 2.1.
FIGURA 2.1
Um documento do Word preenchido com dados de acesso, usando o mtodo TypeText.
Utilizando modelos do Word para a criao de
Documentos do Word formatado
O TypeText mtodo usado na seo anterior s adequado para a criao de palavra muito simples
documentos. Se voc precisa para produzir documentos de Word totalmente formatados, com cabealhos, rodaps, e
sees com margens diferentes, ou se voc precisa colocar acessar dados em vrios pontos dentro de blocos
do texto, melhor preparar um ou mais modelos de Word com antecedncia, format-los conforme necessrio.
Em seguida, voc pode criar novos documentos a partir de modelos e ench-los com dados de acesso, conforme necessrio,
usando marcadores ou (meu mtodo preferido) Propriedades de documento do Word.
O primeiro passo criar os modelos do Word, com cabealhos, rodaps, logotipo e fontes diferentes, como
necessrios. Dependendo do mtodo que voc deseja usar, quer colocar marcadores no modelo onde
voc deseja que os dados de acesso para aparecer ou criar propriedades do documento para aceitar os dados de acesso, e
Coloque DocProperty campos no modelo onde deseja que os dados de acesso para aparecer.
DICA DICA
30
Os componentes do Office e o que fazem melhor
Parte I
06_047026 ch02.qxp 02\/04\/07 21:41 pgina 30
Marcadores
Como um exemplo do uso de marcadores em um modelo do Word, eu criei um modelo projetado para imprimir em uma
determinado tipo de papel (papel Milano direto), com um cabealho e rodap, fontes diversas e dois seg-
es, o primeiro para a letra em si e o segundo para uma correspondncia COM 10 envelope. Coloquei vrios
marcadores na parte da letra do modelo, onde a carta data, nome e endereo e Santos -
tao deve imprimir, e campos de referncia cruzada no envelope da parcela, para imprimir o nome e
Endereo l, bem como um cdigo de barras PostNet ZIP.
Este captulo usa o novo formato de modelo. dotx Word 2007, que cria um documento
o tipo. docx. Documentos neste formato novo da palavra s podem ser usados por gerncia de pessoas-
Ning Office 2007, ento se voc precisa distribuir documentos do Word para pessoas executando verses mais antigas do
Exerccio, melhor usar o formato de modelo. dot e criar documentos. doc, que pode ser usada em
Office 97 at 2007.
AVISO AVISO
31
Criando documentos de palavra de acesso
2
Trabalhando com campos de informaes de usurio do Word
Y
ou pode colocar a palavra UserName e UserAddress campos no cabealho do documento para imprimir seu
nome e endereo. Se voc j usou esses campos em verses anteriores do Word, voc pode ter dife-
ficulty, localizando-os na nova interface do Word 2007, especialmente porque a Microsoft optou por
coloc-los em lugares diferentes (no Word 2003, eles foram todas convenientemente localizados no usurio
Guia de informaes da caixa de dilogo Opes). No Word 2007, o nome de usurio inserido no nome do usurio
campo na pgina Personalizar da caixa de dilogo Opes do Word, que aberto a partir das opes do Word
boto no menu arquivo.
Inserir o nome de usurio na caixa de dilogo Opes do Word.
continuou
06_047026 ch02.qxp 02\/04\/07 21:41 Page 31
32
Os componentes do Office e o que fazem melhor
Parte I
continuou
Curiosamente, as informaes de endereo do usurio so inseridas em um local diferente, como \"Endereo\" no
inferior da pgina avanada da caixa de dilogo Opes do Word.
Digitando o endereo (endereo de usurio) na caixa de dilogo Opes do Word.
Para colocar um campo com o nome de usurio ou endereo de usurio em um modelo, selecione o campo das partes rpidas
lista do grupo de texto do menu Inserir.
Inserir um campo em um modelo.
06_047026 ch02.qxp 02\/04\/07 21:41 Page 32
33
Criando documentos de palavra de acesso
2
Isso abre o dilogo de campo (semelhante ao que no Word 2003), onde voc pode selecionar o nome de usurio
ou o campo de endereo do usurio para insero.
Inserir o campo de UserAddress em um modelo.
A figura a seguir mostra as informaes de nome e endereo do usurio em um modelo de cabealho.
Um modelo de cabealho com informaes de nome e endereo do usurio de campos de informaes de usurio do Word.
06_047026 ch02.qxp 02\/04\/07 21:41 Page 33
Para inserir um marcador em um documento ou modelo, selecione o marcador do grupo Links sobre a
Inserir Tabulao, como na Figura 2.2.
aconselhvel desmarcar a caixa de seleo \"Preservar formatao durante as atualizaes\" quando
inserindo campos, caso contrrio voc pode obter diferentes fontes ou tamanhos para o texto exibido no
os campos.
FIGURA 2.2
Abrindo a caixa de dilogo Bookmark.
Digite o nome do marcador na caixa de dilogo marcador e clique em Adicionar (Figura 2.3).
FIGURA 2.3
Criar um indicador.
Por padro, voc no ver os marcadores em forma de i que indicam favoritos em uma palavra docu-
mento; para v-los, marque a caixa \"Mostrar marcadores\" na pgina avanada da
Dilogo de opes do Word, como ilustrado na Figura 2.4.
NOTA NOTA
AVISO AVISO
34
Os componentes do Office e o que fazem melhor
Parte I
he
06_047026 ch02.qxp 02\/04\/07 21:41 Page 34
FIGURA 2.4
Ligar o indicador exibir na caixa de dilogo Opes do Word.
A Figura 2.5 mostra a segunda pgina (envelope) do modelo palavra Milano, com informaes do usurio
campos, bookmarks e um campo de cdigo de barras (para ver esses campos, pressione Alt + F9).
FIGURA 2.5
Campos e marcadores em um modelo do Word.
35
Criando documentos de palavra de acesso
2
06_047026 ch02.qxp 02\/04\/07 21:41 Page 35
No cdigo de dados de amostra do captulo, o pressuposto que os modelos do Word
esto localizados na pasta padro, que c: \/ usurios\/nome\/AppData\/Roaming \/
Modelos\/Microsoft Windows Vista ou c: \/ documentos e configuraes do usurio\/nome\/aplicao
Dados \/ \/ modelos de Microsoft para Windows XP. Para um mtodo mais flexvel da criao de modelos
pasta, consulte o captulo 6.
O formulrio frmContacts no exemplo de acesso ao banco de dados do Word exibe contatos localizados na
ESTADOS UNIDOS DA AMRICA A forma, mostrada na Figura 2.6, tem trs botes, cada um deles cria uma carta para o
contato selecionado usando um mtodo diferente.
FIGURA 2.6
O formulrio de contatos com botes para criar letras da palavra.
O cdigo para criar um documento usando marcadores listado como segue:
Private Sub cmdBookmarks_Click()
No erro GoTo ErrorHandler
Dim appWord como Word. Application
Dim doc como Word.Document
Dim dbs como DAO.Banco de dados
Dim rst como DAO.Conjunto de registros
Dim strTemplatePath As String
Dim strTemplateName As String
Dim strTemplateNameAndPath As String
Dim lngContactID como longo
Dim strRecipientName As String
Dim strRecipientAddress As String
REFERNCIA CRUZADA REFERNCIA CRUZADA
36
Os componentes do Office e o que fazem melhor
Parte I
06_047026 ch02.qxp 02\/04\/07 21:41 Page 36
Dim strRecipientZip As String
Dim strPrompt As String
Dim strTitle As String
Dim strSalutation As String
Dim fso como scripting. FileSystemObject novo
Dim fil como Scripting.File
lngContactID = Nz (Me! [ContactID])
Se lngContactID = 0 Then
strPrompt = \"Contato selecionado\"
strTitle = \"Problema\"
MsgBox strPrompt, vbOKOnly + vbExclamation, strTitle
GoTo ErrorHandlerExit
Outra coisa
strRecipientName = Nz (Me! [FirstNameFirst])
strRecipientAddress = Nz (Me! [RecipientAddress])
strSalutation = Nz (Me! [FirstName])
strRecipientZip = Nz (Me! [CEP])
End If
Set appWord = GetObject (, \"Word. Application\")
Obter o caminho do modelo de usurio padro na caixa de dilogo Opes do Word (ele ainda est disponvel no cdigo,
Embora ele tenha desaparecido da interface do Word 2007):
strTemplatePath = _
appWord.Options.DefaultFilePath(wdUserTemplatesPath) _
& \
Debug. Print \"pasta modelos:\"
strTemplateName = \"Carta de Milano (Bookmarks). dotx\"
strTemplateNameAndPath = strTemplatePath
Em erro continuar prximo
Tente localizar o modelo na pasta de modelos padro e colocar uma mensagem se no for encontrado:
Conjunto fil = fso.GetFile(strTemplateNameAndPath)
Se o fil nada ento
strPrompt = \"No pode encontrar\"
& in & strTemplatePath & ; canceling
MsgBox strPrompt, vbCritical + vbOKOnly
GoTo ErrorHandlerExit
End If
No erro GoTo ErrorHandler
Conjunto doc = appWord.Documents.Add(strTemplateNameAndPath)
37
Criando documentos de palavra de acesso
2
06_047026 ch02.qxp 02\/04\/07 21:41 Page 37
Gravar informaes de marcadores do Word no documento:
Com appWord.Selection
.Goto que: = wdGoToBookmark, nome: = \"LetterDate\"
.TypeText Text: = Format (data, \"Longa data\")
.Goto que: = wdGoToBookmark, nome: = \"RecipientName\"
.TypeText Text: = strRecipientName
.Goto que: = wdGoToBookmark, nome: = \"RecipientAddress\"
.TypeText Text: = strRecipientAddress
.Goto que: = wdGoToBookmark, nome: = \"RecipientZip\"
.TypeText Text: = strRecipientZip
.Goto que: = wdGoToBookmark, nome: = \"Saudao\"
.TypeText Text: = strSalutation
.Goto que: = wdGoToBookmark, nome: = \"EnvelopeName\"
.TypeText Text: = strRecipientName
.Goto que: = wdGoToBookmark, nome: = \"EnvelopeAddress\"
.TypeText Text: = strRecipientAddress
.Goto que: = wdGoToBookmark, nome: = \"EnvelopeZip\"
.TypeText Text: = strRecipientZip
Reinsira o indicador de EnvelopeZip para que o CEP estar disponvel para uso pelo campo de cdigo de barras
no envelope:
.Unidade de MoveLeft: = wdWord, Count: = 3, estender: = wdExtend
doc.Bookmarks.Add Range:=Selection.Range _
Nome: = \"EnvelopeZip\"
.Goto que: = wdGoToBookmark, nome: = \"LetterText\"
strPrompt = \"Pronto para digitar o texto da carta\"
strTitle = \"Acessar dados importados\"
MsgBox strPrompt, vbOKOnly, strTitle
appWord.Visible = True
appWord.Activate
Terminar com
ErrorHandlerExit:
Set appWord = Nothing
Exit Sub
ErrorHandler:
Se errar = 429 ento
38
Os componentes do Office e o que fazem melhor
Parte I
06_047026 ch02.qxp 02\/04\/07 21:41 Page 38
Palavra no est em execuo; Abra o Word com CreateObject :
Set appWord = CreateObject(\"Word.Application\")
Retomar em seguida
Outra coisa
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End If
End Sub
Propriedades do documento
Quando voc usa propriedades de documento do Word, ao invs de marcadores de dados de acesso de gravao para uma palavra
documento, voc no precisa ter duas (ou mais) conjuntos de fichas, uma para cada lugar que voc quer
para exibir uma folha de dados (por exemplo, exibindo o nome e o endereo do destinatrio na carta
e o envelope). Voc pode gravar os dados para uma propriedade de documento uma vez e exibi-lo em vrios
lugares no documento do Word com DocProperty campos.
Para criar as propriedades, primeiro selecione o acabamento no menu arquivo no modelo e selecione Propriedades,
como mostrado na Figura 2.7.
FIGURA 2.7
Abrir o painel de informaes do documento.
39
Criando documentos de palavra de acesso
2
06_047026 ch02.qxp 02\/04\/07 21:41 Page 39
Isso abre o painel de informaes do documento, com alguns dos mais comuns documento prprio-
laos exibida (Ver Figura 2.8).
FIGURA 2.8
O painel de informaes do documento.
Para obter a folha de propriedades, selecione avanado de propriedades de lista suspensa na parte superior da
painel; Isso abre a folha de propriedades, que parece o mesmo como no Word 2003. Clique o
Guia personalizada (Figura 2.9) para comear a criar propriedades do documento.
FIGURA 2.9
A pgina personalizada da folha Propriedades do Word.
Para criar uma propriedade de documento, digite seu nome (sem espaos), selecione o tipo, digite um valor (um espao
far para uma propriedade de texto) e, em seguida, clique em Adicionar. A Figura 2.10 mostra as propriedades de doc para o
Modelo de carta de Milano (adereos de Doc).
40
Os componentes do Office e o que fazem melhor
Parte I
06_047026 ch02.qxp 02\/04\/07 21:42 Page 40
FIGURA 2.10
As propriedades de Doc para o modelo de carta de Milano (adereos de Doc).
Em seguida, coloque DocProperty campos no modelo onde voc deseja que os valores nas propriedades para doc
exiba.
Um indicador ainda necessria, mesmo se voc estiver usando propriedades de doc para exibir dados de
Acesso: O campo de cdigo de barras deve fazer referncia a um indicador a fim de criar o PostNet
cdigo de barras. Portanto, depois de colocar um campo DocProperty para o zip para o modelo, selecione o campo
e criar um indicador para ele.
Para inserir um campo DocProperty, selecione QuickParts do grupo na guia Inserir do texto a
Da faixa de opes, selecione DocProperty como o tipo de campo e, em seguida, selecione a propriedade do doc da propriedade
lista (veja a Figura 2.11).
No d seus Propriedades doc os mesmos nomes que quaisquer propriedades internas, embora
Palavra permite-lhe fazer isso, porque isso vai dificultar selecionar a propriedade correta
na lista de propriedades, que inclui ambas as propriedades doc internos e personalizados.
Figura 2.12 mostra a primeira pgina do modelo, com DocProperty campos exibidos e um livro-
marca para indicar o local onde o texto da carta deve ser digitada.
DICA DICA
NOTA NOTA
41
Criando documentos de palavra de acesso
2
06_047026 ch02.qxp 02\/04\/07 21:42 Page 41
FIGURA 2.11
Inserir um campo DocProperty.
FIGURA 2.12
A primeira pgina do modelo de carta de Milano (DocProps), com informaes do usurio e DocProperty campos.
42
Os componentes do Office e o que fazem melhor
Parte I
06_047026 ch02.qxp 02\/04\/07 21:42 Page 42
O cdigo que cria um documento com texto escrito Propriedades doc est listado como segue:
Private Sub cmdDocProps_Click()
No erro GoTo ErrorHandler
Dim appWord como Word. Application
Dim doc como Word.Document
Dim dbs como DAO.Banco de dados
Dim rst como DAO.Conjunto de registros
Dim strTemplatePath As String
Dim strTemplateName As String
Dim strTemplateNameAndPath As String
Dim lngContactID como longo
Dim strRecipientName As String
Dim strRecipientAddress As String
Dim strRecipientZip As String
Dim strPrompt As String
Dim strTitle As String
Dim strSalutation As String
Dim fso como scripting. FileSystemObject novo
Dim fil como Scripting.File
Dim prps como objeto
lngContactID = Nz (Me! [ContactID])
Se lngContactID = 0 Then
strPrompt = \"Contato selecionado\"
strTitle = \"Problema\"
MsgBox strPrompt, vbOKOnly + vbExclamation, strTitle
GoTo ErrorHandlerExit
Outra coisa
strRecipientName = Nz (Me! [FirstNameFirst])
strRecipientAddress = Nz (Me! [RecipientAddress])
strSalutation = Nz (Me! [FirstName])
strRecipientZip = Nz (Me! [CEP])
End If
Set appWord = GetObject (, \"Word. Application\")
Obter o caminho de modelos do usurio padro na caixa de dilogo Opes do Word:
strTemplatePath = _
appWord.Options.DefaultFilePath(wdUserTemplatesPath) _
& \
Debug. Print \"pasta modelos:\"
strTemplateName = \"Carta de Milano (Doc adereos). dotx\"
strTemplateNameAndPath = strTemplatePath
Em erro continuar prximo
43
Criando documentos de palavra de acesso
2
06_047026 ch02.qxp 02\/04\/07 21:42 Page 43
Tente localizar o modelo na pasta de modelos padro e colocar uma mensagem se no for encontrado:
Conjunto fil = fso.GetFile(strTemplateNameAndPath)
Se o fil nada ento
strPrompt = \"No pode encontrar\"
& in & strTemplatePath & ; canceling
MsgBox strPrompt, vbCritical + vbOKOnly
GoTo ErrorHandlerExit
End If
No erro GoTo ErrorHandler
Conjunto doc = appWord.Documents.Add(strTemplateNameAndPath)
Gravar informaes de propriedades de doc do Word:
Conjunto prps = doc.CustomDocumentProperties
PRPs.Item(\"LetterDate\").Valor = Format (data, \"Longa data\")
PRPs.Item(\"RecipientName\").Valor = strRecipientName
PRPs.Item(\"RecipientAddress\").Valor = strRecipientAddress
PRPs.Item(\"RecipientZip\").Valor = strRecipientZip
PRPs.Item(\"Salutation\").Valor = strSalutation
Atualize os campos:
Com appWord
.Selection.WholeStory
.Selection.Fields.Update
.Unidade Selection.HomeKey: = wdStory
Terminar com
appWord.Selection.Goto o que: = wdGoToBookmark, _
Nome: = \"LetterText\"
strPrompt = \"Pronto para digitar o texto da carta\"
strTitle = \"Acessar dados importados\"
MsgBox strPrompt, vbOKOnly, strTitle
appWord.Visible = True
appWord.Activate
ErrorHandlerExit:
Set appWord = Nothing
Exit Sub
ErrorHandler:
Se errar = 429 ento
Palavra no est em execuo; Abra o Word com CreateObject :
Set appWord = CreateObject(\"Word.Application\")
Retomar em seguida
44
Os componentes do Office e o que fazem melhor
Parte I
06_047026 ch02.qxp 02\/04\/07 21:42 Page 44
Outra coisa
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End If
End Sub
Documentos do campo de formulrio
s vezes voc precisa criar documentos que exibem alguns dados de acesso e tambm permitir que os usurios
para inserir mais dados de forma controlada. Isso pode ser feito usando marcadores ou doc prop -
erties para exibir os dados de acesso e controles de contedo do Word (campos de formulrio chamado nas verses anteriores do
Palavra) para os dados inserido pelo usurio.
O terceiro boto no frmContacts cria uma carta repleta de dados do Access, usando propriedades de doc;
Alm disso, o modelo tem dois campos de formulrio, a ser preenchido pelo usurio ao criar o docu-
mento. Naturalmente, os usurios podem apenas digitar texto em um documento, mas campos de formulrio permitem que o desenvolvedor
limitar as informaes para uma seleo de valores apropriados, talvez em uma seo do documento protegido
que no permite a entrada de forma livre.
Para inserir um controle de contedo em um modelo, selecione o tipo de controle do grupo controles sobre a
Guia do desenvolvedor da faixa de opes, como mostrado na Figura 2.13.
FIGURA 2.13
Inserir um controle de contedo do tipo dropdown.
Se voc no vir a guia desenvolvedor, lig-lo, verificando o \"Mostrar guia Desenvolvedor na
Fita\"a caixa de seleo na pgina Personalizar da caixa de dilogo Opes do Word (Figura 2.14).
Para adicionar as opes de uma lista de caixa pendente ou de combinao, alternar para modo Design clicando o
Projetar o boto no grupo controles, selecione o controle e, em seguida, selecione Propriedades da
Grupo controles na guia desenvolvedor, conforme representado na Figura 2.15.
DICA DICA
45
Criando documentos de palavra de acesso
2
06_047026 ch02.qxp 02\/04\/07 21:42 Page 45
FIGURA 2.14
Ligar-se a guia Desenvolvedor na faixa de opes do Word.
FIGURA 2.15
Folha de propriedades de um controle de abertura.
46
Os componentes do Office e o que fazem melhor
Parte I
06_047026 ch02.qxp 02\/04\/07 21:42 Page 46
Adicionar as opes de lista drop-down nas propriedades da folha (Ver Figura 2.16). Para adicionar uma escolha,
Clique no boto Adicionar, digite o nome para exibio e valor e clique em OK; Repita para cada seleo voc
deseja adicionar lista.
FIGURA 2.16
Adicionando opes para um controle de contedo de lista drop-down.
No marque a caixa de seleo \"O contedo no pode ser editado\"; se o fizer, as selees no podem ser
feita a partir da lista drop-down.
Quando um novo documento criado a partir de um modelo com controles de contedo, quando voc passar o
Passe o mouse sobre um controle de contedo, o ttulo aparece sobre o controle, e voc pode clicar no menu suspenso
seta para abrir a lista e selecionar um item (Figura 2.17).
DICA DICA
47
Criando documentos de palavra de acesso
2
06_047026 ch02.qxp 02\/04\/07 21:42 Page 47
FIGURA 2.17
Selecionar um item de um controle de contedo de lista suspensa.
Resumo
Este captulo cobriu trs mtodos que voc pode usar para acesso de gravao de dados em documentos do Word
(Propriedades TypeText, marcadores e doc). Com o auxlio destas tcnicas e um conjunto de prefor-
emaranhado de modelos do Word, voc pode fazer usar o armazenamento de dados superior e editando recursos do
Acesso e o superior documento Propriedades de formatao do Word.
48
Os componentes do Office e o que fazem melhor
Parte I
06_047026 ch02.qxp 02\/04\/07 21:42 Page 48
Y
ou pode imprimir acessar dados diretamente, usando relatrios de acesso, conforme descrito no
Captulo 1 ou voc pode apresentar os dados interativamente em tabelas dinmicas ou
Grficos dinmicos. Mas, como mencionado no captulo 1, estas opes tm alguns
limitaes, porque voc s pode trabalhar interativamente com tabelas dinmicas e
Grficos dinmicos dentro de um banco de dados do Access. Se voc (ou outros) querem poder
para manipular e analisar os dados de acesso, sem a necessidade de ter acesso
instalado, planilhas do Excel so uma excelente escolha.
Ao invs de elaborao dos relatrios de acesso, tabelas dinmicas ou grficos dinmicos (ou em
Alm deles), voc pode exportar dados para Excel e permite aos usurios analisar
os dados com as ferramentas do Excel. Esta opo est disponvel para todos que tem
Office instalado, pois as edies as mais bsicas do Office incluem Excel,
Considerando que o acesso s includo em algumas edies (mais caros).
Voc pode exportar os dados do Access para uma planilha no formatada e deixe-o
os usurios trabalham com ele como eles querem (isto funciona bem, se eles s precisam de dados e
no exigem formatao fantasia), ou voc pode criar modelos de Excel e exportar
os dados para uma nova planilha, feita a partir de um modelo; Esta tcnica permite
voc para fazer alguma da formatao com antecedncia.
Uma terceira alternativa exportar os dados de acesso a qualquer um uma planilha padro
ou uma planilha criada a partir de um modelo e classificar os dados, criar totais, ou
aplica a formatao usando os comandos do Excel no cdigo VBA. As sees a seguir
Descreva usando estes trs mtodos para exportar dados do Access para o Excel.
O banco de dados de amostra para este captulo o acesso a
Excel.accdb.
NOTA NOTA
49
NESTE CAPTULO
Exportar dados do Access para Excel
usando um comando de fita
Criando novas planilhas de Excel
a partir de modelos
Formatao de dados do Access exportados
para uma planilha do Excel
Anlise de dados com Excel
07_047026 ch03.qxp 02\/04\/07 21:42 Page 49
Exportao de dados de acesso para
uma planilha no formatada
Se voc s precisa mover um bloco de dados do Access para o Excel, e voc no precisa formatar fantasia-
Ting, voc pode usar o comando Excel no grupo de exportao na guia dados externos da faixa de opes
para exportar os dados de acesso para uma planilha simples, sem formatao. O banco de dados de amostra, com base na
De dados de exemplo Northwind, tem uma consulta que liga todas as tabelas de dados, qryNorthwindAll . A
consulta desse tipo muito til para fazer a exportao de dados, pois ele contm todos os dados que voc pode
deseja exportar. (A Figura 3.1 mostra esta consulta selecionada na barra de objeto.)
FIGURA 3.1
Exportao para Excel de um comando de fita.
Clique o comando Excel com um objeto de banco de dados selecionado abre a caixa de dilogo de exportao, onde voc
pode navegar para a pasta onde a planilha deve ser salvo e selecione um formato de arquivo de planilha.
Esta caixa de dilogo mostrada na Figura 3.2. Voc pode verificar os \"exportar dados com formatao e layout\"
Seleo se desejado, mas no faz muita diferena ao exportar dados de tabelas ou
consultas e eu no recomendo exportar dados de formulrios ou relatrios, porque a formatao voc
precisa em Excel no o mesmo que a formatao que voc precisa em um acesso de formulrio ou relatrio.
50
Os componentes do Office e o que fazem melhor
Parte I
07_047026 ch03.qxp 02\/04\/07 21:42 Page 50
FIGURA 3.2
A caixa de dilogo de exportao aberta do comando Excel.
Usando qryNorthwindAll como a fonte de dados, voc comea a planilha simples mostrada na Figura 3.3.
FIGURA 3.3
Uma planilha do Excel criada a partir de dados da consulta de acesso qryNorthwindAll.
51
Anlise de dados com Excel
3
07_047026 ch03.qxp 02\/04\/07 21:42 Page 51
Usando uma consulta como uma fonte de dados permite que voc combinar dados de vrias tabelas e tambm
para formatar os dados como voc deseja que ele aparea na planilha destino, usando dados tipo conver-
funes de Sion, tais como
CDate CCur
, , ou
CStr
.
Com alguns cliques, voc pode redimensionar as colunas da planilha, conforme necessrio, edite os cabealhos de coluna como
necessrio e fazer a linha de cabealho de coluna em negrito e uma planilha simples, mas til (Figura 3.4)
est pronto para uso.
FIGURA 3.4
A planilha exportada com um pouco de formatao aplicadas manualmente.
Usando modelos do Excel para criar formatado
Planilhas preenchidas com dados de acesso
Se voc quer produzir uma planilha mais formatada, voc pode preparar um formato e um modelo do Excel
-quando necessrio por exemplo, adicionando um grande, centrado ttulos de coluna e ttulo com adequada
texto, talvez em uma fonte maior ou mais ousada do que a rea de dados. Ento, em vez de usar o Excel com-
Matos na faixa de opes, usar cdigo VBA para exportar os dados de acesso linha por linha para a rea de dados de um novo
criado com base no modelo de planilha. Eu criei um conjunto de consultas para o arquivamento de dados, novamente usando o
dados de exemplo Northwind e uma forma de dilogo (fdlgArchiveOrders) que permite que o usurio selecione uma data
intervalo para arquivamento de dados de ordens, como mostrado na Figura 3.5.
Observe o cone do calendrio ao lado os controles data (ele aparece quando um controle acoplado a um
Campo de data tem o foco). Clicando no cone abre um calendrio para selecionar uma data vlida,
como mostrado na Figura 3.6. O novo calendrio pop-up definitivamente til, apesar de selecionar uma data em muito o
passado pode ser entediante, porque no h nenhuma maneira de passar o ano.
NOVO RECURSO NOVO RECURSO
DICA DICA
52
Os componentes do Office e o que fazem melhor
Parte I
07_047026 ch03.qxp 02\/04\/07 21:42 Page 52
FIGURA 3.5
Uma forma de dilogo para selecionar dados Northwind Orders para arquivar.
FIGURA 3.6
Selecionar uma data do calendrio pop-up.
Uma vez que a data inicial e data final foram inseridos ou selecionados, clique no boto arquivo executa
um procedimento que cria uma nova planilha do Excel de um modelo (ordens Archive.xltx) no mesmo
pasta do banco de dados, preenche-lo com os dados do tblOrders no intervalo de datas selecionado e exclui o
registros arquivados.
O ArchiveData procedimento usa os valores de data inicial e data final selecionados na caixa de dilogo como
argumentos. Este procedimento listado como segue, junto com o CreateAndTestQuery proce-
Dure, que ele usa para criar uma consulta por meio de programao e outro procedimento ( TestFileExists ) que
testa se um arquivo existe em uma pasta especfica:
Public Sub ArchiveData(dteStart As Date, dteEnd As Date)
No erro GoTo ErrorHandler
Dim appExcel como Application
Dim intReturn As Integer
Dim lngCount como longo
Dim n As Long
53
Anlise de dados com Excel
3
07_047026 ch03.qxp 02\/04\/07 21:42 Page 53
Dim rng como Excel. Range
Dim rngStart como Excel. Range
Dim strDBPath As String
Dim strPrompt As String
Dim strQuery As String
Dim strSaveName As String
Dim strSheet As String
Dim strSheetTitle As String
Dim strSQL As String
Dim strTemplate As String
Dim strTemplateFile As String
Dim strTemplatePath As String
Dim strTitle As String
Dim wkb como Excel.Workbook
Dim wks como Excel.Worksheet
Crie uma consulta filtrada usando as datas selecionadas na caixa de dilogo:
strQuery = \"qryArchive\"
Conjunto dbs = CurrentDb
strSQL = \"SELECT * de tblOrders onde\" _
& [ShippedDate] Between # & dteStart & # And # _
& dteEnd & #;
Debug. Print \"SQL\"
lngCount = CreateAndTestQuery (strQuery, strSQL)
Debug. Print \"n itens encontrados: \"
Se lngCount = 0 ento
Sair se nenhum pedidos encontram-se no intervalo de datas selecionado:
strPrompt no = \"Nenhum pedidos encontrados para esta faixa de data;\" _
& canceling archiving
strTitle = \"Cancelamento\"
MsgBox strPrompt, vbOKOnly + vbCritical, strTitle
GoTo ErrorHandlerExit
Outra coisa
strPrompt = lngCount
& range; archive them?
strTitle = \"Arquivamento\"
intReturn = MsgBox (strPrompt, vbYesNo + vbQuestion, _
strTitle)
Se intReturn = vbNo Then
GoTo ErrorHandlerExit
End If
End If
Criar uma nova planilha do modelo e exportar os dados de acesso a ele:
strDBPath = Application.CurrentProject.Path
Debug. Print \"caminho do banco de dados atual:\"
54
Os componentes do Office e o que fazem melhor
Parte I
07_047026 ch03.qxp 02\/04\/07 21:42 Page 54
strTemplate = \"Archive.xltx de ordens\"
strTemplateFile = strDBPath
Se TestFileExists(strTemplateFile) = False Then
Colocar uma mensagem e sair se o modelo no for encontrado:
strTitle = \"Modelo no encontrado\"
strPrompt = \"Modelo do Excel 'Ordens Archive.xlt'\" _
& not found in & strDBPath & ; & vbCrLf _
& please put template in this folder and try again
MsgBox strPrompt, vbCritical + vbOKOnly, strTitle
GoTo ErrorHandlerExit
Outra coisa
Debug. Print \"modelo de Excel usado:\"
End If
Modelo encontrado; Crie uma nova planilha a partir dele:
Set appExcel = GetObject (, \"Application\")
Set rst = dbs.OpenRecordset(\"qryRecordsToArchive\")
Set wkb = appExcel.Workbooks.Add(strTemplateFile)
Conjunto wks = wkb.Sheets(1)
WKS.Ativar
appExcel.Visible = True
Escreva o intervalo de datas para clula de ttulo:
Set rng = wks.Range(\"a1\")
strSheetTitle = \"Arquivados ordens para\" _
& Format(dteStart, d-mmm-yyyy) _
& to & Format(dteEnd, d-mmm-yyyy)
Debug. Print \"ttulo da folha:\"
RNG.Valor = strSheetTitle
Ir para a primeira clula de dados:
Definir rngStart = wks.Range(\"A4\")
Set rng = wks.Range(\"A4\")
Redefina lngCount para o nmero de registros na consulta de fonte de dados:
RST.MoveLast
RST.MoveFirst
lngCount = rst.RecordCount
Para n = 1 para lngCount
Gravar dados do conjunto de registros para a rea de dados da planilha, usando o columnoffset argumen-
mento para mover para a prxima clula:
55
Anlise de dados com Excel
3
07_047026 ch03.qxp 02\/04\/07 21:42 Page 55
RNG.Valor = Nz (rst! [OrderID])
Set rng = rng.Offset(columnoffset:=1)
RNG.Valor = Nz (rst! [Cliente])
Set rng = rng.Offset(columnoffset:=1)
RNG.Valor = Nz (rst! [Empregado])
Set rng = rng.Offset(columnoffset:=1)
RNG.Valor = Nz (rst! [DataDoPedido])
Set rng = rng.Offset(columnoffset:=1)
RNG.Valor = Nz (rst! [DataDeEntrega])
Set rng = rng.Offset(columnoffset:=1)
RNG.Valor = Nz (rst! [DataDeEnvio])
Set rng = rng.Offset(columnoffset:=1)
RNG.Valor = Nz (rst! [Expedidor])
Set rng = rng.Offset(columnoffset:=1)
RNG.Valor = Nz (rst! [Frete])
Set rng = rng.Offset(columnoffset:=1)
RNG.Valor = Nz (rst! [NomeDoDestinatrio])
Set rng = rng.Offset(columnoffset:=1)
RNG.Valor = Nz (rst! [ShipAddress])
Set rng = rng.Offset(columnoffset:=1)
RNG.Valor = Nz (rst! [ShipCity])
Set rng = rng.Offset(columnoffset:=1)
RNG.Valor = Nz (rst! [ShipRegion])
Set rng = rng.Offset(columnoffset:=1)
RNG.Valor = Nz (rst! [ShipPostalCode])
Set rng = rng.Offset(columnoffset:=1)
RNG.Valor = Nz (rst! [PasDeDestino])
Set rng = rng.Offset(columnoffset:=1)
RNG.Valor = Nz (rst! [Produto])
Set rng = rng.Offset(columnoffset:=1)
RNG.Valor = Nz (rst! [PreoUnitrio])
Set rng = rng.Offset(columnoffset:=1)
RNG.Valor = Nz (rst! [Quantidade])
Set rng = rng.Offset(columnoffset:=1)
RNG.Valor = Nz (rst! [Desconto])
V para a prxima linha na planilha, usando o RowOffset argumento:
RST.MoveNext
Set rng = rngStart.Offset(rowoffset:=n)
Seguinte n
Salve e feche a planilha preenchida, usando uma pasta de trabalho salve o nome com o intervalo de datas selecionado na
a caixa de dilogo:
strSaveName = strDBPath
Debug. Print \"folha de tempo salve o nome:\"
56
Os componentes do Office e o que fazem melhor
Parte I
07_047026 ch03.qxp 02\/04\/07 21:42 pgina 56
ChDir strDBPath
Em erro continuar prximo
Se j houver uma planilha salva com este nome, exclu-lo:
Matar strSaveName
No erro GoTo ErrorHandler
WKB.SaveAs FileName: = strSaveName, _
FileFormat: = xlWorkbookDefault
WKB.Fechar
RST.Fechar
Colocar uma mensagem de sucesso, listando o nome e o caminho da nova planilha:
strTitle = \"Pasta de trabalho criada\"
strPrompt = \"pasta de trabalho do arquivo '\"
& vbCrLf & created in & strDBPath
MsgBox strPrompt, vbOKOnly + vbInformation, strTitle
Excluir os registros arquivados, processar a tabela \"muitos\" em primeiro lugar, porque voc no pode excluir um registro em
a tabela \"um\" se houver vinculada registros na tabela \"muitos\":
DoCmd.SetWarnings False
strSQL = \"Excluir tblOrderDetails.*,\" _
& tblOrders.ShippedDate _
& FROM tblOrderDetails INNER JOIN qryArchive _
& ON tblOrderDetails.OrderID = qryArchive.OrderID;
Debug. Print \"seqncia SQL:\"
StrSQL DoCmd.RunSQL
strSQL = \"excluir tblOrders.* de tblOrders onde\" _
& [ShippedDate] Between # & dteStart & # And # _
& dteEnd & #;
Debug. Print \"seqncia SQL:\"
StrSQL DoCmd.RunSQL
Colocar uma mensagem listando os registros limpos:
strTitle = \"Registros limpos\"
strPrompt = \"Arquivados os registros de\" _
& Format(dteStart, d-mmm-yyyy) _
& to & Format(dteEnd, d-mmm-yyyy) _
& cleared from tables
MsgBox strPrompt, vbOKOnly + vbInformation, strTitle
ErrorHandlerExit:
Exit Sub
57
Anlise de dados com Excel
3
07_047026 ch03.qxp 02\/04\/07 21:42 Page 57
ErrorHandler:
' Excel no est em execuo; Abra o Excel com CreateObject
Se Err. Number = 429 ento
Set appExcel = CreateObject(\"Excel.Application\")
Retomar em seguida
Outra coisa
MsgBox \"erro nenhum:\"
Resume ErrorHandlerExit
End If
End Sub
Pblico funo CreateAndTestQuery(strTestQuery As String, _
strTestSQL As String) como longo
Essa funo chamada de outros procedimentos para criar uma consulta filtrada, usando uma seqncia de caracteres SQL em sua
strTestSQL argumento:
Em erro continuar prximo
Dim qdf como DAO.QueryDef
' Excluir consulta velha
Conjunto dbs = CurrentDb
DBS.QueryDefs.Delete strTestQuery
No erro GoTo ErrorHandler
' Criar nova consulta
Conjunto qdf = dbs.CreateQueryDef (strTestQuery, strTestSQL)
' Verificar se existem quaisquer registros
Set rst = dbs.OpenRecordset(strTestQuery)
Com rst
.MoveFirst
.MoveLast
CreateAndTestQuery =.RecordCount
Terminar com
ErrorHandlerExit:
Exit Function
ErrorHandler:
Se Err. Number = 3021, em seguida,
CreateAndTestQuery = 0
Resume ErrorHandlerExit
Outra coisa
MsgBox \"erro nenhum:\"
Err
Resume ErrorHandlerExit
End If
58
Os componentes do Office e o que fazem melhor
Parte I
07_047026 ch03.qxp 02\/04\/07 21:42 Page 58
End Function
Funo pblica TestFileExists(strFile As String) As Boolean
Em erro continuar prximo
TestFileExists = no (Dir(strFile) = \"\")
End Function
O cdigo do banco de dados de amostra requer uma referncia biblioteca de objeto do Excel;
A Figura 3.7 mostra essa referncia marcada na caixa de dilogo referncias, que aberto
no menu ferramentas na janela do Visual Basic.
FIGURA 3.7
Definir uma referncia para o modelo de objeto do Excel.
Aps a planilha dos registros arquivados foi criada e salva, voc receber uma mensagem
(representado na Figura 3.8) listando o local onde a planilha arquivo foi salvo.
FIGURA 3.8
Uma mensagem de sucesso aps os registros so arquivados.
NOTA NOTA
59
Anlise de dados com Excel
3
07_047026 ch03.qxp 02\/04\/07 21:42 Page 59
Consulte o captulo 7 para uma forma mais flexvel de especificar uma pasta de modelos e documentos
pasta.
Aps o cdigo exclui os registros arquivados primeiro os de tblOrderDetails (a tabela \"muitos\")
e, em seguida, em tblOrders (a tabela \"um\") uma mensagem final aparece, como mostrado na Figura 3.9.
FIGURA 3.9
Uma mensagem informativa final afirmando que foram cancelados os registros de banco de dados arquivados.
Uma planilha preenchida com os dados arquivados mostrada na Figura 3.10.
FIGURA 3.10
Uma planilha preenchida com dados arquivados de acesso.
Salvando a planilha recm criada com o xlWorkbookDefault valor para oFileFormat
argumento salva-o como uma planilha do Excel padro. Se voc precisa salvar a planilha em outro para-
esteira, talvez para uso por algum executando uma verso anterior do Excel, voc pode usar um dos outros
valores na XlFileFormat enum, que so mostradas no navegador de objeto na Figura 3.11. O
xlExcel9795 constante nomeada criar uma planilha em um formato utilizvel por pessoas correndo
Excel 95 ou 97. (As opes de formato de planilha disponveis no cdigo VBA so muito mais numerosos
do que aqueles disponveis na interface, como mostrado na Figura 3.12.)
NOTA NOTA
60
Os componentes do Office e o que fazem melhor
Parte I
07_047026 ch03.qxp 02\/04\/07 21:42 Page 60
FIGURA 3.11
Exibindo as opes de formato de arquivo para salvar uma pasta de trabalho do Excel.
Se voc criar uma planilha no novo formato xlsx, apenas usurios do Office 2007 podero
para abri-lo. Para criar uma planilha que pode ser aberta e editada por usurios com mais cedo
verses do Office, selecione um dos outros formatos. O formato de pasta de trabalho (. xls) do Excel 97Excel 2003
(mostrado sendo selecionado na Figura 3.12) utilizvel em Office 97 por meio de 2007, por isso geralmente mais
formato de planilha til.
FIGURA 3.12
Selecionar uma planilha salvar formato.
AVISO AVISO
61
Anlise de dados com Excel
3
07_047026 ch03.qxp 02\/04\/07 21:42 Page 61
Para abrir o navegador de objeto pela anlise de componentes de um modelo de objeto, abra a
Janela do Visual Basic e selecione objeto navegador do menu Exibir, ou pressione F2.
Formatao de planilhas de Excel no cdigo VBA
Se voc precisar classificar, grupo, travesso ou caso contrrio formato exportados dados em uma planilha do Excel ou cre-
comeu um total sob a ltima linha de dados, voc pode escrever cdigo VBA para usar comandos do Excel para fazer o
trabalha no cdigo. Voc pode aplicar formatao a uma planilha criada pelo TransferirPlanilha
mtodo, ou um criado a partir do comando de fita ou uma planilha criada programaticamente a partir
um modelo.
Consulte o captulo 7 para obter exemplos de criao de planilhas utilizando o
TransferirPlanilha
mtodo.
Nesta seo, os dados de qryOrdersAndDetails so exportados para uma nova planilha, feita a partir de uma tem-
placa e, em seguida, formatado no cdigo. Para sua convenincia, a ExportNorthwindData procedimento
pode ser executado a partir do mcrExportNorthwindData de macro.
O procedimento inicia-se, criando uma nova planilha de um modelo (Northwind Orders.xltx), como para
o ArchiveData procedimento. Dados da consulta qryOrdersAndDetails escrito s linhas
na planilha e, em seguida, um conjunto de comandos do Excel usado para aplicar bordas de linha fina para os dados
rea e uma fronteira de duplo fundo para a linha de cabealhos de coluna.
Em seguida, a rea de dados da planilha classificada pelas duas primeiras colunas (pas e categoria) e o
valores extras so removidos (o efeito semelhante ao ligar esconder duplica em um relatrio do Access).
Finalmente, um Total geral criada sob a ltima linha, feita grandes e em negrito e fechados em uma caixa.
O procedimento listado como segue:
Public Sub ExportNorthwindData()
No erro GoTo ErrorHandler
Dim appExcel As Object
Dim i As Integer
Dim lngCount como longo
Dim lngCurrentRow como longo
Dim lngRows como longo
Dim n As Long
Dim objFind As Object
Dim rng como Excel. Range
Dim rngData como Excel. Range
Dim rngStart como Excel. Range
Dim strCategory As String
Dim strCountry As String
Dim strCurrAddress As String
Dim strDBPath As String
Dim strFormula As String
REFERNCIA CRUZADA REFERNCIA CRUZADA
NOTA NOTA
62
Os componentes do Office e o que fazem melhor
Parte I
07_047026 ch03.qxp 02\/04\/07 21:42 Page 62
Dim strPrompt As String
Dim strDataRange As String
Dim strRange As String
Dim strSaveName As String
Dim strSheetName As String
Dim strStartAddress As String
Dim strTemplate As String
Dim strTemplateFile As String
Dim strTitle As String
Dim wkb como Excel.Workbook
Dim wks como Excel.Worksheet
Criar uma nova planilha do modelo e exportar dados dela:
strDBPath = Application.CurrentProject.Path
Debug. Print \"caminho do banco de dados atual:\"
strTemplate = \"Northwind Orders.xltx\"
strTemplateFile = strDBPath
Se TestFileExists(strTemplateFile) = False Then
Colocar uma mensagem e sair se o modelo no for encontrado:
strTitle = \"Modelo no encontrado\"
strPrompt = \"Modelo do Excel 'Northwind Orders.xlt'\" _
& not found in & strDBPath & ; & vbCrLf _
& please put template in this folder and try again
MsgBox strPrompt, vbCritical + vbOKOnly, strTitle
GoTo ErrorHandlerExit
Outra coisa
Debug. Print \"modelo de Excel usado:\"
End If
Set appExcel = GetObject (, \"Application\")
Conjunto dbs = CurrentDb
Crie um conjunto de registros com base na consulta acesso:
Set rst = dbs.OpenRecordset(\"qryOrdersAndDetails\")
Crie uma nova planilha, baseada no modelo:
Set wkb = appExcel.Workbooks.Add(strTemplateFile)
Conjunto wks = wkb.Sheets(1)
WKS.Ativar
appExcel.Visible = True
Ir para a primeira clula de dados na planilha:
Definir rngStart = wks.Range(\"A4\")
Set rng = wks.Range(\"A4\")
63
Anlise de dados com Excel
3
07_047026 ch03.qxp 02\/04\/07 21:42 Page 63
Redefina lngCount para o nmero de registros na consulta:
RST.MoveLast
RST.MoveFirst
lngCount = rst.RecordCount
Para n = 1 para lngCount
Gravar dados do conjunto de registros para as clulas na linha atual da planilha, usando o columnoff-
conjunto argumento para mover para a prxima clula:
RNG.Valor = Nz (rst! [PasDeDestino])
Set rng = rng.Offset(columnoffset:=1)
RNG.Valor = Nz (rst! [Categoria])
Set rng = rng.Offset(columnoffset:=1)
RNG.Valor = Nz (rst! [Produto])
Set rng = rng.Offset(columnoffset:=1)
RNG.Valor = Nz (rst! [Cliente])
Set rng = rng.Offset(columnoffset:=1)
RNG.Valor = Nz (rst! [OrderID])
Set rng = rng.Offset(columnoffset:=1)
RNG.Valor = Nz (rst! [PreoUnitrio])
Set rng = rng.Offset(columnoffset:=1)
RNG.Valor = Nz (rst! [Quantidade])
Set rng = rng.Offset(columnoffset:=1)
RNG.Valor = Nz (rst! [Desconto])
Set rng = rng.Offset(columnoffset:=1)
RNG.Valor = Nz (rst! [TotalPrice])
V para a prxima linha da planilha, usando o RowOffset argumento:
RST.MoveNext
Set rng = rngStart.Offset(rowoffset:=n)
Seguinte n
Determinar o nmero de linhas de dados na planilha com o UsedRange Propriedade:
lngRows = wks.UsedRange.Rows.Count
Debug. Print \"o nmero de dados linhas na planilha:\"
Defina o intervalo de dados:
strRange = \"A4: eu\"
Definir rngData = wks.Range(strRange)
Aplica bordas de linha fina para o intervalo de dados:
Com rngData
.Borders(xlDiagonalDown).LineStyle = xlNone
.Borders(xlDiagonalUp).LineStyle = xlNone
64
Os componentes do Office e o que fazem melhor
Parte I
07_047026 ch03.qxp 02\/04\/07 21:42 Page 64
.Borders(xlEdgeLeft).LineStyle = xlContinuous
.Borders(xlEdgeLeft).Peso = xlHairline
.Borders(xlEdgeLeft).ColorIndex = xlAutomatic
.Borders(xlEdgeTop).LineStyle = xlContinuous
.Borders(xlEdgeTop).Peso = xlHairline
.Borders(xlEdgeTop).ColorIndex = xlAutomatic
.Borders(xlEdgeBottom).LineStyle = xlContinuous
.Borders(xlEdgeBottom).Peso = xlHairline
.Borders(xlEdgeBottom).ColorIndex = xlAutomatic
.Borders(xlEdgeRight).LineStyle = xlContinuous
.Borders(xlEdgeRight).Peso = xlHairline
.Borders(xlEdgeRight).ColorIndex = xlAutomatic
.Borders(xlInsideVertical).LineStyle = xlContinuous
.Borders(xlInsideVertical).Peso = xlHairline
.Borders(xlInsideVertical).ColorIndex = xlAutomatic
.Borders(xlInsideHorizontal).LineStyle = xlContinuous
.Borders(xlInsideHorizontal).Peso = xlHairline
.Borders(xlInsideHorizontal).LineStyle = xlContinuous
Terminar com
Aplica uma borda dupla a parte inferior da linha de cabealhos de coluna:
WKS.Rows(\"3:3\").Selecione
Com appExcel.Selection
.Borders(xlDiagonalDown).LineStyle = xlNone
.Borders(xlDiagonalUp).LineStyle = xlNone
.Borders(xlEdgeLeft).LineStyle = xlNone
.Borders(xlEdgeTop).LineStyle = xlNone
Terminar com
Com appExcel.Selection.Borders(xlEdgeBottom)
.LineStyle = xlDouble
.ColorIndex = 0
.TintAndShade = 0
.Peso = xlThick
Terminar com
Com appExcel.Selection
.Borders(xlEdgeRight).LineStyle = xlNone
.Borders(xlInsideVertical).LineStyle = xlNone
Terminar com
Classificar o intervalo de dados por pas e por categoria:
strDataRange = \"A3: eu\"
strKey1Range = \"A4:A\"
strKey2Range = \"B4:B\"
Debug. Print \"intervalo de dados:\"
65
Anlise de dados com Excel
3
07_047026 ch03.qxp 02\/04\/07 21:42 Page 65
WKS.Range(strDataRange).Selecione
WKS.Sort.SortFields.Clear
WKS.Sort.SortFields.Add Key:=Range(strKey1Range) _
SortOn: = xlSortOnValues, _
Ordem: = xlAscending, _
DataOption: = xlSortNormal
WKS.Sort.SortFields.Add Key:=Range(strKey2Range) _
SortOn: = xlSortOnValues, _
Ordem: = xlAscending, _
DataOption: = xlSortNormal
Com wks.Classificao
.SetRange Range(strDataRange)
.Cabealho = xlYes
.MatchCase = False
.Orientao = xlTopToBottom
.SortMethod = xlPinYin
.Aplicar
Terminar com
Remova os pases duplicados:
Set rng = wks.Range(\"A:A\")
Para i = 4 para lngRows
Debug. Print rng.Clulas (i, 1).Endereo
& rng.Cells(i, 1).Value
Se rng.Clulas (i, 1) = rng.Cells (i - 1, 1), em seguida
RNG.Clulas (i, 1).Font.ColorIndex = 2
ElseIf rng.Clulas (i, 1).Valor <>strCountry, em seguida
Debug. Print \"Diferentes dados em\" _
& rng.Cells(i, 1).Address
strCountry = rng.Clulas (i, 1).Valor
End If
Seguinte eu
Remova as categorias duplicadas:
Set rng = wks.Range(\"B:B\")
Para i = 4 para lngRows
Debug. Print rng.Clulas (i, 1).Endereo
& rng.Cells(i, 1).Value
Se rng.Clulas (i, 1).Valor = rng.Cells (i - 1, 1), em seguida
RNG.Clulas (i, 1).Font.ColorIndex = 2
ElseIf rng.Clulas (i, 1).Valor <>strCategory, em seguida
Debug. Print \"Diferentes dados em\" _
& rng.Cells(i, 1).Address
strCategory = rng.Clulas (i, 1).Valor
End If
Seguinte eu
66
Os componentes do Office e o que fazem melhor
Parte I
07_047026 ch03.qxp 02\/04\/07 21:42 Page 66
Adicione um Total geral e formatar seu celular:
strFormula = \"= soma (R [-\"
& ]C:R[-1]C)
Debug. Print \"frmula:\"
strRange = \"I\"
Debug. Print \"intervalo:\"
WKS.Range(strRange).FormulaR1C1 = strFormula
WKS.Range(strRange).Selecione
Com appExcel.Selection.Font
.Nome = \"Calibri\"
.Tamanho = 14
.Tachado = False
.Sobrescrito = False
.Subscrito = False
.OutlineFont = False
.Sombra = False
.Sublinhado = xlUnderlineStyleNone
.ThemeColor = 2
.TintAndShade = 0
.ThemeFont = xlThemeFontMinor
Terminar com
Com appExcel.Selection
.Bold = True
.Borders(xlDiagonalDown).LineStyle = xlNone
.Borders(xlDiagonalUp).LineStyle = xlNone
Terminar com
Com appExcel.Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Peso = xlMedium
Terminar com
Com appExcel.Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Peso = xlMedium
Terminar com
Com appExcel.Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Peso = xlMedium
Terminar com
67
Anlise de dados com Excel
3
07_047026 ch03.qxp 02\/04\/07 21:42 Page 67
Com appExcel.Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Peso = xlMedium
Terminar com
Com appExcel.Selection
.Borders(xlInsideVertical).LineStyle = xlNone
.Borders(xlInsideHorizontal).LineStyle = xlNone
Terminar com
Salve e feche a planilha preenchida, usando uma pasta de trabalho salve o nome com o intervalo de datas:
strSheetName = \"Northwind Orders como de\" _
& Format(Date, d-mmm-yyyy)
Debug. Print \"nome da folha:\"
Escreva o ttulo com o intervalo de datas para a planilha:
WKS.Range(\"a1\").Valor = strSheetName
strSaveName = strDBPath
Debug. Print \"folha de tempo salve o nome:\"
ChDir strDBPath
Em erro continuar prximo
Se j houver uma planilha salva com este nome, exclu-lo:
Matar strSaveName
No erro GoTo ErrorHandler
WKB.SaveAs FileName: = strSaveName, _
FileFormat: = xlWorkbookDefault
WKB.Fechar
RST.Fechar
Colocar uma mensagem de sucesso com o nome e o caminho da nova planilha:
strTitle = \"Pasta de trabalho criada\"
strPrompt = strSheetName
& strDBPath
MsgBox strPrompt, vbOKOnly + vbInformation, strTitle
ErrorHandlerExit:
Exit Sub
ErrorHandler:
' Excel no est em execuo; Abra o Excel com CreateObject
68
Os componentes do Office e o que fazem melhor
Parte I
07_047026 ch03.qxp 02\/04\/07 21:42 Page 68
Se Err. Number = 429 ento
Set appExcel = CreateObject(\"Excel.Application\")
Retomar em seguida
Outra coisa
MsgBox \"erro nenhum:\"
& Err.Description
Resume ErrorHandlerExit
End If
End Sub
Uma planilha acabada mostrada na Figura 3.13.
FIGURA 3.13
Uma planilha preenchida com dados e formatado usando cdigo do VBA.
Resumo
Quando voc precisa exportar dados de acesso a planilhas do Excel para que todo aquele que tem o escritrio pode
trabalhar com eles, voc pode usar as tcnicas discutidas neste captulo para exportar dados do Access na
interface ou usando cdigo do VBA, para uma planilha padro simples, ou uma planilha formatada criada
de um modelo do Excel.
69
Anlise de dados com Excel
3
07_047026 ch03.qxp 02\/04\/07 21:42 Page 69
07_047026 ch03.qxp 02\/04\/07 21:42 Page 70

utlook o componente do Office que usado para comunicao via


e-mail, mantendo um calendrio e armazenar contatos e tarefa infor-
o. Para e-mail e compromissos (um conjunto de compromissos em uma pasta
chamado um calendrio), a interface do Outlook to superior que eu recomendo
no tentar replicar sua funcionalidade no Access, mas sim para exportar o acesso
dados para o Outlook, criar mensagens de email, compromissos ou outro Outlook
itens conforme necessrio.
Caminho de volta no Access 2.0, eu criei um banco de dados para gerenciar tarefas, permitindo-me
para lhes atribuir prioridades, incio e datas de vencimento e notas e orden-los por
qualquer uma dessas prioridades ou datas. Naturalmente, quando o Outlook foi introduzido
no Office 97, meu banco de dados tarefas j no era necessria, porque Outlook
inclui a sua prpria lista de tarefas (ou para fazer a lista, como ele rotulado como no Office 2007). Todos os
as caractersticas que eu queria foram construdas para a lista de tarefas do Outlook, ento eu mudei todos
minhas tarefas para o Outlook e gerenciado-los com as ferramentas do Outlook. Porque
Outlook faz um bom trabalho com as tarefas, no necessrio para armazenar dados de tarefa
no Access, embora em algumas circunstncias especiais talvez voc precise fazer isso,
e, em seguida, talvez, exportar os dados para o Outlook.
Outlook raramente usado componente dirio, que registra a criao de
itens selecionados do Outlook, bem como itens inserido pelo usurio, tambm tem pouca necessidade de
Conectando-se ao acesso. Se voc encontrar este componente til (eu usei isso como parte
do meu tempo
configurar o jornal para gravar vrios tipos de itens do Outlook e adicionar manual
entradas para o jornal, conforme necessrio. No entanto (como com tarefas), l pode justificar-
aliado ser circunstncias em que voc precisa exportar dados do Access para
Itens de dirio do Outlook e eu descrever um no final deste captulo.
71
NESTE CAPTULO
Criar compromissos do Outlook
e tarefas de dados de acesso
Gravar os dados de acesso para o
Dirio do Outlook
Criando e-mails para contatos em um
Tabela do Access
Organizar e
Comunicando-se com o Outlook
08_047026 ch04.qxp 02\/04\/07 21:42 Page 71
Se voc armazenar endereos de e-mail em uma tabela de contatos, clientes ou clientes, voc pode usar cdigo do VBA para cre-
comeu e-mails para eles de uma forma de acesso, tanto para um nico destinatrio ou de um grupo de destinatrios, sem
ter que mudar para o Outlook.
Contatos so outra questo embora o Outlook tem um componente de contatos, com muitos teis fea -
Tures (especialmente o link para e-mail), no entanto, os contatos do Outlook so deficientes em um muito impor -
tante recurso em relao ao acesso: Outlook todos os dados so armazenados em uma tabela MAPI de arquivos simples, assim voc
no possvel definir relacionamentos um-para-muitos entre (por exemplo) e contatos ou contatos
e nmeros de telefone. Se uma empresa se move para outro local ou muda de nome, voc tem que fazer
a alterao manualmente em cada contato que a empresa; se um contato tiver mais de trs endereos,
ou um nmero de telefone que no se encaixa em uma das categorias disponveis, que voc est sem sorte.
Para contatos, precisa realmente a interface atraente e a conectividade de e-mail interno do
Contatos do Outlook e os recursos de banco de dados relacional do acesso. Isso significa que voc precisa de uma maneira de
sincronizar dados entre contatos do Outlook e acesso; meu Contacts.accdb Sincronizando dados-
base faz exatamente isso.
Veja captulo 11 para uma discusso sobre o banco de dados de sincronizao de contatos. Captulo 8
lida com exportadores e importadores contatos sem sincronizao.
Este captulo concentra-se em exportar artigos de jornal, compromissos e tarefas de acesso a
Outlook e criar e-mails para contatos armazenados em uma tabela do Access.
O banco de dados de amostra para este captulo o acesso ao Outlook.accdb.
Compromissos de exportao
e tarefas para o Outlook
Se voc tiver uma tabela de acesso de funcionrios, contato ou informao do cliente, talvez voc precise criar
Compromissos do Outlook ou tarefas com base nas informaes os registros da tabela. A tabela de tblEmployees
no exemplo banco de dados tem empregado dois campos de data de reviso: LastReviewDate e NextReviewDate.
A Figura 4.1 mostra o formulrio frmEmployees, que est vinculado a esta tabela.
A prxima reviso do empregado pode ser agendada, digitando uma data no campo data de reviso prxima e ento
clicando no boto de cronograma de nomeao. Cdigo sobre a BeforeUpdate evento de txtNextReviewDate
(listados em seguida) verifica que a data inscrita (selecionadas usando o pop-up calendrio) uma tera-feira ou
Quinta-feira (a suposio que funcionrio comentrios s so feitos naqueles dias):
Private Sub txtNextReviewDate_BeforeUpdate (Cancel As Integer)
No erro GoTo ErrorHandler
Dim strWeekday As String
Dim intWeekday As Integer
NOTA NOTA
REFERNCIA CRUZADA REFERNCIA CRUZADA
72
Os componentes do Office e o que fazem melhor
Parte I
08_047026 ch04.qxp 02\/04\/07 21:42 Page 72
FIGURA 4.1
Um formulrio de funcionrios com campos de data de reviso.
Verifique se a data tem sido inserido (ou selecionada):
Se IsDate (Me! [NextReviewDate]) = False Then
GoTo ErrorHandlerExit
Outra coisa
dteNextReviewDate = CDate (Me! [NextReviewDate])
intWeekday = Weekday(dteNextReviewDate)
Selecione o caso intWeekday
Verifique se a data selecionada um dia de fim de semana e colocar a mensagem de erro e sair se assim:
Caso vbSunday, vbSaturday
strTitle = \"Errado o dia da semana\"
strPrompt = _
\"Comentrios no podem ser agendados em um fim de semana\"
MsgBox strPrompt, vbOKOnly + vbExclamation _
strTitle
Cancelar = True
GoTo ErrorHandlerExit
Processo vbMonday, vbWednesday, vbFriday
Verifique se a data selecionada errado dia da semana e colocar a mensagem de erro e sair se assim:
strTitle = \"Errado o dia da semana\"
strPrompt = \"Comentrios s podem ser agendados em\" _
& a Tuesday or Thursday
MsgBox strPrompt, vbOKOnly + vbExclamation _
73
Organizar e comunicar-se com o Outlook
4
08_047026 ch04.qxp 02\/04\/07 21:42 pgina 73
strTitle
Cancelar = True
GoTo ErrorHandlerExit
Caso vbTuesday, vbThursday
Data uma tera ou quinta-feira; colocar mensagem e continuar:
strTitle = \"Certo dia da semana\"
strPrompt = \"Rever data OK\"
MsgBox strPrompt, vbOKOnly + vbInformation _
strTitle
End Select
End If
ErrorHandlerExit:
Exit Sub
ErrorHandler:
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End Sub
Para trabalhar com itens do Outlook no cdigo, voc precisar definir uma referncia para o objeto do Outlook
biblioteca (selecione Ferramentas

Referncias na janela do Visual Basic, como mostrado na Figura 4.2). Para


evitar a criao de mltiplas instncias do Outlook, eu gosto de usar um manipulador de erro que vai abrir uma nova instncia
de usar o Outlook
CreateObject
se o
GetObject
funo falhar porque o Outlook no estiver sendo executado.
FIGURA 4.2
Definir uma referncia biblioteca de objeto do Outlook.
NOTA NOTA
74
Os componentes do Office e o que fazem melhor
Parte I
08_047026 ch04.qxp 02\/04\/07 21:42 Page 74
Uma vez que a data correta de tera ou quinta-feira foi selecionada ou entrou, clicando em agenda
Boto de nomeao cria trs itens do Outlook: um compromisso para o empregado, selecione -
mento para o supervisor (a pessoa do empregado reporta) e uma tarefa para o supervisor. O
do botoClique emprocedimento de evento listado como segue:
Private Sub cmdScheduleAppt_Click()
No erro GoTo ErrorHandler
Dim appOutlook como Outlook. Application
Dim strEmployeeName As String
Dim strSupervisorName As String
Dim appt como Outlook.AppointmentItem
Dim fldTopCalendar como Outlook.Folder
Dim fldContactCalendar como Outlook.Folder
Dim fldSupervisorCalendar como Outlook.Folder
Dim fldTasks como Outlook.Folder
Dim tsk como Outlook.TaskItem
Dim nms como Outlook.NameSpace
Conjunto appOutlook = GetObject (, \"Outlook. Application\")
Conjunto nms = appOutlook.GetNamespace(\"MAPI\")
Definir variveis para obter informaes exportar para o Outlook:
strTitle = \"Falta informao\"
Se IsDate (Me! [txtNextReviewDate].Valor) = True Then
dteNextReviewDate = CDate (Me! [txtNextReviewDate].Valor)
Outra coisa
strPrompt = _
\"Nenhuma data prxima de reviso; no possvel criar a nomeao\"
MsgBox strPrompt, vbOKOnly + vbExclamation, strTitle
GoTo ErrorHandlerExit
End If
strEmployeeName = Me![FirstNameFirst]
strSupervisorName = Nz (Me! [cboReportsTo].Column(1))
Se strSupervisorName = \"\", em seguida,
strPrompt no = \"nenhum supervisor selecionado; no possvel agendar reviso\"
strTitle no = \"Nenhum supervisor\"
MsgBox strPrompt, vbOKOnly + vbExclamation, strTitle
GoTo ErrorHandlerExit
End If
75
Organizar e comunicar-se com o Outlook
4
08_047026 ch04.qxp 02\/04\/07 21:42 Page 75
Como referncia (ou criar) o calendrio do contato:
Em erro continuar prximo
Definir fldTopCalendar = _
appOutlook.Session.GetDefaultFolder(olFolderCalendar)
Definir fldContactCalendar = _
fldTopCalendar.Folders(strEmployeeName)
Se fldContactCalendar no nada ento
Definir fldContactCalendar = _
fldTopCalendar.Folders.Add(strEmployeeName)
End If
Como referncia (ou criar) calendrio do supervisor:
Definir fldSupervisorCalendar = _
fldTopCalendar.Folders(strSupervisorName)
Se fldSupervisorCalendar no nada ento
Definir fldSupervisorCalendar = _
fldTopCalendar.Folders.Add(strSupervisorName)
End If
No erro GoTo ErrorHandler
Crie compromisso no calendrio do contato:
Conjunto appt = fldContactCalendar.Items.Add
Com o appt
.Iniciar = CStr(dteNextReviewDate)
.AllDayEvent = False
.Localizao = \"Pequena sala de conferncias\"
.ReminderMinutesBeforeStart = 30
.ReminderSet = True
.ReminderPlaySound = True
.Assunto = \"Rever com\"
.Fechar (olSave)
Terminar com
Crie compromisso no calendrio do supervisor:
Conjunto appt = fldSupervisorCalendar.Items.Add
Com o appt
.Iniciar = CStr(dteNextReviewDate)
.AllDayEvent = False
.Localizao = \"Pequena sala de conferncias\"
.ReminderMinutesBeforeStart = 30
.ReminderSet = True
.ReminderPlaySound = True
.Assunto = strEmployeeName
.OlSave fechar
Terminar com
76
Os componentes do Office e o que fazem melhor
Parte I
08_047026 ch04.qxp 02\/04\/07 21:42 Page 76
Crie tarefas para supervisor (dia antes da nomeao):
Definir fldTasks = _
appOutlook.Session.GetDefaultFolder(olFolderTasks)
Conjunto tsk = fldTasks.Items.Add
Com tsk
.StartDate = DateAdd (\"d\", -1, dteNextReviewDate)
.DueDate = DateAdd (\"d\", -1, dteNextReviewDate)
.ReminderSet = True
.ReminderPlaySound = True
.Assunto = \"Preparar materiais para\"
& review
.Fechar (olSave)
Terminar com
strTitle = \"Feito\"
strPrompt = _ dteNextReviewDate
& appointments scheduled for _
& strEmployeeName & (employee) and _
& strSupervisorName _
& (supervisor) and a task scheduled for _
& strSupervisorName
MsgBox strPrompt, vbOKOnly + vbInformation, strTitle
End Sub
O cdigo primeiro tenta definir referncias do supervisor e do funcionrio pastas sob o padro
Pasta de calendrio. Se no houver nenhuma pasta do empregado (ou supervisor), ele cria uma nova pasta
para o funcionrio ou um supervisor, usando o Adicionar mtodo da coleo de pastas na pasta calendrio.
Em seguida, a coleo de itens da pasta do supervisor usada para criar um novo item do item padro
Digite nessa pasta e da mesma forma para a pasta do empregado. Voc tambm pode criar um novo item usando o
CreateItem mtodo para o objeto de aplicativo do Outlook, mas que cria o item no padro
pasta; Se voc deseja criar um item em uma pasta personalizada, voc precisa usar o Adicionar mtodo em vez disso.
Voc no pode usar o
Adicionar
mtodo diretamente com uma pasta do Outlook; Esse mtodo funciona com
colees, como a coleo de itens ou a coleo de pastas.
Finalmente, voc vai receber uma mensagem \"Done\" (Figura 4.3), relatrios sobre as nomeaes e de tarefas que
foram programadas.
A Figura 4.4 mostra vrias pastas de funcionrio e gerente sob a pasta de calendrio padro e uma
nomeao de supervisor no calendrio dirio.
Se voc no v as pastas de funcionrio e gerente, voc provavelmente est em outro ponto de vista;
alternar para modo de exibio de pasta para ver as pastas de calendrio.
NOTA NOTA
NOTA NOTA
77
Organizar e comunicar-se com o Outlook
4
08_047026 ch04.qxp 02\/04\/07 21:42 Page 77
FIGURA 4.3
Uma mensagem de sucesso com detalhes sobre os itens do Outlook criados.
FIGURA 4.4
Empregado e supervisor de pastas e um compromisso criado a partir de cdigo.
Voc pode clicar duas vezes a nomeao para abrir em uma janela separada.
78
Os componentes do Office e o que fazem melhor
Parte I
08_047026 ch04.qxp 02\/04\/07 21:42 Page 78
Exportar informaes de jornal para Outlook
Se voc link para importar a transao de mainframe ou lote de processamento de dados em um banco de dados do Access
tabela, pode ser conveniente exportar dados para itens de dirio do Outlook, para referncia rpida na
Interface do Outlook. A tabela tblMainframeData no banco de dados sample um exemplo de tais dados.
A Figura 4.5 mostra uma parte desta tabela, com os campos a serem exportados para o Outlook.
FIGURA 4.5
Uma tabela de dados de mainframe para exportar itens de dirio do Outlook.
A funo que exporta os dados de mainframe para itens de dirio do Outlook listada como segue (para con-
venience, essa funo executada a partir do mcrExportTransactions de macro):
Funo pblica ExportTransactions()
No erro GoTo ErrorHandler
Dim appOutlook como Outlook. Application
Dim jnl como Outlook.JournalItem
Dim dbs como DAO.Banco de dados
Dim rst como DAO.Conjunto de registros
Dim strBody As String
Dim strPrompt As String
Dim strTitle As String
Conjunto appOutlook = GetObject (, \"Outlook. Application\")
Conjunto dbs = CurrentDb
Set rst = dbs.OpenRecordset(\"tblMainframeData\")
Fazer enquanto no rst.EOF
Conjunto jnl = appOutlook.CreateItem(olJournalItem)
79
Organizar e comunicar-se com o Outlook
4
08_047026 ch04.qxp 02\/04\/07 21:42 Page 79
JNL.Assunto = rst![Transaction]
JNL.Tipo = rst![JournalType]
jnl.Companies = rst![Departamento]
JNL.Iniciar = rst![TransactionDate]
Crie uma cadeia de caracteres de texto com dados de vrios campos de tabela, para gravao em campo de corpo do item dirio:
strBody = IIf (rst! [Dbito] > 0, _ \"Dbito de\"
& Format(rst![Debit], $###,##0.00) _
& for , ) & IIf(rst![Credit] > 0, _
\"Crdito de\"
# # \"$ #, ##0.00\")
& Account No. & rst![Account]
Debug. Print \"seqncia de caracteres do corpo:\"
JNL.Corpo = strBody
JNL.Fechar (olSave)
RST.MoveNext
Loop
strTitle = \"Feito\"
strPrompt = \"todas as transaes exportados para Outlook\" _
& journal items
MsgBox strPrompt, vbOKOnly + vbInformation, strTitle
ErrorHandler:
' No est executando o outlook; Abra o Outlook com CreateObject
Se Err. Number = 429 ento
Conjunto appOutlook = CreateObject
Retomar em seguida
Outra coisa
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End If
End Function
Quando o Outlook 2007 instalado pela primeira vez, o componente de jornal desligado; ativ-lo em
fim de ver as entradas de dirio criadas pelo procedimento anterior.
Essa funo primeiro configura um conjunto de registros DAO baseado em loops atravs dele, creat - e tblMainframeData
ing um novo item de jornal na pasta de dirio padro para cada registro na tabela e ajuste seu
Propriedades de dados nos campos da tabela. H uma mensagem de sucesso quando todos os dados tem sido
exportados. A Figura 4.6 mostra um item dirio criado a partir de um registro de transao.
Para evitar ter que criar um formulrio personalizado do jornal, o cdigo grava os dados de departamento para as empresas
Campo (empresa interface) de um item padro de jornal. Dados de vrios campos so concate-
NAT em uma varivel de seqncia de caracteres, que escrita para o campo do corpo (o textbox grande na parte inferior da
o item de jornal).
NOTA NOTA
80
Os componentes do Office e o que fazem melhor
Parte I
08_047026 ch04.qxp 02\/04\/07 21:42 Page 80
FIGURA 4.6
Um item de jornal criado a partir de um registro em uma tabela de dados de transaes de mainframe.
Criao de E-mails a partir de uma tabela do Access
Se voc tem uma tabela do Access (por exemplo, do cliente, cliente ou informaes de contato) com endereos de e-mail,
voc pode criar e-mails para pessoas na tabela diretamente de um formulrio do Access, assim voc no precisa
Abra o Outlook para criar um e-mail, que pode economizar tempo. tblContacts do banco de dados de amostra tem um
Campo de e-mail com o endereo de email do contato e o form frmEMail (Figura 4.7) permite que voc envie
e-mails para contatos selecionados a partir de uma caixa de listagem seleo mltipla.
FIGURA 4.7
Um formulrio para selecionar contatos como destinatrios de e-mail.
81
Organizar e comunicar-se com o Outlook
4
08_047026 ch04.qxp 02\/04\/07 21:42 Page 81
Dois botes permitem que voc rapidamente marque (ou desmarque) todos os contatos; uma vez selecionado o e-mail
destinatrios e entrou no assunto da mensagem e o corpo, voc pode clicar a criar mensagens de Email mas -
tonelada para criar o conjunto de e-mails e abri-los para reviso antes de enviar. um conjunto de mensagens de e-mail
mostrado na Figura 4.8.
FIGURA 4.8
Um conjunto de mensagens de e-mail, criado a partir de um formulrio do Access.
O cdigo que cria as mensagens de e-mail (e tambm o cdigo que seleciona ou desmarca a caixa de listagem itens)
listado aqui:
Private Sub cmdMergetoEMailMulti_Click()
No erro GoTo ErrorHandler
Conjunto lst = Me![lstSelectContacts]
Confira o que foi selecionado pelo menos um contato:
Se lst.ItemsSelected.Count = 0 Then
MsgBox \"Por favor seleccione pelo menos um contato\"
LST.SetFocus
GoTo ErrorHandlerExit
End If
82
Os componentes do Office e o que fazem melhor
Parte I
08_047026 ch04.qxp 02\/04\/07 21:42 Page 82
Teste para campos obrigatrios e sair se houver vazios:
strSubject = Me![txtSubject].Valor
Se strSubject = \"\", em seguida,
MsgBox \"digite um assunto\"
Me![txtSubject].SetFocus
GoTo ErrorHandlerExit
End If
strBody = Me![txtBody].Valor
Se strBody = \"\", em seguida,
MsgBox \"digite um corpo da mensagem\"
Me![txtBody].SetFocus
GoTo ErrorHandlerExit
End If
Para cada varItem no lst.ItemsSelected
Verificar endereo de e-mail:
strEMailRecipient = Nz (lst.Coluna (1, varItem))
Debug. Print \"endereo de E-mail:\"
Se strEMailRecipient = \"\", em seguida,
GoTo NextContact
End If
Criar nova mensagem de email e enviar para o contato atual:
Conjunto appOutlook = GetObject (, \"Outlook. Application\")
Set msg = appOutlook.CreateItem(olMailItem)
Com msg
.A = strEMailRecipient
.Assunto = strSubject
.Corpo = strBody
.Exposio
Terminar com
NextContact:
Prxima varItem
ErrorHandlerExit:
Conjunto appOutlook = Nothing
Exit Sub
ErrorHandler:
Outlook no est em execuo; Abra o Outlook com CreateObject :
Se Err. Number = 429 ento
Conjunto appOutlook = CreateObject
83
Organizar e comunicar-se com o Outlook
4
08_047026 ch04.qxp 02\/04\/07 21:42 Page 83
Retomar em seguida
Outra coisa
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End If
End Sub
Private Sub cmdSelectAll_Click()
No erro GoTo ErrorHandler
Conjunto lst = Me![lstSelectContacts]
lngListCount = Me![lstSelectContacts].ListCount
Para lngCount = 0 para lngListCount
LST.Selected(lngCount) = True
LngCount prxima
ErrorHandlerExit:
Exit Sub
ErrorHandler:
MsgBox \"erro nenhum:\"
& Err.Description
Resume ErrorHandlerExit
End Sub
Private Sub cmdDeselectAll_Click()
No erro GoTo ErrorHandler
Conjunto lst = Me![lstSelectContacts]
lngListCount = Me![lstSelectContacts].ListCount
Para lngCount = 0 para lngListCount
LST.Selected(lngCount) = False
LngCount prxima
ErrorHandlerExit:
Exit Sub
ErrorHandler:
MsgBox \"erro nenhum:\"
& Err.Description
Resume ErrorHandlerExit
End Sub
84
Os componentes do Office e o que fazem melhor
Parte I
08_047026 ch04.qxp 02\/04\/07 21:42 Page 84
Se voc preferir enviar as mensagens de e-mail automaticamente (sem revis-las),
substituir o
.Exposio
linha no cdigo com
.Enviar
.
Resumo
Com as tcnicas apresentadas neste captulo, voc pode criar tarefas, compromissos, mensagens de e-mail,
ou itens de jornal de dados em tabelas do Access, permitindo que voc usar o Access como um centro de controle, enquanto
fazendo uso dos itens do Outlook onde eles oferecem uma interface superior, ou so mais amplamente acessvel
para os usurios.
NOTA NOTA
85
Organizar e comunicar-se com o Outlook
4
08_047026 ch04.qxp 02\/04\/07 21:42 Page 85
08_047026 ch04.qxp 02\/04\/07 21:42 Page 86
Escrever cdigo VBA para
Dados do Exchange
entre o escritrio
Componentes
NESTA PARTE
Captulo 5
Trabalhando com dados de acesso
Captulo 6
Trabalhando com documentos do Word
e modelos
Captulo 7
Trabalhando com planilhas do Excel
Captulo 8
Trabalhando com itens do Outlook
Captulo 9
Trabalhando com arquivos e pastas
Captulo 10
Trabalhando com dados externos
Captulo 11
Sincronizando o Outlook e acesso
Contatos
Captulo 12
Indo alm do bsico
09_047026 pt02.qxp 02\/04\/07 21:43 Page 87
09_047026 pt02.qxp 02\/04\/07 21:43 Page 88
EU
n verses mais antigas do Microsoft Office, havia duas opes para trabalho
com dados armazenados em tabelas do Access. Um foi objetos de acesso a dados
(DAO) modelo de objeto, que foi desenvolvido especificamente para trabalhar com
Acessar dados em conjuntos de registros (incluindo os conjuntos de registros do formulrio) e trabalhar com tabela
estrutura usando as tabelas (e campos subsidirios) colees. Por causa de
Estas personalizado recursos, DAO foi o melhor modelo de objeto para trabalhar com
Dados de acesso.
A outra opo para trabalhar com dados de acesso foi (e ) o objeto ADO
modelo, introduzido com o Visual Studio 97 e disponvel para uso no Office 2000
e para cima. Este modelo destina-se para trabalhar com dados em uma ampla variedade
de fontes, incluindo bancos de dados Access. Mas que carece de alguns dos cus-
tomized caractersticas que o tornam to bem adequado para acessar dados, cdigo em ADO do DAO
funciona bem para manipulao de dados bsicos, onde voc no precisa trabalhar com
Acessar conjuntos de registros do formulrio ou criar tabelas e campos (em outras palavras, voc est apenas
trabalhando com dados em tabelas do Access, no com sua estrutura).
Antes do lanamento do 2007 Office, palavra foi que a Microsoft estava caindo
suporte para o modelo de objeto DAO (e na verdade voc pode ver as instrues para
Este efeito em vrios documentos on-line da Microsoft). Eu queria saber se ADO
seria atualizado para trabalhar com conjuntos de registros do formulrio e as tabelas (e sub-
subsidiria campos) coleo (ou algum mtodo alternativo para a criao de tabelas e
seus campos programaticamente), porque existem situaes em que voc precisa
Estas caractersticas do DAO, enquanto trabalha em um banco de dados do Access, ou a criao de um
Acesso Adicionar-in.
89
NESTE CAPTULO
Usando o DAO de antigo e novo
modelos de objeto para trabalhar com
Dados de acesso
Trabalhando com bancos de dados Access
em formatos de 2000 a 2007
Usando o modelo de objeto do ADO para
trabalhar com dados de acesso
Converso de cdigo DAO para
Cdigo ADO
Trabalhando com dados de acesso
10_047026 ch05.qxp 02\/04\/07 21:43 Page 89
Referncias de biblioteca DAO mais de 3.6 no so suportadas no Access 2007. Isto significa
que se voc tem referncias a verses mais antigas do DAO em qualquer formato mais velho databases voc
quer trabalhar no Access 2007, voc precisar redefinir essas referncias para DAO 3.6. Bases de dados que
foram criados no formato do Access 2000 com uma referncia do DAO 3.6, quando aberto no Access 2007, ainda
uma referncia definida para o DAO 3.6 modelo de objeto (como mostrado na Figura 5.1) e seu DAO cdigo de com -
pilhas e corre. O mesmo verdadeiro de bancos de dados de formato de Access 2002\/2003, abertos no Access 2007.
FIGURA 5.1
Uma referncia para o modelo de objeto do DAO 3.6 em um banco de dados do Access 2000 aberto no Access 2007.
Enquanto girou para fora, o modelo de objeto DAO ainda suportado, embora com algumas mudanas. Se voc converter
um formato anterior ao formato do Access 2007 do banco de dados, ou criar um novo banco de dados Access 2007, por padro
Ele tem uma referncia para o modelo de objeto do mecanismo de banco de dados Microsoft Office Access 2007 (nome do arquivo:
ACESSO 2007 DAO.DLL). este novo modelo de objeto (o que eu fizer referncia adiante como Access 2007
DAO) tem a mesma funcionalidade de ncleo que DAO 3.6 (com algumas diferenas, que so discutidos em
a seo de \"Novos objetos em the 2007 DAO objeto modelo de acesso\") e o mesmo modelo de objeto
abreviatura (DAO) para uso em declaraes, Microsoft assim realmente no tem puxado DAO afinal em vez disso,
eles rebatizou, acrescentou um novo objeto e alguns novos atributos e escondeu-se alguns dos componentes que
no esto relacionadas diretamente ao trabalho com dados de acesso.
Isso significa que todo o seu velho DAO cdigo ser executado o mesmo de antes, assim voc no precisar convert-lo
ADO (embora naturalmente voc pode, se voc quiser usar o mais moderno modelo de objeto do ADO) e se
Voc est trabalhando com um banco de dados do Access 2007, voc ter alguns novos componentes de modelo de objeto
que representam os novos recursos do Access 2007.
O banco de dados de amostra para este captulo DAO e ADO amostra Code.accdb. Alm disso
parte do cdigo faz referncia a amostra de banco de dados Northwind 2007.accdb, que
voc pode criar clicando duas vezes o modelo de Northwind.accdt na
C: \/ Arquivos de programa \/
Microsoft Office\/modelos\/1033\/acesso
pasta.
NOTA NOTA
NOTA NOTA
90
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
10_047026 ch05.qxp 02\/04\/07 21:43 Page 90
FIGURA 5.2
A referncia de acesso 2007 DAO padro em um novo banco de dados do Access 2007.
Trabalhando com bancos de dados de formato mais velhos
no Access 2007
Mesmo se voc est usando Access 2007, voc ainda pode estar trabalhando com Access 2002\/2003, para-
esteira de bancos de dados (ou at mesmo banco de dados formato Access 2000) por um tempo. Access 2007 suporta trabalhar
com estes formatos de banco de dados mais velho no modo de leitura\/gravao, e talvez voc precise fazer isso por exemplo,
Se voc estiver trabalhando em um banco de dados para um cliente que esteja executando uma verso anterior do Office. Tanto tempo como voc
no precisa usar nenhum dos novos recursos introduzidos no Access 2007 (tais como a pesquisa de valores mltiplos
campos ou RTF, em campos Memo e anexos), voc pode continuar a trabalhar com bancos de dados em
formato 2000 ou 2002\/2003, no Access 2007 sem convert-los para o novo formato de banco de dados.
Disambiguating referncias ao modelo de objeto
Componentes
Quando DAO foi o nico modelo de objeto que voc pode usar para trabalhar com dados de acesso, quando voc declarou
DAO objetos no havia necessidade para indicar qual modelo de objeto objetos pertenciam a voc
s pode declarar uma varivel de conjunto de registros como o conjunto de registros, ou uma varivel de campo como campo (como no seguinte
declaraes), e seu cdigo iria funcionar bem:
Dim rst como conjunto de registros
Dim fld como campo
Mas desde a introduo do modelo de objeto do ADO, voc pode executar em problemas com tal decla-
raes, porque certos nomes de objeto so usados em ambos estes modelos de objeto. Isso verdadeiro para o
91
Trabalhando com dados de acesso
5
10_047026 ch05.qxp 02\/04\/07 21:43 Page 91
novo modelo de objeto do Access 2007 DAO como o velho modelo de objeto DAO. Se voc comparar o
Acesso 2007 DAO (ou DAO) e modelos de objeto do ADO, voc vai ver o conjunto de registros, o parmetro e o campo
objetos em ambos.
Quando seu cdigo compilado, se as declaraes no incluem o modelo de objeto, a primeira referncia
na lista de referncias que contm esse objeto usado o nome, e no pode ser um direito. Em
Access 2000 e XP (talvez prematuramente), novos bancos de dados tinham uma referncia padro apenas para o ADO
modelo de objeto, o que levou a muitos problemas para usurios e desenvolvedores que estavam trabalhando principalmente
ou exclusivamente com DAO (Ver Figura 5.3). No entanto, se voc criar um novo banco de dados no Access 2003, no
o formato de banco de dados do Access 2002\/2003, por padro ele ter referncias conjunto para ambos o DAO e
Modelos de objeto do ADO, nessa ordem, como mostrado na Figura 5.4.
FIGURA 5.3
As referncias padro para um novo banco de dados do Access 2002 (XP).
Isso significa que todas as variveis do conjunto de registros, o campo e o parmetro declararam sem um objeto modelo ref-
ERNCIA ser interpretada como pertencentes ao modelo de objeto DAO, que pode no ser correto.
Se seu banco de dados foi criado no Access 2000 ou XP, e voc no definir uma referncia para o DAO
modelo de objeto, voc ter o problema oposto variveis Recordset, o campo e o parmetro sero
ser interpretado como pertencentes ao modelo de objeto do ADO, que pode causar problemas quando se trabalha
com mtodos e propriedades do objeto DAO.
92
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
10_047026 ch05.qxp 02\/04\/07 21:43 Page 92
FIGURA 5.4
As referncias padro para um novo banco de dados do Access 2003.
Ao usar um o
Find *
(mtodos de pesquisa
FindFirst FindNext
, e assim por diante),
salvar a seqncia de caracteres de Pesquisar a uma varivel e exibi-lo na janela Immediate usando um
Debug. Print
instruo; isso ser muito til na depurao de problemas porque ele mostra
exatamente o que a expresso est sendo usado para a pesquisa.
Se voc estiver trabalhando em um banco de dados criado originalmente vrias verses de acesso atrs, poderia ter
declaraes ambguas, tais como:
Dim dbs como banco de dados
Dim rst como o conjunto de registros
Como uma demonstrao de possveis problemas, o procedimento a seguir configura um conjunto de registros e usa
FindFirst para localizar a primeira partida para \"Microsoft\" no campo CompanyID:
Private Sub TestFindFirst()
Dim dbs como banco de dados
Dim rst como o conjunto de registros
Dim strSearch As String
Conjunto dbs = CurrentDb
Set rst = dbs.OpenRecordset (nome: = \"tblCompanyIDs\", _
Digite: = dbOpenDynaset)
strSearch = \"[CompanyID] =\"
& Microsoft & Chr$(39)
Debug. Print \"string de busca:\"
RST.FindFirst strSearch
End Sub
DICA DICA
93
Trabalhando com dados de acesso
5
10_047026 ch05.qxp 02\/04\/07 21:43 Page 93
Se voc tem uma referncia definida apenas para o modelo de objeto do ADO, esse cdigo no vai mesmo compilar e voc
receber um erro de \"tipo definido pelo usurio no definido\". Se voc tem referncias conjunto para ambos modelos de objeto,
e a referncia ADO o primeira, voc obter um erro diferente, desta vez na linha com o
FindFirst mtodo de referncia: \"mtodo ou membro de dados no encontrado.\" Se voc tiver apenas um DAO se referem-
ENCE, ou a referncia do DAO posicionado acima da referncia de ADO, o cdigo ser compilado e executado.
Se voc receber um \"tipo definido pelo usurio no definido\" ou \"mtodo ou membro de dados no encontrado\"
mensagem de erro ao compilar o cdigo, isto , quase sempre, uma indicao de uma falta ou
referncia de verso do modelo de objeto incorreto.
Um problema mais sutil pode resultar de uma declarao ambgua do objeto campo. H um
Objeto de campo de modelos de objeto do ADO e DAO, mas possui mtodos e propriedades diferentes
em cada objeto modelo (ver as figuras 5.5 e 5.6), para que pudesse de uma linha de cdigo para referenciar uma propriedade de campo
levar a um erro se essa propriedade no oferece suporte o modelo de objeto que est sendo usado.
Embora a interface do Access 2007 muito diferente do que a interface que voc pode ser
costumava-se, que se manteve praticamente o mesmo do Access 2000 atravs de acesso
2003, a janela do Visual Basic (mdulos) alterada, exceto que a roda do mouse agora funciona
(sobre o tempo!).
NOTA NOTA
DICA DICA
94
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
Usando o pesquisador de objetos
T
Object Browser uma ferramenta muito til para anlise de modelos de objeto e de seus componentes. Ele pode
ser aberto em uma janela do Visual Basic no Access, Word, Excel ou Outlook de um comando em
no menu exibir ou pressionando a tecla F2. A lista drop-down no canto superior esquerdo lista o objeto disponvel
bibliotecas (correspondente s referncias que voc definiu no banco de dados); a lista suspensa inferior
uma caixa de pesquisa onde voc pode digitar o nome de um componente de modelo de objeto ou atributo para Pesquisar;
clicando no boto binculos inicia a pesquisa e os resultados so exibidos nos resultados da pesquisa
caixa, como na figura a seguir. A lista de Classes mostra os membros da biblioteca de objetos selecionados, e
os membros da lista de 'Campo' mostra os atributos (Propriedades, mtodos e eventos) do selecionado
componente modelo de objeto.
Se voc clicar no boto de ponto de interrogao amarelo, voc geralmente ter um tpico da ajuda para o objeto selecionado
ou atributo, mas voc no pode depender isso s vezes, tudo que voc tem uma janela de ajuda em branco. Na
caso de ADO, em verses anteriores do Access, se voc definir uma referncia para a verso mais recente deste
biblioteca (2.8 naquele tempo), voc iria ficar em branco pginas de ajuda; Se voc definir uma referncia ao ADO 2.5, como -
nunca, voc obteria o tpico da ajuda apropriado. Em 2007, acessar, se voc definir uma referncia para o mais alto
verso do ADO (6.0), voc receber um \"no possvel exibir a ajuda\" mensagem de erro ao clicar a ajuda
boto. Se voc definir uma referncia ao ADO 2.5, clicando no boto de ajuda abre o \"Browse acesso
Tela de ajuda do desenvolvedor\", ao invs do tpico de ajuda especfica para o modelo de objeto selecionado compo-
maes ou atributo.
Figura 5.5 mostra os atributos do objeto ADO campo no Pesquisador de objetos.
10_047026 ch05.qxp 02\/04\/07 21:43 Page 94
FIGURA 5.5
Os atributos do objeto do campo no modelo de objeto do ADO.
H muitas mais propriedades para o objeto de campo no modelo de objeto DAO (Figura 5.6), corre-
tipo de propriedades especficas do campo de acesso; as propriedades do campo de ADO so mais genricas, porque
ADO suporta dados em muitas aplicaes diferentes.
A soluo para os problemas de referncia ambgua discutido anteriormente simples: incluir o objeto
nome do modelo em declaraes de variveis DAO e ADO, como as seguintes declaraes para o DAO
variveis (3.6 DAO ou DAO acesso a 2007). Isso chamado de disambiguating as declaraes:
Dim rst como DAO.Conjunto de registros
Dim fld como DAO.Campo
Aqui est a verso do ADO (note que o nome do modelo de objeto no ADO, como se poderia pensar, mas
ADODB):
Dim rst como ADODB.Conjunto de registros
Dim fld como ADODB.Campo
95
Trabalhando com dados de acesso
5
10_047026 ch05.qxp 02\/04\/07 21:43 Page 95
FIGURA 5.6
Os atributos do objeto campo no modelo de objeto DAO.
Eu prefiro sempre incluir o nome do modelo de objeto de declaraes, mesmo se o objeto em questo
s aparece no modelo de um objeto, para a consistncia e no caso de que o objeto de nome pode ser usado em
algum outro modelo de objeto que eu poderia precisar para referncia no futuro.
O objeto DAO modelo (antigo e novo)
O modelo de objeto do DAO 3.6 (mostrado na Figura 5.7) foi listado como preteridos pela Microsoft,
o que geralmente significa que em breve ser obsoleto (no suportado). Ainda DAO 3.6 ainda suportado
no Access 2007, pelo menos para bancos de dados criados no formato do Access 2000 ou Access 2002\/2003, por isso
Vale a pena documentar, porque voc pode precisar continuar trabalhando com mais velhos Formatar bancos de dados para
compatibilidade com outros usurios que ainda no atualizou para o Access 2007.
O modelo de objeto DAO tem muitos componentes; para fins deste livro, examinarei detalhadamente
somente os componentes principais usados para acessar dados de referncia QueryDefs, bancos de dados, conjuntos de registros, e
TableDefs.
O novo modelo de objeto do Access 2007 DAO omite (na verdade, oculta) alguns de menos freqentemente usado
componentes do DAO 3.6 modelo de objeto e adiciona alguns novos. Esse modelo de objeto agora
especificamente focada em trabalhar com dados em tabelas do Access, sempre seu ponto forte.
96
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
10_047026 ch05.qxp 02\/04\/07 21:43 Page 96
FIGURA 5.7
O modelo de objeto do DAO 3.6.
Novos objetos no modelo de objeto do Access 2007 DAO
H trs novos objetos no novo modelo: ComplexType campo2 , , e
Recordset2 . Esses objetos so descritos nas sees a seguir.
ComplexType
O ComplexType objeto representa um campo de valores mltiplos e tem sua prpria coleo de campos para armazenar
os valores.
Campo2
Este objeto representa um campo em um banco de dados do Access 2007. Tem os novos atributos descritos na
Tabela 5.1, em comparao com a propriedade de campo, que representa um campo em um Access 2000 ou Access
banco de dados de 2002\/2003.
DBEngine
Erros
Espaos de trabalho
Erro
Espao de trabalho
Bancos de dados Banco de dados
Recipientes Recipiente
Documentos Documento
Conjuntos de registros Conjunto de registros
Campos Campo
Relaes Relao
Campos Campo
Grupos Grupo
Usurios Usurio
Usurios Usurio
Grupos Grupo
TableDefs TableDef
Campos Campo
ndices ndice
Campos Campo
QueryDefs QueryDef
Campos Campo
Parmetros Parmetro
97
Trabalhando com dados de acesso
5
10_047026 ch05.qxp 02\/04\/07 21:43 Page 97
TABELA 5.1
Novos atributos do objeto campo2
Tipo de atributo Nome Notas
Propriedade AppendOnly Obtm ou define um valor booleano que indica se o especificado
campo definido como acrescentar novos valores o contedo existente do campo
como eles so adicionados (leitura\/gravao).
Propriedade ComplexType Representa um campo de valores mltiplos (somente leitura).
Propriedade IsComplex Retorna um valor booleano que indica se o campo especificado
um tipo de dados com valores mltiplos (somente leitura).
Mtodo LoadFromFile Carrega o arquivo especificado do disco.
Mtodo SaveToFile Salva um anexo para o disco.
Recordset2
O Recordset2 objeto representa um conjunto de registros com base em dados do Access 2007. Em comparao com o
velho Conjunto de registros opor-se, que ele tem apenas uma propriedade nova, ParentRecordset , representando a par -
ent o conjunto de registros do conjunto de registros especificado.
Objetos escondidos no modelo de objeto do Access 2007 DAO
As propriedades e os mtodos listados na tabela 5.2 so escondidos no novo objeto DAO de acesso 2007
modelo. Os objetos de recipiente, DBEngine e espao de trabalho so visveis; somente as propriedades listadas e
mtodos para esses objetos so invisveis. Os objetos de usurio e de grupo e os grupos e usurios col-
explanador totalmente invisveis.
TABELA 5.2
Componentes de banco de dados escondidos no Microsoft Office 2007
Modelo de objeto de mecanismo de banco de dados de acesso
Objeto ou coleo Propriedades Mtodos Constantes
Recipiente AllPermissions
Herdar
Proprietrio
Permisses
Nome de usurio
DBEngine SystemDB
98
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
10_047026 ch05.qxp 02\/04\/07 21:43 Page 98
Objeto ou coleo Propriedades Mtodos Constantes
Grupo\/grupos
Usurio\/usurios
Espao de trabalho Grupos CreateGroup
Nome de usurio CreateUser
Usurios
WorkspaceTypeEnum dbUseODBC
Bancos de dados
Ao trabalhar com dados de acesso, um objeto de banco de dados DAO representa (nenhuma surpresa!) um dados de acesso-
base. (Para trabalhar com outros tipos de dados, use o modelo de objeto do ADO). Para a corrente de referncia
banco de dados, voc pode usar o CurrentDb mtodo do objeto aplicativo Access, depois de declarar a
varivel apropriada de banco de dados DAO, como no cdigo a seguir:
Dim dbs como DAO.Banco de dados
Conjunto dbs = CurrentDb
Se voc precisar fazer referncia a um banco de dados externo, usar o OpenDatabase mtodo, com o nome de
um banco de dados aberto como seu argumento, como no cdigo a seguir:
Dim dbs como DAO.Banco de dados
Dim strDBName As String
strDBName = \"E:\/Documents\/Northwind.mdb\"
Conjunto dbs = OpenDatabase(Name:=strDBName)
Uma vez que o banco de dados estiver aberto, voc pode continuar a trabalhar com ele, usando os conjuntos de registros, QueryDefs, e
Colees de TableDefs.
Conjuntos de registros
Conjuntos de registros so usados para manipular dados em bancos de dados do Access; eles representam os registros em tabelas ou
consultas em um banco de dados. Existem cinco tipos de conjuntos de registros DAO, com propriedades diferentes, conforme descrito
nas sees a seguir. Especificar o tipo de conjunto de registros usando a constante apropriada para o tipo de
argumento ao criar um conjunto de registros, como no cdigo a seguir:
Set rst = dbs.OpenRecordset (nome: = \"tblOrders\", _
Digite: = dbOpenDynaset)
Tabela 5.3 listas constantes nomeadas, correspondente os cinco tipos de conjunto de registros (e seu numrico
equivalentes). Estas constantes nomeadas so usadas no cdigo VBA; alguns dialetos do Visual Basic, tais como
99
Trabalhando com dados de acesso
5
10_047026 ch05.qxp 02\/04\/07 21:43 Page 99
VBScript (VBS), no suportam constantes nomeadas, ento voc precisar usar os valores numricos em vez disso, para
exemplo, quando escrever cdigo VBS Outlook ou Windows Script Host (WSH).
Consulte o captulo 17 para obter exemplos de cdigo WSH.
TABELA 5.3
Tipo de conjunto de registros DAO argumentos nomeados
Tipo de conjunto de registros Constante nomeada Valor numrico
Tabela dbOpenTable1
Dynaset dbOpenDynaset 2
Instantneo dbOpenSnapshot 4
Forward-only dbOpenForwardOnly 8
Dinmica dbOpenDynamic 16
Se voc no especificar um tipo de conjunto de registros, DAO assume o primeiro lugar que voc pretende criar um tipo de tabela
conjunto de registros, e se isso impossvel, ento um dynaset, um instantneo, em seguida um conjunto de registros Avanar-only.
Os conjuntos de registros do tipo dynaset e tabela so os tipos mais comumente usados.
Tabela
Conjuntos de registros do tipo tabela representam a base tabelas (ou seja, localizada dentro do banco de dados do qual
o cdigo est sendo executado, em oposio a tabelas vinculadas). Voc pode adicionar, editar ou excluir registros de uma tabela
usando um conjunto de registros do tipo tabela. Esses conjuntos de registros no suportam o Encontrar mtodos ( FindFirst ,
FindLast FindNext FindPrevious , , ); em vez disso, eles apiam o Procurar mtodo.
Para executar um dos procedimentos do banco de dados DAO e ADO cdigo de exemplo, coloque seu
cursor dentro do procedimento e pressione F5 ou selecione executar Sub\/UserForm da execuo
menu na janela do Visual Basic.
Se voc no receber uma resposta ao pressionar uma tecla de funo, teclas de funo podem ser desativadas;
alguns teclados mais recentes desativar teclas de funo padro. Para ativar as teclas de funo, pressione
a tecla F Lock.
O seguinte cdigo de segmento procura o registro com um valor especfico (Obtida de um
InputBox) no CompanyID de campo e, se ele for encontrado, exibe o valor do ID\/AccountNumber
campo para esse registro em uma caixa de mensagem:
Private Sub ListID()
Dim dbs como DAO.Banco de dados
Dim rst como DAO.Conjunto de registros
DICA DICA
NOTA NOTA
REFERNCIA CRUZADA REFERNCIA CRUZADA
100
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
10_047026 ch05.qxp 02\/04\/07 21:43 Page 100
Dim strValue As String
Dim strPrompt As String
Dim strTitle As String
Conjunto dbs = CurrentDb
Set rst = dbs.OpenRecordset (nome: = \"tblCompanyIDs\", _
Digite: = dbOpenTable)
RST.Index = \"CompanyID\"
EnterID:
strValue = InputBox (prompt: = \"Por favor, introduza um ID de empresa\", _
Ttulo: = \"ID da empresa\", padro: = \"TEAC\")
RST.Buscar comparao: = \"=\", key1: = strValue
Se rst.NoMatch = True, em seguida,
strPrompt = \"No foi possvel localizar\"
; por favor, tente novamente\"
strTitle = \"Pesquisar falhado\"
MsgBox prompt: = strPrompt, botes: = _ vbCritical
+ vbOKOnly, ttulo: = strTitle
GoTo EnterID
Outra coisa
strPrompt = \"O ID do primeiro para\"
& is & rst![ID/AccountNumber]
strTitle = \"Pesquisar sucedido\"
MsgBox prompt: = strPrompt, botes: = vbOKOnly _
+ vbInformation, ttulo: = strTitle
End If
End Sub
Figura 5.8 mostra a caixa de mensagem com o ID da empresa selecionada.
FIGURA 5.8
Uma caixa de mensagem exibindo um ID para uma empresa selecionada.
Dynaset
Conjuntos de registros do tipo dynaset representam os resultados de consultas atualizveis, possivelmente com base em mais de
uma tabela. Voc pode usar esses conjuntos de registros para adicionar, editar ou excluir registros de uma ou mais tabelas base.
Suportam a conjuntos de registros do tipo dynaset mais flexvel Encontrar mtodos ( FindFirst FindLast , ,
101
Trabalhando com dados de acesso
5
10_047026 ch05.qxp 02\/04\/07 21:43 Page 101
FindNext FindPrevious , ); ao contrrio do Procurar mtodo para o tipo de tabela dynasets, voc no precisa
definir um ndice, e voc pode pesquisar por um valor em qualquer campo no conjunto de registros. Aqui est um exemplo em
que o cdigo procura o ltimo registro com um valor correspondente no campo IDLabel e exibe
a identificao da empresa para esse registro em uma caixa de mensagem:
Private Sub ListCompany()
Dim dbs como DAO.Banco de dados
Dim rst como DAO.Conjunto de registros
Dim strValue As String
Dim strPrompt As String
Dim strTitle As String
Dim strSearch As String
EnterID:
strValue = InputBox (prompt: = \"Digite um rtulo de identificao\", _
Ttulo: = \"Etiqueta de identificao\", padro: = \"Endereo de email\")
strSearch = \"[IDLabel] =\"
& Chr$(39)
Debug. Print \"string de busca:\"
Conjunto dbs = CurrentDb
Set rst = dbs.OpenRecordset (nome: = \"tblCompanyIDs\", _
Digite: = dbOpenDynaset)
RST.FindLast strSearch
Se rst.NoMatch = True, em seguida,
strPrompt = \"No foi possvel localizar\"
; por favor, tente novamente\"
strTitle = \"Pesquisar falhado\"
MsgBox prompt: = strPrompt, botes: = _ vbCritical
+ vbOKOnly, ttulo: = strTitle
GoTo EnterID
Outra coisa
102
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
Estilos de argumento
W
galinha escrever cdigo VBA, voc tem duas opes de estilo: usando nomes de argumento (como eu fao na maioria dos
os procedimentos neste livro), que mais detalhado, mas permite ignorar argumentos com-
fora causando erros de sintaxe; ou omitindo nomes de argumento, caso em que voc tem que se certificar de que voc
ter o nmero certo de vrgulas entre os argumentos, com espaos entre vrgulas representa-
ing os argumentos que voc no est usando. Eu prefiro usar nomes de argumento para maior clareza, mesmo que ele faz
meu cdigo um pouco mais.
Se voc usar um nome de argumento, voc deve usar nomes de argumento para todos os argumentos de uma funo ou
o mtodo utilizado no permitido misturar e combinar.
10_047026 ch05.qxp 02\/04\/07 21:43 Page 102
strPrompt = \"O ltimo ID de empresa para\"
& is & rst![CompanyID]
strTitle = \"Pesquisar sucedido\"
MsgBox prompt: = strPrompt, botes: = vbOKOnly _
+ vbInformation, ttulo: = strTitle
End If
End Sub
Instantneo
Um conjunto de registros do tipo snapshot uma cpia somente leitura de um conjunto de registros, til apenas para exibir dados ou
gerao de relatrios. O procedimento a seguir se move atravs de um conjunto de registros com base em uma tabela, escrita
os valores em vrios campos para a janela imediata, usando as constantes do VB vbCrLf e vbTab
para criar quebras de linha e recuos para melhor legibilidade:
Private Sub ListValues()
Dim dbs como DAO.Banco de dados
Dim rst como DAO.Conjunto de registros
Conjunto dbs = CurrentDb
Set rst = dbs.OpenRecordset (nome: = \"tblCompanyIDs\", _
Digite: = dbOpenSnapshot)
Fazer enquanto no rst.EOF
Debug. Print \"ID da empresa:\"
& vbCrLf & vbTab & ID Label: & rst![IDLabel] _
& vbCrLf & vbTab & ID/Account No.: _
& rst![ID/AccountNumber] & vbCrLf
RST.MoveNext
Loop
End Sub
Os resultados da execuo deste procedimento para que dois registros so listados a seguir:
ID empresa: MS Office
Etiqueta de ID: ID de CIS
ID\/Conta n : 70304,3633
ID empresa: Fisher consultoria
Etiqueta de ID: Endereo de email
ID\/Conta n : Rfisher@RickWorld.com
Ao contrrio de conjuntos de registros do tipo table e tipo dynaset, voc pode trabalhar com um mesmo conjunto de registros do tipo instantneo
tabela subjacente aberta, o que ocasionalmente pode ser til.
103
Trabalhando com dados de acesso
5
10_047026 ch05.qxp 02\/04\/07 21:43 Page 103
Forward-only
Avanar-only de conjuntos de registros so semelhantes aos conjuntos de registros do tipo instantneo, exceto que voc apenas move
atravs dos registros no sentido progressivo.
Dinmica
Conjuntos de registros dinmicos representam os resultados de consultas atualizveis, possivelmente com base em mais de um
tabela. Voc pode usar esses conjuntos de registros para adicionar, editar ou excluir registros de uma ou mais tabelas base, e
assim pode a outros usurios.
QueryDefs
QueryDefs correspondem a consultas na interface de acesso. Embora voc pode criar tipo dynaset
conjuntos de registros baseiam diretamente em consultas, e para consultas select que funciona bem, QueryDefs oferecer extra
funcionalidade: voc pode criar uma consulta em tempo real, no cdigo do VBA (por exemplo, para filtrar por um valor
entrou ou selecionado em um formulrio) e, em seguida, usar esse QueryDef como fonte de dados para um conjunto de registros. Voc
pode at mesmo criar uma consulta criar tabela no cdigo e execut-lo para criar uma tabela, para as circunstncias
onde voc precisa de uma tabela para trabalhar com. Isso elimina a necessidade de inmeras consultas filtradas, e
tambm permite que voc trabalhe em torno de vrios problemas com a criao de conjuntos de registros com base em consultas de parmetro.
O procedimento a seguir cria um QueryDef programaticamente, usando uma seqncia de caracteres SQL de dados
fonte e retorna o nmero de registros; til para determinar se h algum
registros em uma consulta filtrada, antes de tomar uma ao. Eu chamo este procedimento com freqncia no cdigo na
bancos de dados de amostra para este livro:
Pblico funo CreateAndTestQuery(strTestQuery As String, _
strTestSQL As String) como longo
Em erro continuar prximo
Exclua consulta antiga:
Conjunto dbs = CurrentDb
DBS.QueryDefs.Delete strTestQuery
No erro GoTo ErrorHandler
Crie nova consulta:
Conjunto qdf = dbs.CreateQueryDef (nome: = strTestQuery, _
SQLTEXT: = strTestSQL)
Teste se h quaisquer registros:
Set rst = dbs.OpenRecordset(Name:=strTestQuery)
Com rst
104
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
10_047026 ch05.qxp 02\/04\/07 21:43 Page 104
.MoveFirst
.MoveLast
CreateAndTestQuery =.RecordCount
Terminar com
ErrorHandlerExit:
Exit Function
ErrorHandler:
Se Err. Number = 3021, em seguida,
CreateAndTestQuery = 0
Resume ErrorHandlerExit
Outra coisa
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End If
End Function
Aqui um segmento de cdigo tpico usando a funo CreateAndTestQuery:
strInventoryCode = Me![InventoryCode]
strQuery = \"qryTemp\"
Conjunto dbs = CurrentDb
strSQL = \"SELECT * tblInventoryItemsComponents _
ONDE [InventoryCode] = \"
& strInventoryCode & Chr$(39) & ;
Debug. Print \"SQL\"
lngCount = CreateAndTestQuery (strQuery, strSQL)
Debug. Print \"n itens encontrados: \"
Se lngCount = 0 ento
strPrompt no = \"nenhum registro encontrado; cancelamento\"
strTitle = \"Cancelamento\"
MsgBox strPrompt, vbOKOnly + vbCritical, strTitle
GoTo ErrorHandlerExit
Outra coisa
' Mais cdigo aqui para trabalhar com a recm-criado consulta
End If
O cdigo cria uma seqncia de caracteres SQL filtrada por um valor que pegou de uma forma e usa essa cadeia de caracteres e um
nome da consulta como argumentos para o CreateAndTestQuery funo. Essa funo retorna num-
ber de registros; se no h registros (a funo retorna zero), o cdigo fechado; caso contrrio, ele pode
continuar a executar alguma ao sobre a consulta criada pelo CreateAndTestQuery funo.
Voc tambm pode criar um QueryDef e us-lo diretamente para criar um conjunto de registros, como na linha seguinte
de cdigo:
Set rst = qdf.OpenRecordset
105
Trabalhando com dados de acesso
5
10_047026 ch05.qxp 02\/04\/07 21:43 Page 105
Nomes de argumento inconsistente so capitalizados no cdigo VBA. Independentemente de como voc digita
em, quando o cursor sai da linha de cdigo, algum argumento nomes so capitalizados
(como \"nome\") e alguns no so (como \"sqltext\"). A capitalizao no coincide com o capital-
rgal dos argumentos em seus tpicos de ajuda, onde eles geralmente so representados como em minsculas.
Voc tambm pode criar um QueryDef correspondente a uma consulta de ao e execut-lo diretamente do cdigo, a
criar uma tabela para uso em outro lugar no cdigo em vez de uma consulta de parmetro, para evitar erros que vai
ocorra se um critrio de consulta est procura de um valor em um formulrio que fechado quando o cdigo executado:
strFilter = \"[DataDaFatura] = #\"
strSQL = \"SELECT [InvoiceNo], InvoiceDate, _
Cliente, empregado \"_
& INTO tmakMatchingRecords _
& FROM tblInvoices _
& WHERE & strFilter & ;
Debug. Print \"seqncia SQL:\"
Conjunto qdf = dbs.CreateQueryDef (nome: = strQuery, _
SQLTEXT: = strSQL)
QDF.Executar
Voc pode criar um QueryDef sem nome, usando apenas aspas, como nesta linha
de cdigo:
Definir qdfTemp = dbs.CreateQueryDef (nome: = \"\", _
SQLTEXT: = strSQL)
No entanto, geralmente prefiro criar uma consulta nomeada, para que eu possa examin-lo na interface de depurao-
Ging efeitos, se necessrio.
TableDefs e campos
TableDefs correspondem s tabelas na interface. Embora seja muito mais comum a necessidade de cre-
comeu uma consulta por meio de programao, s vezes, talvez voc precise criar uma tabela no cdigo. Quando voc cria
uma nova tabela, voc tambm precisar criar campos para ele. O cdigo a seguir cria uma nova tabela em um exter-
nal database, com vrios campos de tipos de dados diferentes. Cada campo criado (e seu valor padro
definir, para dois deles) e, em seguida, acrescentado nova tabela. Um manipulador de erro retorna ao usurio
a caixa de entrada onde inserido o novo nome de tabela, no caso de uma tabela de mesmo nome j existe no
o banco de dados. Finalmente, todos os TableDefs no banco de dados esto listados para a janela imediata, com o
nova tabela como a ltima entrada na lista:
Private Sub NewTable()
Em erro continuar prximo
Dim dbsNorthwind como DAO.Banco de dados
Dim tdfNew como DAO.TableDef
Dim fld como DAO.Campo
DICA DICA
NOTA NOTA
106
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
10_047026 ch05.qxp 02\/04\/07 21:43 Page 106
Dim strDBName As String
Dim strDBNameAndPath As String
Dim strPrompt As String
Dim strTitle As String
Dim strTable As String
Dim strCurrentPath As String
Dim fso como scripting. FileSystemObject novo
Dim fil como Scripting.File
strCurrentPath = Application.CurrentProject.Path
strDBName = \"Northwind 2007.accdb\"
strDBNameAndPath = strCurrentPath
Tente encontrar o banco de dados e colocar uma mensagem se no for encontrado.
Conjunto fil = fso.GetFile(strDBNameAndPath)
Se o fil nada ento
strPrompt = \"No pode encontrar\"
& strCurrentPath
& ; to create this database, double- _
& click the Northwind.accdt template in the _
& C:\Program Files\Microsoft
Pasta Office\/modelos\/1033\/acesso\"
MsgBox strPrompt, vbCritical + vbOKOnly
GoTo ErrorHandlerExit
End If
No erro GoTo ErrorHandler
Definir dbsNorthwind = OpenDatabase(Name:=strDBNameAndPath)
NameNewTable:
strPrompt = \"Por favor insira o novo nome de tabela\"
strTitle = \"Nome da tabela\"
strTable = InputBox (prompt: = strPrompt, ttulo: = strTitle, _
Padro: = \"tblNew\")
Com dbsNorthwind
Crie nova tabela.
Definir tdfNew = _
dbsNorthwind.CreateTableDef(Name:=strTable)
Criar campos e acrescent-las nova tabela.
Com tdfNew
Set fld =.CreateField (nome: = \"EmployeeID\", _
Digite: = dbLong)
107
Trabalhando com dados de acesso
5
10_047026 ch05.qxp 02\/04\/07 21:43 Page 107
.Fields.Append fld
Set fld =.CreateField (nome: = \"Departamento\", _
Digite: = dbText, tamanho: = 14)
.Fields.Append fld
Set fld =.CreateField (nome: = \"Shift\", _
Digite: = dbText, tamanho: = 20)
.Fields.Append fld
Set fld =.CreateField (nome: = \"AnnualBonus\", _
Digite: = dbCurrency)
FLD.DefaultValue = 500
.Fields.Append fld
Set fld =.CreateField (nome: = \"ShiftSupervisor\", _
Digite: = dbBoolean)
FLD.DefaultValue = False
.Fields.Append fld
Terminar com
Adicione nova tabela coleo TableDefs.
.Objeto TableDefs.Append: = tdfNew
Terminar com
Lista o TableDefs no banco de dados depois acrescentando a nova tabela.
Debug. Print \"TableDefs no\"
Para cada tdf em dbsNorthwind.TableDefs
Debug. Print vbTab
Prxima tdf
dbsNorthwind.Close
ErrorHandlerExit:
Exit Sub
ErrorHandler:
Se Err. Number = 3010 ento
strPrompt = \"Tabela nome j usado;\" _
& please enter another name
strTitle = \"Duplicar nome de tabela\"
MsgBox prompt: = strPrompt, _
Botes: = vbExclamation + vbOKOnly, ttulo: = strTitle
GoTo NameNewTable
Outra coisa
MsgBox \"erro nenhum:\"
& Err.Description
Resume ErrorHandlerExit
End If
End Sub
108
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
10_047026 ch05.qxp 02\/04\/07 21:43 Page 108
Aqui est a lista de tabelas, como impresso para a janela imediata a NewTable procedimento:
MSysAccessStorage
MSysACEs
MSysComplexColumns
MSysNavPaneGroupCategories
MSysNavPaneGroups
MSysNavPaneGroupToObjects
MSysNavPaneObjectIDs
MSysObjects
MSysQueries
MSysRelationships
Detalhes do pedido
Ordens
Produtos
Carregadores
Fornecedores
tblNew
Se voc abrir o tblNew no modo folha de dados, voc ver um zero no ShiftSupervisor Boolean
campo. Se voc preferir Ver verdadeiro\/falso ou sim\/no, valores, voc ter que selecionar o formato
de sua escolha manualmente; o
CreateField
mtodo no tem um argumento para a criao do dis-
formato para um campo de jogo.
NOTA NOTA
109
Trabalhando com dados de acesso
5
Outras maneiras de criar tabelas por meio de programao
EU
adio de n para o
CreateTableDef
mtodo, existem trs outras maneiras de criar tabelas de acesso em
Cdigo VBA:
O
CopyObject
mtodo do objeto DoCmd no modelo de objeto do Access cria um novo
tabela baseada em uma tabela existente.
Executar uma consulta criar tabela usando o
OpenQuery
ou
ExecutarSQL
mtodo do DoCmd
objeto, ou a
Executar
mtodo de objeto QueryDef, cria uma nova tabela como a sada de
a consulta.
Uma instruo de Jet SQL CREATE TABLE, como no cdigo a seguir, pode ser usada para criar um
tabela:
strSQL = \"CREATE TABLE\"
\"(Nomedoformulrio texto (100), usar YESNO);\"
StrSQL DoCmd.RunSQL
Comparado com estas tcnicas, o
CreateTableDef
mtodo d a voc o mximo controle
sobre campos a nova tabela e suas propriedades. No entanto, criar uma tabela, sero anexada ao
a coleo TableDefs e ele vai aparecer no grupo tabelas da janela Banco de dados.
10_047026 ch05.qxp 02\/04\/07 21:43 Page 109
O modelo de objeto do ADO
O modelo de objeto do ADO muito mais simples do que o modelo de objeto DAO; Ele usado para se conectar a um
grande variedade de fontes de dados, ento no personalizado para acessar os dados, como o DAO modelo de objeto .
No entanto, com algumas excees (trabalhando com conjuntos de registros do formulrio e criando tabelas programmati-
camente), voc pode manipular dados do Access com o ADO da mesma forma com DAO.
Conexo
Embora o modelo de objeto do ADO no hierrquico (ao contrrio do modelo de objeto DAO), a
Objeto de conexo o objeto da Fundao, porque as conexes so a ligao de dados em bancos de dados.
No conjunto de registros DAO, o
BOF
Propriedade representa o incio do conjunto de registros
(Incio do arquivo) e o
EOF
(Fim do arquivo) propriedade representa o final.
O handy NoMatch Propriedade de conjuntos de registros DAO falta de ADO; em vez disso, voc tem que deter-
mina ou no uma busca bem-sucedida examinando onde o cursor est. Por exemplo, em fazer
um achado, a partir do incio do recordset (BOF) e avanar, se o cursor termina
se no final do conjunto de registros (EOF), a busca foi infrutfera. Aqui est algum cdigo de amostra para
ilustrar esta tcnica; se a pesquisa for bem sucedida, isto significa que a proposta de nova categoria
nome j foi usado, Considerando que se o cursor acaba no final do conjunto de registros (EOF), o
Pesquisar no teve xito, e o novo registro pode ser criado usando o novo nome de categoria no
strSearch varivel (o segmento de cdigo parte do TestKeysetOptimistic procedimento,
que listado mais adiante neste captulo):
RST.Encontrar strSearch
Se rst.EOF = False Then
strPrompt = Chr$(39)
& Chr$(39) & already used; _
& please enter another category _
& name
strTitle = \"Categoria\"
MsgBox prompt: = strPrompt, _
Botes: = vbExclamation + vbOKOnly, _
Ttulo: = strTitle
GoTo CategoryName
Os tabelas coleo e a forma de conjuntos de registros no so suportados no ADO, assim voc ter de continuar a
Use DAO (o velho DAO 3.6 ou o novo modelo de objeto do Access 2007 DAO) para trabalhar com eles.
Se voc no fechar e conjunto para objetos de banco de dados ou conjunto de registros DAO nada, extremamente
improvvel que voc ter problemas; no entanto, se voc deixar conexes ADO e
abrir conjuntos de registros, na prxima vez que voc executa o cdigo, voc pode receber essa mensagem de erro (com seu logon
nome e nome do computador), e voc ter que fechar para baixo e reabra o banco de dados para obter o cdigo
trabalhando novamente: \"o banco de dados foi colocado em um Estado pelo usurio 'Admin' na mquina
\"DELL_DIMEN_8300' que impede que ele seja aberto ou fechado.\" Os procedimentos de ADO da amostra ter
cdigo para fechar qualquer conexo aberta ou conjunto de registros em seus manipuladores de erro.
DICA DICA
NOTA NOTA
110
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
10_047026 ch05.qxp 02\/04\/07 21:43 Page 110
A sintaxe para criar uma conexo com o banco de dados atual simples:
Dim cnn como ADODB.Conexo
Set cnn = CurrentProject
A sintaxe do ADO para trabalhar com um conjunto de registros em um banco de dados externo um pouco diferente; voc tem
para especificar o nome de arquivo e caminho do banco de dados e especificar o provedor Microsoft Jet 4.0, como o pro-
procedimento listado a seguir, que usa uma seqncia de caracteres SQL para criar um conjunto de registros:
Private Sub OpenRecordsetSQL()
Em erro continuar prximo
Dim cnn como ADODB.Conexo
Dim rst como ADODB.Conjunto de registros
Dim strDBName As String
Dim strConnectString As String
Dim strSQL As String
Dim strDBNameAndPath As String
Dim strCurrentPath As String
Dim fso como scripting. FileSystemObject novo
Dim fil como Scripting.File
Dim strPrompt As String
Crie a conexo com um banco de dados externo.
strCurrentPath = Application.CurrentProject.Path
strDBName = \"Adamastor\"
strDBNameAndPath = strCurrentPath
Tente encontrar o banco de dados e colocar uma mensagem se no for encontrado.
Conjunto fil = fso.GetFile(strDBNameAndPath)
Se o fil nada ento
strPrompt = \"No pode encontrar\"
& strCurrentPath & ; please copy it from the _
& Office11\Samples subfolder under the main _
& Microsoft Office folder _
& of an earlier version of Office
MsgBox strPrompt, vbCritical + vbOKOnly
GoTo ErrorHandlerExit
End If
No erro GoTo ErrorHandler
Set cnn = New ADODB.Conexo
Set rst = New ADODB.Conjunto de registros
111
Trabalhando com dados de acesso
5
10_047026 ch05.qxp 02\/04\/07 21:43 Page 111
Precisa especificar o provedor Jet 4.0 para se conectar a bancos de dados do Access. mdb formato.
Com cnn
.Provedor = \"Microsoft.Jet.OLEDB.4.0\"
.StrDBNameAndPath aberto
strConnectString =.ConnectionString
Terminar com
Use uma seqncia de caracteres SQL para criar um conjunto de registros filtrado.
strSQL = \"SELECT CompanyName, ContactName,\" _
& City FROM Suppliers _
& WHERE Country = Australia _
& ORDER BY CompanyName;
RST.Open Source: = strSQL, _
ActiveConnection: = strConnectString, _
CursorType: = adOpenStatic, _
LockType: = adLockReadOnly
Iterar por meio de registros e imprimir os valores dos campos para a janela imediata.
Com rst
.MoveLast
.MoveFirst
Debug. Print.RecordCount _
& records in recordset & vbCrLf
Enquanto no.EOF
Debug. Print \"nome da empresa australiana:\" _
& ![CompanyName] _
& vbCrLf & vbTab & Contact name: _
& ![ContactName] _
& vbCrLf & vbTab & City: & ![City] _
& vbCrLf
RST.MoveNext
Loop
Terminar com
ErrorHandlerExit:
Feche os objetos Recordset e conexo.
Rst nada ento se no
Se rst.Estado = adStateOpen Then
RST.Fechar
Set rst = Nothing
End If
End If
112
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
10_047026 ch05.qxp 02\/04\/07 21:43 Page 112
Se a cnn no nada, ento
Se cnn.Estado = adStateOpen Then
CNN.Fechar
Set cnn = Nothing
End If
End If
Exit Sub
ErrorHandler:
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End Sub
Comando
O objeto ADO Command representa comandos SQL, aproximadamente equivalentes a consultas no Access
bancos de dados, ou QueryDefs no modelo de objeto DAO. Voc no precisa usar esse objeto para consulta ou fil-
dados de ter acesso; Isso pode ser feito usando uma instruo SQL (como o segmento de cdigo anterior) ou o
nome de uma consulta salva para o argumento de origem ao abrir um recordset. No entanto, o comando
objeto pode ser til quando voc deseja reutilizar um comando mais tarde no cdigo, ou se voc precisar passar
informaes detalhadas sobre parmetro com o comando.
O procedimento usa um objeto de comando para criar um conjunto de registros, que pode ser usado mais tarde no cdigo:
Private Sub OpenRecordsetCommand()
Em erro continuar prximo
Dim cnn como ADODB.Conexo
Dim rst como ADODB.Conjunto de registros
Dim cmdSQL como ADODB
Dim strDBName As String
Dim strConnectString As String
Dim strSQL As String
Dim strCursorType As String
Dim strLockType As String
Dim strDBNameAndPath As String
Dim strCurrentPath As String
Dim fso como scripting. FileSystemObject novo
Dim fil como Scripting.File
Dim strPrompt As String
Crie a conexo com um banco de dados externo.
strCurrentPath = Application.CurrentProject.Path
strDBName = \"Adamastor\"
strDBNameAndPath = strCurrentPath
113
Trabalhando com dados de acesso
5
10_047026 ch05.qxp 02\/04\/07 21:43 Page 113
Tente encontrar o banco de dados e colocar uma mensagem se no for encontrado.
Conjunto fil = fso.GetFile(strDBNameAndPath)
Se o fil nada ento
strPrompt = \"No pode encontrar\"
& strCurrentPath & ; please copy it from the _
& Office11\Samples subfolder under the main _
& Microsoft Office folder _
& of an earlier version of Office
MsgBox strPrompt, vbCritical + vbOKOnly
GoTo ErrorHandlerExit
End If
No erro GoTo ErrorHandler
Set cnn = New ADODB.Conexo
Set rst = New ADODB.Conjunto de registros
Precisa especificar o provedor Jet 4.0 para se conectar a bancos de dados do Access. mdb formato.
Com cnn
.Provedor = \"Microsoft.Jet.OLEDB.4.0\"
.StrDBNameAndPath aberto
strConnectString =.ConnectionString
Terminar com
Conjunto cmdSQL = New ADODB
Definir cmdSQL.ActiveConnection = cnn
Use uma seqncia de caracteres SQL para criar um comando.
strSQL = \"SELECT CompanyName, ContactName,\" _
& City FROM Suppliers _
& WHERE Country = Sweden _
& ORDER BY CompanyName;
cmdSQL.CommandText = strSQL
Set rst = cmdSQL.Execute
Seleo tipo de cursor e o bloqueio do conjunto de registros.
strCursorType = interruptor (rst.CursorType = _
adOpenDynamic _
\"Dinmica (\"
RST.CursorType = adOpenForwardOnly, _
\"Forward-only (\"_
& adOpenForwardOnly & ), _
RST.CursorType = adOpenKeyset, \"conjunto de chaves (\"_
& adOpenKeyset & ), _
RST.CursorType = adOpenStatic, \"Static (\"_
& adOpenStatic & ))
114
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
10_047026 ch05.qxp 02\/04\/07 21:43 Page 114
strLockType = interruptor (rst.LockType = _
adLockOptimistic _
\"Otimista (\"
RST.LockType = adLockReadOnly, \"Read-only (\" _
& adLockReadOnly & ), _
RST.LockType = adLockBatchOptimistic, _
\"BatchOptimistic (\"_
& adLockBatchOptimistic & ), _
RST.LockType = adLockPessimistic, _
\"O pessimista (\"_
& adLockPessimistic & ))
Debug. Print \"tipo de cursor\/bloqueio do conjunto de registros:\" _
& strCursorType & , & strLockType & vbCrLf
Iterar por meio de registros e imprimir os valores dos campos para a janela imediata.
Com rst
.MoveFirst
Enquanto no.EOF
Debug. Print \"nome da empresa sueco:\" _
& ![CompanyName] _
& vbCrLf & vbTab & Contact name: _
& ![ContactName] _
& vbCrLf & vbTab & City: & ![City] _
& vbCrLf
RST.MoveNext
Loop
Terminar com
ErrorHandlerExit:
Feche os objetos Recordset e conexo.
Rst nada ento se no
Se rst.Estado = adStateOpen Then
RST.Fechar
Set rst = Nothing
End If
End If
Se a cnn no nada, ento
Se cnn.Estado = adStateOpen Then
CNN.Fechar
Set cnn = Nothing
End If
End If
Exit Sub
115
Trabalhando com dados de acesso
5
10_047026 ch05.qxp 02\/04\/07 21:43 pgina 115
ErrorHandler:
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End Sub
Conjunto de registros
Conjuntos de registros ADO representam conjuntos de registros em um banco de dados, bem como conjuntos de registros DAO, embora sua
atributos so mais genricos. Um conjunto de registros ADO pode ser baseado em uma tabela, consulta, instruo de SQL, ou
Objeto de comando. OTestForwardReadOnly procedimento listado aqui usa uma consulta de seleo salva
como a fonte de conjunto de registros:
Private Sub TestForwardReadOnly()
No erro GoTo ErrorHandler
Dim cnn como ADODB.Conexo
Dim rst como ADODB.Conjunto de registros
Crie uma conexo com o banco de dados atual.
Set cnn = CurrentProject
Set rst = New ADODB.Conjunto de registros
Crie um conjunto de registros com base em uma consulta select.
RST.Open Source: = \"qryCompanyAddresses\", _
ActiveConnection: = cnn.ConnectionString _
CursorType: = adOpenForwardOnly, _
LockType: = adLockReadOnly
Iterar por meio de consulta e imprimir valores de campos para a janela imediata.
Fazer enquanto no rst.EOF
Debug. Print \"ID da empresa:\"
& vbCrLf & vbTab & Category: _
& rst![Category] _
& vbCrLf & vbTab & Company Name: _
& rst![Company] & vbCrLf
RST.MoveNext
Loop
ErrorHandlerExit:
116
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
10_047026 ch05.qxp 02\/04\/07 21:43 Page 116
Feche os objetos Recordset e conexo.
Rst nada ento se no
Se rst.Estado = adStateOpen Then
RST.Fechar
Set rst = Nothing
End If
End If
Se a cnn no nada, ento
Se cnn.Estado = adStateOpen Then
CNN.Fechar
Set cnn = Nothing
End If
End If
Exit Sub
ErrorHandler:
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End Sub
Conjuntos de registros ADO tem quatro tipos de cursores (cursores no ADO so aproximadamente equivalentes para o DAO
tipos de conjunto de registros), conforme descrito nas duas tabelas a seguir. Cada tipo de cursor suporta diferentes
mtodos dependendo da configurao do LockType argumento. Os dois mais usados bloqueio
os tipos so a read-only (chamado constante: adLockReadOnly ) e otimista (chamado constante:
adLockOptimistic ) tipo. 5.4 Tabela lista os tipos de cursor ADO, com seus equivalentes numricos,
e as combinaes de tipo de cursor e o bloqueio mais comumente usadas para trabalhar com listas de tabela 5.5
Dados de acesso.
TABELA 5.4
Tipo de Cursor de conjunto de registros ADO argumentos nomeado
Tipo de cursor Constante nomeada Valor numrico
Dinmica adOpenDynamic 2
Conjunto de chaves adOpenKeyset 1
Esttica adOpenStatic 3
Forward-only adOpenForwardOnly 0
117
Trabalhando com dados de acesso
5
10_047026 ch05.qxp 02\/04\/07 21:43 Page 117
TABELA 5.5
Tipo de bloqueio do conjunto de registros ADO argumentos nomeado
Tipo de bloqueio Constante nomeada Valor numrico
Somente leitura adLockReadOnly 1
Otimista adLockOptimistic 3
Lote otimista adLockBatchOptimistic 4
Pessimista adLockPessimistic 2
s vezes o conjunto de registros ADO criado no o tipo que voc especificar o
CursorType argumento, dependendo do tipo de bloqueio. Em particular, se voc especificar o
adLockOptimistic
Bloquear tipo para qualquer tipo de cursor, voc realmente vai ter um cursor de conjunto de chaves. Para deter-
o tipo de conjunto de registros reais de minas, use a seguinte instruo (Ver tabela 5.4 converter o numrico
tipo de correspondncia de seu chamado constante):
Debug. Print \"tipo de cursor de conjunto de registros:\" _
& rst.CursorType
Para uma determinao mais avanada do tipo de cursor real e tipo de bloqueio de um recm-criado
conjunto de registros, execute o procedimento a seguir, substituindo o tipo de cursor e o bloqueio desejado na
RST.Aberto
linha:
Private Sub TestMethodsSupported()
Em erro continuar prximo
Dim cnn como ADODB.Conexo
Dim rst como ADODB.Conjunto de registros
Dim strDBName As String
Dim strConnectString As String
Dim strSQL As String
Dim strCursorType As String
Dim strLockType As String
Dim strCurrentPath As String
Dim fso como scripting. FileSystemObject novo
Dim fil como Scripting.File
Dim strDBNameAndPath As String
Dim strPrompt As String
Crie uma conexo com um banco de dados externo.
strCurrentPath = Application.CurrentProject.Path
strDBName = \"Adamastor\"
strDBNameAndPath = strCurrentPath
NOTA NOTA
118
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
10_047026 ch05.qxp 02\/04\/07 21:43 Page 118
Tente encontrar o banco de dados e colocar uma mensagem se no for encontrado.
Conjunto fil = fso.GetFile(strDBNameAndPath)
Se o fil nada ento
strPrompt = \"No pode encontrar\"
& strCurrentPath & ; please copy it from the _
& Office11\Samples subfolder under the main _
& Microsoft Office folder _
& of an earlier version of Office
MsgBox strPrompt, vbCritical + vbOKOnly
GoTo ErrorHandlerExit
End If
No erro GoTo ErrorHandler
Set cnn = New ADODB.Conexo
Set rst = New ADODB.Conjunto de registros
Necessidade de especificar o provedor Jet 4.0 para se conectar a bancos de dados Access.
Com cnn
.Provedor = \"Microsoft.Jet.OLEDB.4.0\"
.StrDBNameAndPath aberto
strConnectString =.ConnectionString
Terminar com
Use uma seqncia de caracteres SQL para criar um conjunto de registros filtrado.
strSQL = \"SELECT CompanyName, ContactName, cidade\" _
& FROM Suppliers _
& WHERE Country = Australia _
& ORDER BY CompanyName;
Modificar o
CursorType
e
LockType
argumentos como desejado para testar que tipo de conjunto de registros o cre-
ated quando o procedimento executado.
RST.Open Source: = strSQL, _
ActiveConnection: = strConnectString, _
CursorType: = adOpenForwardOnly, _
LockType: = adLockOptimistic
strCursorType = interruptor (rst.CursorType = _
adOpenDynamic _
\"Dinmica (\"
RST.CursorType = adOpenForwardOnly, _
\"Forward-only (\"_
& adOpenForwardOnly & ), _
RST.CursorType = adOpenKeyset, \"conjunto de chaves (\"_
& adOpenKeyset & ), _
119
Trabalhando com dados de acesso
5
10_047026 ch05.qxp 02\/04\/07 21:43 Page 119
RST.CursorType = adOpenStatic, \"Static (\"_
& adOpenStatic & ))
strLockType = interruptor (rst.LockType = _
adLockOptimistic _
\"Otimista (\"
RST.LockType = adLockReadOnly, \"Read-only (\" _
& adLockReadOnly & ), _
RST.LockType = adLockBatchOptimistic, _
\"BatchOptimistic (\"_
& adLockBatchOptimistic & ), _
RST.LockType = adLockPessimistic, _
\"O pessimista (\"_
& adLockPessimistic & ))
Debug. Print \"tipo de cursor\/bloqueio do conjunto de registros:\" _
& strCursorType & , & strLockType & vbCrLf
Debug. Print \"AddNew suportado?\" _
& rst.Supports(adAddNew)
Debug. Print \"Delete suportado?\" _
& rst.Supports(adDelete)
Debug. Print \"Find suportado?\" _
& rst.Supports(adFind)
Debug. Print \"MovePrevious suportado?\" _
& rst.Supports(adMovePrevious)
Debug. Print \"Atualizao suportada?\" _
& rst.Supports(adUpdate)
ErrorHandlerExit:
Feche os objetos Recordset e conexo.
Rst nada ento se no
Se rst.Estado = adStateOpen Then
RST.Fechar
Set rst = Nothing
End If
End If
Se a cnn no nada, ento
Se cnn.Estado = adStateOpen Then
CNN.Fechar
Set cnn = Nothing
End If
End If
Exit Sub
120
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
10_047026 ch05.qxp 02\/04\/07 21:43 Page 120
ErrorHandler:
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End Sub
Porque outros tipos de cursores so convertidos em conjuntos de chaves quando voc usar bloqueio otimista para um ADO
conjunto de registros, voc pode tambm especificar o cursor de conjunto de chaves quando voc cria o conjunto de registros, porque isso
o que voc pretende obter. Veja tabela 5.6 para os detalhes.
TABELA 5.6
Combinaes de tipos de Lock\/Cursor de conjunto de registros ADO
Tipo de cursor chamado constante Tipo de bloqueio chamado constante Mtodos disponveis
adOpenDynamic AdLockOptimistic AddNew
(converte adOpenKeyset) Excluir
Encontrar
MoveFirst
MovePrevious
MoveNext
MoveLast
Atualizao
adOpenDynamic adLockReadOnly Encontrar
(converte adOpenStatic) MoveFirst
MovePrevious
MoveNext
MoveLast
adOpenKeyset AdLockOptimistic AddNew
Excluir
Encontrar
MoveFirst
MovePrevious
MoveNext
MoveLast
Atualizao
adOpenKeyset AdLockReadOnly Encontrar
MoveFirst
MovePrevious
MoveNext
MoveLast
continuou
121
Trabalhando com dados de acesso
5
10_047026 ch05.qxp 02\/04\/07 21:43 Page 121
TABELA 5.6 (continuao)
Tipo de cursor chamado constante Tipo de bloqueio chamado constante Mtodos disponveis
adOpenStatic AdLockOptimistic AddNew
(converte adOpenKeyset) Excluir
Encontrar
MoveFirst
MovePrevious
MoveNext
MoveLast
Atualizao
adOpenStatic AdLockReadOnly Encontrar
MoveFirst
MovePrevious
MoveNext
MoveLast
adOpenForwardOnly AdLockOptimistic AddNew
(converte adOpenKeyset) Excluir
Encontrar
MoveFirst
MovePrevious
MoveNext
MoveLast
Atualizao
adOpenForwardOnly AdLockReadOnly Encontrar
MoveFirst
MoveNext
MoveLast
Dinmica
Um cursor dinmico (equivalente DAO: dbOpenDynaset ) permite que voc exibir acrscimos, alteraes, ou
excluses feitas por outros usurios. So permitidos todos os tipos de movimento com o recordset.
Conjunto de chaves
Em um conjunto de registros com um cursor de conjunto de chaves (no h nenhum tipo de conjunto de registros DAO equivalente), voc pode adicionar,
alterar e excluir dados em registros, mas voc no consegue ver registros que outros usurios adicionar ou excluir.
No entanto, voc pode ver as alteraes feitas por outros usurios. Com um otimista ( adLockOptimistic )
Bloquear tipo, voc pode modificar os dados; Se voc no precisa modificar os dados, use um tipo de bloqueio somente leitura
(adLockReadOnly ) para acesso de dados mais rpido.
A seguir TestKeysetOptimistic procedimento adiciona um novo registro para o tlkpCategories
tabela e define o valor de um campo de entrada fornecida pelo usurio, depois de verificar se a cate -
Gory nome fornecido pelo usurio j foi usado:
122
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
10_047026 ch05.qxp 02\/04\/07 21:43 Page 122
Private Sub TestKeysetOptimistic()
No erro GoTo ErrorHandler
Dim cnn como ADODB.Conexo
Dim rst como ADODB.Conjunto de registros
Dim strCategory As String
Dim strPrompt As String
Dim strTitle As String
Dim strSearch As String
Crie uma conexo com o banco de dados atual.
Set cnn = CurrentProject
Set rst = New ADODB.Conjunto de registros
Crie um conjunto de registros com base em uma tabela.
RST.Open Source: = \"tlkpCategories\", _
ActiveConnection: = cnn.ConnectionString _
CursorType: = adOpenKeyset, _
LockType: = adLockOptimistic
CategoryName:
Adicione um novo registro, obtendo um valor de campo do usurio.
strPrompt = \"Por favor insira o novo nome de categoria\"
strTitle = \"Nova categoria\"
strCategory = Nz (InputBox (prompt: = strPrompt, _
Ttulo: = strTitle))
Se strCategory = \"\", em seguida,
GoTo ErrorHandlerExit
Outra coisa
strSearch = \"[categoria] =\"
& strCategory & Chr$(39)
Debug. Print \"string de busca:\"; strSearch
Com rst
.MoveLast
.MoveFirst
Debug. Print.RecordCount _
& records initially in recordset
Verifique se o nome da categoria j foi usado, se a pesquisa falhar, o cursor ser em
o fim do conjunto de registros.
RST.Encontrar strSearch
Se rst.EOF = False Then
strPrompt = Chr$(39)
123
Trabalhando com dados de acesso
5
10_047026 ch05.qxp 02\/04\/07 21:43 Page 123
& Chr$(39) & already used; _
& please enter another category _
& name
strTitle = \"Categoria\"
MsgBox prompt: = strPrompt, _
Botes: = vbExclamation + vbOKOnly, _
Ttulo: = strTitle
GoTo CategoryName
Outra coisa
.AddNew
![Categoria] = strCategory
.Atualizao
strPrompt = Chr$(39)
& Chr$(39) & added to table
strTitle = \"Categoria adicionada\"
MsgBox prompt: = strPrompt, _
Botes: = vbInformation + vbOKOnly, _
Ttulo: = strTitle
Debug. Print.RecordCount _
& records in recordset after adding
End If
Terminar com
End If
ErrorHandlerExit:
Feche os objetos Recordset e conexo.
Rst nada ento se no
Se rst.Estado = adStateOpen Then
RST.Fechar
Set rst = Nothing
End If
End If
Se a cnn no nada, ento
Se cnn.Estado = adStateOpen Then
CNN.Fechar
Set cnn = Nothing
End If
End If
Exit Sub
ErrorHandler:
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End Sub
124
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
10_047026 ch05.qxp 02\/04\/07 21:43 Page 124
O cdigo imprime a string de pesquisa (sempre til para depurao) e o nmero de registros no
conjunto de registros, antes e depois de adicionar o novo registro, a janela Verificao imediata:
String de busca: [categoria] = 'Firmware'
29 registros inicialmente no conjunto de registros
30 registros no conjunto de registros aps a adio de
Esttica
O tipo de cursor esttico (equivalente DAO: dbOpenSnapshot ) fornece uma cpia esttica de um conjunto de
registros, para visualizao ou impresso de dados. So permitidos todos os tipos de movimento com o recordset.
Adies, alteraes ou excluses feitas por outros usurios no so mostradas. Para acesso rpido aos dados que
voc no precisa modificar, onde voc no precisa exibir alteraes de outros usurios e necessrio
para ser capaz de se mover tanto para frente e para trs no conjunto de registros, usar um cursor esttico e o
adLockReadOnly tipo de bloqueio, como o seguinte TestStaticReadOnly procedimento. Se voc fizer
preciso modificar os dados, mas preciso ver as alteraes de outros usurios, use o adLockOptimistic
Bloquear tipo em vez disso (o tipo de cursor mudar para o conjunto de chaves, conforme observado anteriormente).
O TestStaticReadOnly procedimento configura uma conexo para o banco de dados Northwind, abre um
filtrados recordset baseado em uma tabela no banco de dados e, em seguida, percorre o recordset, impresso
informaes de seus campos para a janela imediata. Observe que, depois de um ADO recordset tem sido
criado, muitos dos mesmos mtodos podem ser usados para trabalhar com ele quanto um (de banco de dados DAO BOF EOF , ,
Find * movimento * , ):
Private Sub TestStaticReadOnly()
Em erro continuar prximo
Dim cnn como ADODB.Conexo
Dim rst como ADODB.Conjunto de registros
Dim strDBName As String
Dim strDBNameAndPath As String
Dim strConnectString As String
Dim strSQL As String
Dim strCurrentPath As String
Dim fso como scripting. FileSystemObject novo
Dim fil como Scripting.File
Dim strPrompt As String
Crie uma conexo com um banco de dados externo.
strCurrentPath = Application.CurrentProject.Path
strDBName = \"Adamastor\"
strDBNameAndPath = strCurrentPath
125
Trabalhando com dados de acesso
5
10_047026 ch05.qxp 02\/04\/07 21:43 Page 125
Tente encontrar o banco de dados e colocar uma mensagem se no for encontrado.
Conjunto fil = fso.GetFile(strDBNameAndPath)
Se o fil nada ento
strPrompt = \"No pode encontrar\"
& strCurrentPath & ; please copy it from the _
& Office11\Samples subfolder under the main _
& Microsoft Office folder _
& of an earlier version of Office
MsgBox strPrompt, vbCritical + vbOKOnly
GoTo ErrorHandlerExit
End If
No erro GoTo ErrorHandler
Set cnn = New ADODB.Conexo
Set rst = New ADODB.Conjunto de registros
Necessidade de especificar o provedor Jet 4.0 para se conectar a bancos de dados Access.
Com cnn
.Provedor = \"Microsoft.Jet.OLEDB.4.0\"
.StrDBNameAndPath aberto
strConnectString =.ConnectionString
Terminar com
Use uma seqncia de caracteres SQL para criar um conjunto de registros filtrado.
strSQL = \"SELECT CompanyName, ContactName,\" _
& City FROM Suppliers _
& WHERE Country = Australia _
& ORDER BY CompanyName;
RST.Open Source: = strSQL, _
ActiveConnection: = strConnectString, _
CursorType: = adOpenStatic, _
LockType: = adLockReadOnly
Iterar por meio de registros e imprimir os valores dos campos para a janela imediata.
Com rst
.MoveLast
.MoveFirst
Debug. Print.RecordCount _
& records in recordset & vbCrLf
Enquanto no.EOF
Debug. Print \"nome da empresa australiana:\" _
& ![CompanyName] _
& vbCrLf & vbTab & Contact name: _
& ![ContactName] _
126
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
10_047026 ch05.qxp 02\/04\/07 21:43 Page 126
& vbCrLf & vbTab & City: & ![City] _
& vbCrLf
RST.MoveNext
Loop
Terminar com
ErrorHandlerExit:
Feche os objetos Recordset e conexo.
Rst nada ento se no
Se rst.Estado = adStateOpen Then
RST.Fechar
Set rst = Nothing
End If
End If
Se a cnn no nada, ento
Se cnn.Estado = adStateOpen Then
CNN.Fechar
Set cnn = Nothing
End If
End If
Exit Sub
ErrorHandler:
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End Sub
A seguinte informao impressa a janela Verificao imediata:
2 registros no conjunto de registros
Nome de empresa australiana: bom dia, companheiro
Nome de contato: Wendy Mackenzie
Cidade: Sydney
Nome de empresa australiana: Pavlova, Ltd.
Nome de contato: Ian Devling
Cidade: Melbourne
Forward-only
O cursor Avanar-only (equivalente DAO: dbOpenForwardOnly ) permite apenas para a frente, move -
mento por meio de um conjunto de registros e no mostrar adies, alteraes ou excluses feitas por outros usurios.
127
Trabalhando com dados de acesso
5
10_047026 ch05.qxp 02\/04\/07 21:43 Page 127
o tipo de cursor padro. Para o acesso mais rpido aos dados que voc no precisa modificar, use um
cursor forward-only e o adLockReadOnly bloquear o tipo, como na TestForwardReadOnly
procedimento a seguir; Se voc precisar modificar os dados, use o adLockOptimistic bloqueio
tipo em vez disso:
Private Sub TestForwardReadOnly()
No erro GoTo ErrorHandler
Dim cnn como ADODB.Conexo
Dim rst como ADODB.Conjunto de registros
Crie uma conexo com o banco de dados atual.
Set cnn = CurrentProject
Set rst = New ADODB.Conjunto de registros
Crie um conjunto de registros com base em uma consulta select.
RST.Open Source: = \"qryCompanyAddresses\", _
ActiveConnection: = cnn.ConnectionString _
CursorType: = adOpenForwardOnly, _
LockType: = adLockReadOnly
Iterar por meio de consulta e imprimir os valores de seus campos para a janela imediata.
Fazer enquanto no rst.EOF
Debug. Print \"ID da empresa:\"
& vbCrLf & vbTab & Category: _
& rst![Category] _
& vbCrLf & vbTab & Company Name: _
& rst![Company] & vbCrLf
RST.MoveNext
Loop
ErrorHandlerExit:
Feche os objetos Recordset e conexo.
Rst nada ento se no
Se rst.Estado = adStateOpen Then
RST.Fechar
Set rst = Nothing
End If
End If
Se a cnn no nada, ento
Se cnn.Estado = adStateOpen Then
CNN.Fechar
128
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
10_047026 ch05.qxp 02\/04\/07 21:43 Page 128
Set cnn = Nothing
End If
End If
Exit Sub
ErrorHandler:
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End Sub
Dados de cada registro impresso para a janela imediata; dados dos dois ltimos registros esto listados aqui:
Empresa ID: Yclept Yarbro
Categoria: livros
Nome da empresa: Yclept Yarbro
Identificao da empresa: ZDExpos
Categoria: computador
Nome da empresa: ZDExpos
Registro
Um objeto ADO registro representa um conjunto de dados, que podem ser de um conjunto de registros ou um no-banco de dados
fonte. Ao trabalhar com dados de acesso, o objeto de registro uma nica linha de um conjunto de registros, ou um
conjunto de registros de uma linha. H muitos usos especializados de objetos de registro com base em dados no-Access (no
em especial, para trabalhar com dados hierrquicos e exibi-lo no TreeView controles), mas quando
no trabalhando com dados de acesso no VBA cdigo l nenhum motivo para usar o objeto de registro, porque voc pode
campos de referncia conforme necessrio no registro atual em um conjunto de registros, sem criar um objeto de registro.
Fluxo
Um objeto de fluxo representa um fluxo de dados de um arquivo de texto, XML documento ou pgina da web. Porque
Este objeto no funciona com dados de acesso, ele tratado nos captulos sobre como trabalhar com arquivos de texto,
especificamente captulos 9 e 17.
Converso de cdigo DAO para ADO cdigo
Se voc deseja converter seu cdigo DAO antigo para o novo cdigo ADO talvez para consistncia com o ADO
cdigo para trabalhar com outros tipos de dados, ou com a preocupao de que DAO deixaro de ser apoiado em
verses futuras do Access voc pode usar a tabela 5.7 como uma diretriz. Tenha em mente que alguns tipos de
Cdigo DAO no pode ser convertido em ADO, porque eles no tm nenhum equivalente no modelo de objeto do ADO,
assim voc ainda precisar usar DAO para conjuntos de registros de forma de acesso, ou criando tabelas e seus campos pro-
gramaticalmente.
129
Trabalhando com dados de acesso
5
10_047026 ch05.qxp 02\/04\/07 21:43 Page 129
Voc no pode trocar dados entre conjuntos de registros ADO e DAO, mesmo quando trabalhando
bancos de dados com referncias conjunto para ambos modelos de objeto.
TABELA 5.7
ADO equivalentes de objetos DAO
Objeto DAO Objeto ADO Notas
DBEngine No h equivalente No necessrio
Espao de trabalho No h equivalente No necessrio
Banco de dados Conexo
Conjunto de registros Conjunto de registros
Tipo dynaset Cursor de conjunto de chaves
Tipo instantneo Cursor esttico
Tipo de tabela Cursor de conjunto de chaves, com opo de acCmdTableDirect
Campo Campo Somente os campos de conjunto de registros
QueryDef Nenhum equivalente direto, mas pode usar o objeto de comando
para obter a mesma funcionalidade
TableDef No h equivalente
Ao usar o modelo de objeto DAO para trabalhar com dados de acesso, o seguinte cdigo de segmento abre um
conjunto de registros com base em uma consulta em um banco de dados externo:
Dim dbs como DAO.Banco de dados
Dim strDBName As String
Dim rst como DAO.Conjunto de registros
strDBName = \"E:\/Documents\/Northwind.mdb\"
Conjunto dbs = OpenDatabase(Name:=strDBName)
Set rst = dbs.OpenRecordset (nome: = \"qryCurrentOrders\", _
Digite: = dbOpenDynaset)
Esse cdigo ADO abre um recordset equivalente:
Dim cnn como ADODB.Conexo
Dim rst como ADODB.Conjunto de registros
Dim strDBName As String
Dim strConnectString As String
Dim strQuery As String
DICA DICA
130
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
10_047026 ch05.qxp 02\/04\/07 21:43 Page 130
Crie uma conexo com um banco de dados externo.
strDBName = \"D:\/Documents\/Northwind.mdb\"
Set cnn = New ADODB.Conexo
Set rst = New ADODB.Conjunto de registros
strQuery = \"qryCategorySalesFor1997\"
Necessidade de especificar o provedor Jet 4.0 para se conectar a bancos de dados Access.
Com cnn
.Provedor = \"Microsoft.Jet.OLEDB.4.0\"
.StrDBName aberto
strConnectString =.ConnectionString
Terminar com
Abra um conjunto de registros com base em uma consulta salva.
RST.Open Source: = strQuery, _
ActiveConnection: = cnn, _
CursorType: = adOpenStatic, _
LockType: = adLockReadOnly
Uma vez que criou-se o conjunto de registros, voc pode trabalhar com ele muito parecido com um conjunto de registros DAO, embora
Existem algumas diferenas, consulte as sees sobre ADO recordset cursor e o bloqueio de tipos para obter detalhes sobre
as diferenas.
Para mais informaes sobre converso de cdigo DAO para ADO cdigo veja Alyssa Henry arti-
cle \"Portar DAO para ADO com o Microsoft Jet provedor de cdigo,\" que est disponvel
on-line na biblioteca MSDN, procurando seu ttulo ou no
http:\/\/msdn.Microsoft.com\/library\/
default.asp?url=\/library\/en-US\/dndao\/HTML\/daotoado.asp
.
Resumo
O modelo de objeto DAO foi desenvolvido para trabalhar com dados de acesso e (apesar dos rumores de sua morte,
que foram ouvidas por muitos verses agora e muita publicidade do objeto ADO alternativo
modelo) DAO ainda o melhor modelo de objeto para trabalhar com dados em tabelas do Access. No Access 2007
em vez de remover o modelo de objeto DAO, Microsoft escolheu sabiamente para apar-lo de alguns raramente usado
componentes e renomeie-o modelo de objeto do mecanismo de banco de dados Microsoft Office Access 2007. Meu rec-
recomendao usar o DAO para todas as tarefas que envolvem dados de acesso.
Quando voc precisa trabalhar com dados em outros tipos de bancos de dados ou fontes de dados, no entanto, ADO o
voc precisa usar de modelo de objeto (nenhuma escolha l DAO funciona apenas com dados de acesso). ADO pode ser
usado para trabalhar com dados de acesso, bem como, embora tenha algumas limitaes em comparao com DAO, assim no
alguns casos voc pode quer (ou precisa) para usar o ADO para trabalhar com dados de acesso; Eu tenho desde infor-
mao sobre a converso de cdigo DAO para ADO para estas situaes.
DICA DICA
131
Trabalhando com dados de acesso
5
10_047026 ch05.qxp 02\/04\/07 21:43 Page 131
10_047026 ch05.qxp 02\/04\/07 21:43 Page 132
D
espite o novo e melhorado relatrio interativos recursos discutidos
na barra lateral \"Exibio de Layout de relatrio\", para o controle total sobre o
aparncia e o contedo dos documentos preenchidos com dados do Access, VBA
Cdigo de automao, trabalhando com documentos do Word a melhor escolha. Este
Captulo discute produzindo documentos do Word usando um comando de fita
para criar documentos simples, ou escrevendo cdigo de automao VBA para criar a palavra
documentos e ench-los com dados, usando quatro mtodos diferentes.
Em contraste com os relatrios de acesso (mesmo no modo de exibio Layout novo), palavra docu-
mentos tem extensas opes de formatao, incluindo tabelas, campos de formulrio, e
outros controles especializados no disponveis nos relatrios de acesso, mesmo em Layout
modo de exibio. Gerar documentos do Word a partir de cdigo VBA de acesso permite que voc use toda a
Opes de formatao de palavra e (se desejar) para criar um documento separado para
cada registro de acesso, em vez de um documento de vrias pginas de mala direta. E o
Documentos do Word que contm os dados mesclados de acesso podem ser editados, o que no
uma opo mesmo para relatrios do Access 2007.
133
NESTE CAPTULO
Built-in exportao de Word Office 2007
Componentes do objeto Word
modelo usado no cdigo de automao
Criao de documentos do Word cheio
com dados de acesso, atravs de quatro
diferentes mtodos
Trabalhando com palavra
Documentos e modelos
11_047026 ch06.qxp 02\/04\/07 21:44 Page 133
134
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
Exibio de Layout de relatrio
Relatrios de acesso 2007 tem uma nova seleo de modo de exibio, exibio de Layout. Access 2003
tinha a visualizao de impresso, visualizao do Layout (somente leitura, sem dados) e visualizao de Design,
e voc poderia apenas modificar o layout do relatrio, filtragem, ou classificao no modo Design. Em
Access 2007, a nova exibio de Layout substitui a visualizao do Layout, e h um novo relatrio
Ver os alm de Visualizar impresso. A figura a seguir mostra o selector de vista sobre o
Relatrio de acesso faixa de opes.
Pontos de vista de relatrio do Access 2007.
A nova exibio de Layout de relatrios de acesso tem muito mais funcionalidade do que a visualizao do Layout antigo,
permitindo que os usurios classificar e filtrar um menu de atalhos, como mostrado na seguinte captura de tela e at mesmo redimensionar
colunas de relatrio observando os dados (um recurso muito solicitado).
A nova exibio de Layout de um relatrio do Access.
NOVO RECURSO NOVO RECURSO
11_047026 ch06.qxp 02\/04\/07 21:44 pgina 134
Exportao de built-in Word no Office 2007
Para vrias verses do Office, tem sido possvel exportar dados de acesso a documentos do Word dos
Barra de ferramentas de acesso. O nome do local de controle e barra de ferramentas tm mudado ao longo de verses do Office; em
Access 2003 era o controle de lista suspensa de OfficeLinks na barra de ferramentas de banco de dados, oferecendo opes para
Mesclar a palavra (mala direta), publicar para o Word (RTF), ou analisar com o Excel (XLS). No Access 2007,
na nova faixa de opes que substitui o antigas barras de ferramentas e menus, na guia dados externos (mostrada na
Figura 6.1) tem um grupo de exportao com uma variedade de opes de exportao, incluindo Excel, SharePoint,
Word (RTF), arquivo de texto e muito mais. No menu drop-down mais, h um nmero de exportao
selees, incluindo mescl-lo com o Microsoft Office Word.
Voc ver diferentes seleces no menu mais (ou selees aparecendo como habilitado
ou desativado) de acordo com o tipo de objeto selecionado na barra de objeto e se o
objeto aberto ou fechado. Com uma forma aberta, por exemplo, voc ver o banco de dados Access, arquivo XML,
e selees do documento HTML (essas selees esto habilitadas) e uma seleo de deficiente, mescl-la com
Microsoft Office Word; a seleo do Snapshot Viewer habilitada apenas quando um relatrio selecionado.
FIGURA 6.1
Novo guia dados externos sobre o Access 2007 fita, com o menu mais caiu.
NOTA NOTA
135
Trabalhando com documentos do Word e modelos
6
No entanto, mesmo um relatrio interativo ainda fica muito aqum a funcionalidade de um documento do Word, espe-
cialmente se voc precisa distribuir documentos contendo os dados de acesso para as pessoas que no tem acesso
instalado.
11_047026 ch06.qxp 02\/04\/07 21:44 Page 135
Os recursos do Word (RTF) e mala direta do Word no Access 2007 funcionam muito os mesmos anteriormente
Verses do Office. Se voc seleciona uma tabela do Access, consulta ou outro objeto e, em seguida, selecione a palavra (RTF)
opo, todos os dados de todo o objeto selecionado automaticamente exportada para uma nova palavra docu-
mento, com nenhuma opo para selecionar os registros.
O documento RTF criado a partir de uma tabela, consulta ou formulrio uma tabela do Word, que um bom jogo para
dados em uma tabela do Access ou a consulta select, mas um jogo muito pobre para um formulrio. Relatrios so criados como texto
documentos, no de tabelas (mesmo se eles so relatrios tabulares), com rodaps como texto no corpo do doc -
cumento e sem a maior parte de sua formatao; Esse documento pouco utilizvel. (Isso alterado
para vrias verses do Office agora.)
A opo de exportao RTF pode ser til para criar um documento do Word rpida e sujo que pode enviar
para algum que no tem acesso, mas ele no til para a criao de cartas ou outros formatado
Documentos do Word. A Figura 6.2 mostra uma tabela do Access a ser exportado, e a Figura 6.3 mostra o
Exportar o dilogo, com duas opes habilitadas e desabilitado um (porque o objeto que est sendo exportado um
tabela, no h nenhuma formatao para exportao).
A Figura 6.4 mostra a tabela do Word criada pela exportao RTF. Ele basicamente tem a mesma aparncia
como o acesso tabela, mas falta o sombreamento alternativo-linha, mesmo que o Word 2007 oferece suporte a isso
caracterstica.
FIGURA 6.2
Uma tabela do Access para ser exportado para o Word.
136
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
11_047026 ch06.qxp 02\/04\/07 21:44 Page 136
FIGURA 6.3
O dilogo de exportao de RTF do Word ao exportar uma tabela do Access.
FIGURA 6.4
Um documento do Word criado por exportar uma tabela do Access, usando a opo Word (RTF).
137
Trabalhando com documentos do Word e modelos
6
11_047026 ch06.qxp 02\/04\/07 21:44 Page 137
A opo mala direta do Word executa um assistente, que geralmente semelhante dos dois ltimos
Verses do Office. Oferece-lhe uma escolha de desmarcar alguns registros da fonte de dados antes de por-
formando a mesclagem e voc pode criar uma nova carta na mosca, assim esta escolha de interface pode ser
til quando voc precisa criar um conjunto de cartas de palavra minimamente formatados para destinatrios de uma
Tabela do Access ou consulta mas no pode ser mais fcil de percorrer as seis etapas do assistente,
em comparao com apenas a criao de um simples relatrio de carta de acesso com base em uma consulta filtrada.
Minha concluso, depois de analisar os novos recursos de exportao de dados no Access 2007, que (assim como com
verses anteriores do Access) se voc quer ser capaz de selecionar os registros para a exportao de dados de acesso
a palavra e produzir grandes documentos com um aspecto que podem ser abertos e possivelmente editados por todos
Os usurios do Office, voc ainda melhor fora escrever cdigo VBA para mesclar os dados de acesso a documentos do Word.
O banco de dados de exemplo Export.accdb palavra contm tabelas, consultas, formulrios e cdigo
usado neste captulo.
Exportar dados Access para Word
Usando cdigo de automao
Cdigo de automao a ferramenta que voc precisa para usar ao criar ou trabalhando com documentos do Word em
Acesso VBA. Cdigo de automao no uma linguagem de programao especial, apenas um conjunto de funes usadas
no cdigo do VBA para trabalhar com os modelos de objetos de outros aplicativos.
Todo cdigo de automao comea com uma das duas funes descritas da seguinte forma, de que conjuntos
uma referncia a um objeto de alto nvel de automao. Ao trabalhar com a palavra, isto , geralmente, a palavra
Objeto de aplicativo.
O CreateObject funcionar com \"Word. Application\", como o Classe argumento cria um novo
Instncia da palavra; ele funciona ou no palavra j est aberta. O GetObject funo com
\"Word. Application\" como o Classe argumento tenta definir uma referncia a uma instncia existente
da palavra. GetObject consegue definir uma referncia somente se a palavra j est em execuo.
Para evitar a criao de vrias instncias do Word, eu uso o GetObject funo no corpo de um pro-
procedimento, o que define uma referncia a um objeto de aplicativo do Word existente, se a palavra estiver em execuo, com-
analgesia com um manipulador de erro que usa CreateObject para criar um novo objeto de aplicativo do Word
seGetObject falha com erro 429, \"o componente ActiveX no pode criar objeto\":
Set appWord = GetObject(Class:=\"Word.Application\")
[corpo de procedimento aqui]
ErrorHandlerExit:
Set appWord = Nothing
Exit Sub
NOTA NOTA
138
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
11_047026 ch06.qxp 02\/04\/07 21:44 Page 138
ErrorHandler:
Se errar = 429 ento
' Palavra no est em execuo; Palavra aberta com CreateObject
Set appWord = CreateObject(Class:=\"Word.Application\")
Retomar em seguida
Outra coisa
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End If
No manipulador de erro no segmento de cdigo anterior, o objeto de aplicativo appWord
varivel definida como Nothing. Se voc quiser encerrar a palavra quando seu cdigo foi executado, isso
conveniente; mas se voc quiser preservar o objeto de aplicativo do Word para uso futuro (geralmente um
boa idia), ou comentar esta linha ou exclu-lo, como fiz na maioria dos procedimentos a
Palavra exportar banco de dados de amostra.
Para trabalhar com objetos em um modelo de objeto, primeiro voc precisa criar uma referncia para a aplicao
objeto, ou algum outro objeto que pode ser usado com o CreateObject ouGetObject funo.
Apesar de voc usar CreateObject ouGetObject para definir uma referncia diretamente para um documento do Word
objeto, geralmente melhor criar (ou definir uma referncia para) um objeto de aplicativo do Word e use
o appWord varivel para obter em outros objetos da palavra abaixo do objeto de aplicativo, porque muitos dos
as propriedades e mtodos que voc precisa para usar no cdigo de automao pertencem ao objeto aplicativo,
e voc pode acessar todos os outros objetos atravs do objeto de aplicativo...
O modelo de objeto do Word
Um modelo uma representao de componentes de aplicativos disponveis para o controle por
Cdigo de automao. Normalmente, a maioria (mas no todas) de um aplicativo funcionalidade representada por
objetos no modelo, deixando-o fazer quase qualquer coisa que voc pode fazer na interface e por-
HAPs algumas coisas que no podem ser feitas na interface. O modelo de objeto do Word muito extensivo, mas
Felizmente, a fim de trabalhar com documentos do Word e modelos e ench-los com dados de
Acesso, voc precisa trabalhar com apenas alguns componentes do modelo de objeto em especial a
Objeto Application, coleo de documentos objeto de documento, tabelas recolha e tabela
objeto e a coleo de Bookmarks e objeto indicador. Estes componentes do modelo de objeto so
os usados em procedimentos descritos nas sees a seguir.
Voc pode usar o pesquisador de objetos para examinar as propriedades e mtodos do objeto Word
componentes do modelo. Pressione F2 na janela do Visual Basic para abrir o pesquisador de objetos e selecione
Palavra na lista suspensa bibliotecas no canto superior esquerdo da sua janela. A Figura 6.5 mostra o objeto.
Navegador com MailMerge objeto selecionado na lista de Classes, para que voc possa examinar suas propriedades
e mtodos.
Os procedimentos de exemplo a seguir usam automao cdigo para executar alguns comum tarefas quando
trabalhando com o modelo de objeto do Word.
NOTA NOTA
139
Trabalhando com documentos do Word e modelos
6
11_047026 ch06.qxp 02\/04\/07 21:44 Page 139
FIGURA 6.5
Analisar o objeto da palavra MailMerge no Pesquisador de objetos.
Criando um documento do Word de novo, em branco
O NewDocfuno cria um documento novo e em branco do Word baseado no modelo padro do Word:
Funo pblica NewDoc()
No erro GoTo ErrorHandler
Dim appWord como Word. Application
Dim docs como Word.Documents
Dim doc como Word.Document
Set appWord = GetObject(Class:=\"Word.Application\")
Conjunto docs = appWord.Documents
docs.Adicionar
Conjunto doc = appWord.ActiveDocument
ErrorHandlerExit:
Exit Function
140
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
11_047026 ch06.qxp 02\/04\/07 21:44 pgina 140
ErrorHandler:
Se errar = 429 ento
' Palavra no est em execuo; Palavra aberta com CreateObject
Set appWord = CreateObject(Class:=\"Word.Application\")
Retomar em seguida
Outra coisa
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End If
End Function
Criando um documento do Word baseado em um modelo
As funes nesta seo (e sees posteriores) pegar o caminho da pasta de modelos de contato, e
o caminho da pasta documentos do contato, no menu principal. Cada caminho tem um boto de comando e uma
Caixa de texto vinculada a um campo em tblInfo; clicando no boto de comando abre uma caixa de dilogo de FolderPicker para
selecionar o caminho. O caminho selecionado exibido na caixa de texto, como mostrado na Figura 6.6.
FIGURA 6.6
O menu principal da palavra exportao sample database.
Se voc clicar no boto de contato documentos via ou caminho de modelos de contato, abre uma caixa de dilogo Procurar,
onde voc pode selecionar a pasta para armazenar modelos ou documentos (Ver Figura 6.7).
Os procedimentos que surgem essas caixas de dilogo de procura so discutidos no captulo 9.
FIGURA 6.7
REFERNCIA CRUZADA REFERNCIA CRUZADA
141
Trabalhando com documentos do Word e modelos
6
11_047026 ch06.qxp 02\/04\/07 21:44 pgina 141
FIGURA 6.7
Selecionando uma pasta como a pasta de documentos do contato.
O NewDocFromTemplate funo listada em seguida, cria um novo documento baseado em um modelo em
a pasta de modelos de contato, usando propriedades de documento do Word para armazenar os dados de acesso. O
mtodo de propriedades do documento a tcnica mais comum que eu uso para criar documentos para preencher
com os dados de acesso. Na NewDocFromTemplate procedimento, depois de criar o novo documento, o
nomes de suas propriedades de documento so impressos para a janela imediata.
Como com verses anteriores do Word, embora haja uma coleo CustomProperties em
o modelo de objeto do Word 2007 e um
CustomProperty
objeto, esta coleo e
objeto realmente pertencem as marcas inteligentes, por isso, se voc declarar variveis desses tipos de dados, voc receber um
erro de compilao; Portanto, eles devem ser declarados como objeto.
Funo pblica NewDocFromTemplate()
No erro GoTo ErrorHandler
Dim appWord como Word. Application
Dim docs como Word.Documents
Dim strLetter As String
Dim strTemplateDir As String
Dim doc como Word.Document
NOTA NOTA
142
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
11_047026 ch06.qxp 02\/04\/07 21:44 pgina 142
Deve declarar essa varivel como Object porque declar-la como Word.CustomProperties no funciona:
Dim prps como objeto
Deve declarar essa varivel como Object porque declar-la como Word.CustomProperty no funciona:
Dim prp como objeto
Set appWord = GetObject(Class:=\"Word.Application\")
strTemplateDir = GetContactsTemplatesPath()
Debug. Print \"diretrio de modelos:\"
strLetter = strTemplateDir
Debug. Print \"letra:\"
Conjunto docs = appWord.Documents
docs.Adicionar strLetter
Conjunto doc = appWord.ActiveDocument
Conjunto prps = doc.CustomDocumentProperties
Para cada prp no prps
Debug. Print \"nome da propriedade:\"
Prp prxima
ErrorHandlerExit:
Exit Function
ErrorHandler:
Se errar = 429 ento
' Palavra no est em execuo; Palavra aberta com CreateObject
Set appWord = CreateObject(Class:=\"Word.Application\")
Retomar em seguida
Outra coisa
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End If
End Function
Usando uma consulta para concatenar dados para exportao
Eu gostaria de criar uma consulta seleo para usar como a fonte de dados para a mesclagem de dados do Access para o Word, concate-
envolvia dados de diversas reas, conforme necessrio para obter melhores resultados quando se trabalha com documentos do Word.
Um campo concatena o nome, cargo e informaes de nome da empresa, usando o IIf funo para
evitar a criao de linhas em branco, e outro cria um campo nico com informaes de endereo. Esta tecnologia-
nique garante que voc no ver linhas em branco no bloco de endereo em uma carta, ou um rtulo, mesmo que
143
Trabalhando com documentos do Word e modelos
6
11_047026 ch06.qxp 02\/04\/07 21:44 pgina 143
a falta de alguns campos de dados. Eu, tambm, criar um campo ZipCode separado para uso na criao de barra de PostNet EUA
cdigos em envelopes ou etiquetas.
O banco de dados da amostra, esta consulta qryContactsForMerge . As expresses de campo calculado eu
usado para concatenar dados do simples tblContacts de arquivo simples so listados em seguida. Dependendo da
campos em sua tabela (s), essas expresses precisar ser personalizado por exemplo, para lidar com
endereos de vrios campos ou nome prefixos e sufixos:
ContactName:
[Nome]
NameTitleCompany:
[Nome]
[JobTitleCompany]
JobTitleCompany:
IIf(Nz([JobTitle]) = \"\" e
NZ([CompanyName])=\"\",\"\",IIf(NZ([JobTitle]) <>\"\", [JobTitle]
IIf(Nz([CompanyName])<>\"\",Chr(13)
[CompanyName]),[CompanyName]))
CityStateZip:
[Cidade]
WholeAddress:
[StreetAddress]
IIf(Nz([Country]) <>\"\" e Nz([Country]) <>\"EUA\", Chr
& [Country],)
CEP:
IIf ([pas] = \"EUA\" ou Nz([Country])=\"\",[PostalCode],\"\")
LastNameFirst
[Sobrenome]
No cdigo do VBA, voc pode usar o VB chamado constante
vbCrLf
para indicar um CR + LF (car-
Carre retorno alm de avano de linha) iniciar uma nova linha em uma seqncia de caracteres de texto, mas constantes nomeadas no pode
ser usado em expresses de consulta campo, ento eu uso o Chr
valores dos caracteres CR e LF.
Usar uma consulta para fazer a concatenao (em vez de criar expresses no cdigo VBA) torna
muito mais fcil para verificar que as expresses esto retornando os dados corretos e para corrigir quaisquer problemas
antes de realizar a mesclagem. Depois de criar as expresses, basta mudar para o modo folha de dados para inspecionar o
resultados e, em seguida, alternar de volta para criar modo de exibio para corrigir quaisquer problemas que voc v.
DICA DICA
144
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
11_047026 ch06.qxp 02\/04\/07 21:44 pgina 144
Escolhendo um mtodo para mesclar o acesso
Dados para o Word
O NewDocFromTemplate procedimento listado na seo anterior lista palavra documento prop-
erties que pode ser preenchido com os dados de acesso. Este meu mtodo preferido para exportao de dados de acesso para
Documentos do Word, mas no o nico mtodo. Voc tambm pode exportar os dados de acesso ao livro de palavra-
marcas, ou simplesmente inserir dados em um documento do Word usando o mtodo TypeText. E depois h
mala direta, que mais adequada para mesclar dados de um grande nmero de registros. Tabela 6.1
compara as vantagens e desvantagens destes mtodos.
TABELA 6.1
Comparao de quatro maneiras para mesclar os dados de acesso ao Word
Mtodo Vantagens Desvantagens
Marcadores No necessrio para abrir as propriedades Voc no pode inserir o mesmo indicador duas vezes
folha; indicadores so inseridos diretamente em um modelo; para exibir as mesmas infor-
para o modelo. mao em dois ou mais lugares, voc quer
precisa criar outro marcador ou usar
Marcadores so mais familiares a palavra um campo de referncia cruzada que referencia o
usurios do que propriedades do documento. primeiro indicador.
Cria um documento separado para cada Os usurios podem inadvertidamente digitam na
registro, que permite a fcil personalizao texto dentro de um indicador, substituindo o
de documentos especficos. valor exportado.
No h nenhum link para o banco de dados do Access,
assim que os documentos podem ser abertos at mesmo em
outro computador.
Propriedades do documento Dados de uma propriedade de documento podem ser Requer a criao de propriedades de documento
exibido em vrios locais, usando no modelo, na guia personalizado de
campos. a folha de propriedades.
Cria um documento separado para cada
registro, que permite a fcil personalizao
de registros especficos.
No h nenhum link para o banco de dados do Access,
assim que os documentos podem ser abertos at mesmo em
outro computador.
continuou
145
Trabalhando com documentos do Word e modelos
6
11_047026 ch06.qxp 02\/04\/07 21:44 pgina 145
TABELA 6.1 (continuao)
Mtodo Vantagens Desvantagens
TypeText Nenhuma preparao antecipada de qualquer tipoApropriado somente para documentos muito simples,
necessrio; Esse mtodo funciona com um tais como etiquetas de endereamento ou listas tabulares.
documento criado a partir do padro Word
modelo, ou um documento de etiquetas padro.
No h nenhum link para o banco de dados do Access,
assim que os documentos podem ser abertos at mesmo em
outro computador.
Mala direta Apropriado para um grande nmero de mesclagemPersonalizao de registros individuais
de registros, muito grandes para criar um difcil, porque todos os dados so mesclados para um
documento individual para cada registro. documento nico.
A criao de um documento de etiquetas de mala direta
mais complexo do que criar um Etiquetas
documento para uso com o mtodo TypeText.
Voc pode trabalhar com documentos do Word 97\/2003 no Word 2007, bem como criar novos doc-
argu no novo formato do Word 2007, assim voc no precisa refazer todos os seus modelos apenas
lev-los a trabalhar no Office 2007. Alguns dos modelos utilizados para mesclagem do Word no exemplo de palavra
Exportao de banco de dados esto no formato do Word 2007, e outros esto em formato Word 97\/2003. As extenses
so diferentes para esses dois formatos; novos documentos tm a extenso. docx, e novos modelos tm o
extenso. dotx, Considerando que os mais velhos tm as extenses. doc ou. dot, como mostrado na Figura 6.8. Quando
voc abre um documento ou modelo no formato mais velho, a barra de ttulo diz \"(modo de compatibilidade)\" aps
o nome do arquivo.
A nova coluna do tipo no Windows Vista Explorer mostra o contedo de uma Word 2007
campo de palavras-chave do documento, ento voc pode usar esta propriedade interna do Word para exibir rele-
informaes de vant no Explorer.
Trabalhar com propriedades de documento do Word
Em verses anteriores do Word, propriedades de documento foram acessadas de uma maneira simples,
atravs da caixa de dilogo Propriedades, abrir no menu arquivo. O processo agora mais complicado;
no Word 2007, voc clique no boto Office, selecione preparar e Propriedades (Ver Figura 6.9).
DICA DICA
NOTA NOTA
146
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
11_047026 ch06.qxp 02\/04\/07 21:44 pgina 146
FIGURA 6.8
Modelos do Word e documentos em formatos Word 2002\/2003 e Word 2007.
FIGURA 6.9
A seleo de propriedades no menu de Word preparar novo.
147
Trabalhando com documentos do Word e modelos
6
11_047026 ch06.qxp 02\/04\/07 21:44 Page 147
O comando de propriedades no menu do Office abre um novo recurso do Word 2007, o
Painel de informaes do documento (Ver Figura 6.10), onde voc pode modificar algumas das mais
Propriedades internas do documento comum.
FIGURA 6.10
O painel de informaes de documento do Word 2007.
Em seguida, clique no boto de propriedades de lista suspensa na barra de ttulo (a seleo inicial padro) e
selecione Propriedades avanadas. Finalmente, a folha de propriedades de palavra familiar abre, a guia geral
(consulte a Figura 6.11).
FIGURA 6.11
Guia Geral da folha de propriedades do Word.
NOVO RECURSO NOVO RECURSO
148
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
11_047026 ch06.qxp 02\/04\/07 21:44 pgina 148
Clique em Custom para ver as propriedades do documento personalizado; Estes so os que so mais
comumente preenchidos com dados dos campos de acesso. A Figura 6.12 mostra a guia Personalizar de um Word 2007
folha de propriedades do modelo, com vrias propriedades de documento personalizadas que so teis para criar deixe-
ters e outros documentos preenchidos com dados de uma consulta de seleo de acesso.
FIGURA 6.12
O guia Personalizar da folha de propriedades do Word.
Voc tambm poder usar alguns dos campos na guia Resumo (Ver Figura 6.13), nomeadamente
o campo de palavras-chave, que exibido na coluna tipo no Windows Vista Explorer.
Para criar uma nova propriedade de documento do Word, digite seu nome no campo nome (sem espaos e voc
deve evitar usando o mesmo nome como uma propriedade interna, embora a palavra permite isso), selecione o
tipo de dados (texto, numrico, data ou sim\/no), insira um valor padro se desejado e clique o Adicionar mas -
ton. Ao longo de anos de trabalho com propriedades de documento do Word, eu descobri algumas limitaes de
Propriedades de documento do Word e desenvolvidas algumas solues para lidar com eles:
Se voc no especificar um valor padro para uma propriedade de texto, Word no vai deixar voc salv-lo; em vez disso,
Use um espao (o que permitido) como o valor padro.
Campos de data geralmente devem ser evitados, exceto raros casos onde voc realmente precisa
um padro de data valor, porque no h nenhuma maneira de lhes dar um valor padro em branco. possvel
formate um valor de texto como uma data, utilizando switches de campo de palavra.
149
Trabalhando com documentos do Word e modelos
6
11_047026 ch06.qxp 02\/04\/07 21:44 Page 149
150
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
Campos numricos tambm devem ser evitados, porque voc no pode faz-los em branco (voc
no pode querer que um zero aparece no documento quando o campo no possui dados de
Acesso) e, mais importante, porque todos os nmeros so truncados para nmeros inteiros. Um valor de
49.21 no acesso ser truncado para 49 a propriedade de documento do Word. Tal como acontece com data val-
ues, melhor salvar valores numricos para uma propriedade de documento de texto (texto valores no so
truncado) e, em seguida, format-los com o formato numrico apropriado no Word.
Sim\/no Propriedades exigem que voc selecione Sim ou no como o valor padro; Se isto
inaceitvel, usar um campo de texto, possivelmente, convertendo os valores True ou False em um acesso
Sim\/no campos como \"Sim\", \"No\", ou uma seqncia de caracteres de comprimento zero (\"\").
FIGURA 6.13
Na guia Resumo da folha de propriedades do Word.
s vezes, no Word 2007, depois de mergulhar para baixo alguns nveis da nova faixa de opes, voc
ver uma caixa de dilogo Word 2003 familiar. Se voc v uma seta diagonal minscula no baixo-
neste canto de um grupo em uma faixa de opes, clique na seta e, em seguida, a imagem da caixa de dilogo, para abrir a famil-
caixa de dilogo IAR Word 2003 para que recurso (veja Figura 6.14).
Enviando uma carta de palavra para um nico acesso contato
Voc pode ter um formulrio de contatos ou clientes em um banco de dados do Access, e seria conveniente
tem uma maneira rpida de criar uma carta para o contato atual, usando um boto de comando no formulrio.
O banco de dados de exportao de palavra amostra tem um formulrio para contatos, frmContacts, mostrados a navegao
Figura 6.15.
Se voc clicar na palavra no cabealho deste formulrio, criada uma carta para o contato selecionado, enchimento
Propriedades de documento do Word com dados de registo.
DICA DICA
11_047026 ch06.qxp 02\/04\/07 21:44 pgina 150
151
Trabalhando com documentos do Word e modelos
6
FIGURA 6.14
Abrindo a caixa de dilogo pargrafo antiga da nova faixa de opes.
FIGURA 6.15
Um formulrio para contatos, com um boto para a criao de uma carta de palavra a navegao.
11_047026 ch06.qxp 02\/04\/07 21:44 pgina 151
152
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
Usando a palavra campo opes para formatar texto
Dados em DocProperty campos
W
uando voc usar propriedades de documento do Word para mesclar os dados de acesso a documentos do Word, os valores
escrito no documento propriedades so exibidas no documento do Word em DocProperty
campos. Voc pode usar o campo opes para formatar os dados exibidos no campo DocProperty em uma variedade de
maneiras, que vo ser necessrio se voc seguir o meu Conselho e use principalmente (se no exclusivamente) texto
Propriedades do documento. Os interruptores de campo necessrios para produzir alguns formatos comumente usados esto listados
na tabela a seguir.
Dados de acesso RAW Formato Word desejado Interruptores de cdigo de campo
11523.75 r $11,523.75 DOCPROPERTY \"DollarAmount\" \/#
$ # # #, ##0.00
02\/02\/2001 2 De fevereiro de 2001 DOCPROPERTY \"DueDate\" \/ @
\"MMMM d, aaaa\"
282839898 28283-9898 DOCPROPERTY \"CEP\" \/# \"00000\"-
\"0000\"
829887445 829-88-7445 DOCPROPERTY \"CPF\" \/# \"000'-' 00' -
\"0000\"
150250.50 cento cinquenta mil DOCPROPERTY \"DollarAmount\" \/ *
dois cem cinqenta e 50\/100 DollarText
150250.25 CENTO CINQUENTA MIL DOCPROPERTY \"DollarAmount\" \/ *
DOIS CEM CINQENTA E 25\/100 DollarText \/ * superior
150250.50 cento cinquenta mil DOCPROPERTY \"EntryAmount\" \/ *
duzentos cinquenta CardText
13\/11\/2005 Dcimo terceiro DOCPROPERTY \"StartDate\" \/ @ \"d\" \/ *
OrdText \/ * FirstCap
13\/11\/2005 Novembro de DOCPROPERTY \"StartDate\" \/ @
\"MMMM\"
Voc pode criar cdigos de barras PostNet para CEPs dos Estados Unidos em um envelope ou etiqueta por
adicionando um campo ZipCode DocProperty para o modelo do Word e aplicando um CEP
indicador para ele. Porque o campo de WholeAddress inclui o cdigo de fecho de correr (ou o cdigo postal, dependendo
no pas), voc deve fazer o campo ZipCode DocProperty invisvel. Para fazer isso, selecione o
campo, abra a caixa de dilogo fonte clicando na pequena seta no canto inferior direito do grupo fonte sobre o
Faixa de opes do Word e marcar a opo oculto. Em seguida, posicione o cursor acima do bloco de endereo,
Selecione Inserir

Partes rpidas

Campo, selecione o campo de cdigo de barras e, em seguida, o indicador de CEP;


Deixe a caixa de verificao de cdigo de barras POSTNET marcada e clique em OK para inserir o campo de cdigo de barras (consulte o
prxima figura).
DICA DICA
11_047026 ch06.qxp 02\/04\/07 21:44 pgina 152
153
Trabalhando com documentos do Word e modelos
6
Inserir um campo de E.U. PostNet BarCode em um documento do Word.
Ao colocar DocProperty campos em um modelo, certifique-se de que o \"preservar formato-
Ting durante as atualizaes de\"caixa de seleo no estiver marcada, caso esteja marcada e o texto dis -
jogado de um doc propriedade mais do que uma palavra, a primeira palavra poder ter (provavelmente ter, em
minha experincia) uma fonte diferente ou o tamanho do que as outras palavras.
Um envelope com um cdigo de barras PostNet E.U. acima o endereo.
Consulte a tabela anterior para obter uma listagem dos interruptores de campo de palavra usada para formatar valores em
DocProperty campos.
REFERNCIA CRUZADA REFERNCIA CRUZADA
DICA DICA
11_047026 ch06.qxp 02\/04\/07 21:44 pgina 153
O cmdWord_Click() procedimento de evento primeiro salva as informaes de variveis, para uso mais tarde na
cdigo e, em seguida, verifica se o modelo encontrado na pasta modelos, define um aplicativo do Word vari-
capaz e cria um novo documento do Word baseado no modelo. Em seguida, ele define uma referncia para o
Word CustomDocumentProperties coleo do documento recm-criado e define cada docu -
Propriedade de mento para uma varivel ou o valor em um campo do registro atual. O segmento de
nome de cdigo que cria um save para o documento (utilizado na maioria dos meus procedimentos de exportao) usa um
Fazer...Loop instruo para criar um save o nome para o documento que contm os dados mesclados, pick-
ing o nome do contato de um campo no formulrio, adicionar a data de hoje, em um formato que usa traos
para criar um nome de arquivo aceitvel:
Private Sub cmdWord_Click()
No erro GoTo ErrorHandler
Dim appWord como Word. Application
Dim strCompanyName As String
Dim strContactName As String
Dim strWholeAddress As String
Dim strJobTitle As String
Dim docs como Word.Documents
Dim doc como Word.Document
Dim strWordTemplate As String
Dim strDocsPath As String
Dim strTemplatePath As String
Dim prps como objeto
Dim strShortDate As String
Dim strLongDate As String
Dim strTest As String
Dim strAddress As String
Dim strCountry As String
Dim strSaveName As String
Dim strTestFile As String
Dim intSaveNameFail As Boolean
Dim i As Integer
Dim strSaveNamePath As String
Verificar informaes de endereo necessrias:
strTest = Nz (Me! [StreetAddress])
Se strTest = \"\", em seguida,
MsgBox \"no pode enviar carta - nenhum endereo!\"
GoTo ErrorHandlerExit
End If
strContactName = _
NZ (Me! [NomeDoContato])
strCompanyName = _
NZ (Me! [CompanyName])
strWordTemplate = \"Contato carta Doc Props.dotx\"
154
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
11_047026 ch06.qxp 02\/04\/07 21:44 pgina 154
strLongDate = Format (data, \"mmmm d, yyyy\")
strShortDate = Format (data, \"m-d-aaaa\")
strSaveName = \"Letra a\"
strSaveName = strSaveName
& .doc
strDocsPath = GetContactsDocsPath()
Debug. Print \"caminho de Docs:\"
strTemplatePath = GetContactsTemplatesPath()
Debug. Print \"caminho do modelo:\"
strWordTemplate = strTemplatePath
Debug. Print \"modelo e caminho a palavra:\" _
& strWordTemplate
Verifique o modelo na pasta modelos do contato selecionado e sair se no for encontrado:
strTestFile = Nz(Dir(strWordTemplate))
Debug. Print \"o arquivo de teste:\"
Se strTestFile = \"\", em seguida,
MsgBox strWordTemplate _
& template not found; cant create letter
GoTo ErrorHandlerExit
End If
Defina a varivel de aplicativo do Word; se a palavra no est em execuo, o manipulador de erro padro
CreateObject:
Set appWord = GetObject(Class:=\"Word.Application\")
Conjunto docs = appWord.Documents
Conjunto doc = docs.Add(strWordTemplate)
Conjunto prps = doc.CustomDocumentProperties
Desativar o manipulador de erro porque alguns dos modelos no podem ter todas as propriedades de doc:
Em erro continuar prximo
PRPs.Item(\"NameTitleCompany\").Valor = _
NZ (Me! [NameTitleCompany])
PRPs.Item(\"WholeAddress\").Valor = _
NZ (Me! [WholeAddress])
PRPs.Item(\"Salutation\").Valor = _
NZ (Me! [Saudao])
PRPs.Item(\"TodayDate\").Valor = strLongDate
PRPs.Item(\"CompanyName\").Valor = _
strCompanyName
PRPs.Item(\"JobTitle\").Valor = _
NZ (Me! [JobTitle])
PRPs.Item(\"ZipCode\").Valor = _
NZ (Me! [CEP])
PRPs.Item(\"ContactName\").Valor = strContactName
No erro GoTo ErrorHandler
155
Trabalhando com documentos do Word e modelos
6
11_047026 ch06.qxp 02\/04\/07 21:44 pgina 155
Verifique se h uma carta previamente salva na pasta documentos e acrescentar um nmero incrementado
para salvar o nome se encontra:
i = 2
intSaveNameFail = True
Enquanto intSaveNameFail
strSaveNamePath = strDocsPath
Debug. Print \"prope-se salvar o nome e o caminho:\" _
& vbCrLf & strSaveNamePath
strTestFile = Nz(Dir(strSaveNamePath))
Debug. Print \"o arquivo de teste:\"
Se strTestFile = strSaveName Then
Debug. Print \"Salve o nome j usado:\" _
& strSaveName
Crie um novo salve o nome com o nmero incrementado:
intSaveNameFail = True
strSaveName = \"Carta\"
Me![Nome]
strSaveName = strSaveName
& .doc
strSaveNamePath = strDocsPath
Debug. Print \"novo salvar o nome e o caminho:\" _
& vbCrLf & strSaveNamePath
i = i + 1
Outra coisa
Debug. Print \"Salve o nome no usado:\"
intSaveNameFail = False
End If
Loop
Com appWord
.Visvel = True
.Selection.WholeStory
.Selection.Fields.Update
Debug. Print \"vai salvar como\"
.ActiveDocument.SaveAs strSaveNamePath
.Ativar
.Unidade Selection.EndKey: = wdStory
Terminar com
ErrorHandlerExit:
Exit Sub
ErrorHandler:
Se errar = 429 ento
' Palavra no est em execuo; Palavra aberta com CreateObject
Set appWord = CreateObject(Class:=\"Word.Application\")
Retomar em seguida
156
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
11_047026 ch06.qxp 02\/04\/07 21:44 pgina 156
Outra coisa
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End If
End Sub
A Figura 6.16 mostra a letra resultante.
Ao criar documentos do Word no cdigo VBA, salvar a data atual para o TodayDate
Propriedade de documento, o cdigo de exportao, ao invs de inserir um cdigo de data na palavra
modelo, para garantir que a data na carta ser sempre a data em que a letra foi criada; uma data
campo mostrar a data atual (a data que a letra reaberta).
Se o nome j foi usado, o cdigo faz um loop para trs e adiciona um nmero ao final do salvar
nome e continua tentando at que seja atingido um nmero no utilizado. Esta tcnica significa que voc no vai
substituir documentos criados no mesmo dia, mas em vez disso, criar uma srie de documentos com incre-
nmeros de Ludo.
FIGURA 6.16
Uma letra da palavra preenchido com dados de acesso de um nico registro de contato.
DICA DICA
157
Trabalhando com documentos do Word e modelos
6
11_047026 ch06.qxp 02\/04\/07 21:44 pgina 157
Se voc no quiser criar vrios documentos, voc pode eliminar a Fazer...Loop instruo e
Substitua um arquivo existente com o mesmo nome, se houver.
Enviando uma carta de palavra para vrios contatos de acesso
Quando voc precisa selecionar um grupo de destinatrios para uma letra da palavra, conjunto de etiquetas, ou outro documento,
voc precisa de uma interface diferente. O frmMergeToWord de formulrio tem uma caixa de combinao para selecionar uma palavra
modelo e uma caixa de listagem seleo mltipla para selecionar um ou mais contatos como destinatrios (Ver Figura 6.17).
FIGURA 6.17
Um formulrio para a seleo de um documento e destinatrios para a criao de documentos do Word preenchido com os dados de acesso do
vrios registros de contatos.
A lista de caixa de combinao selecione documento mostra o tipo de mesclagem na segunda coluna (Ver Figura 6.18).
O procedimento de evento Click do boto cmdMerge primeiro determina que um modelo tem sido
selecionado, e que o modelo pode ser encontrado na pasta de modelos de contato (esta pasta definida em
menu principal de na base de dados). Em seguida, o mtodo merge captado da terceira coluna da
lista de caixa de combinao (primeira coluna no exibida, ele contm o nome do arquivo selecionado docu-
mento, para uso no cdigo).
Porque alguns dos documentos de mesclagem so documentos do Word e alguns so modelos, e alguns so
no formato do Word 2007 e outros em formato Word 97\/2003, h uma Se...Em seguida declarao em
o procedimento que examina a extenso do documento original e cria o save apropriado
extenso de documento para ser usado como um argumento para os procedimentos de chamada.
158
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
11_047026 ch06.qxp 02\/04\/07 21:44 pgina 158
FIGURA 6.18
Uma caixa de combinao para selecionar um modelo do Word para mesclar dados de acesso.
O procedimento chama um dos quatro procedimentos com o nome de arquivo de documento (incluindo o caminho) e
extenso como argumentos, dependendo do tipo de mesclagem.
O cmdCreateDocuments_Click procedimento listado como segue:
Private Sub cmdCreateDocuments_Click()
No erro GoTo ErrorHandler
Dim cbo como Access.ComboBox
Dim strCompanyName As String
Dim strContactName As String
Dim strJobTitle As String
Dim strTestFile As String
Dim strWordTemplate As String
Dim strTest As String
Dim strDocType As String
Dim strMergeType As String
Dim strExtension As String
Verificar que um documento foi selecionado:
Conjunto cbo = Me![cboSelectDocument]
strWordTemplate = Nz (cbo.Valor)
Se strWordTemplate = \"\", em seguida,
MsgBox \"Selecione um documento\"
CBO.SetFocus
CBO.Menu suspenso
GoTo ErrorHandlerExit
End If
strTemplatePath = GetContactsTemplatesPath()
Debug. Print \"caminho do modelo:\"
strWordTemplate = strTemplatePath
159
Trabalhando com documentos do Word e modelos
6
11_047026 ch06.qxp 02\/04\/07 21:44 pgina 159
Verifique o modelo na pasta de modelo selecionado e sair se no for encontrado:
strTestFile = Nz(Dir(strWordTemplate))
Debug. Print \"o arquivo de teste:\"
Se strTestFile = \"\", em seguida,
MsgBox strWordTemplate
& cant create document
GoTo ErrorHandlerExit
End If
Chame o procedimento adequado, dependendo do tipo de mesclagem selecionado:
strMergeType = Nz (Me! [cboSelectDocument].Column(2))
Se direito (strWordTemplate, 1) = \"x\", ento
strExtension = \". docx\"
Outra coisa
strExtension = \". doc\"
End If
Selecione o caso strMergeType
Caso \"Adereos de Doc\"
Chamar MergeDocProps (strWordTemplate, strExtension)
Caso \"Favoritos\"
Chamar MergeBookmarks (strWordTemplate, strExtension)
Caso \"TypeText\"
Chamar MergeTypeText (strWordTemplate, strExtension)
Caso \"Mala direta\"
Chamar MailMerge (strWordTemplate, strExtension)
End Select
ErrorHandlerExit:
Exit Sub
ErrorHandler:
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End Sub
Se um documento do tipo merge Doc adereos selecionado, o procedimento de MergeDocProps chamado.
Este procedimento define primeiro uma referncia coleo ItemsSelected acessvel do ListBox (esta col-
lectora inclui apenas as linhas selecionadas na ListBox), ento itera atravs da coleo, creat -
ing um novo documento do Word para cada registro de contato.
160
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
11_047026 ch06.qxp 02\/04\/07 21:44 pgina 160
O cdigo define uma referncia coleo de Word CustomDocumentProperties a recm
documento criado e define cada documento de propriedade para o valor em uma coluna da linha atual
do ListBox. A salve o nome criada, incluindo o ttulo do documento, nome do contato, empresa
nome, data e o documento salvo:
Private Sub MergeDocProps(strWordTemplate As String, _
strExtension As String)
No erro GoTo ErrorHandler
strLongDate = Format (data, \"mmmm d, yyyy\")
strShortDate = Format (data, \"m-d-aaaa\")
strDocsPath = GetContactsDocsPath()
Debug. Print \"caminho de Docs:\"
Confira o que foi selecionado pelo menos um contato:
Conjunto lst = Me![lstSelectContacts]
Se lst.ItemsSelected.Count = 0 Then
MsgBox \"Por favor seleccione pelo menos um contato\"
LST.SetFocus
GoTo ErrorHandlerExit
End If
intColumns = lst.ColumnCount
intRows = lst.ItemsSelected.Count
Para cada varItem no lst.ItemsSelected
Verificar informaes de endereo necessrias:
strTest = Nz (lst.Coluna (5, varItem))
Debug. Print \"Endereo:\"
Se strTest = \"\", em seguida,
Debug. Print \"Ignorando este registro - nenhum endereo!\"
GoTo ErrorHandlerExit
End If
strTest = Nz (lst.Coluna (1, varItem))
Debug. Print \"nome do contato:\"
Se strTest = \"\", em seguida,
_ DEBUG
\"Ignorando este registro - sem contato nome!\"
GoTo ErrorHandlerExit
End If
strContactName = _
NZ (lst.Coluna (1, varItem))
strCompanyName = _
NZ (lst.Coluna (7, varItem))
161
Trabalhando com documentos do Word e modelos
6
11_047026 ch06.qxp 02\/04\/07 21:44 pgina 161
Abra um novo documento baseado no modelo seleccionado:
Set appWord = GetObject(Class:=\"Word.Application\")
appWord.Documents.Add strWordTemplate
Gravar informaes de propriedades do documento personalizado do Word:
Conjunto prps = _
appWord.ActiveDocument.CustomDocumentProperties
Desativar o manipulador de erro porque alguns modelos no tm todas as propriedades de doc:
Em erro continuar prximo
PRPs.Item(\"NameTitleCompany\").Valor = _
NZ (lst.Coluna (2, varItem))
PRPs.Item(\"WholeAddress\").Valor = _
NZ (lst.Coluna (5, varItem))
PRPs.Item(\"Salutation\").Valor = _
NZ (lst.Coluna (10, varItem))
PRPs.Item(\"TodayDate\").Valor = strLongDate
PRPs.Item(\"CompanyName\").Valor = _
strCompanyName
PRPs.Item(\"JobTitle\").Valor = _
NZ (lst.Coluna (8, varItem))
PRPs.Item(\"ZipCode\").Valor = _
NZ (lst.Coluna (6, varItem))
PRPs.Item(\"ContactName\").Valor = strContactName
No erro GoTo ErrorHandler
Verificar se um documento salvo anteriormente na pasta documentos e acrescentar um incrementado
nmero para salvar o nome se for encontrado:
strDocType = _
appWord.ActiveDocument.
BuiltInDocumentProperties(wdPropertyTitle)
strSaveName = strDocType
& strContactName & - & strCompanyName
strSaveName = strSaveName
& strShortDate & strExtension
i = 2
intSaveNameFail = True
Enquanto intSaveNameFail
strSaveNamePath = strDocsPath
Debug. Print \"prope-se salvar o nome e o caminho:\" _
& vbCrLf & strSaveNamePath
strTestFile = Nz(Dir(strSaveNamePath))
Debug. Print \"o arquivo de teste:\"
Se strTestFile = strSaveName Then
Debug. Print \"Salve o nome j usado:\" _
& strSaveName
162
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
11_047026 ch06.qxp 02\/04\/07 21:44 pgina 162
Crie um novo salve o nome com o nmero incrementado:
intSaveNameFail = True
strSaveName = strDocType
& to & strContactName & - _
& strCompanyName
strSaveName = strSaveName
& strShortDate & strExtension
strSaveNamePath = strDocsPath
Debug. Print \"novo salvar o nome e o caminho:\" _
& vbCrLf & strSaveNamePath
i = i + 1
Outra coisa
Debug. Print \"Salve o nome no usado:\"
intSaveNameFail = False
End If
NextContact:
Loop
Atualizar os campos no documento do Word e salve-o:
Re-Hide o campo CEP
Com appWord.Selection
.GoTo que: = wdGoToBookmark, nome: = \"CEP\"
.Find.ClearFormatting
.Font.Hidden = True
Terminar com
Com appWord
.Selection.WholeStory
.Selection.Fields.Update
.Unidade Selection.HomeKey: = wdStory
.ActiveDocument.SaveAs strSaveNamePath
Terminar com
Prxima varItem
Com appWord
.ActiveWindow.WindowState = wdWindowStateNormal
.Visvel = True
.Ativar
Terminar com
ErrorHandlerExit:
Exit Sub
ErrorHandler:
Se errar = 429 ento
' Palavra no est em execuo; Palavra aberta com CreateObject
Set appWord = CreateObject(Class:=\"Word.Application\")
Retomar em seguida
163
Trabalhando com documentos do Word e modelos
6
11_047026 ch06.qxp 02\/04\/07 21:44 pgina 163
Outra coisa
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End If
End Sub
Para obter uma lista da palavra interna chamado constantes que podem ser usadas como argumentos para func-
es ou mtodos, ou definir como os valores das propriedades, procure o apropriado enumera -
o (enum) no Pesquisador de objetos. Enums palavra comear com a Wd e esto na parte inferior das Classes
lista. Por exemplo, para ver quais constantes nomeadas podem ser usados para a propriedade WindowState do
Propriedade ActiveWindow, olhar para cima o enum WdWindowState, mostrada na Figura 6.19.
FIGURA 6.19
Examinando o enum WdWindowState no Pesquisador de objetos.
O cmdDeselectAll_Click procedimento, executar a partir do boto de comando clara todas as selees,
desmarca todas as linhas na caixa de listagem, mesmo aqueles que voc no pode ver, ento voc pode comear de novo:
Private Sub cmdDeselectAll_Click()
No erro GoTo ErrorHandler
Conjunto lst = Me![lstSelectContacts]
intRows = lst.ListCount - 1
DICA DICA
164
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
11_047026 ch06.qxp 02\/04\/07 21:44 pgina 164
Para intIndex = 0 para intRows
LST.Selected(intIndex) = False
Prxima intIndex
ErrorHandlerExit:
Exit Sub
ErrorHandler:
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End Sub
O cmdSelectAll_Click procedimento, executar a partir do boto de comando selecionar todos os nomes, seleciona
Todas as linhas no listbox; seu cdigo similar, definindo o Selecionado valor para Verdadeiro Em vez de
Falso .
Clicando no boto de comando de limpar todas as seleces limpa todas as selees que voc fez na lista-
caixa; clicando no boto de comando criar documentos inicia a mesclagem, chamando um dos quatro proce-
dures, dependendo do tipo de mesclagem.
Marcador da palavra
Se voc selecionar a letra do contato com o modelo de Envelope (Bookmarks) do documento selecione
caixa de combinao em frmMergeToWord, voc ter um conjunto de cartas individuais, um para cada selecionado con -
tato, com marcadores preenchido com dados de acesso. Uma destas cartas mostrada na Figura 6.20 (eu fiz
favoritos visveis, assim voc pode ver suas localizaes; Note que o eu-barras cinza).
O MergeBookmarks procedimento (listado em seguida) basicamente semelhante a MergeDocProps
cdigo listado em uma seo anterior; a diferena que em vez de trabalhar com o
CustomDocumentProperties coleo, ele funciona com a coleo de Bookmarks, escrevendo
informaes de variveis ou listbox denominado favoritos no recm-criado
Documento do Word:
Private Sub MergeBookmarks(strWordTemplate As String, _
strExtension As String)
No erro GoTo ErrorHandler
strLongDate = Format (data, \"mmmm d, yyyy\")
strShortDate = Format (data, \"m-d-aaaa\")
strDocsPath = GetContactsDocsPath()
Debug. Print \"caminho de Docs:\"
165
Trabalhando com documentos do Word e modelos
6
11_047026 ch06.qxp 02\/04\/07 21:44 pgina 165
FIGURA 6.20
Um documento do Word com dados de acesso exibidos em favoritos.
Confira o que foi selecionado pelo menos um contato:
Conjunto lst = Me![lstSelectContacts]
Se lst.ItemsSelected.Count = 0 Then
MsgBox \"Por favor seleccione pelo menos um contato\"
LST.SetFocus
GoTo ErrorHandlerExit
End If
intColumns = lst.ColumnCount
intRows = lst.ItemsSelected.Count
Para cada varItem no lst.ItemsSelected
166
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
11_047026 ch06.qxp 02\/04\/07 21:44 pgina 166
Verificar informaes de endereo necessrias:
strTest = Nz (lst.Coluna (5, varItem))
Debug. Print \"Endereo:\"
Se strTest = \"\", em seguida,
Debug. Print \"Ignorando este registro - nenhum endereo!\"
GoTo NextContact
End If
strTest = Nz (lst.Coluna (1, varItem))
Debug. Print \"nome do contato:\"
Se strTest = \"\", em seguida,
_ DEBUG
\"Ignorando este registro - sem contato nome!\"
GoTo NextContact
End If
strContactName = _
NZ (lst.Coluna (1, varItem))
strCompanyName = _
NZ (lst.Coluna (7, varItem))
strNameTitleCompany = _
NZ (lst.Coluna (2, varItem))
strWholeAddress = _
NZ (lst.Coluna (5, varItem))
Abra um novo documento baseado no modelo seleccionado:
Set appWord = GetObject(Class:=\"Word.Application\")
appWord.Documents.Add strWordTemplate
Gravar informaes de favoritos de palavra, primeiro desligar o manipulador de erro, porque alguns modelos
no tenho todos estes indicadores:
Em erro continuar prximo
Com appWord.Selection
.GoTo que: = wdGoToBookmark, _
Nome: = \"NameTitleCompany\"
.TypeText Text: = strNameTitleCompany
.GoTo que: = wdGoToBookmark, _
Nome: = \"WholeAddress\"
.TypeText Text: = strWholeAddress
.GoTo que: = wdGoToBookmark, nome: = \"Saudao\"
.TypeText Text: = Nz (lst.Coluna (10, varItem))
.GoTo que: = wdGoToBookmark, nome: = \"TodayDate\"
.TypeText Text: = strLongDate
167
Trabalhando com documentos do Word e modelos
6
11_047026 ch06.qxp 02\/04\/07 21:44 pgina 167
.GoTo que: = wdGoToBookmark, _
Nome: = \"EnvelopeNameTitleCompany\"
.TypeText Text: = strNameTitleCompany
.GoTo que: = wdGoToBookmark, _
Nome: = \"EnvelopeWholeAddress\"
.TypeText Text: = strWholeAddress
.GoTo que: = wdGoToBookmark, nome: = \"CEP\"
.TypeText Text: = Nz (lst.Coluna (6, varItem))
Terminar com
Reinsira o indicador:
Com appWord.Selection
.MoveLeft _
unidade: = wdWord, Count: = 3, _
Estender: = wdExtend
.Font.Hidden = True
Terminar com
CEP re-Hide.
Com ActiveDocument.Bookmarks
.Adicionar Range:=Selection.Range, nome: = \"CEP\"
.DefaultSorting = wdSortByName
.ShowHidden = False
Terminar com
No erro GoTo ErrorHandler
Verificar se um documento salvo anteriormente na pasta documentos e acrescentar um incrementado
nmero para salvar o nome se for encontrado:
strDocType = _
appWord.ActiveDocument.
BuiltInDocumentProperties(wdPropertyTitle)
strSaveName = strDocType
& strContactName & - & strCompanyName
strSaveName = strSaveName
& strShortDate & strExtension
i = 2
intSaveNameFail = True
Enquanto intSaveNameFail
strSaveNamePath = strDocsPath
Debug. Print \"prope-se salvar o nome e o caminho:\" _
& vbCrLf & strSaveNamePath
strTestFile = Nz(Dir(strSaveNamePath))
Debug. Print \"o arquivo de teste:\"
Se strTestFile = strSaveName Then
Debug. Print \"Salve o nome j usado:\" _
& strSaveName
168
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
11_047026 ch06.qxp 02\/04\/07 21:44 pgina 168
Crie um novo salve o nome com o nmero incrementado:
intSaveNameFail = True
strSaveName = strDocType
& to & strContactName & - _
& strCompanyName
strSaveName = strSaveName
& strShortDate & strExtension
strSaveNamePath = strDocsPath
Debug. Print \"novo salvar o nome e o caminho:\" _
& vbCrLf & strSaveNamePath
i = i + 1
Outra coisa
Debug. Print \"Salve o nome no usado:\"
intSaveNameFail = False
End If
NextContact:
Loop
Atualizar os campos no documento do Word e salve-o:
Com appWord
.Selection.WholeStory
.Selection.Fields.Update
.Unidade Selection.HomeKey: = wdStory
.ActiveDocument.SaveAs strSaveNamePath
Terminar com
Prxima varItem
Com appWord
.ActiveWindow.WindowState = wdWindowStateNormal
.Visvel = True
.Ativar
Terminar com
ErrorHandlerExit:
Exit Sub
ErrorHandler:
Se errar = 429 ento
' Palavra no est em execuo; Palavra aberta com CreateObject
Set appWord = CreateObject(Class:=\"Word.Application\")
Retomar em seguida
Outra coisa
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End If
End Sub
169
Trabalhando com documentos do Word e modelos
6
11_047026 ch06.qxp 02\/04\/07 21:44 pgina 169
O mtodo TypeText
Para documentos simples, como mandar etiquetas, onde voc s precisam inserir um bloco de texto de
Acesso, sem formatao de fantasia, o TypeTextMtodo do objeto Selection Word pode ser til.
Se voc selecionar a seleo de Avery 5160 (TypeText) da caixa de combinao selecione documento em
frmMergeToWord, voc ter um documento do Word em forma de uma tabela com clulas do tamanho certo
para imprimir em folhas de etiquetas, como mostrado na Figura 6,21.
FIGURA 6,21
Um documento de etiquetas Avery 5160 preenchido com dados de acesso.
Voc tambm pode criar um documento do tipo de lista usando o mtodo TypeText, preenchendo uma tabela com
dados de registros de acesso, um registro por linha. A Figura 6.22 mostra desse documento,
usando um dos novos temas de tabela do Word 2007 e o novo recurso de linhas com anilhas.
O MergeTypeText procedimento (listado a seguir) grava dados de variveis diretamente para as clulas em um
tabela, movendo-se para a prxima clula usando o MoveRight mtodo:
Private Sub MergeTypeText(strWordTemplate As String, _
strExtension As String)
No erro GoTo ErrorHandler
NOVO RECURSO NOVO RECURSO
170
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
11_047026 ch06.qxp 02\/04\/07 21:44 pgina 170
Dim intMod As Integer
Dim lngCount como longo
Dim lngSkip como longo
Dim doc como Word.Document
strLongDate = Format (data, \"mmmm d, yyyy\")
strShortDate = Format (data, \"m-d-aaaa\")
strDocsPath = GetContactsDocsPath()
Debug. Print \"caminho de Docs:\"
Abra um novo documento baseado no modelo de rtulos selecionados:
Set appWord = GetObject(Class:=\"Word.Application\")
Conjunto doc = appWord.Documents.Add(strWordTemplate)
FIGURA 6.22
Uma lista de contato preenchido com dados de acesso, mostrando o novo Word 2007, recursos de formatao.
171
Trabalhando com documentos do Word e modelos
6
11_047026 ch06.qxp 02\/04\/07 21:44 pgina 171
Determinar se o modelo para rtulos ou lista e mover para a primeira clula de dados na tabela se
necessrio:
Se Nz (InStr (strWordTemplate, \"Lista\")) > 0 ento
appWord.Selection.GoTo o que: = wdGoToTable, _
que: = wdGoToFirst, _
Contagem: = 1
unidade appWord.Selection.MoveDown: = wdLine, _
Contagem: = 1
End If
Definir ointMod valor dependendo do nmero de clulas por linha:
strDocType = _
doc.BuiltInDocumentProperties(wdPropertyTitle)
Selecione o caso strDocType
Caso \"Etiquetas Avery 5160\"
intMod = 3
Caso \"Etiquetas Avery 5161\"
intMod = 2
Caso \"Avery 5162 Labels\"
intMod = 2
End Select
Confira o que foi selecionado pelo menos um contato:
Conjunto lst = Me![lstSelectContacts]
Se lst.ItemsSelected.Count = 0 Then
MsgBox \"Por favor seleccione pelo menos um contato\"
LST.SetFocus
GoTo ErrorHandlerExit
End If
intColumns = lst.ColumnCount
intRows = lst.ItemsSelected.Count
Para cada varItem no lst.ItemsSelected
Verifique as informaes necessrias:
strTest = Nz (lst.Coluna (1, varItem))
Debug. Print \"nome do contato:\"
Se strTest = \"\", em seguida,
_ DEBUG
\"Ignorando este registro - sem contato nome!\"
GoTo NextContact
172
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
11_047026 ch06.qxp 02\/04\/07 21:44 pgina 172
End If
strNameTitleCompany = _
NZ (lst.Coluna (2, varItem))
strWholeAddress = _
NZ (lst.Coluna (5, varItem))
strContactName = _
NZ (lst.Coluna (1, varItem))
strCompanyName = _
NZ (lst.Coluna (7, varItem))
strJobTitle = Nz (lst.Coluna (8, varItem))
Processo de forma diferente dependendo se o modelo de rtulos ou de uma lista:
Se Nz (InStr (strWordTemplate, \"Lista\")) > 0 ento
Inserir dados em lista:
Com appWord.Selection
.TypeText Text: = strContactName
.MoveRight unidade: = wdCell, Count: = 1
.TypeText Text: = strJobTitle
.MoveRight unidade: = wdCell, Count: = 1
.TypeText Text: = strCompanyName
.MoveRight unidade: = wdCell, Count: = 1
Terminar com
ElseIf Nz (InStr (strWordTemplate, \"Rtulos\")) > 0 ento
lngCount = lngCount + 1
Inserir dados em etiquetas, saltando de colunas estreitas espaador:
Com appWord.Selection
.TypeText Text: = strNameTitleCompany
.TypeParagraph
.TypeText Text: = strWholeAddress
.TypeParagraph
Uso o Modoperador para lidar com cada registro de segundo ou terceiro forma diferente, a fim de gravar dados apenas
clulas vlido:
lngSkip = lngCount Mod intMod
Se lngSkip <>0 ento
.MoveRight unidade: = wdCell, Count: = 2
ElseIf lngSkip = 0 Then
.MoveRight unidade: = wdCell, Count: = 1
End If
Terminar com
End If
173
Trabalhando com documentos do Word e modelos
6
11_047026 ch06.qxp 02\/04\/07 21:44 pgina 173
NextContact:
Prxima varItem
Se Nz (InStr (strWordTemplate, \"Lista\")) > 0 ento
Exclua redundante ltima linha (em branco):
Com appWord.Selection
.SelectRow
.Rows.Delete
.HomeKey unidade: = wdStory
Terminar com
End If
Verificar se o documento salvo anteriormente na pasta documentos e acrescentar um incrementado
nmero para salvar o nome se for encontrado:
strDocType = _
appWord.ActiveDocument.BuiltInDocumentProperties(wdPropertyTitle)
strSaveName = strDocType
& strShortDate & strExtension
i = 2
intSaveNameFail = True
Enquanto intSaveNameFail
strSaveNamePath = strDocsPath
Debug. Print \"prope-se salvar o nome e o caminho:\" _
& vbCrLf & strSaveNamePath
strTestFile = Nz(Dir(strSaveNamePath))
Debug. Print \"o arquivo de teste:\"
Se strTestFile = strSaveName Then
Debug. Print \"Salve o nome j usado:\" _
& strSaveName
Crie um novo salve o nome com o nmero incrementado:
intSaveNameFail = True
strSaveName = strDocType
& strShortDate & strExtension
strSaveNamePath = strDocsPath
Debug. Print \"novo salvar o nome e o caminho:\" _
& vbCrLf & strSaveNamePath
i = i + 1
Outra coisa
Debug. Print \"Salve o nome no usado:\"
intSaveNameFail = False
End If
Loop
174
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
11_047026 ch06.qxp 02\/04\/07 21:44 pgina 174
Salve documento do Word:
appWord.ActiveDocument.SaveAs strSaveNamePath
Com appWord
.ActiveWindow.WindowState = wdWindowStateNormal
.Visvel = True
.Ativar
Terminar com
ErrorHandlerExit:
Exit Sub
ErrorHandler:
Se errar = 429 ento
Palavra no est em execuo; Abra o Word com CreateObject :
Set appWord = CreateObject(Class:=\"Word.Application\")
Retomar em seguida
Outra coisa
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End If
End Sub
Mala direta do Word
Voc pode vincular um documento de mala direta do Word diretamente a uma tabela do Access ou consulta; no entanto, existem alguns
desvantagens para este mtodo. O documento de mala direta no vai abrir, a menos que o banco de dados do Access est disponvel
e no mesmo local quando a fonte de dados de mesclagem foi selecionada. Devido a essa limitao,
ao usar a mala direta que eu prefiro para exportar os dados de acesso para um arquivo de texto e atribuir o recm-criado
arquivo de texto como fonte de dados do documento de mala direta. Isso significa que o documento pode ser aberto com-
acesso sendo disponvel e sem a necessidade de estabelecer um link para um banco de dados.
Etiquetas de endereamento
Folhas de etiquetas de endereamento so muito apropriadas para mala direta; voc pode selecionar trs tipos de Avery de discusso
rtulos (tipo mala) da caixa de combinao selecione documento em frmMergeToWord. Se voc selecionar
o documento de Avery 5160 etiquetas (mala direta), voc ter um documento do Word como a mostrada
na Figura 6.23.
Os documentos de etiquetas Avery olhar (e trabalho) da mesma seja produzida por mala direta ou
o TypeText mtodo, por isso eu prefiro usar o TypeText mtodo, porque muito mais simples
configurar um documento de etiquetas simples de um documento de mala direta; tudo o que voc tem que fazer criar um rtulos-
tipo de documento no Word, Considerando que a criao de um documento de mala direta requer manualmente ligando para um
fonte de dados e inserir campos de mesclagem.
175
Trabalhando com documentos do Word e modelos
6
11_047026 ch06.qxp 02\/04\/07 21:44 pgina 175
FIGURA 6.23
Uma discusso de 5161 Avery etiquetas documento de mala direta, preenchido com os dados de acesso.
Listas
A mesclagem de catlogo do tipo Word muito til para a produo de listas de dados mesclados. Selecionando o
Entre em contato com o documento da lista (mala direta) (este um documento do Word 97\/2003, usado em compatibilidade
modo) do combo de documento selecione caixa de frmMergeToWord cria uma lista em forma tabular,
mostrado na Figura 6.24.
Documentos
Voc pode usar mala direta para criar um documento de mala direta, onde cada pgina exibe dados de um con-
registro de tato. Eu prefiro usar o mtodo de propriedades ou marcadores de documento, a fim de ter um sepa-
documento da taxa para cada contato, mas se voc tem muitas centenas (ou milhares) de documentos que
geram, isto no prtico. Seleo no documento selecione contato letras (mala direta)
caixa de combinao cria um documento de mala direta com uma letra em cada pgina; Figura 6.25 mostra uma pgina
deste documento de mesclagem.
176
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
11_047026 ch06.qxp 02\/04\/07 21:44 pgina 176
FIGURA 6.24
A lista de contato preenchido com dados mesclados de acesso.
Se um documento de mala direta com a fonte de dados de mesclagem Data. txt aberto, se voc tentar criar
outro documento de mala direta vinculado mesma fonte de dados, voc receber uma mensagem de erro
dizendo que
Merge Data. txt
j existe, e voc no ser capaz de continuar. Para evitar isso de
acontecendo, o cdigo da mala fecha o documento original de mesclagem aps a fuso de dados para um novo
documento.
O MailMergeTextFile procedimento listado como segue. Esse procedimento primeiro preenche uma tabela do Access
com os dados da coleo ItemsSelected do ListBox e, em seguida, exporta os dados de que
tabela para um arquivo de texto Merge Data. txt , que usado como a fonte de dados para a mala docu -
mento. A mesclagem executada para um novo documento (para que o documento pode ser aberto posteriormente, sem
precisando de fonte de dados) e salvo com um nome que pegou do campo do ttulo do modelo e o
data, formatada com traos para evitar problemas de nome de arquivo:
AVISO AVISO
177
Trabalhando com documentos do Word e modelos
6
11_047026 ch06.qxp 02\/04\/07 21:44 pgina 177
FIGURA 6.25
A terceira pgina de um documento de cartas de mala direta.
Private Sub MailMergeTextFile(strWordTemplate As String, _
strExtension As String)
No erro GoTo ErrorHandler
Dim rst como DAO.Conjunto de registros
Dim dbs como DAO.Banco de dados
Dim strDBPath As String
Dim strTextFile As String
Dim strDocName As String
Dim strSalutation As String
Dim strZipCode As String
Dim strSQL As String
Dim strTable As String
178
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
11_047026 ch06.qxp 02\/04\/07 21:44 Page 178
strLongDate = Format (data, \"mmmm d, yyyy\")
strShortDate = Format (data, \"m-d-aaaa\")
strDocsPath = GetContactsDocsPath()
Debug. Print \"caminho de Docs:\"
strTemplatePath = GetContactsTemplatesPath()
Verificar que pelo menos dois contatos foram selecionados, pois no adianta fazer um mail
Mesclar para apenas um contato:
Conjunto lst = Me![lstSelectContacts]
Se lst.ItemsSelected.Count < 0 ento
MsgBox \"Por favor seleccione pelo menos um contato\"
LST.SetFocus
GoTo ErrorHandlerExit
End If
Claro, os dados de mesclagem da antiga tabela dados:
DoCmd.SetWarnings False
strTable = \"tblMergeData\"
strSQL = \"DELETE * FROM\"
StrSQL DoCmd.RunSQL
Crie um conjunto de registros com base na tabela de dados de mesclagem:
Conjunto dbs = CurrentDb
Set rst = dbs.OpenRecordset(Name:=strTable)
intColumns = lst.ColumnCount
intRows = lst.ItemsSelected.Count
Para cada varItem no lst.ItemsSelected
Verificar informaes de endereo necessrias:
strTest = Nz (lst.Coluna (5, varItem))
Debug. Print \"Endereo:\"
Se strTest = \"\", em seguida,
Debug. Print \"Ignorando este registro - nenhum endereo!\"
GoTo NextContact
End If
strTest = Nz (lst.Coluna (1, varItem))
Debug. Print \"nome do contato:\"
Se strTest = \"\", em seguida,
_ DEBUG
\"Ignorando este registro - sem contato nome!\"
GoTo NextContact
End If
179
Trabalhando com documentos do Word e modelos
6
11_047026 ch06.qxp 02\/04\/07 21:44 pgina 179
strContactName = _
NZ (lst.Coluna (1, varItem))
strCompanyName = _
NZ (lst.Coluna (7, varItem))
strNameTitleCompany = _
NZ (lst.Coluna (2, varItem))
strWholeAddress = Nz (lst.Coluna (5, varItem))
strSalutation = Nz (lst.Coluna (10, varItem))
strJobTitle = Nz (lst.Coluna (8, varItem))
strZipCode = Nz (lst.Coluna (6, varItem))
Adicione registros tabela de itens selecionados no ListBox:
Com rst
.AddNew
![NameTitleCompany] = strNameTitleCompany
![WholeAddress] = strWholeAddress
![Saudao] = strSalutation
![TodayDate] = strLongDate
![CompanyName] = strCompanyName
![JobTitle] = strJobTitle
![CEP] = strZipCode
![NomeDoContato] = strContactName
.Atualizao
Terminar com
NextContact:
Prxima varItem
RST.Fechar
Exporte os dados da tabela de mesclagem para um arquivo de texto, para ser usado como fonte de dados de mala direta do documento:
strTextFile = strTemplatePath
Debug. Print \"o arquivo de texto para mesclar:\"
DoCmd.TransferText transfertype: = acExportDelim, _
TableName: = strTable, _
FileName: = strTextFile, _
HasFieldNames: = True
Abra um novo documento de mala direta, baseado no modelo seleccionado:
Set appWord = GetObject(Class:=\"Word.Application\")
appWord.Documents.Add strWordTemplate
appWord.Visible = True
strDocName = appWord.ActiveDocument.Name
Debug. Print \"nome do doc inicial:\"
180
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
11_047026 ch06.qxp 02\/04\/07 21:44 pgina 180
Verificar se um documento salvo anteriormente na pasta documentos e acrescentar um incrementado
nmero para salvar o nome se for encontrado:
strDocType = _
appWord.ActiveDocument.
BuiltInDocumentProperties(wdPropertyTitle)
strSaveName = strDocType
& strShortDate & strExtension
i = 2
intSaveNameFail = True
Enquanto intSaveNameFail
strSaveNamePath = strDocsPath
Debug. Print \"prope-se salvar o nome e o caminho:\" _
& vbCrLf & strSaveNamePath
strTestFile = Nz(Dir(strSaveNamePath))
Debug. Print \"o arquivo de teste:\"
Se strTestFile = strSaveName Then
Debug. Print \"Salve o nome j usado:\" _
& strSaveName
Crie um novo salve o nome com o nmero incrementado:
intSaveNameFail = True
strSaveName = strDocType
& strShortDate & strExtension
strSaveNamePath = strDocsPath
Debug. Print \"novo salvar o nome e o caminho:\" _
& vbCrLf & strSaveNamePath
i = i + 1
Outra coisa
Debug. Print \"Salve o nome no usado:\"
intSaveNameFail = False
End If
Loop
Definir a fonte de dados de mesclagem para o arquivo de texto que acabou de criar e fazer o merge:
Com appWord
.ActiveDocument.MailMerge.OpenDataSource _
Nome: = strTextFile, _
Formato: = wdOpenFormatText
.ActiveDocument.MailMerge.Destination = _
wdSendToNewDocument
.ActiveDocument.MailMerge.Execute
181
Trabalhando com documentos do Word e modelos
6
11_047026 ch06.qxp 02\/04\/07 21:44 pgina 181
Salve o documento de mesclagem recm-criado:
.ActiveDocument.SaveAs strSaveNamePath
Feche o documento de mesclagem mestra:
.Documents(strDocName)._ Close
SaveChanges: = wdDoNotSaveChanges
Terminar com
ErrorHandlerExit:
Exit Sub
ErrorHandler:
Se errar = 429 ento
Palavra no est em execuo; Abra o Word com CreateObject :
Set appWord = CreateObject(Class:=\"Word.Application\")
Retomar em seguida
Outra coisa
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End If
End Sub
Resumo
Agora voc sabe como exportar dados do Access para vrios tipos de documentos do Word, ambos na inter-
enfrentar e no cdigo do VBA, voc pode produzir documentos de palavra altamente formatados preenchidos com dados de acesso.
Microsoft promove a mala, mas na minha opinio melhor evitar esse mtodo (especialmente em
Office 2007 e Windows Vista), devido a problemas com recursos de segurana. Com o
trs outras tcnicas abordadas nesse captulo, voc vai saber como produzir quase qualquer tipo de
documento usando outros mtodos e evitar os problemas com bancos de dados bloqueados ou indisponveis
ao usar a mala direta quando for necessrio.
182
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
11_047026 ch06.qxp 02\/04\/07 21:44 pgina 182
J
Ust como voc pde querer exportar dados de acesso a documentos do Word para
Aproveite sua formatao superior e transportabilidade, voc
maio tambm quer (ou necessidade) para exportar dados de acesso a planilhas do Excel, assim
os usurios podem rever, editar, adicionar dados ou executar vrios numrica c-
es, em um formato familiar e amplamente utilizado (todos os usurios do Office que o Excel,
Considerando que s alguns tm acesso). Planilhas do Excel so frequentemente utilizadas para enter-
o e anlise numrica (e o texto) dados, tais como quadros de horrios, applica -
es e outras formas. Ou voc pode querer exportar dados do Access para um simples
linhas e colunas de planilha, para que os usurios podem manipular os dados em vari -
UOs maneiras e produzir grficos com base nos dados, usando as ferramentas no Excel.
Este captulo descreve como voc pode exportar dados de planilhas do Excel para uma
variedade de efeitos. Voc pode exportar dados do Access para o Excel usando o comando
sobre a nova faixa de opes, ou usar o TransferirPlanilha mtodo em um nico
linha de cdigo para fazer uma exportao de bsica de todos os dados em uma tabela ou consulta para um simples
planilha, ou escrever o cdigo mais complexo de automao VBA para criar um totalmente
planilha formatada preenchido com dados de acesso.
Estritamente falando, um. xls (ou o novo xlsx) arquivo um
pasta de trabalho; cada pasta de trabalho contm um ou mais
planilhas. No entanto, em geral jargo voc vai ouvir (e ler) planilha
usado para fazer referncia a um arquivo. xls, uma prtica transitadas desde os primeiros dias de
Excel, antes de pastas de trabalho foram adicionadas interface. Vou seguir esse uso
exceto quando necessrio distinguir entre uma pasta de trabalho e trabalho-
folha, como descrever como funciona um procedimento.
NOTA NOTA
183
NESTE CAPTULO
O modelo de objeto do Excel
Criao de planilhas de
a faixa de opes
Criao de planilhas de
modelos
Formatao de planilhas
Cdigo VBA
Preenchimento de planilhas de Excel com
Quadro de horrios de acesso a dados
Trabalhando com o Excel
Planilhas
12_047026 ch07.qxp 02\/04\/07 21:44 pgina 183
Simplesmente exportar dados do Access para Excel
Assim como em verses anteriores do Office, o Access oferece duas maneiras de fazer uma exportao rpida e suja de tabela ou
consultar dados de uma planilha do Excel. Voc pode usar o boto do Excel no grupo de exportao do externo
Dados guia da faixa de opes para exportar dados do Access sem se preocupar com a formatao, para um escritrio
2007 usurio que s quer os dados. Se voc precisa criar planilhas que podem ser abertas e editadas
por usurios executando verses anteriores do Office, ou usando um dispositivo porttil como um BlackBerry, voc pode
Use o TransferirPlanilha mtodo para exportar dados, selecionando a planilha desejada de sada
formato. Isso pode ser til quando voc trabalha para uma organizao que tem atualizado seu software e
voc precisa enviar uma planilha com informaes de contato do cliente para um representante de vendas que no tem
atualizado seu laptop ainda.
Para uma exportao rpida para o novo formato de planilha xlsx, use o boto do Excel no grupo de exportao
na guia dados externos da nova fita de acesso, como mostrado na Figura 7.1.
FIGURA 7.1
Exportar uma tabela para uma planilha do Excel da faixa de opes.
Clicando no boto Excel abre uma caixa de dilogo onde voc pode procurar o local para salvar o
planilha. Este dilogo tem uma opo para preservar o layout e formatao do original
Objeto do Access, que (curiosamente) est disponvel somente se uma tabela ou consulta selecionado (Ver Figura 7.2).
Tabelas e consultas no tm muito em termos de formatao e layout, mas se voc verificar o
Caixa de seleo \"Exportar dados com formatao e layout\" sua planilha de Excel usar a mesma fonte como
a tabela ou consulta (embora no o sombreamento de linha alternativo), e ele vai mostrar dados de uma tabela vinculada
em vez do campo ID da ligao. A Figura 7.3 mostra duas planilhas feitas da mesma tabela; a parte superior
um exibe o nome da empresa dos clientes na coluna CustomerID (peg-la do
tabela vinculada) e usa a fonte Calibri 11; a segunda planilha exibe CustomerID no que
coluna e usa a fonte Arial 10.
184
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
12_047026 ch07.qxp 02\/04\/07 21:44 pgina 184
FIGURA 7.2
As opes ao exportar uma tabela para uma planilha do Excel.
FIGURA 7.3
Planilhas Excel exportou com e sem verificar a opo \"Exportar dados com formatao e layout\"
na caixa de dilogo Exportar.
185
Trabalhando com planilhas do Excel
7
12_047026 ch07.qxp 02\/04\/07 21:44 pgina 185
O boto do Excel na faixa de opes (com ou sem o layout e a formatao preservada) um til
opo quando voc precisa criar uma planilha de Excel rpida e suja no formato do Excel 2007 (o novo
a extenso . xlsx). Se voc precisa exportar para um formato anterior do Excel, mas voc no precisa de fantasia formato-
Ting, voc pode fazer uma exportao com uma nica linha de VBA cdigo, usando o TransferirPlanilha
mtodo, que est disponvel desde os primeiros dias de acesso.
O TransferirPlanilha mtodo permite que voc selecione a verso do Excel para a criao de seu
planilha preenchida com dados de acesso, assim voc pode criar planilhas que ser utilizvel por destinatrios
quem tem verses mais antigas do Office. O procedimento listado a seguir exporta tblContacts para Excel
97-2003 planilha chamada Contacts.xls ( o constante nomeada para esta verso da planilha
acSpreadsheetTypeExcel7 ):
Funo pblica TransferToExcel()
No erro GoTo ErrorHandler
Dim strTable As String
Dim strWorksheetPath As String
strWorksheetPath = GetWorksheetsPath
strWorksheetPath = strWorksheetPath
strTable = \"tblContacts\"
strWorksheetPath = GetWorksheetsPath()
strWorksheetPath = strWorksheetPath
Debug. Print \"caminho de planilha:\"
Exporte dados de tabela para uma nova planilha:
DoCmd.TransferSpreadsheet transfertype: = acExport, _
spreadsheettype: = acSpreadsheetTypeExcel7, _
TableName: = strTable, FileName: = strWorksheetPath, _
hasfieldnames: = True
ErrorHandlerExit:
Exit Sub
ErrorHandler:
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End Sub
Planilha exportada se parece com a planilha no formatada exportada da faixa de opes
seleo, mas o formato mais velho, como voc pode ver o \"(modo de compatibilidade)\" aps o
nome da planilha na sua barra de ttulo (Ver Figura 7.4).
186
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
12_047026 ch07.qxp 02\/04\/07 21:44 pgina 186
FIGURA 7.4
Uma tabela do Access exportados para uma planilha do Excel 97-2003.
O modelo de objeto do Excel
As opes de exportao de dois descritas na seo anterior so muito bem para criar um simples, minimamente
formatado ou no formatada planilha preenchida com dados de uma tabela do Access ou a consulta, mas se voc precisa
para criar planilhas totalmente formatadas, como formas de pessoal, quadros de horrios, relatrios de vendas, fbrica
relatrios de dados de produo e assim por diante, voc precisar trabalhar com o modelo de objeto do Excel para criar
planilhas usando cdigo de automao, preench-los com dados de acesso e, em seguida, aplicar a formatao, usando
componentes do modelo de objeto do Excel.
O banco de dados de exemplo Export.accdb do Excel contm tabelas, consultas, formulrios e cdigo
usado neste captulo.
O CreateObject e GetObject funes so usadas para criar um novo objeto do Excel, ou
Defina uma referncia a uma instncia existente do Excel. Usando GetObject para recuperar uma referncia a um
pasta de trabalho existente evita a criao de instncias adicionais do Excel, que utiliza recursos do sistema. Para
abrir uma planilha dentro de uma pasta de trabalho, primeiro definir uma referncia para o objeto de pasta de trabalho, em seguida, adicionar um novo
pasta de trabalho para a coleo de pastas de trabalho. Por padro, a nova pasta de trabalho ter trs planilhas.
O CreateNewWorkbook procedimento cria uma pasta de trabalho nova e em branco do Excel padro
modelo, com trs planilhas:
Public Function CreateNewWorkbook)
No erro GoTo ErrorHandler
Dim appExcel como Application
Dim bks como Excel.Workbooks
Set appExcel = GetObject (, \"Application\")
Conjunto bks = appExcel.Workbooks
NOTA NOTA
187
Trabalhando com planilhas do Excel
7
12_047026 ch07.qxp 02\/04\/07 21:44 pgina 187
Criar e abrir um livro novo e em branco:
bks.Adicionar
Tornar a pasta visvel:
appExcel.Application.Visible = True
ErrorHandlerExit:
Exit Sub
ErrorHandler:
Se errar = 429 ento
Excel no est em execuo; Abra o Excel com CreateObject :
Set appExcel = CreateObject(\"Excel.Application\")
Retomar em seguida
Outra coisa
MsgBox \"erro nenhum:\"
Err
Resume ErrorHandlerExit
End If
End Sub
Os procedimentos nesta seo podem ser executados a partir de macros; cada procedimento tem uma macro
cujo nome
MCR
Alm disso, o nome do procedimento.
O manipulador de erro no procedimento anterior semelhante ao usado na automao do Word
cdigo no captulo 6; define uma referncia instncia atual do Excel, se o Excel est em execuo e caso contrrio
Cria um novo aplicativo do Excel instncia usando o CreateObject funo de uma linha na
manipulador de erro do procedimento. Se voc executar o CreateNewWorkbook procedimento vrias vezes, cada vez que
executa que uma nova pasta de trabalho criada dentro da janela do Excel, denominada Pasta1, Book2 e assim por diante, como
mostrado na Figura 7.5.
NOTA NOTA
188
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
12_047026 ch07.qxp 02\/04\/07 21:44 pgina 188
FIGURA 7.5
Trs pastas de trabalho na janela do Excel.
Para abrir uma pasta de trabalho salva especfica, use um procedimento como esse listado a seguir, que abre um salvo
pasta de trabalho usando a coleo de planilhas Abertomtodo e o nome do arquivo e o caminho:
Funo pblica OpenSpecificWorkbook()
No erro GoTo ErrorHandler
Dim appExcel como Application
Dim bks como Excel.Workbooks
Dim sht como Excel.Worksheet
Dim strWorkbook As String
Set appExcel = GetObject (, \"Application\")
strPrompt = \"Introduza o caminho e o ttulo da pasta de trabalho\"
strTitle = \"Nome da pasta de trabalho\"
strDefault = \"D:\/Documents\/tblContacts2.xls\"
strWorkbook = InputBox (prompt: = strPrompt, _
Ttulo: = strTitle, padro: = strDefault)
appExcel.Workbooks.Open (strWorkbook)
Conjunto sht = appExcel.ActiveWorkbook.Sheets(1)
189
Trabalhando com planilhas do Excel
7
12_047026 ch07.qxp 02\/04\/07 21:44 pgina 189
SHTAtivar
appExcel.Application.Visible = True
ErrorHandlerExit:
Exit Sub
ErrorHandler:
Se errar = 429 ento
Excel no est em execuo; Abra o Excel com CreateObject :
Set appExcel = CreateObject(\"Excel.Application\")
Retomar em seguida
Outra coisa
MsgBox \"erro nenhum:\"
Err
Resume ErrorHandlerExit
End If
End Sub
Se o Excel aberto, a pasta de trabalho ser aberta na mesma janela, conforme mostrado na Figura 7.6.
FIGURA 7.6
Abrindo uma pasta de trabalho salva em uma janela do Excel existente.
190
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
12_047026 ch07.qxp 02\/04\/07 21:44 pgina 190
Se o Excel no est em execuo, a pasta de trabalho ser aberto em uma nova janela do Excel.
Tal como acontece com a exportao de dados de acesso palavra, ao escrever o cdigo de automao para trabalhar com o Excel, voc
s precisa de alguns componentes do modelo de objeto do Excel: planilhas e pastas de trabalho, o objeto Range,
Linhas e colunas. Esses objetos so usados nos procedimentos mais complexos de automao do Excel em
as sees a seguir.
Planilhas minimamente formatadas
Se voc precisa criar uma planilha simples de tabular listando os contatos em qryContacts, com mnima
formatao, voc pode criar uma nova pasta de trabalho no cdigo VBA, a partir de um modelo de pasta de trabalho salvo com uma
ttulo, corretamente dimensionada de colunas e a fonte e outro layout de sua escolha e preench-lo com acesso
dados. OExportContactsToExcel procedimento cria um conjunto de registros com base em qryContacts, e
exportaes selecionado campos de cada registro em que consulta a uma pasta de trabalho criada a partir de um modelo, com
um ttulo, ttulos de coluna e alguma formatao mnima:
Funo pblica ExportContactsToExcel()
No erro GoTo ErrorHandler
Dim dbs como DAO.Banco de dados
Dim rst como DAO.Conjunto de registros
Dim strWorksheetPath As String
Dim appExcel como Application
Dim strTemplatePath As String
Dim bks como Excel.Workbooks
Dim rng como Excel. Range
Dim rngStart como Excel. Range
Dim strTemplateFile As String
Dim wkb como Excel.Workbook
Dim wks como Excel.Worksheet
Dim lngCount como longo
Dim strPrompt As String
Dim strTitle As String
Dim strTemplateFileAndPath As String
Dim prps como objeto
Dim strSaveName As String
Dim strTestFile As String
Dim strDefault As String
Set appExcel = GetObject (, \"Application\")
strTemplatePath = GetWorksheetTemplatesPath
strTemplateFile = \"Acesso Contacts.xltx\"
strTemplateFileAndPath = strTemplatePath _
& strTemplateFile
191
Trabalhando com planilhas do Excel
7
12_047026 ch07.qxp 02\/04\/07 21:44 pgina 191
Verifique o modelo na pasta de modelo seleccionado e sair se no for encontrado:
strTestFile = Nz(Dir(strTemplateFileAndPath))
Debug. Print \"o arquivo de teste:\"
Se strTestFile = \"\", em seguida,
MsgBox strTemplateFileAndPath _
& template not found; _
& cant create worksheet
GoTo ErrorHandlerExit
End If
strWorksheetPath = GetWorksheetsPath
Debug. Print \"modelo de planilha e o caminho:\" _
& strTemplateFileAndPath
Definir uma referncia para a pasta de trabalho e planilha e ative a planilha:
Conjunto bks = appExcel.Workbooks
Set wkb = bks.Add(strTemplateFileAndPath)
Conjunto wks = wkb.Sheets(1)
WKS.Ativar
Defina uma referncia para a consulta:
Conjunto dbs = CurrentDb
Set rst = dbs.OpenRecordset (\"qryContacts\" _
dbOpenDynaset)
RST.MoveLast
RST.MoveFirst
lngCount = rst.RecordCount
Se lngCount = 0 ento
MsgBox \"No h contatos para exportao\"
GoTo ErrorHandlerExit
Outra coisa
strPrompt = \"Exportar\"
& contacts to Excel
strTitle = \"Exportar\"
MsgBox strPrompt, vbInformation + vbOKOnly, strTitle
End If
Ir para a primeira clula de dados:
Definir rngStart = wks.Range(\"A4\")
rngStart.Activate
Percorra o conjunto de registros, cada registro a importao para uma clula na planilha:
Com rst
Fao at.EOF
192
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
12_047026 ch07.qxp 02\/04\/07 21:44 pgina 192
Gravar dados de acesso de um registro diretamente as clulas na planilha:
rngStart.Activate
rngStart.Value = Nz(![ContactID])
Set rng = _
appExcel.ActiveCell.Offset(columnoffset:=1)
RNG.Valor = Nz(![CompanyName])
Set rng = _
appExcel.ActiveCell.Offset(columnoffset:=2)
RNG.Valor = Nz(![FirstName])
Set rng = _
appExcel.ActiveCell.Offset(columnoffset:=3)
RNG.Valor = Nz(![LastName])
Set rng = _
appExcel.ActiveCell.Offset(columnoffset:=4)
RNG.Valor = Nz(![Saudao])
Set rng = _
appExcel.ActiveCell.Offset(columnoffset:=5)
RNG.Valor = Nz(![StreetAddress])
Set rng = _
appExcel.ActiveCell.Offset(columnoffset:=6)
RNG.Valor = Nz(![Cidade])
Set rng = _
appExcel.ActiveCell.Offset(columnoffset:=7)
RNG.Valor = Nz(![StateOrProvince])
Set rng = _
appExcel.ActiveCell.Offset(columnoffset:=8)
RNG.Valor = Nz(![CEP])
Set rng = _
appExcel.ActiveCell.Offset(columnoffset:=9)
RNG.Valor = Nz(![Pas])
Set rng = _
appExcel.ActiveCell.Offset(columnoffset:=10)
RNG.Valor = Nz(![JobTitle])
Ir para a primeira coluna da linha seguinte:
rngStart.Activate
Definir rngStart = _
appExcel.ActiveCell.Offset(rowoffset:=1)
.MoveNext
Loop
Terminar com
MsgBox \"Todos os contatos exportados!\"
193
Trabalhando com planilhas do Excel
7
12_047026 ch07.qxp 02\/04\/07 21:44 pgina 193
Get a salvar o nome da Propriedade do ttulo da pasta de trabalho:
Conjunto prps = _
appExcel.ActiveWorkbook.BuiltinDocumentProperties
strSaveName = strWorksheetPath
& - & Format(Date, d-mmm-yyyy)
Debug. Print \"planilha salvar nome:\"
Em erro continuar prximo
Se j houver uma planilha salva com este nome, exclu-lo:
Matar strSaveName
No erro GoTo ErrorHandler
strPrompt = \"Insira o nome de arquivo e caminho para salvar a planilha\"
strTitle = \"Nome do arquivo\"
strDefault = strSaveName
strSaveName = InputBox (prompt: = strPrompt, _
Ttulo: = strTitle, padro: = strDefault)
WKB.SaveAs FileName: = strSaveName, _
FileFormat: = xlWorkbookDefault
appExcel.Visible = True
ErrorHandlerExit:
Exit Sub
ErrorHandler:
Se errar = 429 ento
Excel no est em execuo; Abra o Excel com CreateObject :
Set appExcel = CreateObject(\"Excel.Application\")
Retomar em seguida
Outra coisa
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End If
End Sub
O procedimento a primeiro pega o caminho do modelo de planilha no menu principal, verifica que o
modelo pode ser encontrado nesse local e, em seguida, cria uma nova pasta de trabalho do modelo. Ele
em seguida, configura um conjunto de registros baseado em uma consulta de acesso, vai para a primeira clula de dados na planilha, e
comea Iterando atravs de registros no conjunto de registros, usando o Deslocamento mtodo da clula ativa para
coloca os dados de cada campo na coluna correta.
194
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
12_047026 ch07.qxp 02\/04\/07 21:44 pgina 194
Quando todos os contatos foram exportados para a planilha, um salvar nome construdo a partir da
Propriedade do ttulo do modelo e a data atual e exibido em um InputBox para que ele pode ser editado, se
desejado; Finalmente, a planilha salvo com a salvar nome e tornada visvel.
O
ExportContactsToExcel
procedimento nesta seo pode ser executado a partir da macro
mcrExportContactsToExcel
.
A planilha resultante mostrada na Figura 7.7.
FIGURA 7.7
Uma planilha formatada minimamente preenchido com dados de acesso.
Tabulares planilhas formatadas do cdigo
Muitas empresas armazenam dados no cliente ou contas de cliente em um banco de dados do Access e precisa
Exporte dados para Excel para posterior anlise ou distribuio. Por exemplo, uma companhia de seguros
talvez seja necessrio exportar dados sobre as empresas que ele segura, incluindo o nmero de conta, conta
tipo de tomador do seguro e executivo de contas para utilizao por seus empregados no campo. O
ExportAccountSummary procedimento (listado a seguir) exporta esses dados, usando um diferente
abordagem do que o procedimento anterior. Em vez de usar um modelo do Excel pr-formatado, todas as
formatao e dimensionamento aplicado diretamente em cdigo do VBA, para uma planilha do Excel 9 preenchida com acesso
dados peloTransferirPlanilha mtodo:
Funo pblica ExportAccountSummary()
Dim strWorksheet As String
Dim strWorksheetPath As String
Dim appExcel como Application
NOTA NOTA
195
Trabalhando com planilhas do Excel
7
12_047026 ch07.qxp 02\/04\/07 21:44 pgina 195
Dim sht como Excel.Worksheet
Dim wkb como Excel.Workbook
Dim rng como Excel. Range
Dim strTable As String
Dim strRange As String
Dim strSaveName As String
Dim strPrompt As String
Dim strTitle As String
Dim strDefault As String
No erro GoTo ErrorHandler
Recrie a tabela para exportao:
strTable = \"tmakAccountSummary\"
DoCmd.SetWarnings False
DoCmd.OpenQuery \"qmakAccountSummary\"
Crie planilha salvar nome:
strWorksheetPath = GetWorksheetsPath()
strWorksheet = \"Resumo de conta\"
strSaveName = strWorksheetPath
Debug. Print \"Planilha salve o nome\"
Em erro continuar prximo
Exclua planilha existente (se houver):
Matar strSaveName
No erro GoTo ErrorHandler
Exporte dados de consulta para uma nova planilha em formato Excel 9:
DoCmd.TransferSpreadsheet transfertype: = acExport, _
spreadsheettype: = acSpreadsheetTypeExcel9, _
TableName: = strTable, FileName: = strSaveName, _
hasfieldnames: = True
Abra a planilha recm-criada e introduza o material do ttulo:
Set appExcel = GetObject (, \"Application\")
appExcel.Workbooks.Open (strSaveName)
Set wkb = appExcel.ActiveWorkbook
Conjunto sht = appExcel.ActiveSheet
SHTAtivar
Com sht
196
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
12_047026 ch07.qxp 02\/04\/07 21:44 pgina 196
Aplica fonte Calibri 9 pt para a planilha inteira:
.Range(\"A:F\").Font = \"Calibri\"
.Range(\"A:F\").Font = 9
Aplica bordas de linha fina para a planilha inteira:
.Range(\"A:F\").Borders(xlDiagonalDown).LineStyle = _
xlNone
.Range(\"A:F\").Borders(xlDiagonalUp).LineStyle = xlNone
.Range(\"A:F\").Borders(xlEdgeLeft).LineStyle = _
xlContinuous
.Range(\"A:F\").Borders(xlEdgeLeft).Peso = xlHairline
.Range(\"A:F\").Borders(xlEdgeLeft).ColorIndex = _
xlAutomatic
.Range(\"A:F\").Borders(xlEdgeTop).LineStyle = _
xlContinuous
.Range(\"A:F\").Borders(xlEdgeTop).Peso = xlHairline
.Range(\"A:F\").Borders(xlEdgeTop).ColorIndex = _
xlAutomatic
.Range(\"A:F\").Borders(xlEdgeBottom).LineStyle = _
xlContinuous
.Range(\"A:F\").Borders(xlEdgeBottom).Peso = _
xlHairline
.Range(\"A:F\").Borders(xlEdgeBottom).ColorIndex = _
xlAutomatic
.Range(\"A:F\").Borders(xlEdgeRight).LineStyle = _
xlContinuous
.Range(\"A:F\").Borders(xlEdgeRight).Peso = _
xlHairline
.Range(\"A:F\").Borders(xlEdgeRight).ColorIndex = _
xlAutomatic
.Range(\"A:F\").Borders(xlInsideVertical).LineStyle = _
xlContinuous
.Range(\"A:F\").Borders(xlInsideVertical).Peso = _
xlHairline
.Range(\"A:F\").Borders(xlInsideVertical).ColorIndex = _
xlAutomatic
.Range(\"A:F\").Borders(xlInsideHorizontal).LineStyle = _
xlContinuous
.Range(\"A:F\").Borders(xlInsideHorizontal).Peso = _
xlHairline
.Range(\"A:F\").Borders(xlInsideHorizontal).LineStyle = _
xlContinuous
Defina as larguras das colunas:
.Range(\"A:A\").ColumnWidth = 25
.Range(\"B:B\").ColumnWidth = 15
.Range(\"C:C\").ColumnWidth = 15
197
Trabalhando com planilhas do Excel
7
12_047026 ch07.qxp 02\/04\/07 21:44 pgina 197
.Range(\"D:D\").ColumnWidth = 20
.Range(\"E:E\").ColumnWidth = 15
.Range(\"F:F\").ColumnWidth = 20
Inserir linhas em branco no topo da planilha:
.Range(\"1:1\").Inserir Shift: = xlDown
.Range(\"1:1\").Inserir Shift: = xlDown
.Range(\"1:1\").Inserir Shift: = xlDown
.Range(\"1:1\").Inserir Shift: = xlDown
Formato da linha de cabealhos de coluna:
Com.Range(\"5:5\")
.Font = 10
.Bold = True
.Borders(xlEdgeTop).Peso = xlMedium
.Borders(xlEdgeBottom).Peso = xlMedium
.Interior.ColorIndex = 15
.Interior.Pattern = xlSolid
.Interior.PatternColorIndex = xlAutomatic
.RowHeight = 15
.VerticalAlignment = xlBottom
.HorizontalAlignment = xlCenter
.WrapText = True
Terminar com
Inserir e formatar texto de ttulo:
.Range(\"a1:F1\").HorizontalAlignment = xlCenter
.Range(\"a1:F1\").VerticalAlignment = xlBottom
.Range(\"a1:F1\").WrapText = False
.Range(\"a1:F1\").Orientao = 0
.Range(\"a1:F1\").ShrinkToFit = False
.Range(\"a1:F1\").MergeCells = True
.Range(\"a1:F1\").Borders(xlDiagonalDown).LineStyle = _
xlNone
.Range(\"a1:F1\").Borders(xlDiagonalUp).LineStyle = _
xlNone
.Range(\"a1:F1\").Borders(xlEdgeLeft).LineStyle = xlNone
.Range(\"a1:F1\").Borders(xlEdgeTop).LineStyle = xlNone
.Range(\"a1:F1\").Borders(xlEdgeBottom).LineStyle = _
xlNone
.Range(\"a1:F1\").Borders(xlEdgeRight).LineStyle = _
xlNone
.Range(\"a1:F1\").Borders(xlInsideVertical).LineStyle = _
xlNone
.Range(\"a2:F2\").HorizontalAlignment = xlCenter
198
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
12_047026 ch07.qxp 02\/04\/07 21:44 pgina 198
.Range(\"a2:F2\").VerticalAlignment = xlBottom
.Range(\"a2:F2\").WrapText = False
.Range(\"a2:F2\").Orientao = 0
.Range(\"a2:F2\").ShrinkToFit = False
.Range(\"a2:F2\").MergeCells = True
.Range(\"a2:F2\").Borders(xlDiagonalDown).LineStyle = _
xlNone
.Range(\"a2:F2\").Borders(xlDiagonalUp).LineStyle = _
xlNone
.Range(\"a2:F2\").Borders(xlEdgeLeft).LineStyle = xlNone
.Range(\"a2:F2\").Borders(xlEdgeTop).LineStyle = xlNone
.Range(\"a2:F2\").Borders(xlEdgeBottom).LineStyle = _
xlNone
.Range(\"a2:F2\").Borders(xlEdgeRight).LineStyle = xlNone
.Range(\"a2:F2\").Borders(xlInsideVertical).LineStyle = _
xlNone
.Range(\"a3:F3\").HorizontalAlignment = xlCenter
.Range(\"a3:F3\").VerticalAlignment = xlBottom
.Range(\"a3:F3\").WrapText = False
.Range(\"a3:F3\").Orientao = 0
.Range(\"a3:F3\").ShrinkToFit = False
.Range(\"a3:F3\").MergeCells = True
.Range(\"a3:F3\").Borders(xlDiagonalDown).LineStyle = _
xlNone
.Range(\"a3:F3\").Borders(xlDiagonalUp).LineStyle = _
xlNone
.Range(\"a3:F3\").Borders(xlEdgeLeft).LineStyle = xlNone
.Range(\"a3:F3\").Borders(xlEdgeTop).LineStyle = xlNone
.Range(\"a3:F3\").Borders(xlEdgeBottom).LineStyle = _
xlNone
.Range(\"a3:F3\").Borders(xlEdgeRight).LineStyle = xlNone
.Range(\"a3:F3\").Borders(xlInsideVertical).LineStyle = _
xlNone
.Range(\"A4:F4\").MergeCells = True
.Range(\"A4:F4\").Borders(xlDiagonalDown).LineStyle = _
xlNone
.Range(\"A4:F4\").Borders(xlDiagonalUp).LineStyle = _
xlNone
.Range(\"A4:F4\").Borders(xlEdgeLeft).LineStyle = xlNone
.Range(\"A4:F4\").Borders(xlEdgeTop).LineStyle = xlNone
.Range(\"A4:F4\").Borders(xlEdgeRight).LineStyle = xlNone
.Range(\"A4:F4\").Borders(xlInsideVertical).LineStyle = _
xlNone
.Range(\"a1:A4\").Font = 14
.Range(\"a1:A4\").Bold = True
.Range(\"a3\").Valor = \"Como de\"
.Range(\"a2\").Valor = \"Servios da conta\"
.Range(\"a1\").Valor = \"Resumo de toda a nao de\"
199
Trabalhando com planilhas do Excel
7
12_047026 ch07.qxp 02\/04\/07 21:44 pgina 199
Ajuste as margens e a configurao de impresso de planilha:
.PageSetup.PrintTitleRows = \"$ 5:$ 5\"
.PageSetup.LeftFooter = \"
.PageSetup.CenterFooter = \"\"
.PageSetup.CenterHeader = \"\"
.PageSetup.RightFooter = \"pgina
.PageSetup.Orientation = xlLandscape
.PageSetup.PrintGridlines = False
.PageSetup.Zoom = 90
Terminar com
Fazer a planilha visvel e salv-lo:
appExcel.Application.Visible = True
strPrompt = _
\"Digite o nome do arquivo e o caminho para salvar a planilha\"
strTitle = \"Nome do arquivo\"
strDefault = strSaveName
strSaveName = InputBox (prompt: = strPrompt, _
Ttulo: = strTitle, padro: = strDefault)
WKB.SaveAs FileName: = strSaveName, _
FileFormat: = xlWorkbookDefault
appExcel.Visible = True
ErrorHandlerExit:
Exit Function
ErrorHandler:
Se errar = 429 ento
Excel no est em execuo; Abra o Excel com CreateObject :
Set appExcel = CreateObject(\"Excel.Application\")
Retomar em seguida
Outra coisa
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End If
End Function
200
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
12_047026 ch07.qxp 02\/04\/07 21:44 pgina 200
Porque a pasta de trabalho foi criada em um formato antigo, voc ver \"(compatibilidade
Modo) \"na sua barra de ttulo.
O procedimento comea executando uma consulta criar tabela para criar uma tabela para exportar para o Excel, em seguida, cre-
ates salvar nome para a planilha e exclui a velha planilha do arquivo, se ele existir. Os dados a
tabela criada pela consulta criar tabela, em seguida, exportada para uma planilha do Excel Nova, usando o
TransferirPlanilha mtodo. A nova planilha aberta e ativada e vrios
intervalos na planilha so formatados, aplicando a fonte Calibri, bordas de linha fina e necessrio
larguras de coluna para cada coluna.
Eu gosto de dar tabelas criadas por consultas criar tabela, o prefixo
tmak
, com a mesma base
nome da consulta. Isto deixa-me saber que uma tabela foi criada por uma consulta criar tabela, assim
Eu sei que se eu quiser alter-lo, preciso modificar a consulta, no a tabela.
Em seguida, o procedimento insere linhas em branco na parte superior da planilha e texto de ttulo inserido na parte superior;
Estas linhas de cabealho, em seguida, so formatadas com um fundo cinza e linhas superiores e inferiores. Vrios
configuraes de configurao e margem de impresso so feitas em seguida e finalmente a planilha salvo, com um InputBox
assim voc pode modificar a salvar o nome, se desejado. Planilha acabada mostrada na Figura 7.8.
FIGURA 7.8
Uma planilha do Excel formatado no cdigo VBA.
DICA DICA
NOTA NOTA
201
Trabalhando com planilhas do Excel
7
12_047026 ch07.qxp 02\/04\/07 21:44 pgina 201
Como uma maneira rpida de descobrir a sintaxe para vrios comandos do Excel, abrir um trabalho de Excel-
folha, ligar o gravador de macro, executar as aes e, em seguida, salvar a macro. Aberto
o macro salva e copiar o cdigo para o procedimento de acesso; com um corte pequeno de redundante
argumentos e edio para inserir seus nomes de variveis, ele deve funcionar bem.
Quadros de horrios
Quase qualquer tipo de negcio (que no seja uma operao one-person) precisa de um formulrio para gravao
dos funcionrios trabalham horas e uma maneira de imprimir ou distribuir eletronicamente os dados do quadro de horrios. Muitas vezes um
empresa usou um formulrio de papel para gravar horas de trabalho por muitos anos e o formulrio eletrnico
precisa replicar o formulrio de papel. Em alguns casos, h determinado governo ou indstria stan -
formatos de dard que devem ser usados, ou os dados devem ser produzidos em um formato que pode ser importado pelo
um computador de mainframe. Voc pode usar um modelo de planilha Excel pr-formatado para produzir
quadros de horrios no formato exato que voc precisa e ench-los com dados de acesso.
Um exemplo do uso de quadros de horrios em tal forma uma empresa de engenharia, cujos funcionrios trabalham
em vrios projetos para clientes da empresa. Porque as horas de trabalho dos trabalhadores (exceto aqueles
projetos atribudos ao interno) sero cobrados para os clientes, neste caso uma planilha separada
necessrio para o trabalho de cada funcionrio em um projeto especfico por semana, assim um nico empregado pode ter
vrios quadros de horrios em uma semana. No caso (por exemplo) um estabelecimento de pesquisa cientfica, onde
horas no so tarifadas fora aos clientes, um quadro de horrios por funcionrio, listando vrios projetos em uma semana,
seria mais adequado.
A forma frmWeeklyTimesheet (mostrada na Figura 7.9) um acesso para entrar o quadro de horrios
dados que sero exportados para o Excel os quadros de horrios. Este formulrio permite que voc selecione um funcionrio, cliente, e
projeto e preenchimento em um quadro de horrios para que o empregado. A suposio que um quadro de horrios separado feito
para cada combinao de projeto\/cliente, assim um empregado pode ter vrios quadros de horrios para uma determinada semana.
Fonte de na cboEmployeeID caixa de combinao linha uma consulta Unio que combina dados de dois
consultas: qryThisWeeksTimesheets , que lista os quadros de horrios que foram preenchidos at agora
Esta semana, e qryNeedTimesheets , que relaciona os funcionrios que no tenham ainda preenchido um
quadro de horrios para esta semana. A lista resultante exibe todos os funcionrios, mostrando os quadros de horrios que
ter sido preenchido at agora, como ilustrado na Figura 7.10.
DICA DICA
202
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
12_047026 ch07.qxp 02\/04\/07 21:44 pgina 202
FIGURA 7.9
Um formulrio do Access para inserir dados de quadro de horrios para exportao para Excel.
FIGURA 7.10
Uma lista de caixa de combinao apresentando quadros de horrios para os funcionrios.
Depois de selecionar um funcionrio, o CurrentWeekEnding procedimento calcula o fim de semana
Data (hoje, se for domingo, caso contrrio no domingo passado) e preenche as legendas dos sete data rtulos sobre
a forma com que o dia correto da semana; o nome do gerente tambm exibido no Gerenciador de domnio
(a cor de fundo azul clara indica que a caixa de texto est bloqueada). (Consulte a Figura 7.11).
Dou controles bloqueados um fundo azul claro (em oposio a um fundo branco para
controles editveis) para dar aos usurios uma indicao visual de que eles no possvel digitar ou editar texto nestes
controles.
NOTA NOTA
203
Trabalhando com planilhas do Excel
7
12_047026 ch07.qxp 02\/04\/07 21:44 pgina 203
FIGURA 7.11
Informaes de data automaticamente preenchido aps selecionar um funcionrio.
O CurrentWeekEnding e FillDateControls procedimentos so listados a seguir:
CurrentWeekEnding() funo pblica como data
No erro GoTo ErrorHandler
Dim dteToday As Date
dteToday = data
Fazer enquanto Weekday(dteToday) <>vbSunday
dteToday = dteToday - 1
Debug. Print \"teste\"
Loop
CurrentWeekEnding = dteToday
ErrorHandlerExit:
Exit Function
ErrorHandler:
MsgBox \"erro nenhum:\"
Err
Resume ErrorHandlerExit
End Function
204
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
12_047026 ch07.qxp 02\/04\/07 21:44 pgina 204
Private Sub FillDateControls()
No erro GoTo ErrorHandler
Dim strFormattedDate As String
Preencha controles de dia da semana e fim de semana com o texto:
Me![txtWeekEnding].Valor = CurrentWeekEnding
strFormattedDate = formato (DateAdd (\"d\", -6, _
CDate (Me! [WeekEnding])), \"dddd, mmmm d, yyyy\")
Me![lblMondayDate].Legenda = strFormattedDate
strFormattedDate = formato (DateAdd (\"d\", -5, _
CDate (Me! [WeekEnding])), \"dddd, mmmm d, yyyy\")
Me![lblTuesdayDate].Legenda = strFormattedDate
strFormattedDate = formato (DateAdd (\"d\", -4, _
CDate (Me! [WeekEnding])), \"dddd, mmmm d, yyyy\")
Me![lblWednesdayDate].Legenda = strFormattedDate
strFormattedDate = formato (DateAdd (\"d\", -3, _
CDate (Me! [WeekEnding])), \"dddd, mmmm d, yyyy\")
Me![lblThursdayDate].Legenda = strFormattedDate
strFormattedDate = formato (DateAdd (\"d\", -2, _
CDate (Me! [WeekEnding])), \"dddd, mmmm d, yyyy\")
Me![lblFridayDate].Legenda = strFormattedDate
strFormattedDate = formato (DateAdd (\"d\", -1, _
CDate (Me! [WeekEnding])), \"dddd, mmmm d, yyyy\")
Me![lblSaturdayDate].Legenda = strFormattedDate
strFormattedDate = formato ((Me! [_ WeekEnding]),
\"dddd, mmmm d, yyyy\")
Me![lblSundayDate].Legenda = strFormattedDate
ErrorHandlerExit:
Exit Sub
ErrorHandler:
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End Sub
Alm disso, o cdigo executa uma consulta criar tabela cria uma tabela para uso de consulta que o
fonte de linha de cboClientProject (Ver Figura 7.12); Inicialmente, a fonte de linha na caixa de combinao estiver em branco,
porque caso contrrio, a consulta no poderia ser executada. A consulta de fonte de linha uma consulta de FindUnmatched
criado com o Assistente de consulta que exclui combinaes de cliente\/projeto para planilhas que tm
j foi preenchido para o funcionrio selecionado, ento voc no pode acidentalmente selecionar o mesmo duas vezes.
205
Trabalhando com planilhas do Excel
7
12_047026 ch07.qxp 02\/04\/07 21:44 pgina 205
FIGURA 7.12
Selecionar um cliente e um projeto para um quadro de horrios.
Se voc precisar modificar os dados em um quadro de horrios existente, voc pode fazer isso mais tarde, na fase de reviso,
de fdlgTimesheets.
Depois o cliente e o projeto foi selecionado, as horas podem ser inseridas; os totais recalcular
automaticamente (Ver Figura 7.13).
FIGURA 7.13
Entrar horas sobre um quadro de horrios.
206
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
12_047026 ch07.qxp 02\/04\/07 21:44 pgina 206
No rodap existem trs botes de comando: o primeiro (\"claro este horrios\") limpa a
quadro de horrios para que voc possa comear o segundo (\"salvar este horrios\") salva o atual quadro de horrios
e comea um novo registro para inserir um outro quadro de horrios; e a terceira (\"enviar horrios para Excel\")
abre um formulrio de dilogo listando os quadros de horrios que foram concludos para esta semana, para
reviso. Os procedimentos de evento do boto de trs comando so listados a seguir:
Private Sub cmdClearTimesheet_Click()
Em erro continuar prximo
Exclua o registro na tabela temp:
DoCmd.SetWarnings False
Chamada acCmdSelectRecord
Chamada acCmdDeleteRecord
Me![cboClientProject].OrigemDaLinha = \"\"
End Sub
Private Sub cmdSendToExcel_Click()
No erro GoTo ErrorHandler
DoCmd. OpenForm nomedoformulrio: = \"fdlgTimesheets\"
DoCmd.Close acForm, Me.Name
ErrorHandlerExit:
Exit Sub
ErrorHandler:
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End Sub
A forma frmWeeklyTimesheet ligada a uma tabela temp, tblWeeklyTimesheetTemp, para garantir que
dados no salvos em tabela regular (tblWeeklyTimesheet) at que o usurio optar por salv-lo, e
campos obrigatrios foram preenchidos:
Private Sub cmdSaveTimesheet_Click()
No erro GoTo ErrorHandler
Verifique se campos obrigatrios possuem valores e sair se no:
strTitle = \"Valor exigido\"
Se Nz (Me! [cboEmployeeID].Valor) = \"\", em seguida,
strPrompt = \"Favor selecionar um funcionrio\"
207
Trabalhando com planilhas do Excel
7
12_047026 ch07.qxp 02\/04\/07 21:44 pgina 207
MsgBox prompt: = strPrompt, botes: = _ vbExclamation
+ vbOKOnly, ttulo: = strTitle
Me![cboEmployeeID].SetFocus
GoTo ErrorHandlerExit
End If
Se Nz (Me! [cboClientProject].Valor) = \"\", em seguida,
strPrompt = \"Favor selecionar um cliente e o projeto\"
MsgBox prompt: = strPrompt, botes: = _ vbExclamation
+ vbOKOnly, ttulo: = strTitle
Me![cboClientProject].SetFocus
GoTo ErrorHandlerExit
End If
Salve os dados da tabela temp para mesa regular:
Conjunto dbs = CurrentDb
Set rst = dbs.OpenRecordset(\"tblWeeklyTimesheet\")
Com rst
.AddNew
![EmployeeID] = Nz (Me! [cboEmployeeID].Valor)
![ClientCode] = Nz (Me! [cboClientProject].Valor)
![ProjectCode] = Nz (Me! [txtProjectCode].Valor)
![WeekEnding] = Nz (Me! [txtWeekEnding].Valor)
![Gerente] = Nz (Me! [cboEmployeeID].Column(2))
![MondayHours] = Nz (Me! [txtMondayHours].Valor)
![TuesdayHours] = Nz (Me! [txtTuesdayHours].Valor)
![WednesdayHours] = Nz (Me! [txtWednesdayHours].Valor)
![ThursdayHours] = Nz (Me! [txtThursdayHours].Valor)
![FridayHours] = Nz (Me! [txtFridayHours].Valor)
![SaturdayHours] = Nz (Me! [txtSaturdayHours].Valor)
![SundayHours] = Nz (Me! [txtSundayHours].Valor)
![MondayOTHours] = Nz (Me! [txtMondayOTHours].Valor)
![TuesdayOTHours] = Nz (Me! [txtTuesdayOTHours].Valor)
![WednesdayOTHours] = _
NZ (Me! [txtWednesdayOTHours].Valor)
![ThursdayOTHours] = Nz (Me! [txtThursdayOTHours].Valor)
![FridayOTHours] = Nz (Me! [txtFridayOTHours].Valor)
![SaturdayOTHours] = Nz (Me! [txtSaturdayOTHours].Valor)
![SundayOTHours] = Nz (Me! [txtSundayOTHours].Valor)
.Atualizao
.Fechar
Terminar com
Exclua o registro na tabela temp:
DoCmd.SetWarnings False
Chamada acCmdSelectRecord
208
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
12_047026 ch07.qxp 02\/04\/07 21:44 pgina 208
Chamada acCmdDeleteRecord
Me![cboEmployeeID].Repetir a consulta
Me![cboClientProject].OrigemDaLinha = \"\"
ErrorHandlerExit:
Exit Sub
ErrorHandler:
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End Sub
A forma de dilogo aberta a partir das tabelas de tempos de enviar para boto Excel mostrada na Figura 7.14.
FIGURA 7.14
Uma forma de dilogo para rever timesheets desta semana.
TxtEmployeeID caixa de texto no subformulrio folha de dados do formulrio de dilogo tem um DblClick evento
procedimento, ento voc pode clicar duas vezes o nome de um funcionrio para abrir esse quadro de horrios para edio, se
necessrio:
Private Sub txtEmployeeID_DblClick (Cancel As Integer)
No erro GoTo ErrorHandler
Dim lngID como longo
Dim strClientCode As String
209
Trabalhando com planilhas do Excel
7
12_047026 ch07.qxp 02\/04\/07 21:45 pgina 209
Dim strProjectCode As String
Dim strSearch As String
Dim strSQL As String
Dim frm como Access.Form
Dim strForm As String
Criar uma consulta filtrada e execut-lo para criar a fonte de registro do formulrio:
strForm = \"frmSelectedTimesheet\"
lngID = Nz (Me! [EmployeeID])
strClientCode = Nz (Me! [ClientCode])
strProjectCode = Nz (Me! [ProjectCode])
strSQL = \"SELECT tblWeeklyTimesheet.*,\" _
& qryEmployees.EmployeeName, _
& qryEmployees.ManagerName, _
& qryClientsAndProjects.ClientProject _
& INTO tmakSelectedTimesheetTemp _
& FROM qryClientsAndProjects _
& INNER JOIN (tblWeeklyTimesheet _
& INNER JOIN qryEmployees _
& ON tblWeeklyTimesheet.EmployeeID = _
& qryEmployees.EmployeeID) _
& ON (qryClientsAndProjects.ProjectCode = _
& tblWeeklyTimesheet.ProjectCode) _
& AND (qryClientsAndProjects.ClientCode = _
& tblWeeklyTimesheet.ClientCode) _
& WHERE tblWeeklyTimesheet.EmployeeID= _
& lngID & AND tblWeeklyTimesheet.ClientCode= _
& Chr$(39) & strClientCode & Chr$(39) _
& AND tblWeeklyTimesheet.ProjectCode= _
& Chr$(39) & strProjectCode & Chr$(39) _
& AND tblWeeklyTimesheet.WeekEnding = _
& CurrentWeekEnding();
Debug. Print \"seqncia SQL:\"
DoCmd.SetWarnings False
StrSQL DoCmd.RunSQL
Formulrio aberto para edio selecionado de quadro de horrios:
DoCmd. OpenForm nomedoformulrio: = strForm
Conjunto frm = formulrios![frmSelectedTimesheet]
frm.Caption = \"Quadro de horrios semanal para\" _
& Me![EmployeeName]
DoCmd.Close acForm, Parent.Name
ErrorHandlerExit:
Exit Sub
210
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
12_047026 ch07.qxp 02\/04\/07 21:45 pgina 210
ErrorHandler:
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End Sub
A forma de frmSelectedTimesheet uma verso simplificada da frmWeeklyTimesheet (Ver Figura 7.15).
FIGURA 7.15
Um formulrio para edio de um quadro de horrios selecionado.
As horas podem ser editadas neste formulrio, e quando tiver terminado, voc pode tanto excluir este quadro de horrios
Registre-se clicando no boto \"Clear este quadro de horrios\", ou guardar o registo para o regular
tabela de tblWeeklyTimesheets. Clicando no boto \"Enviar quadros de horrios para Excel\" reabre o
fdlgTimesheets de dilogo, com dados atualizados.
Clique no boto OK na fdlgTimesheets executa o CreateExcelTimesheets procedimento,
que cria uma planilha do Excel para cada quadro de horrios listado na caixa de dilogo; Dentre estes quadros de horrios
mostrado na Figura 7.16.
211
Trabalhando com planilhas do Excel
7
12_047026 ch07.qxp 02\/04\/07 21:45 pgina 211
FIGURA 7.16
Um quadro de horrios do Excel preenchido com dados de acesso.
O CreateExcelTimesheets procedimento listado como segue primeiro configura um conjunto de registros DAO do
quadros de horrios na semana atual e outro conjunto de registros de horas na que o empregado. O funcionrio informa-
o inserida na planilha primeiro e, em seguida, o cdigo itera por meio de registros de horas, processo-
ing as horas de cada dia, das horas normais e horas extras, at que todos foram preenchidos e projeto
em e, em seguida, loops para o prximo registro de funcionrio:
Funo CreateExcelTimeSheets()
No erro GoTo ErrorHandler
212
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
12_047026 ch07.qxp 02\/04\/07 21:45 pgina 212
Dim appExcel como Application
Dim dteWeekEnding As Date
Dim lngCount como longo
Dim lngEmployeeID como longo
Dim n As Long
Dim rngCC como Excel. Range
Dim rngDay como Excel. Range
Dim rngOT como Excel. Range
Dim rngPC como Excel. Range
Dim rngRH como Excel. Range
Dim rngTotal como Excel. Range
Dim rngTotalAbove como Excel. Range
Dim rstAll como DAO.Conjunto de registros
Dim rstOne como DAO.Conjunto de registros
Dim strDocsPath As String
Dim strEmployeeName As String
Dim strPrompt As String
Dim strQuery As String
Dim strSaveName As String
Dim strSheet As String
Dim strSQL As String
Dim strTemplate As String
Dim strTemplateFile As String
Dim strTemplatePath As String
Dim strTitle As String
Dim wkb como Excel.Workbook
Dim wks como Excel.Worksheet
Dim lbl como Access.Label
Conjunto dbs = CurrentDb
Definir rstAll = _
DBS.OpenRecordset (\"qryCurrentTimesheetInfo\" _
dbOpenDynaset)
rstAll.MoveLast
rstAll.MoveFirst
lngCount = rstAll.RecordCount
Se lngCount = 0 ento
MsgBox \"Nenhum registro de folha de tempo atual para exportao\"
GoTo ErrorHandlerExit
Outra coisa
Conjunto lbl = _
Formulrios![fdlgTimesheets]![lblCreatingWorksheets]
Debug. Print lngCount _
& current time sheet records to transfer to Excel
LBL.Visvel = True
End If
213
Trabalhando com planilhas do Excel
7
12_047026 ch07.qxp 02\/04\/07 21:45 pgina 213
Obter o caminho do modelo que foi selecionado no menu principal:
strTemplate = _
\"Folha de tempo semanal por cliente e project.xlt\"
strTemplatePath = GetWorksheetTemplatesPath()
strTemplateFile = strTemplatePath
Se TestFileExists(strTemplateFile) = False Then
strTitle = \"Modelo no encontrado\"
strPrompt = \"Modelo de Excel\" _
& Weekly time sheet by client and project.xlt _
& not found in & strTemplatePath & ; _
& vbCrLf _
& please put template in this folder and try again
MsgBox strPrompt, vbCritical + vbOKOnly, strTitle
GoTo ErrorHandlerExit
Outra coisa
Debug. Print \"modelo de Excel usado:\" _
& strTemplateFile
End If
Obter o caminho para salvar pastas de trabalho:
strDocsPath = GetWorksheetsPath()
Defina uma referncia ao objeto Application do Excel para uso na criao de pastas de trabalho:
Set appExcel = GetObject (, \"Application\")
Fazer enquanto no rstAll.EOF
Crie um conjunto de registros de horas para este empregado:
lngEmployeeID = rstAll![EmployeeID]
strEmployeeName = rstAll![EmployeeName]
dteWeekEnding = CDate (rstAll! [WeekEnding])
strQuery = \"qfltHours\"
strSQL = \"SELECT * de qryCurrentTimesheetInfo\" _
& WHERE [EmployeeID] = & lngEmployeeID & ;
Debug. Print \"SQL\"
lngCount = CreateAndTestQuery (strQuery, strSQL)
Debug. Print \"n itens encontrados: \"
Se lngCount = 0 ento
MsgBox \"nenhum item encontrado; cancelamento\"
GoTo ErrorHandlerExit
End If
Conjunto rstOne = dbs.OpenRecordset (strQuery _
dbOpenDynaset)
Com rstOne
214
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
12_047026 ch07.qxp 02\/04\/07 21:45 pgina 214
Conte o nmero de registros para este empregado:
.MoveLast
.MoveFirst
lngCount =.RecordCount
Crie uma nova pasta de trabalho do modelo entrar horas:
Set wkb = appExcel.Workbooks.Add(strTemplateFile)
Conjunto wks = wkb.Sheets(1)
WKS.Ativar
appExcel.Visible = True
WKS.Range(\"C3\") =![EmployeeName]
WKS.Range(\"C4\") =![ManagerName]
WKS.Range(\"F3\") = Nz(![HomePhone])
WKS.Range(\"F4\") = Nz(![E-mail])
WKS.Range(\"C6\") =![WeekEnding]
Para n = 1 para lngCount
Debug. Print \"Record\"
& strEmployeeName
Se n = 1 ento
Processos horas para o primeiro projeto.
Em que horas trabalhadas na segunda-feira:
Se Nz(![_ MondayHours])
+ Nz(![MondayOTHours]) > 0 ento
appExcel.GoTo _
Referncia: = wks.Range(\"Monday\")
Definir rngCC = _
appExcel.ActiveCell.Offset(columnoffset:=2)
Definir rngPC = _
appExcel.ActiveCell.Offset(columnoffset:=3)
Definir rngRH = _
appExcel.ActiveCell.Offset(columnoffset:=4)
Definir rngOT = _
appExcel.ActiveCell.Offset(columnoffset:=5)
rngCC.Value =![ClientCode]
rngPC.Value =![ProjectCode]
rngRH.Value =![MondayHours]
rngOT.Value =![MondayOTHours]
End If
[Cdigo semelhante para o processamento de tera a domingo horas omitido].
ElseIf n > 1 ento
215
Trabalhando com planilhas do Excel
7
12_047026 ch07.qxp 02\/04\/07 21:45 pgina 215
Horas do processo de projeto diferentes para o mesmo empregado na mesma planilha.
Verifique as horas extras trabalhadas na segunda-feira:
Se Nz(![MondayHours]) + _
NZ(![MondayOTHours]) > 0 ento
Determine se qualquer horas foram adicionadas para este dia:
appExcel.GoTo _
Referncia: = wks.Range(\"Monday\")
Definir rngCC = _
appExcel.ActiveCell.Offset(columnoffset:=2)
Se rngCC.Value <>\"\" ento
V para o prximo dia e inserir uma nova linha acima:
appExcel.GoTo _
Referncia: = wks.Range(\"Tuesday\")
appExcel.ActiveCell.Select
appExcel.Selection.EntireRow.Insert
Definir rngCC = _
appExcel.ActiveCell.Offset(columnoffset:=2)
Definir rngPC = _
appExcel.ActiveCell.Offset(columnoffset:=3)
Definir rngRH = _
appExcel.ActiveCell.Offset(columnoffset:=4)
Definir rngOT = _
appExcel.ActiveCell.Offset(columnoffset:=5)
rngCC.Value =![ClientCode]
rngPC.Value =![ProjectCode]
rngRH.Value =![MondayHours]
rngOT.Value =![MondayOTHours]
Definir rngTotalAbove = _
appExcel.ActiveCell.Offset (rowoffset: =-1, _
columnoffset: = 6)
Definir rngTotal = _
appExcel.ActiveCell.Offset(columnoffset:=6)
rngTotalAbove.Select
Copie Frmula Total da clula acima:
appExcel.Selection.Copy
rngTotal.Select
WKS.Colar
appExcel.CutCopyMode = False
Outra coisa
216
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
12_047026 ch07.qxp 02\/04\/07 21:45 pgina 216
Insira horas na linha regular de segunda-feira:
Definir rngPC = _
appExcel.ActiveCell.Offset(columnoffset:=3)
Definir rngRH = _
appExcel.ActiveCell.Offset(columnoffset:=4)
Definir rngOT = _
appExcel.ActiveCell.Offset(columnoffset:=5)
rngCC.Value =![ClientCode]
rngPC.Value =![ProjectCode]
rngRH.Value =![MondayHours]
rngOT.Value =![MondayOTHours]
End If
End If
[Cdigo semelhante para o processamento de tera a domingo horas omitido].
.MoveNext
Seguinte n
Salve e feche a planilha preenchida.
Crie pasta de trabalho salve o nome do nome do funcionrio e a data de encerramento da semana:
strSaveName = strDocsPath
& time sheet for week ending _
& Format(dteWeekEnding, d-mmm-yyyy)
Debug. Print \"folha de tempo salve o nome:\" _
& strSaveName
Em erro continuar prximo
Se j houver uma planilha salva com este nome, exclu-lo:
Matar strSaveName
No erro GoTo ErrorHandler
WKB.SaveAs FileName: = strSaveName, _
FileFormat: = xlWorkbookDefault
WKB.Fechar
Terminar com
rstAll.MoveNext
Loop
rstAll.Close
rstOne.Close
appExcel.Visible = False
217
Trabalhando com planilhas do Excel
7
12_047026 ch07.qxp 02\/04\/07 21:45 pgina 217
Set appExcel = Nothing
MsgBox \"So criados em todos os livros de folha de tempo\" _
& strDocsPath
ErrorHandlerExit:
Exit Function
ErrorHandler:
Excel no est em execuo; Abra o Excel com CreateObject :
Se Err. Number = 429 ento
Set appExcel = CreateObject(\"Excel.Application\")
Retomar em seguida
Outra coisa
MsgBox \"erro nenhum:\"
& ; Description:
Resume ErrorHandlerExit
End If
End Function
Este procedimento cria uma nova planilha do Excel a partir de um modelo para cada registro. Este modelo
preenchida com texto padro, cores e outras caractersticas; tudo que precisa ter os dados do quadro de horrios
preenchido no registro de acesso.
Resumo
Com as tcnicas descritas neste captulo, voc pode exportar os dados em tabelas do Access para o Excel
planilhas em uma variedade de formatos, para compatibilidade com verses anteriores do Office ou porttil
dispositivos. Voc pode usar o boto do Excel na faixa de opes para fazer uma exportao rpida e suja para o novo
. xlsx Formatar ou criar uma planilha em um formato mais antigo que pode ser sincronizado com um PDA, utilizando
o TransferirPlanilha mtodo. E finalmente, quando voc precisa de sada de seus dados para um
Planilha do Excel em um formato especfico, voc pode usar um pr-formatado modelo de planilha ou formato de um
planilha simples usando cdigo do VBA automao para obter os resultados exatos que voc quer.
218
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
12_047026 ch07.qxp 02\/04\/07 21:45 pgina 218

utlook tem uma tima interface para trabalhar com calendrios, contatos,
e tarefas, bem como para enviar mensagens de e-mail. Mas o Outlook um
parente recm-chegado ao escritrio (ele foi introduzido no Office 97),
o que significa que se voc estiver usando acesso por mais do que isso, voc
provavelmente tem calendrio, contato ou tarefa dados armazenados nas tabelas de acesso de dados-
bases que foram criadas h muitas verses do Office. (Eu tenho alguns que foram
Originalmente criado em Access 1.0!)
No caso de informaes de contato, h uma outra razo que muitos usurios
Prefiro guardar dados de acesso: Access um banco de dados relacional, permitindo-lhe
configurar ligaes de um-para-muitos entre empresas e contatos, contatos e
telefones, contatos e endereos e assim por diante. Outlook, por outro lado, no um
banco de dados relacional; Ele armazena todos os seus dados em um banco de dados do arquivo simples MAPI. Isto
por que voc vai Ver vagas para trs endereos em um contato do Outlook e um grande
(mas finita) seleo de vagas telefone e ID. Se voc precisa digitar quatro
endereos para um contato, voc est sem sorte. Se voc precisar inserir um tipo de
nmero de telefone ou ID que no um dos itens disponveis, voc no pode faz-lo.
Mas se voc armazenar seus dados de contacto no Access, voc pode criar tabelas vinculadas do
endereos, nmeros de telefone e IDs, deix-lo entrar como muitos telefones e
Identificaes que voc precisam por contato, e voc pode dar-lhes qualquer identificadores voc
desejo. E com um link de um-para-muitos entre empresas e contatos, voc
pode alterar o endereo ou nmero de telefone principal de uma empresa, uma vez e o
informaes alteradas sero apanhadas atravs do link para todos os que com-
do Josenildo contatos. No Outlook, por outro lado, se voc tiver 10 contatos para um com-
Cris Pereira, e o endereo da empresa ou alteraes de nmeros de telefone principal, voc tem
para fazer a mudana separadamente em todos os 10 contatos.
219
NESTE CAPTULO
Links para pastas do Outlook
Aprendendo sobre o Outlook
modelo de objeto
Trabalhando com o Outlook
nomeaes
Trabalhando com tarefas do Outlook
Trabalhando com email do Outlook
mensagens
Trabalhar com contatos do Outlook
Trabalhando com
Itens do Outlook
13_047026 ch08.qxp 02\/04\/07 21:45 pgina 219
Por exemplo, o registro de Microsoft em meu banco de dados de contatos de acesso pessoal tem 30 de telefone-
Bers, muitos com descries no-padro eu no podia fazer isso no Outlook!
No entanto, apesar das vantagens de um banco de dados relacional, Outlook inegavelmente atraente e con-
venient, tanto que voc pode quer (ou precisa) para exportar os dados de contatos do Access para Outlook
entre em contato com itens, assim voc pode rapidamente pesquisar um telefone nmero ou endereo de e-mail (ou pelo menos aqueles que
correspondem aos slots padro do Outlook). E se voc tiver tarefas ou itens de calendrio armazenados em um acesso
tabela (talvez criado antes de Office 97), voc pode desejar permanentemente mov-los para o Outlook,
que oferece uma interface superior para trabalhar com esses tipos de itens.
Consulte o captulo 11 para um tratamento detalhado de sincronizar um conjunto de tabelas vinculadas do Access
com correspondncia de contatos do Outlook.
Exportao de dados de acesso aos itens do Outlook
Alm de exportar todo contato, tarefa ou registros de nomeao para o Outlook, talvez voc precise
criar novos itens do Outlook na mosca, como os dados de suas alteraes de tabelas do Access, usando o cdigo em execuo
de procedimentos de evento ou macros. Por exemplo, se voc tem um banco de dados relacionados com o projecto infor-
o, voc pode criar lembretes de tarefas de projeto na forma de mensagens de e-mail preenchido com dados de
uma tabela do Access, ou tarefas do Outlook ou nomeaes desencadeadas por alteraes nos dados armazenados na
Tabelas do Access.
Voc pode usar o legado EnviarObjeto comando para criar mensagens de e-mail (em alguns do
macros incorporadas em formulrios importados dos novos Microsoft sample databases discutidos posteriormente
sobre o captulo), mas EnviarObjeto apenas permite que voc defina algumas propriedades de um padro Outlook
mensagem de email e assim no vai fazer o trabalho, se voc precisa criar uma mensagem de email com base em um personalizado
forma, ou voc deseja definir propriedades internas que no so argumentos do EnviarObjeto comando.
Como alternativa, o grupo de exportao na guia dados externos da nova faixa de opes oferece muitas opes para
exportar dados do Access, mas curiosamente, como voc pode ver na Figura 8.1, no h nenhuma seleo para exportao-
ing para o Outlook.
Usando o grupo de coletar dados
No Access 2007, h uma nova escolha para interagir com o Outlook: A coletar dados de grupo sobre a
Guia de dados externo da fita tem dois botes, um para criar e-mails para coleta de dados para importar
em tabelas do Access e o outro para gerenciar as respostas (Ver Figura 8.2).
REFERNCIA CRUZADA REFERNCIA CRUZADA
220
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
13_047026 ch08.qxp 02\/04\/07 21:45 pgina 220
FIGURA 8.1
Opes de fita para exportao de dados de acesso.
FIGURA 8.2
O grupo de coletar dados sobre a faixa de opes de acesso.
Usando o grupo de importao para importar ou
Link para dados do Outlook
H tambm uma opo familiar para vincular tabelas do Access para Outlook, agora atualizado para uma seleo em
o menu mais do grupo Import na faixa de opes. Voc pode ver esta seleco na Figura 8.3.
221
Trabalhando com itens do Outlook
8
13_047026 ch08.qxp 02\/04\/07 21:45 pgina 221
FIGURA 8.3
A seleo de pasta do Outlook no grupo importar na faixa de opes.
Selecionar a seleo de pasta do Outlook, no menu mais abre uma caixa de dilogo oferecendo-lhe trs
escolhas (mostradas na Figura 8.4): importao de dados do Outlook para uma nova tabela de acesso, acrescentando os dados
para uma tabela existente, ou ligando a pasta para uma tabela do Access recm-criado.
FIGURA 8.4
As selees de importar\/vincular para pastas do Outlook.
222
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
13_047026 ch08.qxp 02\/04\/07 21:45 pgina 222
Depois de selecionar a opo \"Link para a fonte de dados, criando uma nova tabela\" (mostrada na Figura 8.5)
e clicar em OK, o Assistente do Exchange\/Outlook Link abre, a mesma coisa como no anterior, ver-
Sion de Office, permitindo que voc selecione uma pasta para vincular a uma tabela do Access.
FIGURA 8.5
Selecionando a pasta de tarefas para vincular a uma tabela do Access.
Na tela seguinte do assistente, voc pode dar a tabela um nome; Eu uso o prefixo \"ol\" para indicar
que a tabela vinculada ao Outlook. Eu fiz as tabelas vinculadas para tarefas, contatos e compromissos
(localizado na pasta de calendrio e nomeado como tal). A Figura 8.6 mostra trs tabelas vinculadas do Outlook
na lista de tabelas; Observe a seta indicando uma tabela vinculada e o cone distintivo para o Outlook.
FIGURA 8.6
Tabelas do Access ligado para pastas do Outlook.
Como com verses anteriores do Office, a opo de Link tem srias limitaes. A tabela vinculada olTasks
(mostrado na Figura 8.7) tem um grande muitos campos, mas falta-lhe o campo de assunto crucial, tornando tudo
mas intil.
223
Trabalhando com itens do Outlook
8
13_047026 ch08.qxp 02\/04\/07 21:45 pgina 223
FIGURA 8.7
Uma pasta de tarefas do Outlook vinculada, falta o campo de assunto.
A tabela vinculada olCalendar (mostrada na Figura 8.8) incluem o campo de assunto, bem como muitos
campos misteriosos e irrelevantes como MessageToMe e MessageCCToMe, mas ele no tem o crucial
Incio e fim datas e horas, por isso tambm intil.
FIGURA 8.8
Um calendrio do Outlook vinculado.
Dos trs, a tabela vinculada olContacts fornece a melhor correspondncia para contatos do Outlook: ele tem
a maioria (mas no todos) dos campos de item de contato padro (embora no o campo de identificao do cliente, que
poderia ser til na vinculao de registros). No entanto, a promessa de ligar acesso tabelas para Outlook
especificamente, que as alteraes feitas no acesso sero salvo para o Outlook e vice-versa no com -
completamente preenchida. Por exemplo, embora eu fiz mudanas para a empresa e nome do contato
nome de um contato recorde no acesso, apenas a mudana de empresa reflectiu-se volta para o Outlook.
No entanto, reflectiram-se alteraes de nome de contato e empresa no Outlook para acesso. Figura 8.9
mostra a tabela vinculada olContacts.
224
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
13_047026 ch08.qxp 02\/04\/07 21:45 pgina 224
FIGURA 8.9
Uma pasta de contatos vinculada.
225
Trabalhando com itens do Outlook
8
Criando um banco de dados a partir de um modelo
T
o criar um banco de dados de um dos novos modelos, primeiro selecione Nova no menu arquivo do Access,
como mostrado na figura a seguir.
O novo item no menu de arquivo do Access.
continuou
13_047026 ch08.qxp 02\/04\/07 21:45 pgina 225
226
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
continuou
Se o modelo que voc deseja usar exibido na tela seguinte, selecione-o diretamente.
Selecione o modelo de banco de dados de contatos.
Se o modelo que voc deseja usar no for mostrado, voc pode procur-lo (ou basta dar uma olhada no que est
disponvel), clicando no link de modelos na parte inferior da tela.
13_047026 ch08.qxp 02\/04\/07 21:45 pgina 226
227
Trabalhando com itens do Outlook
8
Abrindo a pgina de modelos no site do Microsoft Office.
A pgina de bancos de dados, voc tem uma escolha de Access 2007 ou no Access 2003.
A escolha da verso de acesso para modelos de banco de dados.
continuou
13_047026 ch08.qxp 02\/04\/07 21:45 pgina 227
228
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
continuou
O grupo de Access 2007, voc ver vrias categorias.
Categorias de modelos de banco de dados do Access 2007.
Selecionar a categoria de negcio, voc ver os modelos que eu usei neste captulo.
Modelos de banco de dados na categoria empresarial.
13_047026 ch08.qxp 02\/04\/07 21:45 pgina 228
229
Trabalhando com itens do Outlook
8
Clique no modelo que voc deseja usar para abrir uma pgina com um link para Download.
Download link para o modelo de banco de dados de tarefas.
Clique no boto baixar agora para prosseguir (voc pode receber uma mensagem sobre como instalar um ActiveX
controle para escritrio Online). Depois de instalar o controle ActiveX (se necessrio), o acesso ser aberto para o
Crie tela de banco de dados, com Tasks1.accdb como o nome do banco de dados proposto.
O novo banco de dados a ser criado a partir de um modelo de banco de dados.
Clique em criar para criar o novo banco de dados do modelo.
13_047026 ch08.qxp 02\/04\/07 21:45 pgina 229
Usando bancos de dados de amostra e formas
Criei bancos de dados de eventos e tarefas de modelos novos e importados as tabelas pertinentes e
formas destes bancos de dados o banco de dados de amostra para este captulo, o Outlook Export.accdb, e
ento renomeado os objetos e controles com prefixos apropriados.
A Microsoft criou vrios novos modelos de banco de dados para Access 2007; um deles cre -
Ates, um banco de dados de eventos e outro cria o banco de dados tarefas. Consulte o \"criar um
Barra lateral de banco de dados de um modelo\"para obter detalhes completos sobre como localizar um modelo de banco de dados e criar um
banco de dados dele.
Pessoalmente, prefiro manter minha lista de tarefas e calendrio no Outlook, porque ele tem o mais rico
interface para trabalhar com compromissos e tarefas. No entanto, se voc quer (ou precisa) para manter uma
simples calendrio ou lista de tarefas no Access, voc pode querer usar estes bancos de dados de amostra nova, ou
importar objetos deles, em seu banco de dados. Voc pode examinar as formas que importei do
bancos de dados de amostra, selecionando-os da seo formulrios no menu principal do Outlook
Exportao de dados, como mostrado na Figura 8.10 (final formas importadas com \"Lista\").
FIGURA 8.10
Selecionando um formulrio no menu principal.
Figura 8.11 mostra a forma de lista de tarefas, e Figura 8.12 mostra o formulrio lista de evento.
NOVO RECURSO NOVO RECURSO
230
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
13_047026 ch08.qxp 02\/04\/07 21:45 pgina 230
FIGURA 8.11
A forma de lista de tarefas, importada de um banco de dados criado a partir do novo modelo de banco de dados de tarefas.
FIGURA 8.12
O formulrio de lista de evento, importado de um banco de dados criado a partir do novo modelo de banco de dados de eventos.
O banco de dados do Outlook Export.accdb amostra contm as tabelas, consultas, formulrios, e
cdigo usado neste captulo.
H tambm um formulrio de lista de contatos (no banco de tarefas amostra dados), mostrado na Figura 8.13. Este formulrio
s adequado para manter uma simples lista de contatos de arquivos simples e no tem maioria da fea especial-
Tures Outlook fornece para trabalhar com contatos, mas novamente existem circunstncias onde voc
pode querer (ou precisar) para manter as informaes de contato em uma nica tabela de acesso, como quando voc precisa
regularmente exportar dados bsicos de contato para um arquivo de texto ou planilha para distribuio via e-mail, ou para
exportar para um banco de dados de arquivos simples de mainframe.
NOTA NOTA
231
Trabalhando com itens do Outlook
8
13_047026 ch08.qxp 02\/04\/07 21:45 pgina 231
FIGURA 8.13
A forma de lista de contatos, importada de um banco de dados criado a partir do novo modelo de banco de dados de tarefas.
Estas formas dos novos modelos tm botes com macros incorporadas. A adicionar a partir do Outlook
boto, que usa um argumento de comando novo, acCmdAddFromOutlook , abre um selecionar nomes
na caixa de dilogo para selecionar um contato do Outlook, como mostrado na Figura 8.14.
FIGURA 8.14
Selecionando um contato do Outlook.
232
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
13_047026 ch08.qxp 02\/04\/07 21:45 pgina 232
Todas essas formas dos novos modelos de banco de dados usam as macros incorporadas novas
em vez de cdigo do VBA para diversos fins. Usando macros em vez do cdigo que me parece
ser um passo para trs para os primeiros dias de acesso, mas tm a vantagem de evitar macros incorporadas
problemas de segurana que podem ocorrer se voc tentar executar o cdigo que no est assinado com uma assinatura digital (ou
mesmo quando voc executa assinado cdigo, no Windows Vista). Para tarefas simples, como fechar um formulrio ou a execuo
Ning um comando ou dois, incorporado macros funcionam bem, mas para tarefas mais complexas, no vai fazer o
Emprego; voc ainda precisa escrever cdigo VBA para realizar tarefas complexas, como iterar atravs de um conjunto de registros
ou criao de novos objetos em outros aplicativos do Office.
Importei tambm relatrios dos bancos de dados eventos e tarefas, que voc pode ver, selecionando o
nome do relatrio na seo relatrios do menu principal do exemplo do banco de dados, mostrado na Figura 8.15.
FIGURA 8.15
Selecionando um relatrio no menu principal.
Dependendo de que tipo de impressora que voc tem, talvez voc precise ajustar as margens no
alguns destes relatrios para evitar mensagens de erro ao abri-los.
NOTA NOTA
NOVO RECURSO NOVO RECURSO
233
Trabalhando com itens do Outlook
8
13_047026 ch08.qxp 02\/04\/07 21:45 pgina 233
O modelo de objeto do Outlook
Por causa das opes limitadas para exportar dados do Access para Outlook, eu prefiro usar VBA
Cdigo de automao para exportar os dados de acesso a objetos do Outlook. Exportar dados do Access para Outlook, voc
necessidade de compreender o modelo de objeto do Outlook.
O modelo de objeto do Outlook 2007 tem uma srie de novos componentes; eles so listados no MSDN
artigo \"o que novo para os desenvolvedores no Microsoft Office Outlook 2007 (parte 1 de 2),\" que voc pode
Download a partir do seguinte link: http:\/\/msdn2.Microsoft.com\/en-us\/library\/
ms772422.aspx #officeoutlook2007whatsnewdeveloperspart1_enhancements .
O modelo de objeto do Outlook no representa a interface do Outlook, tanto quanto os modelos de objeto
de outros componentes do Office; em vez de representando contatos, mensagens, tarefas, compromissos,
e outros objectos familiares do Outlook diretamente no modelo de objeto, estes componentes devem ser
acessado indiretamente, atravs da coleo de itens de um objeto de pasta, usando especficas constantes nomeadas para
referncia ou criar os tipos de item especfico. Pastas so acessadas atravs de curiosamente nomeado
Espao para nome objeto (representando os dados armazenados nas pastas do Outlook), o que faz para alguns muito
cdigo unintuitive.
Explorer, Inspetor e outros objetos do Outlook
Ao trabalhar com objetos do Outlook no cdigo VBA, voc estar trabalhando principalmente com pastas e
itens; Ocasionalmente voc tambm pode precisar usar um objeto Explorer ou Inspector. O objeto Explorer
representa uma pasta, conforme exibido em um painel de interface; o Inspector objeto representa um item,
como exibido em uma janela na interface. Exploradores e inspetores so usados para trabalhar com o cur-
rently Abra o item ou pasta; Se voc s precisa criar e salvar itens, voc no precisa usar esses
objetos no seu cdigo.
Figura 8.16, a pasta de contatos do Outlook exibida em um painel de Explorer e uma tarefa do Outlook
item exibido em uma janela de Inspetor.
Voc pode usar o CreateObject ouGetObject funciona com o \"Outlook. Application\"
argumento (com as aspas) para qualquer um criar um Outlook novo instncia ou recuperar uma referncia para o
instncia atual do Outlook, se estiver executando o Outlook. Com o Outlook, usando o Novopalavra-chave quando
declarar um aplicativo Outlook varivel tambm um mtodo til, especialmente se voc quer trabalhar
com uma instncia do Outlook diferente daquele atualmente em uso na interface.
Se seu cdigo faz uso de Explorer ou Inspetor de objetos, normalmente melhor usar o Novopalavra-chave
quando declarar o aplicativo Outlook objeto e, em seguida, defina a varivel de Nada no final do
o procedimento, porque o usurio pode estar abrindo e fechando vrias pastas e janelas, que
pode causar erros de cdigo, se voc estiver trabalhando com a instncia de execuo do Outlook.
234
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
13_047026 ch08.qxp 02\/04\/07 21:45 pgina 234
FIGURA 8.16
Outlook Explorer e Inspetor de objetos.
Os objetos do NameSpace, o Explorer e o Inspetor, juntamente com o objeto de aplicativo propriamente dito, so
a chave para a maioria dos componentes do Outlook, que voc precisar trabalhar com, como pastas e itens. Para
trabalho com uma pasta, por exemplo, voc deve primeiro definir uma referncia para o objeto de aplicativo Outlook,
em seguida, o objeto NameSpace e, em seguida, voc pode recuperar uma das pastas padro local usando o
GetDefaultFolder mtodo, ou uma pasta personalizada por fazer referncia a ele como um membro de nvel superior
Coleo de pastas, ou alguma pasta debaixo dessa pasta. (Note que o singular de pastas agora
Pasta aparentemente a Microsoft percebeu que o nome anterior MAPIFolder causava confuso.)
Embora o objeto MAPIFolder foi substitudo com a pasta mais intuitiva
objeto no Pesquisador de objetos, voc ainda pode declarar um objeto de pasta como MAPIFolder com-
fora causando um erro de compilao. Isso significa que voc no precisa passar por todo o cdigo antigo do Outlook e
Altere MAPIFolder declaraes para pasta.
Sintaxe para fazer referncia a objetos do Outlook
A coleo de itens para uma pasta representa todos os itens do Outlook separados nessa pasta, que
podem ser de diferentes tipos. No h nenhuma coisa como um singular objeto de Item do Outlook uma armadilha
que tem pego muitos programadores do Outlook a partir. Assim, quando voc precisa trabalhar com itens
NOTA NOTA
235
Trabalhando com itens do Outlook
8
13_047026 ch08.qxp 02\/04\/07 21:45 Page 235
em uma pasta, voc tambm precisa declarar uma varivel como Object. Isso ocorre porque uma varivel de objeto
tipo pode representar itens de diferentes tipos; cada item pode ser inspecionado, e se ele for o pblico -
comeu o tipo, mais medidas a tomar, como nos meus exemplos de cdigo a seguir.
Para criar um item de um tipo especfico, use o Adicionar mtodo com a coleo de itens de uma pasta (este cre-
ates um item padro da pasta padro item tipo), ou usar o objeto de aplicativo CreateItem
mtodo com a constante apropriada (Ver tabela 8.1 para listas das constantes). Se voc quer usar
objetos personalizados, use o objeto de aplicativo CreateItemFromTemplate objeto, com o nome
do formulrio personalizado do Outlook salvo. O cdigo de amostras nas sees a seguir ilustram usa de
esses mtodos.
Os fragmentos de cdigo a seguir mostram como definir uma referncia para uma pasta do Outlook ou item, com um
nmero de variaes. Voc pode declarar a varivel de aplicativo usando o Novopalavra-chave, em que
caso que voc no precisa definir a varivel. Ou voc pode declar-lo sem o Novopalavra-chave e ento
Defina a varivel mais tarde com GetObject ouCreateObject , como eu geralmente fao em meu completo pro -
contratao.
Um procedimento geralmente comea com declarar diversas variveis de tipos diferentes; a seguir
lista de declaraes de cobre o mais comumente usado alto nvel objetos do Outlook:
Dim appOutlook como Outlook. Application novo
Dim nms como Outlook.NameSpace
Dim flds como Outlook.Folders
Dim fld como Outlook.Folder
Dim exp como Outlook.Explorer
Dim ins como Outlook.Inspector
Declarar uma varivel como Objeto ento ele pode ser usado para qualquer tipo de item. Isso necessrio se voc precisa
para fazer referncia o item atual em uma pasta que pode conter itens de diferentes tipos:
Dim itm As Object
Declarar variveis de tipos de item to especficos, para uso quando voc estiver criando ou trabalhando com itens de
tipos especficos:
Dim msg As Outlook.MailItem
Dim con como Outlook.ContactItem
Conjunto nms = appOutlook.GetNamespace(\"MAPI\")
O flds varivel faz referncia as pastas sob a pasta de nvel superior:
Conjunto flds = nms.Pastas (\"pastas pessoais\").Pastas
Criar um item usando oAdicionar mtodo para a coleo de itens de uma pasta. O item ser da
tipo de item na pasta padro:
Conjunto appt = fldCalendar.Items.Add
236
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
13_047026 ch08.qxp 02\/04\/07 21:45 pgina 236
Criar um padro de item usando o CreateItem mtodo do objeto Application:
Set msg = appOutlook.CreateItem(olMailItem)
Crie um item de mensagem de email personalizado de um modelo de Outlook salvo:
strTemplate = \"D:\/Templates\/Outlook\/Personnel.oft\"
Set msg = appOutlook.CreateItemFromTemplate(strTemplate)
Em verses anteriores do Office, voc poderia abrir um modelo do Outlook (arquivo. oft) salvo por
simplesmente clicando duas vezes nela em uma janela do Explorer. Isso no funciona mais, por causa de mais
rigorosas medidas de segurana do Microsoft. No Office 2007 em execuo no Windows Vista, se voc tentar abrir um
Modelo do Outlook diretamente, voc receber a mensagem de aviso mostrada na Figura 8.17.
FIGURA 8.17
Uma mensagem de aviso ao abrir um arquivo de modelo do Outlook salvo.
Aps clicar em OK, o arquivo abrir, em seguida, como um item padro, no seu formulrio personalizado. Para contornar esse problema
recurso de segurana chato, selecione Ferramentas

Formulrios

Escolha o formulrio na janela principal do Outlook, como


mostrado na Figura 8.18.
FIGURA 8.18
Selecionando um formulrio personalizado na interface do Outlook.
DICA DICA
237
Trabalhando com itens do Outlook
8
13_047026 ch08.qxp 02\/04\/07 21:45 pgina 237
Na caixa de dilogo escolher formulrio, selecione \"Modelos de usurio no sistema de arquivos\" na lista drop-down \"Olhar\",
como mostrado na Figura 8.19.
FIGURA 8.19
Selecionando a opo \"Modelos em arquivo sistema usurio\" para abrir um arquivo de modelo salvo.
O caminho de modelo padro para o local de modelo padro do Office 2007\/Windows Vista,
C: \/ usurios\/seu nome\/App\/Roaming\/Microsoft\/modelos de dados, mas h um Browse boto que
permite que voc selecione um modelo de outro local. Depois de selecionar o modelo, voc pode abri-lo com
o boto abrir e voc ver o formulrio personalizado no ltimo (embora suas cores podem ter mudado,
devido s alteraes na paleta de cores do Windows Vista e Office 2007).
Defina uma referncia para a pasta de contatos padro local:
Set fld = nms.GetDefaultFolder(olFolderContacts)
Definir uma referncia para a coleo de pastas de uma pasta chamada \"Custom contatos\" sob o nvel superior
Pasta de pastas pessoal (via definida anteriormente flds varivel):
Set fld = flds \"(contatos Custom\")
Defina uma referncia para uma pasta pblica personalizada:
Conjunto flds = nms.Pastas (\"pastas pblicas\").Pastas
Set fld = _
flds (\"todas as pastas pblicas\").Pastas (\"pasta personalizada\")
Defina uma referncia para a pasta atualmente aberta, atravs do explorador ativo:
Definir exp = appOutlook.ActiveExplorer
Set fld = exp.CurrentFolder
238
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
13_047026 ch08.qxp 02\/04\/07 21:45 pgina 238
Teste se a atual pasta uma pasta de contatos:
Se FLD.DefaultItemType <>olContactItem, em seguida
MsgBox _
\"Esta pasta no uma pasta de contatos; cancelamento\"
GoTo ErrorHandlerExit
End If
Defina uma referncia para o item atualmente aberto, atravs do Inspetor ativo:
Conjunto de ins = appOutlook.ActiveInspector
Conjunto itm = ins.CurrentItem
Testar se o item aberto uma mensagem de email e definir uma varivel de mensagem de email para ele se assim:
Se itm.Classe = olMail ento
Set msg = itm
End If
Defina uma referncia para o contato cujo nome \"Helen Feddema\":
Set fld = nms.GetDefaultFolder(olFolderContacts)
Conjunto con = FLD.Itens (\"Helen Feddema\")
Defina uma referncia a uma propriedade de item built-in do Outlook:
strFullName = con.FullName
Definir uma referncia a uma propriedade de item do Outlook personalizada da sim\/no h dados tipo:
blnCustomer = con.UserProperties(\"Customer\")
Padro GetObject linha e erro manipulador padro para CreateObject Outlook no for
executando:
Dim appOutlook como Outlook. Application
Conjunto appOutlook = GetObject (, \"Outlook. Application\")
[Seu cdigo aqui]
ErrorHandlerExit:
Exit Sub
ErrorHandler:
' No est executando o outlook; Abra o Outlook com CreateObject
Se Err. Number = 429 ento
Conjunto appOutlook = CreateObject
239
Trabalhando com itens do Outlook
8
13_047026 ch08.qxp 02\/04\/07 21:45 Page 239
Retomar em seguida
Outra coisa
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End If
Referenciar itens do Outlook no cdigo VBA
Microsoft optou por usar a mesma palavra (por exemplo, nota) para os tipos de itens diferentes de referncia
(classe de mensagem de uma mensagem correio e um item de nota na interface), e para dar itens confusamente dife -
diferentes nomes em cdigo que eles tm na interface do usurio (por exemplo, um artigo de jornal tem uma mensagem
classe de \"Atividade\"). Tabela 8.1 ir ajud-lo a encontrar o nome certo ou uma constante nomeada para cada situao.
TABELA 8.1
Referenciar itens do Outlook
Mensagem de modelo de objeto de interface OlObjectClass OlItemType
Nome Nome Classe Constante Constante
Contato ContactItem IPM.Contato olContact olContactItem
Tarefa TaskItem IPM.Tarefa olTask olTaskItem
Mensagem de correioMailItem IPM.Nota olMail olMailItem
Nomeao AppointmentItem IPM.Nomeao olAppointment olAppointmentItem
Entrada de dirio JournalItem IPM.Atividade olJournal olJournalItem
Nota NoteItem IPM.StickyNote olNote olNoteItem
A classe de mensagem pode ser usada para criar um item de um tipo especfico, ou para determinar qual o tipo de
objeto que voc est lidando com (por exemplo, no Inspetor de ativo). Ele tambm pode ser visto na
\"Publicar formulrio como\" caixa de dilogo ao publicar um item do Outlook para uma biblioteca ou pasta, como mostrado na
Figura 8.20.
A classe de mensagem de uma forma personalizada consiste no nome do formulrio anexado para o padro do objeto
classe de mensagem, com um perodo de separao. O OlObjectClass constantes nomeadas so usadas para deter-
que tipo de item que voc est tratando, usando o meu a Classe Propriedade de um objeto, Considerando que o
OlItemType constantes nomeadas so utilizados para definir ou determinar o tipo de item do padro de um
pasta, usando uma pasta DefaultItemType Propriedade. Consulte os procedimentos de amostra na prxima seg-
es para exemplos que usam essas constantes.
240
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
13_047026 ch08.qxp 02\/04\/07 21:45 pgina 240
FIGURA 8.20
O Outlook \"Publicar o formulrio como\" caixa de dilogo, mostrando a classe de mensagem de um formulrio personalizado do Outlook.
Trabalhando com compromissos do Outlook
Voc pode ter dados de calendrio (marcao) armazenados em uma tabela do Access, talvez datam de antes
Outlook tornou-se parte do Office. Porque o Outlook tem uma interface muito mais rica para trabalhar com
calendrios de acesso, eu recomendo a exportar os dados de calendrio de acesso ao Outlook e trabalhando
com ele em calendrios do Outlook no futuro.
Para exportar dados de uma tabela de compromissos de acesso (como a tabela de dados de eventos de amostra-
base, chamado de tblEvents) para compromissos do Outlook, use a funo listado prximo (pode tambm ser executado
a macro de mcrExportAppointments):
Funo pblica ExportAppointmentsToOutlook()
No erro GoTo ErrorHandler
Dim fldCalendar como Outlook.Folder
Dim appt como Outlook.AppointmentItem
Dim strApptName As String
Dim dteStartTime As Date
Dim dteEndTime As Date
Dim strStatus As String
Dim lngStatus como longo
Conjunto appOutlook = GetObject (, \"Outlook. Application\")
Conjunto nms = appOutlook.GetNamespace(\"MAPI\")
Definir fldCalendar = nms.GetDefaultFolder(olFolderCalendar)
241
Trabalhando com itens do Outlook
8
13_047026 ch08.qxp 02\/04\/07 21:45 pgina 241
Conjunto dbs = CurrentDb
Set rst = dbs.OpenRecordset(\"tblEvents\")
Com rst
Enquanto no.EOF
Verifique que h um assunto de nomeao.
strApptName = Nz(![Ttulo])
Debug. Print \"nome de nomeao:\"
Se strApptName = \"\", em seguida,
GoTo NextAppt
End If
Verifique datas vlidas e converter datas em branco em 1\/1\/4501 (que uma data em branco no Outlook).
Se IsNull(![Hora de incio]) = True Then
dteStartTime = #1\/1\/4501 #
Outra coisa
dteStartTime = Nz(![Hora de incio])
End If
Se IsNull(![Horrio de trmino]) = True Then
dteEndTime = #1\/1\/4501 #
Outra coisa
dteEndTime = Nz(![Tempo final])
End If
Crie um novo compromisso item na pasta calendrio local.
Conjunto appt = fldCalendar.Items.Add
appt.Assunto = strApptName
appt.Iniciar = dteStartTime
appt.Final = dteEndTime
appt.Localizao = Nz(![Localizao])
appt.Corpo = Nz(![Descrio])
appt.Fechar (olSave)
NextAppt:
.MoveNext
Loop
Terminar com
MsgBox \"Compromissos exportados para Outlook\"
ErrorHandlerExit:
Exit Function
ErrorHandler:
242
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
13_047026 ch08.qxp 02\/04\/07 21:45 pgina 242
Outlook no est em execuo; Abra Outlook com CreateObject.
Se Err. Number = 429 ento
Conjunto appOutlook = CreateObject
Retomar em seguida
Outra coisa
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End If
End Function
Figura 8.21 mostra as nomeaes exportadas no calendrio do Outlook.
FIGURA 8.21
Compromissos no calendrio do Outlook exportados do acesso.
Para importar os compromissos de seu calendrio do Outlook local para uma tabela do Access (tblImportedCalendar),
Use a seguinte funo (pode tambm ser executado de macro mcrImportCalendar):
Funo pblica ImportApptsFromOutlook()
No erro GoTo ErrorHandler
Dim fldCalendar como Outlook.Folder
Dim appt como Outlook.AppointmentItem
Dim strApptName As String
Dim dteStartTime As Date
Dim dteEndTime As Date
Dim strLocation As String
Dim strSQL As String
Dim strDescription As String
Conjunto appOutlook = GetObject (, \"Outlook. Application\")
Conjunto nms = appOutlook.GetNamespace(\"MAPI\")
Definir fldCalendar = nms.GetDefaultFolder(olFolderCalendar)
243
Trabalhando com itens do Outlook
8
13_047026 ch08.qxp 02\/04\/07 21:45 pgina 243
Tabela clara de dados antigos.
strSQL = \"DELETE * de tblImportedCalendar\"
DoCmd.SetWarnings False
StrSQL DoCmd.RunSQL
Conjunto dbs = CurrentDb
Set rst = dbs.OpenRecordset(\"tblImportedCalendar\")
Iterar atravs as nomeaes na pasta calendrio local e import-los para a tabela do Access.
Para cada itm em fldCalendar.Items
Se itm.Classe = olAppointment Then
Conjunto appt = itm
Com o appt
strApptName = Nz (.Assunto)
dteStartTime = Nz (.Start)
dteEndTime = Nz (.Final)
strLocation = Nz (.Localizao)
strDescription = Nz (.Corpo)
Terminar com
Com rst
RST.AddNew
![Assunto] = strApptName
Se dteStartTime <>#1\/1\/4501 #, em seguida,
![Incio] = dteStartTime
End If
Se dteEndTime <>#1\/1\/4501 #, em seguida,
![Horrio de trmino] = dteEndTime
End If
![Localizao] = strLocation
![Descrio] = strDescription
.Atualizao
Terminar com
End If
Itm prximo
RST.Fechar
DoCmd.OpenTable \"tblImportedCalendar\"
ErrorHandlerExit:
Exit Function
ErrorHandler:
244
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
13_047026 ch08.qxp 02\/04\/07 21:45 pgina 244
Outlook no est em execuo; Abra Outlook com CreateObject.
Se Err. Number = 429 ento
Conjunto appOutlook = CreateObject
Retomar em seguida
Outra coisa
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End If
End Function
Figura 8.22 mostra a tabela de nomeaes importadas, que aberta automaticamente no final
do procedimento.
FIGURA 8.22
Uma tabela de nomeaes importados de uma pasta de calendrio do Outlook.
Para um cenrio mais realista, no qual voc deseja criar compromissos com base nos dados em um acesso
tabela de dados do projeto, uso o CreateProjectAppts funo (ele tambm pode ser executado a partir do
mcrCreateProjectAppts macro). Essa funo seleciona registros em tblContactsWithProjects que tm
uma ltima reunio data de mais de um ms atrs e cria um compromisso do Outlook para um projeto
reunio dos seguintes segunda-feira para cada um desses registros, gravar dados de vrios campos da
Registro de acesso para o item de compromisso:
Funo pblica CreateProjectAppts()
No erro GoTo ErrorHandler
Dim fldCalendar como Outlook.Folder
Dim appt como Outlook.AppointmentItem
Dim dteMonthAgo As Date
Dim dteLastMeeting As Date
Dim dteNextMonday As Date
Dim strProject As String
Conjunto appOutlook = GetObject (, \"Outlook. Application\")
Conjunto nms = appOutlook.GetNamespace(\"MAPI\")
245
Trabalhando com itens do Outlook
8
13_047026 ch08.qxp 02\/04\/07 21:45 pgina 245
Definir fldCalendar = nms.GetDefaultFolder(olFolderCalendar)
Conjunto dbs = CurrentDb
Set rst = dbs.OpenRecordset(\"tblContactsWithProjects\")
dteMonthAgo = DateAdd (\"m\", -1, data)
dteNextMonday = NextMondayTime()
Com rst
Enquanto no.EOF
Verifique se a ltima data de reunio mais de um ms atrs.
dteLastMeeting = Nz(![LastMeetingDate])
strProject = Nz(![CurrentProject])
Se dteLastMeeting < dteMonthAgo ento
Crie um novo compromisso item na pasta calendrio local.
Conjunto appt = fldCalendar.Items.Add
appt.Assunto = strProject
appt.Iniciar = dteNextMonday
appt.Durao = \"60\"
appt.ReminderSet = True
appt.Corpo = \"Reunio mensal do projeto\"
appt.Fechar (olSave)
End If
.MoveNext
Loop
Terminar com
MsgBox \"Outlook projeto reunio nomeaes criadas\"
ErrorHandlerExit:
Exit Function
ErrorHandler:
Outlook no est em execuo; Abra Outlook com CreateObject.
Se Err. Number = 429 ento
Conjunto appOutlook = CreateObject
Retomar em seguida
Outra coisa
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End If
End Function
246
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
13_047026 ch08.qxp 02\/04\/07 21:45 pgina 246
A Figura 8.23 mostra dentre as nomeaes criadas pelo procedimento.
FIGURA 8.23
Um compromisso de reunio de projeto criado a partir de dados em uma tabela do Access.
Trabalhando com tarefas do Outlook
Como com nomeaes, se voc tem uma tabela do Access de tarefas criadas vrias verses do Office atrs, eu rec -
ommend, exportar os dados da tarefa para Outlook, pode ser mantido na lista de tarefas (no Outlook
2007, renomeado To Do List) para uso futuro.
A tabela que importei do banco de dados exemplo tarefas (tblTasks) tarefas do Outlook pode ser usada
como um exemplo de como exportar dados de tarefa de acesso ao Outlook. A seguinte funo faz o
exportao (pode tambm ser executado de macro mcrExportTasksToOutlook):
Funo pblica ExportTasksToOutlook()
No erro GoTo ErrorHandler
Dim fldTasks como Outlook.Folder
Dim tsk como Outlook.TaskItem
Dim strTaskName As String
Dim dteStartDate As Date
Dim dteDueDate As Date
Dim strStatus As String
Dim lngStatus como longo
247
Trabalhando com itens do Outlook
8
13_047026 ch08.qxp 02\/04\/07 21:45 pgina 247
Dim strPriority As String
Dim lngPriority como longo
Dim strDescription As String
Conjunto appOutlook = GetObject (, \"Outlook. Application\")
Conjunto nms = appOutlook.GetNamespace(\"MAPI\")
Definir fldTasks = nms.GetDefaultFolder(olFolderTasks)
Conjunto dbs = CurrentDb
Set rst = dbs.OpenRecordset(\"tblTasks\")
Com rst
Enquanto no.EOF
Verifique que h um assunto da tarefa.
strTaskName = Nz(![Ttulo])
Debug. Print \"tarefa:\"
Se strTaskName = \"\", em seguida,
GoTo NextTask
End If
Verifique datas vlidas e converter datas em branco em 1\/1\/4501 (que uma data em branco no Outlook).
Se IsNull(![Data de incio]) = True Then
dteStartDate = #1\/1\/4501 #
Outra coisa
dteStartDate = Nz(![Data de incio])
End If
Se IsNull(![Data de vencimento]) = True Then
dteDueDate = #1\/1\/4501 #
Outra coisa
dteDueDate = Nz(![Data de vencimento])
End If
Converta o valor de Status de texto para um nmero para o Outlook.
strStatus = Nz(![Status])
lngStatus = interruptor (strStatus = \"No iniciado\", _
0, strStatus = \"em andamento\", 1, _
strStatus = \"Concludo\", 2, _
strStatus = \"Aguardando outra pessoa\", 3, _
strStatus = \"Diferidos\", 4, _
, 0)
248
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
13_047026 ch08.qxp 02\/04\/07 21:45 pgina 248
Converta o valor de prioridade do texto para um nmero para o Outlook.
strPriority = Nz(![Prioridade])
lngPriority = interruptor (strPriority = \"(1) alta\", _
1, strPriority = \"(2) Normal\", 2, _
strPriority = \"(3) baixa\", 3, _
, 0)
strDescription = Nz(![Descrio])
Crie um novo item de tarefa na pasta tarefas selecionada.
Conjunto tsk = fldTasks.Items.Add
tsk.Assunto = strTaskName
tsk.StartDate = dteStartDate
tsk.DueDate = dteDueDate
tsk.Status = lngStatus
tsk.Corpo = strDescription
tsk.PercentComplete = Nz(![% Completo])
tsk.Fechar (olSave)
NextTask:
.MoveNext
Loop
Terminar com
MsgBox \"Funes exportadas para o Outlook\"
ErrorHandlerExit:
Exit Function
ErrorHandler:
Outlook no est em execuo; Abra Outlook com CreateObject.
Se Err. Number = 429 ento
Conjunto appOutlook = CreateObject
Retomar em seguida
Outra coisa
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End If
End Function
Figura 8.24 mostra as tarefas exportadas na pasta de tarefas (no Outlook 2007, essa pasta agora
chamado To Do List).
249
Trabalhando com itens do Outlook
8
13_047026 ch08.qxp 02\/04\/07 21:45 pgina 249
FIGURA 8.24
Tarefas do Outlook para fazer a lista exportada de uma tabela do Access.
Para importar tarefas de pasta de tarefas do Outlook local em uma tabela do Access (tblImportedTasks), use
a funo seguinte (pode tambm ser executado de macro mcrImportTasksFromOutlook):
Funo pblica ImportTasksFromOutlook
No erro GoTo ErrorHandler
Dim fldTasks como Outlook.Folder
Dim tsk como Outlook.TaskItem
Dim strTaskName As String
Dim dteStartDate As Date
Dim dteDueDate As Date
Dim strStatus As String
Dim lngStatus como longo
Dim strPriority As String
Dim lngPriority como longo
Dim strDescription As String
Dim lngPercentComplete como longo
Dim itm As Object
Dim strSQL As String
Conjunto appOutlook = GetObject (, \"Outlook. Application\")
Conjunto nms = appOutlook.GetNamespace(\"MAPI\")
Definir fldTasks = nms.GetDefaultFolder(olFolderTasks)
Tabela clara de dados antigos.
strSQL = \"DELETE * de tblImportedTasks\"
DoCmd.SetWarnings False
StrSQL DoCmd.RunSQL
Conjunto dbs = CurrentDb
Set rst = dbs.OpenRecordset(\"tblImportedTasks\")
Iterar por meio de tarefas na pasta tarefas e import-los para a tabela do Access.
Para cada itm em fldTasks.Items
Se itm.Classe = olTask Then
Conjunto tsk = itm
250
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
13_047026 ch08.qxp 02\/04\/07 21:45 pgina 250
Com tsk
strTaskName = Nz (.Assunto)
dteStartDate = Nz (.StartDate)
dteDueDate = Nz (.DueDate)
lngStatus = Nz (.Status)
lngPriority = Nz (.Importncia)
strDescription = Nz (.Corpo)
lngPercentComplete = Nz (.PercentComplete)
Terminar com
Com rst
RST.AddNew
![Assunto] = strTaskName
Se dteStartDate <>#1\/1\/4501 #, em seguida,
![Data de incio] = dteStartDate
End If
Se dteDueDate <>#1\/1\/4501 #, em seguida,
![Data] = dteDueDate
End If
' Converte um nmero de prioridade ao texto de acesso
strPriority = interruptor (lngPriority = 1, _
\"(1) Alta\" _
lngPriority = 2, (2) Normal\", _\"
lngPriority = 3, \"(3) baixa\", _
0, )
![Prioridade] = strPriority
Converta o valor numrico do Status em texto para acesso.
strStatus = interruptor (lngStatus = 0, _
\"No iniciado\" _
lngStatus = 1, \"em andamento\", _
lngStatus = 2, \"Concludo\", _
lngStatus = 3, _
\"Esperando algum\" _
lngStatus = 4, \"Diferidos\", _
0, )
![Status] = strStatus
Se lngPercentComplete > 0 ento
lngPercentComplete = _
lngPercentComplete \/ 100
End If
![PercentComplete] = lngPercentComplete
![Notas] = strDescription
251.
Trabalhando com itens do Outlook
8
13_047026 ch08.qxp 02\/04\/07 21:45 pgina 251
.Atualizao
Terminar com
End If
Itm prximo
RST.Fechar
DoCmd.OpenTable \"tblImportedTasks\"
ErrorHandlerExit:
Exit Function
ErrorHandler:
Outlook no est em execuo; Abra Outlook com CreateObject.
Se Err. Number = 429 ento
Conjunto appOutlook = CreateObject
Retomar em seguida
Outra coisa
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End If
End Function
Figura 8.25 mostra a tabela de tarefas importadas.
FIGURA 8.25
Uma tabela de tarefas importadas do Outlook.
252
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
13_047026 ch08.qxp 02\/04\/07 21:45 pgina 252
Para um cenrio mais realista, no qual voc deseja criar tarefas baseadas em dados em uma tabela do Outlook,
consulte o CreateProjectTasks funo (que pode ser executado a partir da macro mcrCreateProjectTasks).
Essa funo cria uma tarefa do Outlook para cada registro em tblContactsWithProjects que no tenha tido
suprimentos alimentada por um ms ou mais e grava dados de vrios campos no Access
Registre-se para o item de tarefa:
Funo pblica CreateProjectTasks()
No erro GoTo ErrorHandler
Dim fldTasks como Outlook.Folder
Dim tsk como Outlook.TaskItem
Dim dteMonthAgo As Date
Dim dteReplenished As Date
Dim dteNextMonday As Date
Dim strProject As String
Conjunto appOutlook = GetObject (, \"Outlook. Application\")
Conjunto nms = appOutlook.GetNamespace(\"MAPI\")
Definir fldTasks = nms.GetDefaultFolder(olFolderTasks)
Conjunto dbs = CurrentDb
Set rst = dbs.OpenRecordset(\"tblContactsWithProjects\")
dteMonthAgo = DateAdd (\"m\", -1, data)
dteNextMonday = NextMonday()
Com rst
Enquanto no.EOF
Verifique se a suprimentos ltima foram reabastecidos h mais de um ms.
dteReplenished = Nz(![SuppliesReplenished])
strProject = Nz(![CurrentProject])
Se dteReplenished < dteMonthAgo ento
Crie uma nova tarefa na pasta tarefas local.
Conjunto tsk = fldTasks.Items.Add
tsk.Assunto = \"Repor os suprimentos para\" _
& strProject
tsk.StartDate = dteNextMonday
tsk.Status = 0
tsk.Importncia = 1
tsk.Fechar (olSave)
End If
.MoveNext
Loop
Terminar com
MsgBox \"Tarefas do Outlook projeto criadas\"
253
Trabalhando com itens do Outlook
8
13_047026 ch08.qxp 02\/04\/07 21:45 pgina 253
ErrorHandlerExit:
Exit Function
ErrorHandler:
Outlook no est em execuo; Abra Outlook com CreateObject.
Se Err. Number = 429 ento
Conjunto appOutlook = CreateObject
Retomar em seguida
Outra coisa
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End If
End Function
Figura 8.26 mostra uma das tarefas criadas por este procedimento.
FIGURA 8.26
Uma tarefa criada a partir de dados em uma tabela do Access.
Trabalhar com contatos do Outlook
Outlook oferece uma interface conveniente e atraente para trabalhar com contatos (embora, como observado
no incio deste captulo, no oferece suporte a empresas liga para contatos ou outro um-para-muitos
links). Manter a maioria de pessoas Outlook aberto em todos os momentos, Considerando que eles s podem abrir um dados de acesso-
base conforme necessrio. Por isso, se voc tem uma tabela nica de contatos de acesso, voc pode desejar
exportar os dados para o Outlook, ento voc pode abrir um item de contato rapidamente sem ter que primeiro abrir um
Banco de dados do Access.
254
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
13_047026 ch08.qxp 02\/04\/07 21:45 pgina 254
Se voc tem um conjunto de tabelas vinculadas do acesso dos dados de contato, e voc deseja manter os dados
nas tabelas sincronizadas com correspondncia de itens de contato do Outlook, voc precisa de mais de um
exportao simples. Consulte o captulo 11 para uma discusso de sincronizao bidirecional entre acesso e
Contatos do Outlook.
Para exportar dados de uma tabela do Access arquivo simples contatos (como tblContactsToExport) para o Outlook
contatos em uma pasta de contatos personalizada chamada contatos de acesso, use a funo listada a seguir
(pode tambm ser executado de macro mcrExportFlatFileContactsToOutlook):
Funo pblica ExportFlatFileContactsToOutlook()
No erro GoTo ErrorHandler
Conjunto appOutlook = GetObject (, \"Outlook. Application\")
Dim lngContactID como longo
Dim lngContactCount como longo
Dim fld como Outlook.Folder
Dim fldContacts como Outlook.Folder
Dim conNew como Outlook.ContactItem
Dim concurso como Outlook.ContactItem
Dim strFullName As String
Dim strFirstName As String
Dim strLastName As String
Dim strBusinessPhone As String
Dim strMobilePhone As String
Dim strFaxNumber As String
Dim strNotes As String
Dim strJobTitle As String
Dim strStreetAddress As String
Dim strCity As String
Dim strStateProv As String
Dim strPostalCode As String
Dim strCountry As String
Dim strCompanyName As String
Dim strEMail As String
Dim strSalutation As String
Conjunto appOutlook = GetObject (, \"Outlook. Application\")
Conjunto nms = appOutlook.GetNamespace(\"MAPI\")
Use a seguinte linha para exportar para a pasta de contatos padro local:
' Definir fldContacts = nms.GetDefaultFolder(olFolderTasks)
Em erro continuar prximo
Use as seguintes linhas para exportar para uma pasta de contatos personalizada, cri-la se necessrio. Se a criao de um
falha de referncia para a pasta, a pasta ser criada.
REFERNCIA CRUZADA REFERNCIA CRUZADA
255
Trabalhando com itens do Outlook
8
13_047026 ch08.qxp 02\/04\/07 21:45 pgina 255
Set fld = nms.Pastas (\"pastas particulares\")
Definir fldContacts = FLD.Pastas (\"contactos de acesso\")
Se fldContacts no nada ento
Definir fldContacts = _
FLD.Folders (\"contactos de acesso\" _
olFolderContacts)
End If
No erro GoTo ErrorHandler
lngContactCount = 0
Conjunto dbs = CurrentDb
Set rst = dbs.OpenRecordset(\"tblContactsToExport\")
Com rst
Enquanto no.EOF
Verificar informaes de nome do requerido.
strFullName = Nz(![FirstName])
& Nz(![LastName])
Debug. Print \"nome do contato:\"
Se strFullName = \"\", em seguida,
GoTo NextContact
End If
Verificar se j existe um item de contato do Outlook para essa pessoa.
Em erro continuar prximo
Concurso conjunto = fldContacts.Items(strFullName)
Se conTest.FullName <>strFullName ento
Nenhum contato correspondente encontrado.
StrFullName Debug. Print
ElseIf conTest.FullName = strFullName ento
StrFullName Debug. Print
GoTo NextContact
End If
No erro GoTo ErrorHandler
lngContactID = Nz(![ContactID])
strCompanyName = Nz(![CompanyName])
strFirstName = Nz(![FirstName])
strLastName = Nz(![LastName])
strSalutation = Nz(![Saudao])
strEMail = Nz(![EmailName])
strJobTitle = Nz(![JobTitle])
strBusinessPhone = Nz(![_ WorkPhone])
256
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
13_047026 ch08.qxp 02\/04\/07 21:45 pgina 256
& IIf(Nz(![WorkExtension]) <> , x _
& ![WorkExtension], )
strMobilePhone = Nz(![Telemvel])
strFaxNumber = Nz(![Nmerofax])
strNotes = Nz(![Notas])
strStreetAddress = Nz(![StreetAddress])
strCity = Nz(![Cidade])
strStateProv = Nz(![StateOrProvince])
strPostalCode = Nz(![CEP])
strCountry = Nz(![Pas])
Crie um novo item de contato na pasta contatos selecionada.
Conjunto conNew = fldContacts.Items.Add
Com conNew
.CustomerID = lngContactID
.FirstName = strFirstName
.LastName = strLastName
.JobTitle = strJobTitle
.BusinessAddressStreet = strStreetAddress
.BusinessAddressCity = strCity
.BusinessAddressState = strStateProv
.BusinessAddressPostalCode = strPostalCode
.BusinessAddressCountry = strCountry
.CompanyName = strCompanyName
.Email1Address = strEMail
.BusinessTelephoneNumber = strBusinessPhone
.BusinessFaxNumber = strFaxNumber
.MobileTelephoneNumber = strMobilePhone
.Alcunha = strSalutation
.Corpo = strNotes
.Fechar (olSave)
Terminar com
lngContactCount = lngContactCount + 1
NextContact:
.MoveNext
Loop
Terminar com
RST.Fechar
Se lngContactCount = 0 Then
MsgBox \"Nenhum contato exclusivo para exportar para o Outlook\"
Outra coisa
MsgBox lngContactCount
End If
ErrorHandlerExit:
Exit Function
ErrorHandler:
257
Trabalhando com itens do Outlook
8
13_047026 ch08.qxp 02\/04\/07 21:45 pgina 257
Outlook no est em execuo; Abra Outlook com CreateObject.
Se Err. Number = 429 ento
Conjunto appOutlook = CreateObject
Retomar em seguida
Outra coisa
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End If
End Function
Figura 8,27 mostra alguns dos contatos exportados para os contatos personalizados de pasta de acesso.
FIGURA 8,27
Contatos em uma pasta personalizada do Outlook exportados do acesso, na nova exibio de carto de visita.
258
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
13_047026 ch08.qxp 02\/04\/07 21:45 pgina 258
Importar contatos de sua pasta de contatos do Outlook local em uma tabela do Access
(tblImportedContacts), use a seguinte funo (ele tambm pode ser executado a partir do
macro de mcrImportContactsFromOutlook):
Funo pblica ImportContactsFromOutlook()
No erro GoTo ErrorHandler
Dim lngContactCount como longo
Dim fld como Outlook.Folder
Dim fldContacts como Outlook.Folder
Dim con como Outlook.ContactItem
Dim strFullName As String
Dim strFirstName As String
Dim strLastName As String
Dim strBusinessPhone As String
Dim strHomePhone As String
Dim strMobilePhone As String
Dim strFaxNumber As String
Dim strNotes As String
Dim strJobTitle As String
Dim strWorkAddress As String
Dim strWorkCity As String
Dim strWorkStateProv As String
Dim strWorkPostalCode As String
Dim strWorkCountry As String
Dim strHomeAddress As String
Dim strHomeCity As String
Dim strHomeStateProv As String
Dim strHomePostalCode As String
Dim strHomeCountry As String
Dim strCompanyName As String
Dim strEMail As String
Dim strSalutation As String
Dim itm As Object
Dim strSQL As String
Dim strWebSite As String
Conjunto appOutlook = GetObject (, \"Outlook. Application\")
Conjunto nms = appOutlook.GetNamespace(\"MAPI\")
Use a seguinte linha para importar a pasta de contatos padro local:
' Definir fldContacts = nms.GetDefaultFolder(olFolderTasks)
Em erro continuar prximo
259
Trabalhando com itens do Outlook
8
13_047026 ch08.qxp 02\/04\/07 21:45 pgina 259
Use as seguintes linhas para definir uma referncia a uma pasta de contatos personalizada, cri-la se necessrio. Se set -
falha de Ting uma referncia para a pasta, a pasta ser criada.
Set fld = nms.Pastas (\"pastas particulares\")
Definir fldContacts = FLD.Pastas (\"contatos para exportao\")
Se fldContacts no nada ento
Definir fldContacts = _
FLD.Folders (\"Contatos para exportar\" _
olFolderContacts)
End If
No erro GoTo ErrorHandler
Limpe a mesa de dados antigos.
strSQL = \"DELETE * de tblImportedContacts\"
DoCmd.SetWarnings False
StrSQL DoCmd.RunSQL
lngContactCount = 0
Conjunto dbs = CurrentDb
Set rst = dbs.OpenRecordset(\"tblImportedContacts\")
Iterar atravs de contatos na pasta contatos selecionada e import-los para a tabela do Access.
Para cada itm em fldContacts.Items
Se itm.Classe = olContact Then
Conjunto con = itm
Com con
strFirstName = Nz (.FirstName)
strLastName = Nz (.Sobrenome)
strJobTitle = Nz (.JobTitle)
strWorkAddress = Nz (.BusinessAddressStreet)
strWorkCity = Nz (.BusinessAddressCity)
strWorkStateProv = Nz (.BusinessAddressState)
strWorkPostalCode = _
Nova Zelndia (.BusinessAddressPostalCode)
strWorkCountry = Nz (.BusinessAddressCountry)
strHomeAddress = Nz (.HomeAddress)
strHomeCity = Nz (.HomeAddressCity)
strHomeStateProv = Nz (.HomeAddressState)
strHomePostalCode = Nz (.HomeAddressPostalCode)
strHomeCountry = Nz (.HomeAddressCountry)
strCompanyName = Nz (.CompanyName)
strEMail = Nz (.Email1Address)
strBusinessPhone = _
Nova Zelndia (.BusinessTelephoneNumber)
strFaxNumber = Nz (.BusinessFaxNumber)
strMobilePhone = Nz (.MobileTelephoneNumber)
strSalutation = Nz (.Apelido)
260
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
13_047026 ch08.qxp 02\/04\/07 21:45 pgina 260
strWebSite = Nz (.Pgina da Web)
strNotes = Nz (.Corpo)
.Fechar (olSave)
Terminar com
Com rst
RST.AddNew
![CompanyName] = strCompanyName
![Nome] = strFirstName
![Sobrenome] = strLastName
![Saudao] = strSalutation
![EmailName] = strEMail
![JobTitle] = strJobTitle
![WorkPhone] = strBusinessPhone
![Celular] = strMobilePhone
![Nmerofax] = strFaxNumber
![Notas] = strNotes
![WorkAddress] = strWorkAddress
![WorkCity] = strWorkCity
![WorkStateOrProvince] = strWorkStateProv
![WorkPostalCode] = strWorkPostalCode
![WorkCountry] = strWorkCountry
![HomeAddress] = strHomeAddress
![HomeCity] = strHomeCity
![HomeStateOrProvince] = strHomeStateProv
![HomePostalCode] = strHomePostalCode
![HomeCountry] = strHomeCountry
![WorkPhone] = strHomePhone
![Site] = strWebSite
.Atualizao
Terminar com
lngContactCount = lngContactCount + 1
End If
Itm prximo
RST.Fechar
Se lngContactCount = 0 Then
MsgBox \"No h contatos para importar do Outlook\"
Outra coisa
MsgBox lngContactCount _
& contact(s) imported from Outlook
End If
ErrorHandlerExit:
Exit Function
Se Err. Number = 429 ento
Conjunto appOutlook = CreateObject
Retomar em seguida
261
Trabalhando com itens do Outlook
8
13_047026 ch08.qxp 02\/04\/07 21:45 pgina 261
Outra coisa
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End If
End Function
FIGURA 8.28
Uma tabela de dados importados de uma pasta do Outlook.
Ao trabalhar com contatos, seria a situao ideal manter sua maioria com-
concludo um conjunto de informaes ligadas tabelas do Access e sincroniz-las com o Outlook
contatos que exibem a maioria das informaes em uma interface fcil de usar. Captulo 11 abrange
Sincronizando lig mesas contatos de acesso com uma pasta de contatos do Outlook.
Resumo
Este captulo descreve os componentes do modelo de objeto do Outlook que voc precisa entender
para trabalhar com objetos do Outlook e voc deu exemplos de exportao de dados de acesso para
Outlook e importar dados do Outlook para acesso (ou ligando para ela), bem como criando novas perspectivas
itens com base nas alteraes de dados em tabelas do Access. Embora existam vantagens e desvantagens
para armazenar contatos em Access e Outlook, eu recomendo a exportar tarefas e compromissos de
Tabelas do Access para Outlook, assim eles podem ser gerenciados em sua interface superior. Para contatos, a deci-
Sion depende do que mais importante para voc: convenincia e atraente interface de
Contatos do Outlook, ou mais sofisticado interface de acesso do banco de dados relacional, permitindo-lhe
Configure ligaes de um-para-muitos entre empresas e contatos, ou contatos e telefones ou identificaes.
REFERNCIA CRUZADA REFERNCIA CRUZADA
262.
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
13_047026 ch08.qxp 02\/04\/07 21:45 pgina 262
EU
n os captulos anteriores abordei a criao de documentos, Excel do Word
planilhas e vrios tipos de itens do Outlook usando a automao do VBA
cdigo. Mas estes no so os nicos tipos de documentos que voc precisa para trabalhar
com s vezes voc precisa criar um documento de texto sem formatao ou importar dados
de um em uma tabela do Access. Mas, antes que voc possa trabalhar com esses docu-
mentos, voc precisar trabalhar com pastas. O presente captulo compreende escrever cdigo
que trabalha com pastas do Windows Explorer e arquivos de texto, usando vrios
mtodos diferentes.
Como acesso verses progrediram, as ferramentas disponveis para trabalhar com arquivos
ou pastas tm avanado. Acesso 1.0, o retorno de chamada notoriamente crptico
funo era a nica maneira de obter uma lista de arquivos a serem exibidos em uma caixa de combinao ou
ListBox. Pelo Windows 95, o CommonDialog controle era uma possibilidade, no
pelo menos se voc teve a edio de desenvolvedor do Office. Mas o CommonDialog
controle foi flagelada com problemas de verso se voc colocar uma verso
um formulrio e enviado o banco de dados para outra pessoa que tinha uma verso diferente
do controle, a outra pessoa apenas recebo a mensagem misteriosa
\"L no nenhum objeto nesse controle\" na abertura do formulrio com o
CommonDialog controle.
Consulte o captulo 8 para obter informaes sobre como trabalhar com o Outlook
pastas.
Outro avano veio com a biblioteca de tempo de execuo de script, que forneceu um
FileSystemObject objeto (sim, isso dois objetos!) que muito til para
encontrando, trabalhando com ou criando arquivos e pastas no cdigo. No entanto, ele
no oferece uma interface de dilogo-tipo para selecionar arquivos ou pastas.
O avano seguinte veio com o Office XP, que introduziu uma nova ferramenta para
trabalhando com arquivos e pastas. O FileDialog objeto (a parte do escritrio
REFERNCIA CRUZADA REFERNCIA CRUZADA
263
NESTE CAPTULO
Criao de pastas do Windows
Criando FolderPicker e
FilePicker caixas de dilogo usando o
Objeto FileDialog de escritrio
Gravar dados em arquivos de texto usando
o FileSystemObject, legado do VB
instrues e ADO
Lendo dados de arquivos texto
usando o FileSystemObject,
legado demonstraes de VB e ADO
Carregando arquivos em anexo
campos e salvar anexos
para arquivos
Trabalhando com arquivos
e pastas
14_047026 ch09.qxp 02\/04\/07 21:50 pgina 263
modelo de objeto) permite-lhe aparecer uma caixa de dilogo para selecionar um arquivo ou uma pasta, com vrios tipo de dilogo
Opes. Esta caixa de dilogo permite que os usurios facilmente selecionar um arquivo ou pasta, cujo nome pode ser usado no cdigo de
mais operaes.
No h qualquer razo para usar um Retorno de chamada funo ou a CommonDialog controle para
trabalhando com arquivos e pastas, ento este captulo cobre usando o FileSystemObject e o
FileDialog objeto para trabalhar com arquivos e pastas e os componentes de modelo de objeto do ADO
e legados VB para trabalhar com arquivos de texto.
Trabalhando com pastas do Windows Explorer
Quando voc salvar documentos (de qualquer tipo) para a unidade de disco rgido do seu computador, voc precisar especificar o
pasta (caso contrrio tudo vai acabar em sua pasta de documentos de raiz ou a corrente
pasta, tornando muito difcil encontrar documentos especficos). Se voc trabalha com Word, Excel ou Outlook
modelos, voc tambm precisa especificar uma pasta de modelos, assim seu cdigo vai olhar no lugar certo para
seus modelos. Voc pode obter a pasta de modelos do usurio padro na caixa de dilogo opes de arquivo do Word,
mas, novamente, voc provavelmente no quer manter todos os seus modelos na pasta de modelos de raiz.
Consulte o menu principal da palavra Export.accdb amostra do banco de dados para os botes de comando com
cdigo para selecionar os caminhos de documentos e modelos.
Para trabalhar com pastas do Windows, voc tem duas opes: o escritrio FileDialog objeto, ou a
FileSystemObject . Esses dois mtodos so discutidos nas sees a seguir.
O banco de dados de amostra para este captulo arquivos e Folders.accdb.
O objeto FileDialog Office
Para permitir o mximo de escolha do usurio, combinada com a sua convenincia, eu gostaria de colocar um ou
dois botes de comando de seleo de pasta no menu principal do banco de dados, para selecionar as pastas que sero
usado em todo o banco de dados. Do banco de dados de amostra para este captulo, arquivos e Folders.accdb, para
exemplo, o menu principal tem uma seo com dois conjuntos de controles para selecionar uma pasta; um tem um
boto de comando que aparece em uma caixa de dilogo selecionador de pasta para selecionar a pasta de documentos de entrada
(usado para armazenar documentos para ser carregado em campos de fixao ou caixas de texto em formas) e o
outra abre um seletor de pasta de documentos de sada para selecionar a pasta onde os arquivos salvos de
anexos devem ser armazenados. Depois de selecionar uma pasta, seu nome exibido na caixa de texto sob
o boto de comando. A Figura 9.1 mostra um menu principal com essas opes.
NOTA NOTA
REFERNCIA CRUZADA REFERNCIA CRUZADA
264
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
14_047026 ch09.qxp 02\/04\/07 21:50 pgina 264
FIGURA 9.1
Um menu principal com um Backup boto e boto\/textbox controles para selecionar um caminho de documentos de entrada
e um caminho de sada de documentos para uso no banco de dados.
Os caminho de documentos de entrada e sada de documentos via botes executar procedimentos que criam um
FileDialog objeto.FileDialog objetos podem ser criados como um seletor de arquivo ou uma pasta selecionador dia-
log; Neste caso o msoFileDialogFolderPicker constante nomeada usada ao criar o
dilogo, para torn-lo uma caixa de dilogo selecionador de pasta:
Private Sub cmdInputDocsPath_Click()
No erro GoTo ErrorHandler
Crie um objeto FileDialog como uma caixa de dilogo selecionador de pasta.
Definir fd = Application.FileDialog(msoFileDialogFolderPicker)
Conjunto txt = Me![txtInputDocsPath]
strPath = GetInputDocsPath()
Com fd
se = _ \"Procure a pasta onde entrada documentos\"
& are stored
.ButtonName = \"Selecione\"
.InitialView = msoFileDialogViewDetails
.InitialFileName = strPath
Se for.Mostrar = -1 ento
txt.Valor = CStr (fd.SelectedItems.Item(1))
265
Trabalhando com arquivos e pastas
9
14_047026 ch09.qxp 02\/04\/07 21:50 pgina 265
Outra coisa
Debug. Print \"usurio pressionado cancelar\"
End If
Terminar com
Em erro continuar prximo
Chamada acCmdSaveRecord
ErrorHandlerExit:
Exit Sub
ErrorHandler:
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End Sub
Private Sub cmdOutputDocsPath_Click()
No erro GoTo ErrorHandler
Crie um objeto FileDialog como uma caixa de dilogo selecionador de pasta.
Definir fd = Application.FileDialog(msoFileDialogFolderPicker)
Conjunto txt = Me![txtOutputDocsPath]
strPath = GetOutputDocsPath()
Com fd
se = \"Procurar pasta onde salvou documentos\" _
& should be stored
.ButtonName = \"Selecione\"
.InitialView = msoFileDialogViewDetails
.InitialFileName = strPath
Se for.Mostrar = -1 ento
txt.Valor = CStr (fd.SelectedItems.Item(1))
Outra coisa
Debug. Print \"usurio pressionado cancelar\"
End If
Terminar com
Em erro continuar prximo
Chamada acCmdSaveRecord
ErrorHandlerExit:
Exit Sub
266
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
14_047026 ch09.qxp 02\/04\/07 21:50 pgina 266
ErrorHandler:
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End Sub
Na cmdInputDocsPath_Click procedimento de evento, o GetInputDocsPath() funo
usado para obter o valor de caminho salvo documentos de entrada do tblInfo (se houver); caso contrrio o
pasta de documentos do padro aberta. O usurio pode selecionar um outro caminho, ou aceitar o caminho padro;
o valor selecionado na caixa de dilogo salvo em txtInputDocsPath caixa de texto no formulrio, que
vinculada ao campo InputDocsPath em tblInfo. O cmdOutputDocsPath_Click procedimento de evento
armazena o caminho do modelo selecionado para txtOutputDocsPath, que armazenado na OutputDocsPath
campo em tblInfo.
Eu uso uma mesa de tblInfo na maioria de meus bancos de dados para armazenar dados que so necessrios em toda a
banco de dados, como informaes de caminho. Embora voc possa usar variveis globais para este pur-
pose, eles no persistem de uma sesso para outra, e no fcil examinar seus valores, ento eu
preferir armazenar esses valores em uma tabela.
Os caminhos de entrada e sada de documentos personalizados armazenados no tblInfo so captados, sempre que necessrio
no banco de dados, usando o GetInputDocsPath() e GetOutputDocsPath() funes,
listados em seguida:
GetInputDocsPath() funo pblica como String
No erro GoTo ErrorHandler
Conjunto dbs = CurrentDb
Set rst = dbs.OpenRecordset(\"tblInfo\")
RST.MoveFirst
strPath = Nz (rst! [InputDocsPath])
Adicione uma barra invertida terminao, se o caminho no tem um.
Se Len(strPath) > 1 Right(strPath, 1) e <>\"\/\" ento
GetInputDocsPath = strPath
Outra coisa
GetInputDocsPath = strPath
End If
RST.Fechar
ErrorHandlerExit:
Exit Function
ErrorHandler:
MsgBox \"erro nenhum:\"
Err
Resume ErrorHandlerExit
NOTA NOTA
267
Trabalhando com arquivos e pastas
9
14_047026 ch09.qxp 02\/04\/07 21:50 pgina 267
End Function
GetOutputDocsPath() funo pblica como String
No erro GoTo ErrorHandler
Conjunto dbs = CurrentDb
Set rst = dbs.OpenRecordset(\"tblInfo\")
RST.MoveFirst
strPath = Nz (rst! [OutputDocsPath])
Adicione uma barra invertida terminao, se o caminho no tem um.
Se Len(strPath) > 1 Right(strPath, 1) e <>\"\/\" ento
GetOutputDocsPath = strPath
Outra coisa
GetOutputDocsPath = strPath
End If
RST.Fechar
ErrorHandlerExit:
Exit Function
ErrorHandler:
MsgBox \"erro nenhum:\"
Err
Resume ErrorHandlerExit
End Function
A Figura 9.2 mostra a caixa de dilogo selecionador de pasta para selecionar um caminho de sada de documentos personalizado.
Para usar oFileDialog objeto em seu cdigo, voc precisa definir uma referncia para o objeto do Office
biblioteca; essa referncia no definida por padro em um banco de dados Access 2007 recm-criado. Figura 9.3
mostra a referncia do Office 12.0 sendo verificada na caixa de dilogo referncias para os arquivos e pastas
banco de dados.
268
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
14_047026 ch09.qxp 02\/04\/07 21:50 Page 268
FIGURA 9.2
Selecionando uma pasta personalizada para armazenar documentos em um banco de dados.
FIGURA 9.3
Definir uma referncia biblioteca de objeto do Office 12.0.
269
Trabalhando com arquivos e pastas
9
14_047026 ch09.qxp 02\/04\/07 21:50 pgina 269
O FileDialog objeto tem vrias propriedades e mtodos teis:
Filters.Add Permite especificar o filtro (s) para a exibio de arquivos, tais como
FD.Filters.Add \"Documentos do Word\", \"*. doc\"
InitialFileName O nome de arquivo padro, para uma caixa de dilogo Seletor de arquivo; o caminho padro
para uma caixa de dilogo selecionador de pasta
ButtonName O boto de legenda (no caso voc quer algo diferente de \"Select\").
DialogType A seleo do tipo de dilogo Seletor de arquivo, selecionador de pasta, abrir ou salvar como
(do Seguintes enum, que pode ser visto no Pesquisador de objetos).
InitialView Permite-lhe definir a exibio da caixa de dilogo (detalhes, cones grandes, visualizao e assim
sobre). Olhar para o MsoFileDialogView enum no Pesquisador de objetos para a seleo completa.
AllowMultiSelect Se definido como True, permite que os usurios selecionar vrios arquivos na caixa de dilogo (para
Arquivo caixas de dilogo selecionador somente).
Figura 9.4 mostra oMsoFileDialogView enum, com todas as opes para definir o modo de exibio para
a caixa de dilogo.
FIGURA 9.4
Exibindo o
MsoFileDialogView
enum no Pesquisador de objetos.
270
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
14_047026 ch09.qxp 02\/04\/07 21:50 pgina 270
O FileSystemObject
O FileSystemObject a biblioteca fornece uma outra maneira de trabalhar com pastas do Windows (e arquivos).
Para usar os componentes da biblioteca de objetos em um banco de dados, voc precisar definir uma referncia, neste caso
para a biblioteca de tempo de execuo de scripts, como mostrado na Figura 9.5.
Se voc no vir a Microsoft Scripting Runtime seleo na caixa de dilogo referncias, voc pode obter este
biblioteca baixando o Microsoft Windows Script 5.6 (ou o que a verso atual), alm de
os documentao do Microsoft Windows Script 5.6 arquivos a partir do Microsoft Windows Script
Downloads pgina no http:\/\/www.Microsoft.com\/downloads\/details.aspx?
FamilyID = 01592C48-207 D-4BE1-8A76-1C4099D7BBB9 .
FIGURA 9.5
Definir uma referncia para a biblioteca de tempo de execuo de scripts.
O arquivo de ajuda mostrado na Figura 9.6 ( script56.chm ) um arquivo de ajuda HTML compilado. Voc vai encontr-lo
muito til, pois inclui um livro de ajuda com informaes completas sobre os componentes do
FileSystemObject , alm de exemplos de cdigo til.
271
Trabalhando com arquivos e pastas
9
14_047026 ch09.qxp 02\/04\/07 21:50 pgina 271
272
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
Uma digresso com a ajuda de acesso
EU
n minha opinio, o acesso ajuda atingiu seu ponto mais alto no acesso 3.1, quando foi fornecida no
forma de um arquivo de ajuda do Windows, cada pedacinho do que foi escrito especificamente para a verso atual do
Acessar e estava disponvel sem uma conexo de Internet. Em sucessivas verses do Access, ajuda
mudou-se para o formato HTML, que introduziu a possibilidade de recuperar os tpicos de ajuda que no foram
relevantes para o acesso (por exemplo da biblioteca MSDN que acompanha o VB 6.0), como propriedades, mtodos,
controles e outros objetos podem ocorrer em muitas aplicaes diferentes da Microsoft, embora eles podem
no (geralmente no) funcionam exatamente da mesma forma. Se voc est tentando determinar quais propriedades de uma guia
controle funcionar em um formulrio do Access, ele no ajuda muito se voc encontrar o tpico da ajuda para um controle guia
em um UserForm de escritrio ou um formulrio do VB.
Ajuda do Access 2007 ainda menos til; ele pesquisa tudo do Office online (pelo menos, se voc est conectado
a Internet; caso contrrio, no se qualquer ajuda em tudo), usando um motor de busca vergonhosamente ineficaz. EU
entrou \"Controle guia\" na caixa de pesquisa na janela Ajuda do Access e tem a lista de tpicos
mostrado na figura a seguir. Nem um nico deles relevante. Pode-se pensar que o acesso
no suporta controles guia, mas claro que no o caso.
FIGURA 9.6
O arquivo de ajuda do FileSystemObject.
14_047026 ch09.qxp 02\/04\/07 21:50 pgina 272
273
Trabalhando com arquivos e pastas
9
Uma lista de tpicos de ajuda inadequada em busca de \"Controle de guia\".
H uma opo de ndice na ajuda do Access, mas ele muito escasso em relao tabela do con-
tendas de ajuda em verses anteriores do Access e (curiosamente) bastante diferente dependendo se
ou no, voc est conectado Internet. Ao invs de dar uma cobertura completa de todos os controles que voc pode
Coloque em uma forma de acesso, os controles a seguir (a verso online da tabela de contedo e como
mostrado na figura a seguir) tem apenas quatro temas, que cobrem somente o mais comumente usado controles.
continuou
14_047026 ch09.qxp 02\/04\/07 21:50 Page 273
274
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
continuou
O livro de controles de acesso ajuda ndice.
A verso offline do ndice tem uma seo de referncia do VBA, com uma seo sobre controles,
e ele apontar para um tpico da ajuda para o controle guia mas o tpico no est disponvel off-line! E em
qualquer caso, a pesquisa no vai encontr-lo.
Isso significa que no h nenhuma ajuda disponvel para o controle de guia? De modo algum. Entrei \"controle de guia no
Formas de acesso\"no Google e tem uma pgina de tpicos relevantes, comeando com um tutorial muito til na
usando o controle guia de acesso. No especfico para o Access 2007, mas isso no importa porque guia
controles no foram alterados nesta verso. Note que alguns dos sucessos so do site da Microsoft,
assim ajuda do Access no pode mesmo encontrar tpicos de ajuda apropriados em arquivos de suporte da Microsoft! Minha concluso-
Sion: se precisar de ajuda para Access 2007, tente o Google.
14_047026 ch09.qxp 02\/04\/07 21:50 pgina 274
275
Trabalhando com arquivos e pastas
9
Usando o Google para obter ajuda para o acesso.
No h outra opo para obter ajuda, pelo menos quando voc est escrevendo cdigo VBA: como mostrado a seguir
Figura, voc pode usar o pesquisador de objetos (aberto pela chave F2 na janela do Visual Basic) para Ver os
componentes do modelo de objeto do Access e seus atributos. Em verses anteriores do Access, clique
o boto de ponto de interrogao amarelo normalmente abriria um tpico da ajuda apropriado. No entanto, esta sem
mais o caso no Access 2007. Selecionando o
TabControl
objeto na biblioteca de acesso e clicando em
o boto ajuda apenas abre a janela principal de ajuda, onde voc pode procurar ineficazmente ajuda no
o controle de guia, assim como eu descrevi anteriormente.
continuou
14_047026 ch09.qxp 02\/04\/07 21:50 pgina 275
276
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
continuou
Selecionando um objeto de acesso no Pesquisador de objetos.
No Access 2003, clique no boto de ajuda para o controle de guia no Pesquisador abriu um apro-
tpico de ajuda do Quad.
14_047026 ch09.qxp 02\/04\/07 21:50 pgina 276
Backup de seu banco de dados
Todo mundo sabe que dados devem ser armazenados com freqncia, e eu gostaria de torn-lo to conveniente como
possvel fazer backup de um banco de dados. Meu menu principal de banco de dados padro possui um Backup o boto que
chamadas a BackupDB procedimento listado em seguida. Eu criei o boto de menu e o cdigo de Backup em uma orelha-
verso de Lier de acesso, quando no havia nenhuma maneira de fazer backup de um banco de dados sem fech-lo para baixo.
Desde aquela poca, a Microsoft adicionou um comando de backup que no exige o encerramento do
banco de dados, embora ainda no to conveniente como meu backup de um clique. O Access 2007 backup com-
Matos esto disponvel atravs do boto gerenciar no menu arquivo (mostrado na Figura 9.7). Selecionando
a opo de \"Back Up Database\" abre a janela Salvar como mostrada na Figura 9.8.
277
Trabalhando com arquivos e pastas
9
Um tpico da ajuda Access 2003 para o controle guia.
14_047026 ch09.qxp 02\/04\/07 21:50 pgina 277
FIGURA 9.7
A seleo de banco de dados do Access 2007 Back Up.
FIGURA 9.8
O banco de dados interno salvar caixa de dilogo.
Se voc estiver executando o cdigo de backup no Windows Vista, voc pode ser incapaz de fazer o backup
bancos de dados em determinadas pastas, devido s restries de segurana do Vista. Este um problema de Vista,
no um problema com a base de dados, voc pode fazer o backup de banco de dados depois de mov-lo para outra pasta
com baixa segurana.
NOTA NOTA
278
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
14_047026 ch09.qxp 02\/04\/07 21:50 pgina 278
Embora seja muito mais fcil fazer backup de um banco de dados de acesso no Access 2007 do que em verses anteriores,
a nova seleo de \"Back Up Database\" sobre os padres do menu de gerenciar para salvar a cpia do banco de dados em
a mesma pasta que o prprio banco de dados. Se voc deseja salvar os backups para outra pasta (que i
prefiro, para evitar confuso entre bancos de dados e seus backups), voc tem que procurar que
pasta. O BackupDB funo no mdulo seguinte basBackup salva backups para uma pasta
chamado Backups sob a pasta de banco de dados; voc pode modificar o caminho de disco rgido-codificado para salvar backups
como desejado se voc deseja salvar os backups para outro local. Se voc deseja salvar backups para um
Pasta de Backups diria na unidade E, por exemplo, voc poderia substituir as linhas de cdigo
strBackupPath = _ Application.CurrentProject.Path
& \Backups\
com
strBackupPath = \"Backups dirios e: \/\"
Consulte o captulo 14 para uma discusso de um suplemento com opes de backup selecionvel pelo usurio,
incluindo a seleo da pasta de backup de uma caixa de dilogo selecionador de pasta.
O banco de dados do Access 2007 Backup.accdb contm a tabela, mdulo e macros que so usadas para
fazer os backups de banco de dados. Esses objetos de banco de dados podem ser importados para qualquer base de dados do Access 2007,
e o BackupDB funo pode executar a macro mcrBackup, ou de um boto na principal
no menu. O mdulo basBackup listado como segue:
Opo explcita
Opo Compare Database
Dbs privado como DAO.Banco de dados
Fld privado como Scripting.Folder
Fso privado como scripting. FileSystemObject
Private intReturn As Integer
Rst privado como DAO.Conjunto de registros
Private strBackupPath As String
Private strCurrentDB As String
Private strDayPrefix As String
Private strDBName As String
Private strDefault As String
Private strFinalSaveName As String
Private strPrompt As String
Private strSaveName As String
Private strTitle As String
Funo pblica BackupDB()
REFERNCIA CRUZADA REFERNCIA CRUZADA
279
Trabalhando com arquivos e pastas
9
14_047026 ch09.qxp 02\/04\/07 21:50 pgina 279
Requer uma referncia biblioteca Microsoft Scripting Runtime.
No erro GoTo ErrorHandler
Set fso = CreateObject(\"Scripting.FileSystemObject\")
strCurrentDB = Application.CurrentProject.FullName
Debug. Print \"db atual:\"
strBackupPath = _ Application.CurrentProject.Path
& \Backups\
Tentativa de definir uma referncia para a pasta de backup.
Set fld = fso.GetFolder(strBackupPath)
strDayPrefix = Format (data, \"yyyy-mm-dd\")
strSaveName = Left (Application.CurrentProject.Name, _
Len(Application.CurrentProject.Name) - 6) _
& & SaveNo & , & strDayPrefix & .accdb
strSaveName = strBackupPath
Debug. Print \"Backup salve o nome:\"
strTitle = \"Backup do banco de dados\"
strPrompt = \"aceitar ou editar o nome de cpia de banco de dados\"
strDefault = strSaveName
strFinalSaveName = InputBox (prompt: = strPrompt, _
Ttulo: = strTitle, padro: = strDefault)
Conjunto dbs = CurrentDb
Set rst = dbs.OpenRecordset(\"tblBackupInfo\")
Com rst
.AddNew
![SaveDate] = Format (data, \"d-mmm-aaaa\")
![SaveNumber] = SaveNo
.Atualizao
.Fechar
Terminar com
FSO.CopyFile strCurrentDB, strFinalSaveName
ErrorHandlerExit:
Exit Function
ErrorHandler:
Se Err. Number = 76, em seguida,
Se a pasta de backup no foi encontrada, cri-lo.
FSO.CreateFolder strBackupPath
Retomar em seguida
Outra coisa
280
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
14_047026 ch09.qxp 02\/04\/07 21:50 Page 280
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End If
End Function
SaveNo() funo pblica como String
No erro GoTo ErrorHandler
Dim intDayNo As Integer
Dim strNextNo As String
Crie um nico salvar nmero para hoje.
intDayNo = Nz (DMax (\"[SaveNumber]\", \"tblBackupInfo\", _
\"[SaveDate] = Date()\"))
Debug. Print \"dia nenhum.\"
strNextNo = CStr(intDayNo + 1)
Debug. Print \"prximo n.\"
SaveNo = strNextNo
ErrorHandlerExit:
Exit Function
ErrorHandler:
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End Function
O SaveNo() funo cria um nmero de incremento para o backup atual, pegando
o ltimo nmero armazenado para a data de hoje de tblBackupInfo e acrescentando-lhe 1.
O BackupDB procedimento faz o backup do banco de dados atual, criando um salvar nome no banco de dados
nome (pegou desde o NomePropriedade do CurrentProject Propriedade do Aplicativo
o objeto), alm da SaveNo() valor e a data de hoje, formatado com traos. (Voc pode alterar a data
Formatar como desejar, contanto que voc no use barras ou outros caracteres que no so permitidos no arquivo
nomes.) O proposto salvar nome apresentado em um InputBox, onde ele pode ser editado como desejado, tal
como adicionar informaes sobre alteraes especficas feitas no banco de dados; Ele salvo em uma pasta chamada Backups
sob a pasta de banco de dados atual.
O GetFolder mtodo para aFileSystemObject usado para fazer referncia a pasta de Backups; se
a pasta no for encontrada, o manipulador de erro da funo cria a pasta usando a CreateFolder
mtodo. Um registro adicionado ao tblBackupInfo com a data e a salvar nmero e finalmente o
281
Trabalhando com arquivos e pastas
9
14_047026 ch09.qxp 02\/04\/07 21:50 pgina 281
CopyFile mtodo para aFileSystemObject usado para copiar o banco de dados atual para um backup
com o final salve o nome na pasta Backups.
A tabela tblBackupInfo armazena datas e nmeros de incremento para os nomes de backup. A volta-
ups que voc faz em um dia ter um nmero (comeando com 1) e a data, ento eles no over-
escrever uns aos outros, e voc vai saber a ordem em que foram criados os backups. Figura 9.9
mostra o InputBox apresentado pela BackupDB funo; voc pode aceitar o proposto salvar nome
ou edit-lo como desejado.
FIGURA 9.9
Salvar uma cpia do banco de dados usando a funo BackupDB.
Trabalhando com arquivos de texto
Para fins de trabalhar com arquivos de texto no cdigo VBA, existem trs tipos de arquivos de texto: vrgula -
delimitados, largura fixa (colunar), ou forma livre. Os dados dos dois primeiros tipos de arquivos de texto podem ser
importados ou exportados utilizando o TransferText mtodo de acesso e arquivos delimitados por vrgula pode
ser tratados com o TransferirPlanilha mtodo. Se voc s precisa ler dados a partir de (ou
escrever dados para) um arquivo de texto, mas no importar para uma tabela, voc pode trabalhar com arquivos de texto usando o
FileSystemObject , os mtodos herdados de VB, ou ADO.
Para (e importada de) arquivos de texto delimitado por vrgulas e largura fixa coberto
no captulo 10.
Gravar dados em arquivos de texto
Se seu cdigo itera atravs de um conjunto de registros, fazer (ou no fazer) alguma ao para cada registro, um texto
arquivo uma maneira prtica de documento quais registros foram transformados, ou talvez apenas para documentar
registros que foram ignorados por causa da falta de informao. Voc pode gravar dados informativos para um
arquivo de texto usando trs mtodos: as declaraes de VB legadas (aberto Nome do arquivo Para entrada\/sada como # n);
componentes da FileSystemObject modelo de objeto (a TextStream o objeto em particular); ou
modelo (o de objeto de componentes do ADO Fluxo o objeto em particular).
A amostra selecionar contatos para formulrio de E-mail (frmEMailMerge), mostrado na Figura 9.10, tem um multi-
Selecione listbox para selecionar contatos para receber um email, caixas de texto para introduzir o assunto da mensagem
e o corpo e um grupo de opes para selecionar o mtodo para criar um arquivo de texto contendo infor-
o sobre os registros ignorados.
REFERNCIA CRUZADA REFERNCIA CRUZADA
282
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
14_047026 ch09.qxp 02\/04\/07 21:50 pgina 282
FIGURA 9.10
Um formulrio com opes para criar um arquivo de texto com informaes sobre saltados registros usando trs mtodos diferentes.
O completo cmdCreateEMails_Click procedimento de evento listado em seguida; o cdigo primeiro verifica
que o texto de assunto e corpo da mensagem foram inserido no formulrio e define uma referncia para o
Objeto de aplicativo Outlook, exclui o arquivo de texto antigo, se ele existe e, em seguida, configura um Select Case Estado-
mento para trabalhar com arquivos de texto diferente, segundo a qual opo foi selecionada, o tipo de texto
Grupo de opes:
Private Sub cmdCreateEMails_Click()
No erro GoTo ErrorHandler
Dim appOutlook como Outlook. Application
Dim fso como scripting. FileSystemObject
Dim msg As Outlook.MailItem
Dim strBody As String
Dim strEMailRecipient
Dim strSubject As String
Dim strTo As String
Dim varItem como variante
Dim strTest As String
Dim lngContactID como longo
Dim strFullName As String
Dim strText As String
Dim strCompanyName As String
Dim strDocsPath As String
Dim strFile As String
283
Trabalhando com arquivos e pastas
9
14_047026 ch09.qxp 02\/04\/07 21:50 pgina 283
Dim blnSomeSkipped As Boolean
Dim intTextType As Integer
Dim strTitle As String
Dim strPrompt As String
Dim txt como Scripting.TextStream
Dim tstr como ADODB.Fluxo
Conjunto lst = Me![lstSelectContacts]
intTextType = Nz (Me! [fraTextType].Valor, 2)
strDocsPath = GetCustomDocsPath()
Verifique que foi selecionado pelo menos um contato.
Se lst.ItemsSelected.Count = 0 Then
strTitle = \"Contato selecionado\"
strPrompt = \"Favor selecionar pelo menos um contato\"
MsgBox prompt: = strPrompt, botes: = _ vbExclamation
+ vbOKOnly, ttulo: = strTitle
LST.SetFocus
GoTo ErrorHandlerExit
End If
Teste para campos de mensagem necessria.
strSubject = Nz (Me! [txtMessageSubject].Valor)
Se strSubject = \"\", em seguida,
strTitle no = \"Nenhum assunto que entrou\"
strPrompt = \"Digite um assunto\"
MsgBox prompt: = strPrompt, botes: = _ vbExclamation
+ vbOKOnly, ttulo: = strTitle
Me![txtMessageSubject].SetFocus
GoTo ErrorHandlerExit
End If
strBody = Nz (Me! [txtMessageBody].Valor)
Se strBody = \"\", em seguida,
strTitle no = \"Nenhuma mensagem corpo entrado\"
strPrompt = \"Digite o corpo da mensagem\"
MsgBox prompt: = strPrompt, botes: = _ vbExclamation
+ vbOKOnly, ttulo: = strTitle
Me![txtMessageBody].SetFocus
GoTo ErrorHandlerExit
End If
Cheques passados; proceda para criar uma mensagem usando o mtodo de sada do texto selecionado.
Conjunto appOutlook = GetObject (, \"Outlook. Application\")
strFile = strDocsPath
Debug. Print \"o arquivo de texto:\"
Em erro continuar prximo
284
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
14_047026 ch09.qxp 02\/04\/07 21:50 pgina 284
Exclua o arquivo existente, se houver.
Matar strFile
No erro GoTo ErrorHandler
Selecione o caso intTextType
Caso 1
ADO
Definir tstr = New ADODB.Fluxo
TSTR.Aberto
strText = \"Informaes sobre a criao de progresso\" _
& Outlook mail messages
TSTR.WriteText dados: = strText, opes: = adWriteLine
TSTR.WriteText dados: = vbCrLf
blnSomeSkipped = False
Para cada varItem no lst.ItemsSelected
Obter o ID de contato e nome para referncia.
lngContactID = Nz (lst.Coluna (0, varItem))
Debug. Print \"ID do contato:\"
strFullName = Nz (lst.Coluna (1, varItem))
Verificar endereo de e-mail.
strEMailRecipient = Nz (lst.Coluna (2, varItem))
strTest = strEMailRecipient
Debug. Print \"endereo de E-mail:\"
Se strTest = \"\", em seguida,
blnSomeSkipped = True
strText = \"Contato no.\"
& ( & strFullName _
& ) skipped; no email address
TSTR.WriteText dados: = vbCrLf
TSTR.WriteText dados: = strText, _
Opes: = adWriteLine
GoTo NextContactADO
End If
Verifique se o nome da empresa.
strCompanyName = Nz (lst.Coluna (3 varItem))
strTest = strCompanyName
Debug. Print \"nome da empresa:\"
285
Trabalhando com arquivos e pastas
9
14_047026 ch09.qxp 02\/04\/07 21:50 pgina 285
Se strTest = \"\", em seguida,
blnSomeSkipped = True
strText = \"Contato no.\"
& ( & strFullName _
& ) skipped; no company name
TSTR.WriteText dados: = vbCrLf
TSTR.WriteText dados: = strText, _
Opes: = adWriteLine
GoTo NextContactADO
End If
necessrio informao; criar nova mensagem de email e enviar para entrar em contato.
Set msg = appOutlook.CreateItem(olMailItem)
Com msg
.A = strEMailRecipient
.Assunto = strSubject
.Corpo = strBody
.Enviar
Terminar com
NextContactADO:
Prxima varItem
Se blnSomeSkipped = True Then
Escrever a linha final e salve o arquivo de texto.
strText = \"End of File\"
TSTR.WriteText dados: = vbCrLf
TSTR.WriteText dados: = strText
TSTR.SaveToFile FileName: = strFile, _
Opes: = adSaveCreateNotExist
End If
Caso 2
FSO
Set fso = CreateObject(\"Scripting.FileSystemObject\")
Conjunto txt = fso.CreateTextFile (FileName: = strFile, _
substituir: = True)
strText = \"Informaes sobre a criao de progresso\" _
& Outlook mail messages
txt.WriteLine Text: = strText
txt.WriteBlankLines linhas: = 2
blnSomeSkipped = False
Para cada varItem no lst.ItemsSelected
286
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
14_047026 ch09.qxp 02\/04\/07 21:50 pgina 286
Obter o ID de contato e nome para referncia.
lngContactID = Nz (lst.Coluna (0, varItem))
Debug. Print \"ID do contato:\"
strFullName = Nz (lst.Coluna (1, varItem))
Verificar endereo de e-mail.
strEMailRecipient = Nz (lst.Coluna (2, varItem))
strTest = strEMailRecipient
Debug. Print \"endereo de E-mail:\"
Se strTest = \"\", em seguida,
blnSomeSkipped = True
strText = \"Contato no.\"
& ( & strFullName _
& ) skipped; no email address
txt.WriteBlankLines linhas: = 1
txt.WriteLine Text: = strText
GoTo NextContactFSO
End If
Verifique se o nome da empresa.
strCompanyName = Nz (lst.Coluna (3 varItem))
strTest = strCompanyName
Debug. Print \"nome da empresa:\"
Se strTest = \"\", em seguida,
blnSomeSkipped = True
strText = \"Contato no.\"
& ( & strFullName _
& ) skipped; no company name
txt.WriteBlankLines linhas: = 1
txt.WriteLine Text: = strText
GoTo NextContactFSO
End If
necessrio informao; criar nova mensagem de email e enviar para entrar em contato.
Set msg = appOutlook.CreateItem(olMailItem)
Com msg
.A = strEMailRecipient
.Assunto = strSubject
.Corpo = strBody
.Enviar
Terminar com
NextContactFSO:
Prxima varItem
287.
Trabalhando com arquivos e pastas
9
14_047026 ch09.qxp 02\/04\/07 21:50 pgina 287
Escreva a linha final.
strText = \"End of File\"
txt.WriteBlankLines linhas: = 1
txt.WriteLine Text: = strText
Caso 3
VB
Arquivo de texto aberto para escrever informaes sobre o progresso de exportao.
StrFile aberto para sada como #1
strText = \"Informaes sobre a criao de progresso\" _
& Outlook mail messages
Impresso #1, strText
Imprimir #1,
Imprimir #1,
blnSomeSkipped = False
Para cada varItem no lst.ItemsSelected
Obter o ID de contato e nome para referncia.
lngContactID = Nz (lst.Coluna (0, varItem))
Debug. Print \"ID do contato:\"
strFullName = Nz (lst.Coluna (1, varItem))
Verificar endereo de e-mail.
strEMailRecipient = Nz (lst.Coluna (2, varItem))
strTest = strEMailRecipient
Debug. Print \"endereo de E-mail:\"
Se strTest = \"\", em seguida,
blnSomeSkipped = True
strText = \"Contato no.\"
& ( & strFullName _
& ) skipped; no email address
Imprimir #1,
Impresso #1, strText
GoTo NextContactVB
End If
Verifique se o nome da empresa.
strCompanyName = Nz (lst.Coluna (3 varItem))
strTest = strCompanyName
Debug. Print \"nome da empresa:\"
288
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
14_047026 ch09.qxp 02\/04\/07 21:50 pgina 288
Se strTest = \"\", em seguida,
blnSomeSkipped = True
strText = \"Contato no.\"
& ( & strFullName _
& ) skipped; no company name
Imprimir #1,
Impresso #1, strText
GoTo NextContactVB
End If
necessrio informao; criar nova mensagem de email e enviar para entrar em contato.
Set msg = appOutlook.CreateItem(olMailItem)
Com msg
.A = strEMailRecipient
.Assunto = strSubject
.Corpo = strBody
.Enviar
Terminar com
NextContactVB:
Prxima varItem
Se blnSomeSkipped = True Then
Escreva texto fechar arquivo e linha final.
strText = \"End of file\"
Imprimir #1,
Impresso #1, strText
#1 Fechar
End If
End Select
Arquivo de texto aberto no bloco de notas.
Shell \"Notepad\"
ErrorHandlerExit:
Exit Sub
ErrorHandler:
Outlook no est em execuo; Abra Outlook com CreateObject.
Se Err. Number = 429 ento
Conjunto appOutlook = CreateObject
Retomar em seguida
ElseIf Err. Number = 55 ento
289
Trabalhando com arquivos e pastas
9
14_047026 ch09.qxp 02\/04\/07 21:50 pgina 289
Arquivo j est aberto; fech-lo.
#1 Fechar
Currculo
Outra coisa
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End If
End Sub
Figura 9.11 mostra um arquivo de texto tpico criado pelo cmdCreateEMails_Click procedimento de evento
cdigo (o arquivo de texto o mesmo independentemente do mtodo usado para cri-lo).
FIGURA 9.11
Um arquivo de texto com informaes sobre registros saltados.
A Figura 9.12 mostra uma das mensagens de e-mail criadas pelo cdigo anterior.
Como tantas vezes acontece com acesso, voc tem uma escolha de vrias tcnicas para usar quando estiver trabalhando
com arquivos de texto no cdigo VBA. Qualquer um dos trs mtodos discutidos nas prximas sees podem criar um
arquivo de texto e escreva para ela; qual mtodo voc usar depende de fatores como sua familiaridade com o
tcnica, ou a necessidade de referncias extras no banco de dados para o cdigo de suporte. Eu geralmente uso o
FileSystemObject mtodo, em parte porque eu costumo ter uma referncia de conjunto para a criao de scripts
Biblioteca de tempo de execuo para outros fins e em parte porque sua sintaxe o mais intuitivo. Se seus dados -
base tem uma referncia para a biblioteca do ADO, mas no a biblioteca de tempo de execuo de script, voc pode usar o
Mtodo de ADO para evitar a necessidade de definir uma referncia extra; Se voc no tiver uma referncia definida
o ADO ou Scripting Runtime bibliotecas, voc pode usar o mtodo VB para evitar a configurao de um
referncia extra.
290
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
14_047026 ch09.qxp 02\/04\/07 21:50 pgina 290
FIGURA 9.12
Uma mensagem de e-mail, criada a partir de cdigo.
ADO
O modelo de ActiveX Data Objects (ADO) no o melhor mtodo para trabalhar com dados de acesso, mas
oferecer alguns recursos extras que so muito teis para trabalhar com arquivos de texto, em especial o
Fluxo objeto. O caso do ADO nocmdCreateEMails_Click o procedimento de evento comea por set-
Ting uma varivel para um Fluxo objeto no modelo de objeto do ADO (note que o prefixo do modelo de objeto
ADODB), usando oNovopalavra-chave. A prxima linha abre o novo Fluxo objeto (voc no pode escrever para
ele menos que seja aberto). Uma seqncia de caracteres de texto introdutrio a serem gravados para o arquivo salvo para o strText
varivel e, em seguida, escrito para uma linha de fluxo usando a WriteText mtodo. Para criar dois
linhas em branco no arquivo de texto, WriteText usado com dois vbCrLf constantes (que representa um
CR + LF, ou seja, transporte de retorno alm de avano de linha terminologia antiga remonta aos dias de
mquinas de escrever manuais).
Voc precisa de uma referncia para a biblioteca de objetos ActiveX Data Objects para oferecer suporte a esse cdigo.
O cdigo itera atravs da coleo ItemsSelected do listbox lstSelectContacts, verificando
cada registro para campos necessrios (Email e CompanyName). Para cada registro que carece de dados em um
ou de ambos os campos obrigatrios (e assim no vai receber uma mensagem de e-mail), uma Se... Em seguidainstruo
grava uma linha contendo informaes que record tem sido ignorada, e por isso, alm de outro
linha em branco. No final do processo, uma linha final escrita, e o fluxo salva em um arquivo de texto usando
o SaveToFile mtodo com o adSaveCreateNotExist opo, que cria o arquivo se ele
no existe.
NOTA NOTA
291
Trabalhando com arquivos e pastas
9
14_047026 ch09.qxp 02\/04\/07 21:50 pgina 291
FileSystemObject
O FileSystemObject biblioteca de objeto fornece uma abordagem alternativa para trabalhar com arquivos de texto,
usando oTextStream objeto. O caso da FSO nacmdCreateEMails_Click procedimento de evento
comea criando um FileSystemObject varivel e, em seguida, criando uma TextStream varivel
usando oCreateTextFile mtodo. uma seqncia de caracteres de texto introdutrio a serem gravados para o arquivo.
salvo para ostrText varivel e, em seguida, escrito para uma linha no arquivo texto usando o WriteLine
mtodo. Criar duas linhas em branco no arquivo de texto, o WriteBlankLines mtodo usado
com o Linhas argumento definido como 2.
Voc precisa de uma referncia para a biblioteca de objetos do Microsoft Scripting Runtime para oferecer suporte a
Esse cdigo.
O cdigo itera atravs da coleo ItemsSelected do listbox lstSelectContacts, verificando
cada registro para campos necessrios (Email e CompanyName). Para cada registro que carece de dados em um
ou de ambos os campos obrigatrios (e assim no vai receber uma mensagem de e-mail), uma Se... Em seguidainstruo
grava uma linha contendo informaes que record tem sido ignorada, e por isso, alm de outro
linha em branco. Quando todos os itens foram processados, uma linha final gravada no arquivo de texto.
VB
O terceiro caso usa legadas VB instrues desde os primeiros dias de acesso; nenhum modelo de objeto se referem-
ENCE necessria. O StrFile aberto para sada como #1 Declarao cria e abre o arquivo de texto
para a sada. Uma seqncia de caracteres de texto introdutrio a serem gravados para o arquivo salvo para o strText varivel
e, em seguida, escrito para uma linha no arquivo de texto usando o bastante intuitiva Impresso #1 mtodo. Para criar
dois em branco linhas no arquivo de texto, dois Impresso #1 linhas com nenhum argumento so usadas.
O cdigo itera atravs da coleo ItemsSelected do listbox lstSelectContacts, verificando
cada registro para campos necessrios (Email e CompanyName). Para cada registro que carece de dados em um
ou de ambos os campos obrigatrios (e assim no vai receber uma mensagem de e-mail), uma Se... Em seguidainstruo
escreve uma outra linha em branco e uma linha que contm informaes sobre que registro tem sido ignorado.
Escrito no final do processo, uma linha final, e o arquivo fechado usando o #1 Fechar declarao.
Isso no exclui o arquivo de texto, basta fecha-lo.
Lendo dados de arquivos texto
Assim como voc pode gravar dados em arquivos de texto, voc pode usar instrues legadas do VB, FileSystemObject cdigo,
ou cdigo ADO para ler dados de arquivos texto. Importar dados de formulrio de arquivo de texto (frmTextImport) tem um
boto de comando para selecionar um arquivo de texto para importar (Figura 9.13 apresenta o formulrio e Figura 9.14
mostra a caixa de dilogo Seletor de arquivo aberta por este boto) e um grupo de opo com uma escolha de ADO, FSO
(FileSystemObject) e as importaes de texto VB-tipo; os dados importados so gravados o texto importado grande
caixa de texto quando voc clicar no boto \"Load do arquivo de dados\". Um boto \"Limpar dados importados\" limpa o
Importados texto caixa de texto, ento voc pode comear de novo.
NOTA NOTA
292
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
14_047026 ch09.qxp 02\/04\/07 21:50 pgina 292
FIGURA 9.13
Um formulrio com opo de carregamento de dados de um arquivo de texto usando trs mtodos diferentes.
FIGURA 9.14
Selecionando um arquivo de texto para importar os dados.
293
Trabalhando com arquivos e pastas
9
14_047026 ch09.qxp 02\/04\/07 21:50 pgina 293
O cmdLoadData_Click procedimento de evento que l dados de um arquivo de texto mais simples do que o
cdigo que grava dados, porque dois dos trs mtodos (em sua prpria maneira) podem importar todos os dados
de um arquivo de texto sem a necessidade de processar cada linha separadamente. O cmdLoadData_Click proce-
dure comea definindo uma referncia caixa de texto que contm o nome do arquivo de texto selecionado, e
verifica-se que existe um nome de arquivo na caixa. Se houver um nome de arquivo, ele salvo para uma varivel e ento
umSelect Case instruo est configurada para processar a importao separadamente, dependendo se o
usurio seleciona ADO, FSO ou VB em um grupo de opes:
Private Sub cmdLoadData_Click()
No erro GoTo ErrorHandler
Dim fso como scripting. FileSystemObject
Dim strText As String
Dim strFile As String
Dim intTextType As Integer
Dim strTitle As String
Dim strPrompt As String
Dim txt como Scripting.TextStream
Dim stm como ADODB.Fluxo
Dim txtData como Access.TextBox
Dim strTextFile As String
Dim strData As String
Dim strLine As String
Conjunto txtData = Me![txtSelectedTextFile]
strTextFile = Nz(txtData.Value)
Se strTextFile = \"\", em seguida,
strTitle no = \"Nenhum arquivo de texto selecionado\"
strPrompt = \"Favor selecionar um arquivo de texto\"
MsgBox prompt: = strPrompt, botes: = _ vbExclamation
+ vbOKOnly, ttulo: = strTitle
GoTo ErrorHandlerExit
Outra coisa
Debug. Print \"o arquivo de texto:\"
End If
intTextType = Nz (Me! [fraTextType].Valor, 2)
Selecione o caso intTextType
Caso 1
ADO
Conjunto stm = New ADODB.Fluxo
Com o stm
.Charset = \"ASCII\"
294
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
14_047026 ch09.qxp 02\/04\/07 21:50 pgina 294
.Aberto
.LoadFromFile strTextFile
.Posio = 0
strData =.ReadText(adReadAll)
Terminar com
Objeto de fluxo de fechar.
STM.Fechar
Caso 2
FSO
Set fso = CreateObject(\"Scripting.FileSystemObject\")
Conjunto txt = fso.OpenTextFile (FileName: = strTextFile, _
IOMode: = ForReading)
Ler todos os dados do arquivo.
strData = txt.ReadAll
Fechar o arquivo.
txt.Fechar
Caso 3
VB
Arquivo de texto aberto para leitura de dados.
StrTextFile aberto para entrada como #2
Enquanto no EOF(2)
Salve dados de uma linha no arquivo de texto a uma varivel.
Entrada #2, strLine
strData = strData
vbCrLf, \"\")
Loop
Fechar o arquivo.
#2 Fechar
End Select
295
Trabalhando com arquivos e pastas
9
14_047026 ch09.qxp 02\/04\/07 21:50 pgina 295
Gravar dados de caixa de texto no formulrio.
Me![txtImportedText].Valor = strData
ErrorHandlerExit:
Exit Sub
ErrorHandler:
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End Sub
As prximas sees descrevem as tcnicas especficas usadas no cdigo para o ADO, FOE e VB
mtodos para carregar dados de um arquivo de texto selecionado.
ADO
Para a opo do ADO, definida uma varivel de fluxo, usando o Novopalavra-chave, o Fluxo o objeto
aberto e o selecionado texto arquivo carregado, utilizando o LoadFromFile mtodo. O ReadText
mtodo usado com oadReadAll constante nomeada como seu argumento para ler todo o texto de
o arquivo de texto e dados, em seguida, escrito para o strData varivel. Finalmente, o Fluxo objeto
est fechado.
FSO
Para a opo de FSO (FileSystemObject), primeiro, uma varivel definida como a FileSystemObject ,
e, em seguida, o arquivo de texto aberto com o OpenTextFile mtodo para aFileSystemObject ,
com o ForReading valor para oIOMode argumento. Todos os dados do arquivo de texto
ler usando o ReadAll mtodo e ele salvo para ostrData varivel. Finalmente, o arquivo de texto
est fechado.
VB
O ltimo mtodo, VB, usa oStrTextFileForInput aberto como #2 instruo para abrir o arquivo,
e configura uma Enquanto... Loop estrutura para processar todas as linhas no arquivo de texto, salvando dados
de cada linha para ostrData varivel, incrementando-linha por linha com um vbCrLf constante no
entre linhas. Quando todas as linhas tiverem sido processadas, o arquivo de texto fechado.
Finalmente, no entanto os dados tem sido acumulados, o strData varivel escrito para o
txtImportedText caixa de texto, como mostrado na Figura 9.15.
296
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
14_047026 ch09.qxp 02\/04\/07 21:50 pgina 296
FIGURA 9.15
Um formulrio com os dados carregados de um arquivo de texto, usando o mtodo de FileSystemObject.
Trabalhando com campos de anexo
O tipo de dados anexo discutido nesta seo novo no Access 2007.
Verses anteriores do Access tinham um tipo de dados de campo objeto OLE, que somente certos tipos suportados
de objetos e foi muito complicado de usar (no mencionar causando inchao terrvel de banco de dados). Por
contraste, no Access 2007, muito fcil armazenar arquivos de qualquer tipo em um campo de anexo novo
tipo de dados, e os anexos so automaticamente compactados para economizar espao de banco de dados. Os contatos
forma, frmContactsWithAttachments (aberto a partir do boto Procurar contactos no menu principal)
tem esse campo. Se um anexo j foi adicionado ao campo, ele mostra como um cone (pelo menos,
se de um tipo reconhecido pelo Office); Figura 9.16 mostra um registro com um documento do Word 2007
acessrio.
Os cones de ligao diferem de acordo com a verso do Office do anexo armazenado
arquivo. cone de um documento Word tem um documento do Word com uma imagem de W ao longo do canto superior esquerdo
canto; o estilo do W diferente para Word 97-2003 (. doc) ou documentos do Word 2007 (. docx). Para um
Documento do Word 2007, o W semelhante ao cone de em um numa palavra 2007 documento exibido barra de tarefas;
para documentos do Word 97-2003, o W o estilo mais antigo W que foi usado como cone do Word no Office 97.
Outros documentos do Office tambm tem cones diferentes, dependendo da sua verso.
NOTA NOTA
NOVO RECURSO NOVO RECURSO
297
Trabalhando com arquivos e pastas
9
14_047026 ch09.qxp 02\/04\/07 21:50 pgina 297
Discutido usando oFileSystemObject (Scripting Runtime library) para trabalhar com pastas
em uma seo anterior deste captulo; Voc tambm pode usar o FileSystemObject para trabalhar com arquivos
em uma pasta, ou criar arquivos. Um possvel uso para selecionar um arquivo de uma pasta para armazenar em um novo
Acessrio campo de tipo de dados em uma tabela do Access.
FIGURA 9.16
Um formulrio com um campo de anexo, mostrando um documento do Word 2007 armazenado.
Para adicionar um anexo, basta clicar duas vezes o campo; Isso abre a caixa de dilogo anexos (mostrada na
Figura 9.17), onde voc pode visualizar anexos existentes (vrios anexos podem ser armazenados em um
Campo do anexo), ou adicionar um novo, clicando no boto Adicionar.
FIGURA 9.17
O dilogo de apego, mostrando um documento do Word 2007 armazenado.
O boto Adicionar na caixa de dilogo anexos (mostrado na Figura 9.17) abre uma caixa de dilogo Escolher arquivo
(mostrado na Figura 9.18) onde voc pode selecionar um arquivo para armazenar o campo de anexo.
298
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
14_047026 ch09.qxp 02\/04\/07 21:50 pgina 298
FIGURA 9.18
Selecionando um arquivo TIF na caixa de dilogo Escolher arquivo.
Se voc armazenar vrios arquivos em um campo de anexo, apenas o primeiro cone do arquivo ser exibido
o controle de formulrio.
Embora seja fcil o suficiente armazenar um anexo ou dois manualmente, se voc tiver uma pasta cheia de anexar-
mentos que precisam ser armazenadas em centenas de registros, mais fcil usar cdigo VBA para armazenar o
anexos, ou para extrair anexos e salv-los em uma pasta. Como exemplo, suponha que voc tenha
uma pasta contendo vrios documentos do Word e planilhas do Excel (ambos no Office 2007 e
contatos relacionados com formatos anteriores). Cada nome de documento comea com \"Contact ID\" e um nmero,
que corresponde ao campo ID de contato em tblContacts do banco de dados de amostra.
Carregando arquivos em anexo campos
O objeto Recordset2 (novo no Access 2007) usado para trabalhar com campos do
Tipo de acessrio.
O LoadAttachments procedimento listado em seguida percorre os documentos na pasta
selecionado pelo boto caminho de documentos de entrada no menu principal e para qualquer documento que inicia o
com \"ID de contato\" salva o documento para o campo do arquivo do registro de contato correspondente (este campo de
o tipo de dados anexo). Um campo de anexo pode conter vrios anexos e a coleo
de anexos representado no cdigo VBA, como um conjunto de registros distinto de anexos pertencentes a um
registro em uma tabela. Usando um Recordset2 objeto (novo no Access 2007) para trabalhar com os acessrios
permite que voc use o novo LoadFromFile e SaveToFile mtodos para trabalhar com os acessrios.
Figura 9.19 mostra uma pasta com documentos de identificao do contato de vrios tipos de carga como anexos.
NOVO RECURSO NOVO RECURSO
NOTA NOTA
299
Trabalhando com arquivos e pastas
9
14_047026 ch09.qxp 02\/04\/07 21:50 pgina 299
FIGURA 9.19
Uma pasta com alguns documentos de ID de contato, para a criao de anexos.
Na LoadAttachments funo listados a seguir, declarando a rstAttachments varivel como
umRecordset2 objeto (em vez de um objeto Recordset) permite o uso do novo LoadFromFile e
SaveToFile mtodos que eu uso para carregar arquivos em campos de fixao, ou salvar arquivos de
Campos de anexo:
Funo pblica LoadAttachments()
No erro GoTo ErrorHandler
Dim intSpace As Integer
Dim strTest As String
Dim strSearch As String
strDocsPath = GetInputDocsPath()
Set fso = CreateObject(\"Scripting.FileSystemObject\")
Set fld = fso.GetFolder(strDocsPath)
Conjunto dbs = CurrentDb
Definir rstTable = dbs.OpenRecordset (\"tblContacts\", dbOpenDynaset)
Para cada fil em FLD.Arquivos
strFile = fil.Nome
Debug. Print \"nome do arquivo:\"
Debug. Print \"tipo de arquivo:\"
Verifique se o nome do arquivo comea com 'ID de contato'
Se deixou (strFile, 10) = \"Contact ID\", em seguida,
300
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
14_047026 ch09.qxp 02\/04\/07 21:50 Page 300
Extrair o ID de contato do arquivo, usando o nome Meados e InStr funes para comear no incio do
nmero e final antes o espao aps o nmero, se houver.
strTest = Mid (String: = strFile, incio: = 12, comprimento: = 3)
intSpace = InStr (strTest, \"\")
Se intSpace > 0 ento
lngContactID = CLng (Mid (String: = strTest, _
Iniciar: = 1, comprimento: = intSpace - 1))
Outra coisa
lngContactID = CLng(strTest)
End If
strSearch = \"[ContactID] =\"
Debug. Print \"string de busca:\"
strFileAndPath = strDocsPath
Procurar por ID de contato de correspondncia na tabela.
rstTable.MoveFirst
rstTable.FindFirst strSearch
Se rstTable.NoMatch = True Then
strTitle = \"No pode encontrar o contato\"
strPrompt = \"Contact ID\"
& not found in table; cant add attachment
GoTo NextDoc
Outra coisa
rstTable.Edit
Crie registros de anexos para esse registro, usando o recordset de tipo novo Recordset2.
Definir rstAttachments = _
rstTable.Fields(\"File\").Valor
Desligue o manipulador de erro para evitar erros, se o cdigo tenta adicionar o mesmo arquivo duas vezes; no presente
caso que o conjunto de registros anexos no vai ser atualizado.
Em erro continuar prximo
Com rstAttachments
.AddNew
.Fields(\"FileData\").LoadFromFile _
(strFileAndPath)
.Atualizao
.Fechar
Terminar com
rstTable.Update
Debug. Print \"Adicionado\"
& as attachment to Contact ID _
& lngContactID; s record
End If
301
Trabalhando com arquivos e pastas
9
14_047026 ch09.qxp 02\/04\/07 21:50 pgina 301
End If
NextDoc:
Prximo fil
Abra o formulrio de contatos para Ver os anexos que foram carregados.
DoCmd. OpenForm nomedoformulrio: = \"frmContacts\"
ErrorHandlerExit:
Exit Function
ErrorHandler:
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
End Function
Figura 9.20 mostra o menu principal do banco de dados do amostra, arquivos e Folders.accdb, com a carga
Opo de anexos seleccionada; Esta seleco chama a LoadAttachments funo.
FIGURA 9.20
O menu principal, com um boto de anexos com duas opes, para carregar ou salvar anexos.
Salvar anexos de arquivos
O SaveAttachments procedimento executa a funo oposta: trabalhando com um conjunto de registros
com base no tblContacts, ele usa um Recordset2 tipo de conjunto de registros para iterar por meio de anexos
302
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
14_047026 ch09.qxp 02\/04\/07 21:50 Page 302
coleo de um registro e salva cada um em um arquivo na pasta de documentos de sada selecionado sobre o
menu principal:
Funo pblica SaveAttachments()
No erro GoTo ErrorHandler
Dim intSpace As Integer
Dim strTest As String
Dim strSearch As String
strDocsPath = GetOutputDocsPath()
Debug. Print \"caminho de documentos de sada:\"
Set fso = CreateObject(\"Scripting.FileSystemObject\")
Set fld = fso.GetFolder(strDocsPath)
Conjunto dbs = CurrentDb
Definir rstTable = dbs.OpenRecordset(\"tblContacts\")
Fazer enquanto no rstTable.EOF
Crie registros de anexos para este registro.
Definir rstAttachments = _
rstTable.Fields(\"File\").Valor
Com rstAttachments
Enquanto no.EOF
strFileAndPath = _ strDocsPath
& .Fields(FileName)
Salve este anexo para um arquivo na pasta de documentos de sada.
Debug. Print \"poupana\"
& to & strDocsPath & folder
Desligue o manipulador de erro para evitar erros, se o arquivo j existir na pasta.
Em erro continuar prximo
.Fields(\"FileData\").SaveToFile strFileAndPath
.MoveNext
Loop
.Fechar
Terminar com
rstTable.MoveNext
Loop
rstTable.Close
strPrompt = \"todos os novos anexos salvos\" _
& strDocsPath & folder
strTitle = \"Feito!\"
MsgBox strPrompt, vbOKOnly + vbInformation, strTitle
303
Trabalhando com arquivos e pastas
9
14_047026 ch09.qxp 02\/04\/07 21:50 pgina 303
ErrorHandlerExit:
Exit Function
ErrorHandler:
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End Function
No Access 2007, muito mais fcil salvar um banco de dados para um formato anterior, bem como da economia
uma cpia do banco de dados no formato atual (o to esperado \"Banco de dados salvar como\"); o
trs opes so direito no submenu salvar como do menu do Office, como mostrado na Figura 9-21.
FIGURA 9.21
Salvando um banco de dados em formato Access 2002-2003.
Resumo
Neste captulo voc aprendeu a usar o OfficeFileDialog objeto para permitir facilitar a seleo de um
pasta para carregar ou salvar documentos. Alm disso, voc aprendeu como usar uma variedade de tcnicas
para criar arquivos de texto, salvando dados a eles e carregando dados para tabelas do Access, usando
ADO, a FileSystemObject , legadas declaraes de VB e tambm como salvar anexos
de arquivos para o novo anexo de campo (ou extrair anexos de campos e salv-los como
arquivos), usando o cdigo do VBA. Estas tcnicas permitir que voc trabalhe com arquivos de texto em uma variedade de maneiras,
para adicionar funcionalidades extras para seus bancos de dados, para alm de trabalhar com documentos do Office.
NOVO RECURSO NOVO RECURSO
304
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
14_047026 ch09.qxp 02\/04\/07 21:50 pgina 304
EU
n o captulo anterior, voc aprendeu como trabalhar com arquivos de texto, usando um
mtodo antigo e duas novas. Para alguns tipos de arquivos de texto, voc tambm pode
usar mtodos do objeto Application do acesso para importao e exportao
arquivos de texto ao trabalhar com dados em cdigo VBA. O TransferText mtodo
tem sido usado para importar dados do (ou exportar dados para) delimitado por vrgula ou
fixo-largura arquivos desde os primeiros dias de acesso e ele ainda til no acesso
2007, quando voc estiver trabalhando com arquivos nesses formatos. No Office XP, o
TransferText mtodo foi atualizado para tambm exportar para e importar de
Arquivos HTML.
Tipicamente, delimitado por vrgulas ou fixo-largura arquivos so produzidos por mainframe
computadores e voc pode precisar importar esses arquivos em suas tabelas de acesso ou
exportar dados de tabelas do Access para arquivos delimitados por vrgula ou de largura fixa para
importar para aplicativos de mainframe. Alm disso, voc pode usar esses formatos
exportar dados para ou importar dados de outros aplicativos cujos formatos no so
diretamente suportado pelo acesso.
Se voc tiver dados em planilhas Excel ou Lotus, voc pode usar o
TransferirPlanilha mtodo para importar dados de-los ou exportar dados
para planilhas. E o TransferirBancoDeDadosmtodo pode ser usado para
transferir dados entre tabelas do Access e bancos de dados legados ou planilhas.
Estes trs mtodos no tm o poder ou a flexibilidade de cdigo de automao,
que pode iterar por meio de registros em uma tabela, talvez usando um filtrado
conjunto de registros e dados de gravao de campos especficos para uma planilha. Mas se voc precisa
para importar todos os dados de uma planilha do Lotus ou um banco de dados dBASE, assim voc
pode funcionar no Access, estes mtodos vm a calhar.
305
NESTE CAPTULO
Importao e exportao
delimitado por vrgulas e fixa-
arquivos de texto de largura
Importao e exportao de dBASE,
Paradoxo e arquivos do Lotus 1-2-3
Importao e exportao de XML
e arquivos HTML
Enviando arquivos de texto exportado
Trabalhando com
Dados externos
15_047026 ch10.qxp 02\/04\/07 21:52 pgina 305
Nos dias de hoje, no provvel que voc iria querer exportar dados do Access para uma planilha do Lotus ou um
banco de dados dBASE, mas ainda necessrio para exportar arquivos de texto delimitado por vrgula ou de largura fixa, portanto, a
TransferText mtodo tambm til para exportar dados do Access para arquivos de texto.
Trabalhando com texto arquivos usando o
Mtodo TransferText
Quando voc usa o TransferText mtodo no cdigo VBA, voc pode fornecer um nome de especificao. A
especificao de importao ou exportao criada quando voc executa a exportar ou importa manualmente. O
processo de criao de uma especificao (e reutilizando-interface) foi racionalizadas no Access
2007; Eu cubro a criao de uma especificao de exportao na prxima seo. As especificaes so teis
Quando voc precisa definir um nmero de opes personalizadas para uma exportao ou importao, especialmente se voc planeja
Execute novamente a exportao ou importao na interface; no entanto, eles no so necessrios.
Criando uma especificao de exportao ou importao
O processo de criao de uma especificao de importao para importar um arquivo de texto de largura fixa descrito a seguir;
voc criar especificaes para importar um arquivo de texto delimitado por vrgula ou exportar qualquer um desses arquivos
tipos, de forma semelhante, com opes diferentes, dependendo do tipo de arquivo. Voc pode querer usar
baixei de uma especificao de importao, por exemplo, se voc receber um arquivo de texto de dados delimitados por vrgulas
de um mainframe toda semana e voc precisar importar os dados semanais para uma tabela do Access.
1. Primeiro, clique no boto arquivo de texto no menu de dados externa, como mostrado na Figura 10.1.
FIGURA 10.1
A partir de uma importao de um arquivo de texto.
2. Em seguida, em obter dados externos - caixa de dilogo de arquivo de texto (mostrado na Figura 10.2), use o
Procure o boto para selecionar o arquivo de texto para importar (empregos 02-Jul-2006.txt no exemplo).
306
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
15_047026 ch10.qxp 02\/04\/07 21:52 pgina 306
FIGURA 10.2
Selecionando um arquivo de texto para importar.
3. Depois de selecionar o arquivo, clicando em OK na obter dados externos - caixa de dilogo de arquivo de texto abre
o Assistente de texto de importao (Figura 10.3), com uma seleo de delimitado ou largura fixa; Gen-
erally acesso pre-selects a opo correta.
FIGURA 10.3
A caixa de dilogo do Assistente de importao de texto.
307
Trabalhando com dados externos
10
15_047026 ch10.qxp 02\/04\/07 21:52 pgina 307
4. Clicando em seguida abre uma tela onde voc pode ajustar as larguras de coluna, como mostrado na
Figura 10.4.
FIGURA 10.4
Ajustando as colunas em um arquivo de largura fixa.
5. A prxima tela, mostrada na Figura 10.5, permite que voc especifique nomes de campo, se eles esto faltando
no arquivo de texto (este frequentemente o caso com os arquivos exportados de mainframes). A figura
mostra o primeiro campo (originalmente chamado ProductNumber e recebe um nome de campo padro de
Campo1 pelo Assistente) sendo rebatizado com o nome original. Voc tambm pode alterar os dados
tipo do campo, se necessrio; por exemplo, fazendo um campo de texto que contm dados numricos um
Campo inteiro longo ou moeda, ou um campo de texto contendo dados de uma data\/hora de data\/hora
campo.
6. A tela na Figura 10.6 permite que voc adicionar, selecione ou no especificar uma chave primria; Neste caso,
porque os dados sero anexados a uma tabela que tem um campo AutoNumerao, o \"no pri-
opo de chave de Mary\" correta.
7. Em seguida, voc ver uma tela que permite que voc digite o nome da tabela de acesso de destino.
308
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
15_047026 ch10.qxp 02\/04\/07 21:52 pgina 308
FIGURA 10.5
Especificando nomes de campo para um arquivo de texto importado.
FIGURA 10.6
Opes de chaves primrias para um arquivo de texto importado.
309
Trabalhando com dados externos
10
15_047026 ch10.qxp 02\/04\/07 21:52 pgina 309
Voc agora forneceu todas as informaes necessrias para configurar a especificao; as prximas etapas, onde
voc salvar a especificao, so novos para o Access 2007.
Clicando no boto Concluir abre uma nova tela de salvar etapas de importao (mostrada na Figura 10.7).
Se voc marcar a caixa de seleo \"salvar etapas de importao\", mais controles aparecem na caixa de dilogo,
onde pode introduzir o nome e a descrio da especificao de importao salvo e at mesmo criar uma
Tarefa do Outlook para execut-lo automaticamente em um intervalo especificado.
FIGURA 10.7
Salvando uma especificao de importao.
Clicando no boto Salvar importar salva a especificao de importao. Isso permite que voc selecione os salvos
especificao e execuo-lo no futuro de importaes salvas boto na guia dados externos do
Fita (mostrada na Figura 10.1), o que economiza muito tempo comparado com passar por todos os
etapas do Assistente para cada vez que quiser fazer a importao.
Infelizmente, o Access 2007 VBA cdigo no reconhece salvo especificaes. Fea-
ture trabalhou para vrias verses anteriores, mas neste momento ele est quebrado, ento temos de esperar
para um pacote de patch ou servio para corrigi-lo. Por agora, apenas o cdigo que evita o uso de especificaes vai funcionar.
(Voc pode importar ou exportar para um arquivo delimitado por vrgula sem uma especificao, mas no um fixo-
arquivo de largura).
A tela de gerenciar tarefas de dados mostrada na Figura 10.8. Ele tem duas guias, uma para importaes salvas e
o outro para exportaes salvas. Em cada guia, voc pode selecionar uma salva especificao para executar.
CUIDADO CUIDADO
NOVO RECURSO NOVO RECURSO
310
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
15_047026 ch10.qxp 02\/04\/07 21:52 pgina 310
FIGURA 10.8
A caixa de dilogo gerenciar tarefas de dados, onde voc pode selecionar um salvo importar ou exportar a especificao.
s vezes, o assistente no reconhece que a primeira linha de um arquivo de texto contm o campo
nomes. Nesse caso, voc precisar dar os campos nomes apropriados e, em seguida, excluir o
primeira linha, com os nomes de campo como dados, aps a concluso da importao (voc provavelmente ter algum tipo
Erros de converso na tabela de erros de importao para essa linha). Figura 10.9 mostra a tabela de importados
dados de postos de trabalho e a tabela de erros de importao com erros na primeira linha que contm os nomes de campo.
FIGURA 10.9
Uma tabela de dados de texto importado, com nomes de campo na primeira linha de dados e uma tabela de erros de importao.
NOTA NOTA
311
Trabalhando com dados externos
10
15_047026 ch10.qxp 02\/04\/07 21:52 pgina 311
Importar e exportar dados de arquivo de texto no cdigo VBA
O menu principal do aplicativo de exemplo, Data.accdb externos (mostrado na Figura 10.10), tem mas-
toneladas para a abertura de vrios formulrios que importar e exportar os dados em uma variedade de formatos de arquivo. Escrita VBA
cdigo para fazer as importaes e exportaes d-lhe um clique convenincia, particularmente til se voc tem
para fazer uma importao ou exportao de tarefa com freqncia, por exemplo, importando dados de postos de trabalho semanais baixou
de um computador mainframe ou por e-mail como um arquivo de texto de largura fixa ou delimitado por vrgulas.
FIGURA 10.10
O menu principal do banco de dados de amostra de dados externos.
Importao de dados de texto
As etapas a seguir ilustram como importar dados de um arquivo de texto para uma tabela do Access, usando o VBA
cdigo de execuo de controles em um formulrio do Access (frmImportTextData, ilustrado na Figura 10.11):
1. Selecionando a opo \"Importar dados de arquivos de texto\" e clicando no boto sua esquerda abre
o trabalho de importar dados de formulrio em arquivo de texto (frmImportTextData), como mostrado na Figura 10.11.
Se um arquivo de texto foi selecionado anteriormente, seu nome exibido na caixa de texto direita do
o boto de \"Arquivo de texto de origem\".
2. Voc pode usar o arquivo selecionado (se um estiver listado), ou voc pode selecionar outro clicando o
\"Arquivo de texto-fonte\" boto, que abre uma caixa de dilogo Seletor de arquivo. A caixa de dilogo Seletor de arquivo
caixa filtrada para exibir delimitado por vrgula (. csv) ou arquivos de largura fixa (. txt), acordo-
ing para a opo selecionada no grupo de opo de tipo de texto de importao. Na Figura 10.12, que eu
selecionado um arquivo de texto delimitado por vrgulas para importao.
312
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
15_047026 ch10.qxp 02\/04\/07 21:52 pgina 312
FIGURA 10.11
O trabalho de importar dados de formulrio em arquivo de texto, como inicialmente aberto.
FIGURA 10.12
Selecionando um arquivo de texto delimitado por vrgulas para importao.
313
Trabalhando com dados externos
10
15_047026 ch10.qxp 02\/04\/07 21:52 pgina 313
3. Depois de selecionar um arquivo de texto, clique no boto de \"Inspecionar novos postos de trabalho do arquivo de texto\" para importar
dados do arquivo de texto para uma tabela temporria, tblNewJobs.
O cdigo em execuo a partir deste boto define a tabela como o objeto de fonte de empregos para
Inspecionar o subformulrio, assim voc pode ver os novos registros antes de realmente acrescent-los para o
tabela de tblJobs, como mostrado na Figura 10.13.
FIGURA 10.13
Os novos empregos, importados de um arquivo de texto delimitado por vrgula.
4. Aps inspecionar os novos dados, voc pode descartar os dados ou import-lo para o
tabela de tblJobs.
Clicando no boto \"Clear importado empregos dados\" descartar os dados (que no adicionado
tblJobs).
Clique no boto de \"Salvar novos postos de trabalho em mesa\" executa uma consulta de acrscimo que adiciona o novo
Dados de postos de trabalho para tblJobs. O cdigo faz algum tipo de converso de dados (como mostrado na Figura
10.14), porque todos os campos no arquivo de texto so campos de texto.
314
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
15_047026 ch10.qxp 02\/04\/07 21:52 pgina 314
FIGURA 10.14
Uma consulta acrscimo que faz alguns dados digite converso antes de acrescentar o recm
empregos importados para a tabela principal tblJobs.
Se voc clicou no boto \"Salvar novos postos de trabalho em mesa\", os novos registros que foram exibidos no
forma foram adicionados ao tblJobs.
Os procedimentos relevantes do mdulo de cdigo do formulrio esto listados em seguida. Os \"empregos importados claros\"
procedimento de evento do boto limpa a folha de dados, chamadas de comando a SaveTextFile Procedimento Sub,
e limpa o arquivo previamente selecionado o nome do textbox:
Private Sub cmdClearData_Click()
Em erro continuar prximo
Me![subNewJobs].SourceObject = \"\"
Chame SaveTextFile(\"\")
Me![txtSelectedTextFile].Valor = \"\"
End Sub
Importar dados de arquivos de texto de largura fixa tornou-se muito mais difcil no acesso
2007 do que em verses anteriores do Access. Loja de especificaes agora o nome do arquivo inter-
nalmente e, portanto, voc deve criar uma especificao separada para cada arquivo de texto que voc deseja criar. Este
significa que o mtodo flexvel que eu uso, onde voc pode selecionar o arquivo a importar, no vai funcionar. Eu recom -
emendar adere a importao de arquivo delimitado por vrgula, se possvel.
NOTA NOTA
315
Trabalhando com dados externos
10
15_047026 ch10.qxp 02\/04\/07 21:52 pgina 315
Procedimento de evento do boto de comando \"Inspecionar novos postos de trabalho do arquivo de texto\" primeiro verifica que um texto
arquivo foi selecionado e, em seguida, define variveis com o nome da tabela de destino para a importao e a
tipo de importao. Prximo, um Select Case declarao lida com os dois tipos de importao (delimitado por vrgula
e largura fixa) separadamente, usando o TransferText declarao com argumentos diferentes:
Private Sub cmdInspectJobs_Click()
No erro GoTo ErrorHandler
Dim strText As String
Dim strTitle As String
Dim strPrompt As String
Dim txtData como Access.TextBox
Dim strTextFile As String
Dim strTable As String
Dim strSpec As String
Conjunto txtData = Me![txtSelectedTextFile]
strTextFile = Nz(txtData.Value)
Se strTextFile = \"\", em seguida,
strTitle no = \"Nenhum arquivo de texto selecionado\"
strPrompt = \"Favor selecionar um arquivo de texto\"
MsgBox prompt: = strPrompt, botes: = _ vbExclamation
+ vbOKOnly, ttulo: = strTitle
GoTo ErrorHandlerExit
Outra coisa
Debug. Print \"o arquivo de texto:\"
End If
strTable = \"tblNewJobs\"
intTextType = Nz (Me! [fraTextType].Valor, 1)
Selecione o caso intTextType
Caso 1
Delimitado por vrgula:
DoCmd.TransferText transfertype: = acImportDelim, _
TableName: = strTable, _
FileName: = strTextFile, _
hasfieldnames: = True
Caso 2
Largura fixa
strSpec = \"importao-empregos 13 de agosto de 2006\"
' Nova sintaxe de estilo
316
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
15_047026 ch10.qxp 02\/04\/07 21:52 pgina 316
Application.CurrentProject.ImportExportSpecifications(strSpec).
Executar
\"Sintaxe de estilo antigo causa erro
' DoCmd.TransferText transfertype: = acImportFixed, _
SpecificationName: = strSpec, _
TableName: = strTable, _
FileName: = strTextFile, _
hasfieldnames: = True
End Select
Atribua a tabela como objeto de origem do subformulrio.
Me![subNewJobs].SourceObject = \"fsubNewJobs\"
ErrorHandlerExit:
Exit Sub
ErrorHandler:
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End Sub
Procedimento de evento do boto \"Salvar novos postos de trabalho em mesa\" comando executa uma consulta de acrscimo que adiciona
os trabalhos selecionados para tblNewJobs:
Private Sub cmdSaveJobs_Click()
No erro GoTo ErrorHandler
DoCmd.SetWarnings False
DoCmd.OpenQuery \"qappNewJobs\"
strTitle = \"Empregos importados\"
strPrompt = \"empregos novos importados para tblJobs de\" _
& GetTextFile()
MsgBox strPrompt, vbInformation + vbOKOnly, strTitle
ErrorHandlerExit:
Exit Sub
ErrorHandler:
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End Sub
317
Trabalhando com dados externos
10
15_047026 ch10.qxp 02\/04\/07 21:52 pgina 317
Procedimento de evento do boto de comando \"Arquivo de texto de origem\" abre uma caixa de dilogo de arquivo seletor para selecionar um
arquivo de texto para importar, para texto ou arquivos delimitados por vrgula, dependendo da opo de filtragem
selecionado no formulrio:
Private Sub cmdSourceTextFile_Click()
No erro GoTo ErrorHandler
Dim fd como Office.FileDialog
Dim txt como Access.TextBox
Dim strPath As String
Dim strFilter As String
Criar umFileDialog objeto como uma caixa de dilogo Seletor de arquivo.
Definir fd = Application.FileDialog(msoFileDialogFilePicker)
Conjunto txt = Me![txtSelectedTextFile]
Defina o caminho inicial para o caminho de entrada de documentos personalizado.
strPath = GetInputDocsPath()
intTextType = Nz (Me! [fraTextType].Valor, 1)
Com fd
se = \"arquivo de texto select com dados de emprego para importar\"
.ButtonName = \"Selecione\"
.Filters
Se intTextType = 1 ento
.Filters.Add \"arquivos delimitados por vrgula\", \"*. csv\"
ElseIf intTextType = 2 ento
.Filters.Add \"arquivos de largura fixa\", \"*. txt\"
End If
.InitialView = msoFileDialogViewDetails
.InitialFileName = strPath
Se for.Mostrar = -1 ento
strTextFile = CStr (fd.SelectedItems.Item(1))
Outra coisa
Debug. Print \"usurio pressionado cancelar\"
End If
Terminar com
txt.Valor = strTextFile
Salvar o valor para tblInfo; a forma pode ser vinculada a essa tabela porque o menu principal vinculado a
e assim ele est bloqueado.
SaveTextFile (strTextFile)
Me![txtSelectedTextFile].Valor = strTextFile
ErrorHandlerExit:
Exit Sub
318
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
15_047026 ch10.qxp 02\/04\/07 21:52 pgina 318
ErrorHandler:
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End Sub
Procedimento de evento do grupo de opo de \"Importar texto tipo\" primeiro verifica se o arquivo de texto selecionado o
certo tipo e limpa, se no, ento estabelece uma Select Case instruo ao processo delimitado por vrgula
e ficheiros de texto diferente, chamando a SaveTextFile Sub:
Private Sub fraTextType_AfterUpdate()
No erro GoTo ErrorHandler
Dim strExt As String
Verifique se o arquivo de texto selecionado o tipo certo e desmarque a seleo de arquivo, se no.
intTextType = Nz (Me! [fraTextType].Valor, 1)
strTextFile = GetTextFile()
Se Len(strTextFile) > 4 ento
strExt = Right (strTextFile, 3)
End If
Selecione o caso intTextType
Caso 1
Delimitado por vrgula
Se strExt = \"txt\", em seguida,
SaveTextFile (\"\")
Me![txtSelectedTextFile].Valor = \"\"
End If
Caso 2
Largura fixa
Se strExt = \"csv\", em seguida,
SaveTextFile (\"\")
Me![txtSelectedTextFile].Valor = \"\"
End If
Caso 3
Se <>strExt \"csv\" e <>strExt \"txt\", em seguida,
SaveTextFile (\"\")
Me![txtSelectedTextFile].Valor = \"\"
End If
319
Trabalhando com dados externos
10
15_047026 ch10.qxp 02\/04\/07 21:52 pgina 319
End Select
ErrorHandlerExit:
Exit Sub
ErrorHandler:
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End Sub
Exportar dados de texto
Ao exportar dados para arquivos de texto (por exemplo, para importar para um programa de computador de mainframe, ou outro
aplicativo que pode importar dados de arquivos de texto delimitado por vrgula ou de largura fixa), muitas vezes voc precisa
para filtrar os dados, geralmente por data. O emprego de exportar dados para formato de arquivo de texto (frmExportTextData) tem
duas caixas de texto vinculado a campos de data que voc pode usar para selecionar datas para um intervalo de datas usada para filtrar
os registros a ser exportados para um arquivo de texto.
Controles vinculados aos campos de data em um formulrio do Access 2007 tem um recurso muito aguardado
mostrado na Figura 10.15: um calendrio pop-up para tornar mais fcil para selecionar uma data.
FIGURA 10.15
A exportar dados de emprego a forma de arquivo de texto, com um seletor de data de pop-up.
NOVO RECURSO NOVO RECURSO
320
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
15_047026 ch10.qxp 02\/04\/07 21:52 pgina 320
1. Para abrir o \"exportar dados de emprego a forma de arquivo texto (frmExportTextData), selecione\"Export
Dados de arquivos texto\"opo no menu principal e clique no boto sua esquerda. Este formulrio permite
voc exportar uma variedade de registros filtrados por data ou uma vrgula-delimited ou de largura fixa
arquivo de texto.
2. Aps voc selecionar o de data e a data, digit-los no ou usando a data
seletor de pop-up, clique no boto \"Inspecionar novos empregos para exportao\" para mostrar os trabalhos em
o intervalo de datas selecionado em empregos para inspecionar o subformulrio (fsubNewJobs), como mostrado na
Figura 10.16.
3. Se voc no quiser ir em frente com a exportao, use o boto \"Clear empregos para exportao\"
Limpe os trabalhos selecionados.
4. Para prosseguir com a exportao, use o boto \"Exportar empregos para arquivo de texto\" para executar o cdigo usando
o TransferText mtodo para exportar o intervalo de datas selecionado de postos de trabalho para um arquivo de texto do
tipo selecionado no grupo de opo de \"Exportar texto tipo\". Figura 10.17 mostra um exportado
arquivo delimitado por vrgula aberto no Excel (que o aplicativo padro para arquivos. csv).
FIGURA 10.16
Inspecionar os postos de trabalho em um determinado intervalo de dados para exportar para um arquivo de texto.
321
Trabalhando com dados externos
10
15_047026 ch10.qxp 02\/04\/07 21:52 pgina 321
FIGURA 10.17
Um arquivo de texto delimitado por vrgulas exportado aberto no Excel.
O novo mtodo de lidar com especificaes funciona bem com as exportaes de largura fixa, pelo menos assim
contanto que voc sempre deseja exportar para salvar arquivo nome, como eu fao no cdigo de exemplo.
Os procedimentos relevantes do mdulo de formulrio so listados em seguida. O boto \"Clear empregos para exportao\"
procedimento de evento limpa o subformulrio de folha de dados de empregos:
Private Sub cmdClearData_Click()
Em erro continuar prximo
Me![subFilteredJobs].SourceObject = \"\"
End Sub
NOTA NOTA
322
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
15_047026 ch10.qxp 02\/04\/07 21:52 pgina 322
Procedimento de evento do boto \"Exportar empregos para arquivo de texto\" configura um Select Case instruo para
exportar os trabalhos selecionados, usando o TransferText declarao com argumentos diferentes:
Private Sub cmdExportJobs_Click()
No erro GoTo ErrorHandler
Dim intTextType As Integer
Dim strQuery As String
Dim strTextFile As String
Dim strTitle As String
Dim strPrompt As String
intTextType = Nz (Me! [fraTextType].Valor, 1)
strQuery = \"qryFilteredJobs\"
Selecione o caso intTextType
Caso 1
Delimitado por vrgula
strTextFile = _ GetOutputDocsPath()
&Filtered Jobs.csv
DoCmd.TransferText transfertype: = acExportDelim, _
TableName: = strQuery, _
FileName: = strTextFile, _
hasfieldnames: = True
Caso 2
Largura fixa
strTextFile = _ GetOutputDocsPath()
&Filtered Jobs.txt
strSpec = \"Export@@hyFilteredJobs\"
strTextFile = GetOutputDocsPath()
' Nova sintaxe de estilo
Application.CurrentProject.ImportExportSpecifications(strSpec).Ex
ecute
\"Sintaxe de estilo antigo causa erro
' DoCmd.TransferText transfertype: = acExportFixed, _
TableName: = strQuery, _
FileName: = strTextFile, _
hasfieldnames: = True
End Select
323
Trabalhando com dados externos
10
15_047026 ch10.qxp 02\/04\/07 21:52 pgina 323
strTitle = \"Exportar empregos\"
strPrompt = \"Exportou empregos filtrados para\"
MsgBox strPrompt, vbInformation + vbOKOnly, strTitle
ErrorHandlerExit:
Exit Sub
ErrorHandler:
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End Sub
Procedimento de evento do boto \"Inspecionar novos empregos para exportar\" define o objeto de origem na folha de dados de formulrio
para o subformulrio vinculado a qryFilteredJobs , para exibir os trabalhos selecionados:
Private Sub cmdInspectNewJobs_Click()
Em erro continuar prximo
Me![subFilteredJobs].SourceObject = \"fsubFilteredJobs\"
End Sub
Trabalhando com Banco de dados do legado
e arquivos de planilha
Desde os primeiros dias de acesso (quando o dBASE e o Paradox foram grandes foras no banco de dados
mundo e Lotus 1-2-3 foi o principal aplicativo de planilha) acesso poderia importar de ou
exportar para esses formatos. Algumas pessoas ainda esto usando esses programas, ou pelo menos tem arquivos antigos cre-
ated por eles no ano passado, ento voc ainda pode precisar de importar dados de um dBASE, Paradox ou Lotus
arquivo ou (embora seja muito menos provvel) exportar para um desses formatos. Acesso ainda suporta a importao de
estes formatos herdados, e voc tambm pode exportar para eles, tanto na interface e no cdigo VBA.
Importao de arquivos de banco de dados
Formato para importar dados de arquivos de aplicativo herdado semelhante ao formulrio de importao de
arquivos de texto; ele difere em oferecer uma seleo de trs tipos de aplicativos legados: dBASE, Paradox, e
Lotus. As etapas a seguir descrevem a importao de dados de empregos de um arquivo do dBASE:
324
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
15_047026 ch10.qxp 02\/04\/07 21:52 pgina 324
1. Para abrir o trabalho de importar dados de formulrio de arquivo de aplicativo (frmImportAppData), selecione o
\"Importar dados de arquivos App\" opo no menu principal e clique no boto sua esquerda
(veja figura 10.10). Os dados de emprego do formato de arquivo do aplicativo mostrado em seu estado inicial no
Figura 10.18.
FIGURA 10.18
Uma forma para importar dados de arquivos de aplicativo de banco de dados e planilha legados.
2. Clique no boto do arquivo de origem para selecionar um arquivo do tipo selecionado em \"Tipo de arquivo de importao\"
Grupo de opo de uma caixa de dilogo Seletor de arquivo, como mostrado na Figura 10.19.
3. Tal como acontece com arquivos de texto, clique no boto de \"Inspecionar novos postos de trabalho do arquivo de App\" para importar dados do
o arquivo selecionado para uma tabela temporria. O cdigo define essa tabela como o objeto de origem da
Empregos para inspecionar subformulrio, assim voc pode ver os novos registros antes de acrescent-los para o
tabela de tblJobs, como mostrado na Figura 10.20.
325
Trabalhando com dados externos
10
15_047026 ch10.qxp 02\/04\/07 21:52 pgina 325
FIGURA 10.19
Selecionando um arquivo do dBASE para importar.
FIGURA 10.20
Inspecionar novos dados de emprego, importados de um arquivo de banco de dados do dBASE IV.
326
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
15_047026 ch10.qxp 02\/04\/07 21:52 pgina 326
Quando o importador de (ou exportadores para) dBASE ou Paradox formatos usando o
TransferirBancoDeDados
mtodo, o
DatabaseName
argumento leva o caminho, no o
nome do banco de dados; o nome do banco de dados definido com o
Fonte
argumento. O caminho deve ser definido sem uma
barra invertida final, ou ento ele ir causar um erro.
4. Use o boto \"Limpar dados de empregos importados\" para limpar os dados importados sem adicion-lo
para tblJobs.
5. Use o boto \"Salvar novos postos de trabalho em mesa\" para acrescentar os dados importados de postos de trabalho para tblJobs.
Importando um arquivo de paradoxo bastante semelhante; apenas o argumento de tipo de banco de dados diferente.
Figura 10,21 mostra nova empregos dados importados de um banco de dados Paradox 4.
FIGURA 10.21
Inspecionar dados importados de um banco de dados Paradox.
Curiosamente, no h um enum de constantes nomeadas para os valores usados para definir o DatabaseTypecomplexType
argumento do TransferirBancoDeDadosmtodo; voc tem que digitar os valores. 10.1 Tabela lista o
valores que voc precisa usar para diferentes verses do dBASE e Paradox.
NOTA NOTA
327
Trabalhando com dados externos
10
15_047026 ch10.qxp 02\/04\/07 21:52 pgina 327
TABELA 10.1
Valores de argumento DatabaseTypecomplexType para dBASE e Paradox
Verso do banco de dados DatabaseTypecomplexType valor
dBASE III dBASE III
dBASE IV dBASE IV
dBASE 5 dBASE 5.0
Paradox 3. x Paradox 3. x
Paradox 4. x Paradox 4. x
Paradox 5. x Paradox 5. x
Paradox 7. x Paradox 7. x
Agora que os dados em uma tabela do Access, voc pode continuar a trabalhar com ele, conforme necessrio.
Importao de arquivos de planilha
Se voc tem arquivos de planilha do Lotus 1-2-3 antigos, voc pode importar dados de-los em tabelas do Access
usando oTransferirPlanilha mtodo, que funciona muito parecido com o TransferText
mtodo, importar todos os dados de uma planilha. Ao contrrio dos arquivos de banco de dados, voc pode usar o nome
os valores de argumento o Seguintes enum para planilhas de vrias verses;
esses valores esto listados na tabela 10.2.
TABELA 10.2
SpreadsheetType constantes nomeada para Lotus 1-2-3
Verso do Lotus SpreadsheetType constantes nomeada
Lotus WK1 acSpreadsheetTypeLotusWK1
Lotus WK3 acSpreadsheetTypeLotusWK3
WK4 Lotus acSpreadsheetTypeLotusWK4
WJ2 Lotus acSpreadsheetTypeLotusWJ2
328
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
15_047026 ch10.qxp 02\/04\/07 21:52 pgina 328
Quando voc inspecionar novos dados de emprego importados de uma planilha do Lotus (como mostrado na Figura 10.22),
o campo de data\/hora de trabalho parece estranho, porque o campo criado como um campo de nmero. No entanto,
Quando voc clicar os postos de trabalho salvar boto de tabela, o CDate) funo na qappNewJobs
acrescentar consulta converte o valor numrico de data no formato correto antes de acrescentar os dados para
tblJobs. Este tipo de ajustes de dados importados muitas vezes necessrio, para garantir que os dados que chegam em
a tabela de destino do Access o tipo de dados correto.
FIGURA 10.22
Valores numricos dados importados de uma planilha do Lotus 1-2-3 no campo data\/hora de trabalho.
Os procedimentos pertinentes a partir dos dados de emprego de importao do mdulo de formulrio de aplicativo arquivo esto listados
prxima. Procedimento de evento do boto \"Clear importado empregos dados\" limpa a folha de dados de registros, chamadas
o SaveAppFile Sub, limpa a caixa de texto do nome do arquivo e exclui as tabelas temporrias de
novos postos de trabalho:
Private Sub cmdClearData_Click()
Em erro continuar prximo
Me![subNewJobs].SourceObject = \"\"
Chame SaveAppFile(\"\")
Me![txtSelectedAppFile].Valor = \"\"
329
Trabalhando com dados externos
10
15_047026 ch10.qxp 02\/04\/07 21:52 pgina 329
Excluir tabelas de empregos novos
AcTable, DoCmd.DeleteObject \"tblNewJobs\"
AcTable, DoCmd.DeleteObject \"tblNewJobsDB\"
End Sub
Procedimento de evento do boto \"Inspecionar novos postos de trabalho do arquivo de App\" primeiro verifica que um arquivo do aplicativo
foi selecionado, analisa o caminho do arquivo e o nome do arquivo para uso em diferentes argumentos do
TransferirBancoDeDadosdeclarao, configura-se ento um Select Case instruo para fazer a importao
diferentes para os tipos de aplicao de trs:
Private Sub cmdInspectJobs_Click()
No erro GoTo ErrorHandler
Dim strText As String
Dim strTitle As String
Dim strPrompt As String
Dim txtData como Access.TextBox
Dim strAppFile As String
Dim strTable As String
Dim strSpec As String
Dim strDBPath As String
Dim strDBName As String
Dim strAppFileAndPath As String
Conjunto txtData = Me![txtSelectedAppFile]
strAppFileAndPath = Nz(txtData.Value)
Se strAppFileAndPath = \"\", em seguida,
strTitle no = \"Nenhum arquivo de aplicativo selecionado\"
strPrompt = \"Favor selecionar um arquivo do aplicativo\"
MsgBox prompt: = strPrompt, botes: = _ vbExclamation
+ vbOKOnly, ttulo: = strTitle
GoTo ErrorHandlerExit
Outra coisa
Analisa o caminho do arquivo e nome do arquivo.
strDBPath = SplitDBPath(strAppFileAndPath)
Retire o ltima barra invertida.
Debug. Print \"comprimento de caminho DB:\"
strDBPath = Left (strDBPath, Len(strDBPath) - 1)
strDBName = SplitDBName(strAppFileAndPath)
End If
330
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
15_047026 ch10.qxp 02\/04\/07 21:52 pgina 330
intFileType = Nz (Me! [fraFileType].Valor, 1)
Selecione o caso intFileType
Caso 1
dBASE
strTable = \"tblNewJobsDB\"
Debug. Print \"caminho DB:\"
Debug. Print \"nome da DB:\"
DoCmd.TransferDatabase transfertype: = acImport, _
DatabaseTypecomplexType: = \"dBASE IV\", _
DatabaseName: = strDBPath, _
ObjectType: = _ acTable,
Fonte: = strDBName, _
Destino: = strTable, _
structureonly: = False
Atribua o formulrio apropriado como o objeto de origem do subformulrio.
Me![subNewJobs].SourceObject = \"fsubNewJobsDB\"
Caso 2
Paradoxo
strTable = \"tblNewJobs\"
DoCmd.TransferDatabase transfertype: = acImport, _
DatabaseTypecomplexType: = \"Paradox 4. x\", _
DatabaseName: = strDBPath, _
ObjectType: = _ acTable,
Fonte: = strDBName, _
Destino: = strTable, _
structureonly: = False
Atribua o formulrio apropriado como o objeto de origem do subformulrio.
Me![subNewJobs].SourceObject = \"fsubNewJobs\"
Caso 3
Lotus 1-2-3
strTable = \"tblNewJobs\"
DoCmd.TransferSpreadsheet transfertype: = acImport, _
spreadsheettype: = acSpreadsheetTypeLotusWK3, _
TableName: = strTable, _
FileName: = strAppFileAndPath, _
hasfieldnames: = True
331
Trabalhando com dados externos
10
15_047026 ch10.qxp 02\/04\/07 21:52 pgina 331
Atribua o formulrio apropriado como o objeto de origem do subformulrio.
Me![subNewJobs].SourceObject = \"fsubNewJobs\"
End Select
ErrorHandlerExit:
Exit Sub
ErrorHandler:
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End Sub
Procedimento de evento do boto \"Salvar novos postos de trabalho em mesa\" configura um Select Case instruo para executar
um dos trs acrescentar consultas para acrescentar os novos dados de postos de trabalho para a tabela de tblJobs:
Private Sub cmdSaveJobs_Click()
No erro GoTo ErrorHandler
DoCmd.SetWarnings False
intFileType = Nz (Me! [fraFileType].Valor, 1)
Selecione o caso intFileType
Caso 1
dBASE
DoCmd.OpenQuery \"qappNewJobsDB\"
Caso 2
Paradoxo
DoCmd.OpenQuery \"qappNewJobsPdox\"
Caso 3
Lotus 1-2-3
DoCmd.OpenQuery \"qappNewJobsLotus\"
End Select
332
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
15_047026 ch10.qxp 02\/04\/07 21:52 pgina 332
strTitle = \"Empregos importados\"
strPrompt = \"empregos novos importados para tblJobs de\" _
& GetAppFile()
MsgBox strPrompt, vbInformation + vbOKOnly, strTitle
ErrorHandlerExit:
Exit Sub
ErrorHandler:
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End Sub
Procedimento de evento do boto fonte arquivo abre uma caixa de dilogo de arquivo seletor para selecionar um arquivo de aplicativo para
importando, filtragem para dBASE, Paradox ou Lotus arquivos dependendo da opo selecionada no formulrio:
Private Sub cmdSourceFile_Click()
No erro GoTo ErrorHandler
Dim fd como Office.FileDialog
Dim txt como Access.TextBox
Dim strPath As String
Dim strFilter As String
Criar umFileDialog objeto como uma caixa de dilogo Seletor de arquivo.
Definir fd = Application.FileDialog(msoFileDialogFilePicker)
Conjunto txt = Me![txtSelectedAppFile]
Definir o caminho inicial para o caminho de entrada de documentos personalizado
strPath = GetInputDocsPath()
intFileType = Nz (Me! [fraFileType].Valor, 1)
Com fd
se = \"Selecionar arquivo de banco de dados ou planilha com\" _
& job data to import
.ButtonName = \"Selecione\"
.Filters
Selecione o caso intFileType
Caso 1
.Filters.Add \"arquivos dBASE\", \"dbf\"
333
Trabalhando com dados externos
10
15_047026 ch10.qxp 02\/04\/07 21:52 pgina 333
Caso 2
.Filters.Add \"Arquivos Paradox\", \"*. DB\"
Caso 3
.Filters.Add \"arquivos do Lotus 1-2-3\", \"*.wk3\"
End Select
.InitialView = msoFileDialogViewDetails
.InitialFileName = strPath
Se for.Mostrar = -1 ento
strAppFile = CStr (fd.SelectedItems.Item(1))
Outra coisa
Debug. Print \"usurio pressionado cancelar\"
End If
Terminar com
txt.Valor = strAppFile
Salve o valor para tblInfo.
SaveAppFile (strAppFile)
ErrorHandlerExit:
Exit Sub
ErrorHandler:
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End Sub
O grupo de opo de \"Tipo de arquivo de importao\" After_Update procedimento primeiro verifica que o selecionado
arquivo do aplicativo o tipo certo e limpa-lo se no, ento configura um Select Case instruo para
processar os trs tipos de arquivos de aplicativo diferente, chamando a SaveTextFile Sub:
Private Sub fraFileType_AfterUpdate()
No erro GoTo ErrorHandler
Dim strExt As String
Verifique o arquivo do aplicativo selecionado o tipo certo e desmarque a seleo de arquivo, se no.
intFileType = Nz (Me! [fraFileType].Valor, 1)
Se Len(GetTextFile()) > 4 ento
strExt = Right (strAppFile, 3)
End If
334
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
15_047026 ch10.qxp 02\/04\/07 21:52 pgina 334
Selecione o caso intFileType
Caso 1
dBASE
Se <>strExt \"dbf\", em seguida,
SaveAppFile (\"\")
Me![txtSelectedAppFile].Valor = \"\"
End If
Caso 2
Paradoxo
Se <>strExt \". DB\", em seguida,
SaveAppFile (\"\")
Me![txtSelectedAppFile].Valor = \"\"
End If
Caso 3
Lotus 1-2-3
Se strExt <>\"wk3\", em seguida,
SaveAppFile (\"\")
Me![txtSelectedAppFile].Valor = \"\"
End If
End Select
Me![subNewJobs].SourceObject = \"\"
ErrorHandlerExit:
Exit Sub
ErrorHandler:
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End Sub
Depois de importar dados de arquivo do aplicativo de legado, agora em uma tabela do Access, onde voc pode
trabalhar com ele no futuro.
335
Trabalhando com dados externos
10
15_047026 ch10.qxp 02\/04\/07 21:52 pgina 335
Exportando arquivos de planilha e banco de dados
No nos dias de hoje, muito provvel que voc precisa exportar dados do Access para um dBASE, Paradox,
ou o arquivo de Lotus (e em todo o caso, conforme discutido na seo \"Exportando arquivos de texto\", voc pode exportar para um
delimitado por vrgulas arquivo de texto que pode ser importado para as aplicaes). No entanto, ainda oferece acesso
a opo de fazer as exportaes para esses aplicativos herdados, como discutido nesta seo.
Se voc selecionar a opo \"Exportar dados para arquivos de App\" no menu principal e clique no boto sua esquerda,
o emprego de exportar dados para formato de arquivo do aplicativo (frmExportAppData) abre. Desta forma (muito parecido com o
Dados do trabalho de exportao para o formato de arquivo de texto) permitem exportar uma srie de registros filtrados por data para um dBASE,
Paradoxo, ou arquivo do Lotus 1-2-3. Figura 10.23 mostra dados filtrados prontos para exportar para um arquivo do dBASE.
FIGURA 10.23
Registros filtrados para exportar para um arquivo do dBASE.
O boto \"Clear empregos para exportar\" limpa os registros selecionados e o \"exportar empregos para aplicao
Arquivo\"boto faz a exportao de um arquivo de formato selecionado; Este procedimento encontra-se em seguida. Semelhante ao
os outros procedimentos de exportao, esse procedimento configura uma Select Case instruo para fazer a exportao
Diferentemente de acordo com o tipo de aplicativo selecionado; o TransferirBancoDeDadosdeclarao com
vrios argumentos:
Private Sub cmdExportJobs_Click()
No erro GoTo ErrorHandler
Dim intFileType As Integer
Dim strQuery As String
336
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
15_047026 ch10.qxp 02\/04\/07 21:52 pgina 336
Dim strAppFile As String
Dim strTitle As String
Dim strPrompt As String
Dim strOutputPath As String
Dim strDBName As String
intFileType = Nz (Me! [fraFileType].Valor, 1)
strQuery = \"qryFilteredJobs\"
strOutputPath = GetOutputDocsPath()
Retire o ltima barra invertida.
strOutputPath = Left (strOutputPath, _
Len(strOutputPath) - 1)
Selecione o caso intFileType
Caso 1
dBASE
strDBName = \"Jobs.dbf\"
strAppFile = strOutputPath
DoCmd.TransferDatabase transfertype: = acExport, _
DatabaseTypecomplexType: = \"dBASE IV\", _
DatabaseName: = strOutputPath, _
ObjectType: = _ acTable,
Fonte: = strQuery, _
Destino: = strDBName, _
structureonly: = False
Caso 2
Paradoxo
strDBName = \"Jobs.db\"
strAppFile = strOutputPath
DoCmd.TransferDatabase transfertype: = acExport, _
DatabaseTypecomplexType: = \"Paradox 5. x\", _
DatabaseName: = strOutputPath, _
ObjectType: = _ acTable,
Fonte: = strQuery, _
Destino: = strDBName, _
structureonly: = False
Caso 3
337
Trabalhando com dados externos
10
15_047026 ch10.qxp 02\/04\/07 21:52 pgina 337
Lotus 1-2-3
strAppFile = strOutputPath
DoCmd.TransferSpreadsheet transfertype: = acExport, _
spreadsheettype: = acSpreadsheetTypeLotusWK1, _
TableName: = strQuery, _
FileName: = strAppFile, _
hasfieldnames: = True
End Select
strTitle = \"Exportar empregos\"
strPrompt = \"Exportou empregos filtrados para\"
MsgBox strPrompt, vbInformation + vbOKOnly, strTitle
ErrorHandlerExit:
Exit Sub
ErrorHandler:
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End Sub
Trabalhando com XML e arquivos HTML
s vezes Microsoft introduz uma nova tecnologia muito antes de ter qualquer uso do mundo real. O XML
e formatos de arquivo HTML, porm muito til para o desenvolvimento de web sites, at data no tm utilidade como veculos
para exportar ou importar os dados de acesso. XML, em particular, parece ser uma nova tecnologia (no que
novo; foi introduzida no Office XP) que como de ainda no ter muita utilidade para importao de dados de acesso
e exportao, embora talvez ele ser no futuro. Como pode ver, todos os dados relacionados ao acesso
tarefas do Exchange que voc pode fazer com o XML ou HTML podem ser feitas melhor por outros mtodos, tais como
os formatos de planilha ou delimitado por vrgulas.
Dito isto, talvez voc precise exportar uma tabela do Access ou a consulta para o formato HTML para postagem em um web
local; Arquivos XML, embora talvez promissor para uso futuro, esto em apresentar minimamente til para
importar ou exportar dados do Access.
Importando arquivos XML e HTML
Se voc precisar importar dados para o acesso de um arquivo HTML ou XML (ou simplesmente deseja experimentar com
essas opes) voc pode usar o formulrio HTML de importao ou dados de emprego de XML (frmImportHTMLXMLData),
que abre, se voc selecionar importao HTML ou XML dados opo no menu principal e clique o
boto sua esquerda (Ver Figura 10.11).
Clicando no boto \"Inspecionar novos postos de trabalho de arquivo de HTML\" exibe os registros importados na sub-
formulrio, conforme mostrado na Figura 10,24.
338
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
15_047026 ch10.qxp 02\/04\/07 21:52 pgina 338
FIGURA 10,24
Inspecionar dados importados de um arquivo HTML.
Se voc selecionar a opo XML, dados do arquivo XML so exibidos no subformulrio, conforme mostrado na
Figura 10.25.
FIGURA 10.25
Inspecionar dados importados de um arquivo XML.
339
Trabalhando com dados externos
10
15_047026 ch10.qxp 02\/04\/07 21:52 pgina 339
Quando voc importar dados de um arquivo XML, no h nenhuma opo para especificar o nome do
a tabela do Access; ele ter o mesmo nome como a fonte de dados original, possivelmente com um
acrescentado o nmero.
O cdigo para o boto de \"Inspecionar novos postos de trabalho do arquivo de HTML\" est listado abaixo:
Private Sub cmdInspectJobs_Click()
No erro GoTo ErrorHandler
Dim strText As String
Dim strTitle As String
Dim strPrompt As String
Dim txtData como Access.TextBox
Dim strAppFile As String
Dim strTable As String
Dim strSpec As String
Dim strHTMLXMLFileAndPath As String
Dim strHTMLXMLFile As String
Dim strHTMLXMLPath As String
Conjunto txtData = Me![txtSelectedAppFile]
strTable = \"tblNewJobs\"
strHTMLXMLFileAndPath = Nz(txtData.Value)
Se strHTMLXMLFileAndPath = \"\", em seguida,
strTitle no = \"Nenhum arquivo de aplicativo selecionado\"
strPrompt = \"Favor selecionar um arquivo do aplicativo\"
MsgBox prompt: = strPrompt, botes: = _ vbExclamation
+ vbOKOnly, ttulo: = strTitle
GoTo ErrorHandlerExit
Outra coisa
Analisar o nome do arquivo; necessrio mais tarde no processo.
strHTMLXMLFile = SplitDBName(strHTMLXMLFileAndPath)
Guarnio fora a extenso de arquivo.
strHTMLXMLFile = Mid (strHTMLXMLFile, 1, InStr (1,
strHTMLXMLFile, \".\") @ @ hy 1)
Debug. Print \"nome de aparado de arquivo:\"
End If
intFileType = Nz (Me! [fraFileType].Valor, 1)
Selecione o caso intFileType
NOTA NOTA
340
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
15_047026 ch10.qxp 02\/04\/07 21:52 pgina 340
Caso 1
HTML
DoCmd.TransferText transfertype: = acImportHTML, _
TableName: = strTable, _
FileName: = strHTMLXMLFileAndPath, _
hasfieldnames: = True
Atribua o formulrio apropriado como o objeto de origem do subformulrio.
Me![subNewJobs].SourceObject = \"fsubNewJobs\"
Caso 2
XML
ImportXML DataSource: = strHTMLXMLFileAndPath, _
ImportOptions: = acStructureAndData
DoCmd.SetWarnings False
No h nenhum argumento para especificar o nome da tabela que
criado quando um arquivo XML importado; Ele vem como o nome
armazenadas no arquivo XML (normalmente o arquivo nome do XML), possivelmente com
um nmero adicionado em.
DoCmd.Rename newname: = strTable, objecttype: = _ acTable,
OldName: = strHTMLXMLFile
Atribua o formulrio apropriado como o objeto de origem do subformulrio.
Me![subNewJobs].SourceObject = \"fsubNewJobs\"
End Select
ErrorHandlerExit:
Exit Sub
ErrorHandler:
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End Sub
Exportar HTML e arquivos XML
Se voc deseja experimentar com exportao de dados de acesso para arquivos HTML ou XML, tente o trabalho de exportao
Dados de formulrio HTML ou arquivo XML. Se voc selecionar a opo \"Exportar HTML ou XML dados\" sobre a
menu principal (Ver Figura 10.10) e clique no boto sua esquerda, os dados de emprego exportar para HTML ou
341
Trabalhando com dados externos
10
15_047026 ch10.qxp 02\/04\/07 21:52 pgina 341
Formato de arquivo XML (frmExportHTMLXMLData) vai abrir (como mostrado na Figura 10,26). Tem a forma
De caixas de texto data e a data para especificar um intervalo de datas; clicando em \"verificar novos postos de trabalho para
Exportar \"carrega o subformulrio com os registros de intervalo de datas selecionado.
FIGURA 10,26
Inspecionar os registros de emprego filtrados para exportar para um arquivo HTML ou XML.
Clicando no boto \"Exportar empregos para HTML File\" (ou \"Exportar empregos para arquivo de XML\"; as mudanas de legenda
com a seleo do grupo de opo de \"Tipo de arquivo de exportao\") comea a exportao. A exportao HTML feita
com o TransferText mtodo com o acExportHTML valor para oTransferType argumen-
mento; a exportao XML feita com o ExportXML mtodo de acesso Aplicativo objeto.
Figura 10.27 mostra um arquivo HTML exportado aberto no Internet Explorer 7. Infelizmente, com-
pletamente no formatado e, assim, provavelmente no muito til.
342
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
15_047026 ch10.qxp 02\/04\/07 21:52 pgina 342
FIGURA 10.27
Um arquivo HTML exportado aberto no Internet Explorer.
O cdigo de limpeza de dados antigos e inspecionar os postos de trabalho para exportar semelhante ao cdigo para outro
tipos de exportao; somente o procedimento de evento para o boto \"Exportar empregos para HTML\/XML File\" listado como
Segue-se; Ele usa um Select Case instruo para exportar os dados para um arquivo de HTML (usando o
TransferText mtodo) ou um XML arquivo, usando o ExportXML mtodo de acesso
Objeto Application:
Private Sub cmdExportJobs_Click()
No erro GoTo ErrorHandler
Dim intFileType As Integer
Dim strQuery As String
Dim strTitle As String
Dim strPrompt As String
Dim strOutputPath As String
Dim strFileName As String
Dim strFileNameAndPath As String
intFileType = Nz (Me! [fraFileType].Valor, 1)
strQuery = \"qryFilteredJobs\"
343
Trabalhando com dados externos
10
15_047026 ch10.qxp 02\/04\/07 21:52 pgina 343
strOutputPath = GetOutputDocsPath()
Selecione o caso intFileType
Caso 1
HTML
strFileName = \"Jobs.htm\"
strFileNameAndPath = strOutputPath
DoCmd.TransferText transfertype: = acExportHTML, _
TableName: = strQuery, _
FileName: = strFileNameAndPath, _
hasfieldnames: = True
Caso 2
XML
strFileName = \"Jobs.xml\"
strFileNameAndPath = strOutputPath
Objecttype ExportXML: = acExportQuery, _
DataSource: = strQuery, _
DataTarget: = strFileNameAndPath
End Select
strTitle = \"Exportar empregos\"
strPrompt = \"Exportou empregos filtrados para\"
MsgBox strPrompt, vbInformation + vbOKOnly, strTitle
ErrorHandlerExit:
Exit Sub
ErrorHandler:
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End Sub
Se voc abrir um arquivo XML no IE 7, rodando em Windows Vista, voc ver uma barra amarela com uma segurana
aviso. Se voc clicar na barra voc pode selecionar para permitir o contedo bloqueado, como mostrado na Figura 10.28.
344
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
15_047026 ch10.qxp 02\/04\/07 21:52 pgina 344
FIGURA 10.28
Um aviso de segurana ao abrir um arquivo XML no Windows Vista.
Se voc selecionar permitir contedo bloqueado, voc ter um outro aviso de segurana, mostrada na Figura 10.29.
Finalmente, o XML do arquivo exibe (Ver Figura 10.30), mas como cdigo-fonte, no um corretamente formatado doc -
cumento, ento (como o arquivo HTML) no muito til.
FIGURA 10.29
Outro aviso de segurana do Vista.
345
Trabalhando com dados externos
10
15_047026 ch10.qxp 02\/04\/07 21:52 pgina 345
FIGURA 10.30
Um arquivo XML aberto no Internet Explorer.
Voc tambm pode abrir um arquivo XML no Excel. Depois de selecion-lo, voc recebe uma caixa de dilogo Open XML com trs
opes, como mostrado na Figura 10,31. Para ver o que se parece com os dados XML formatados, selecione \"como
opo de uma tabela XML\".
FIGURA 10,31
Trs opes para abrir um arquivo XML no Excel.
346
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
15_047026 ch10.qxp 02\/04\/07 21:52 pgina 346
Se voc aceitar a opo padro de \"Como uma tabela XML\", receber a mensagem mostrada na Figura 10.32.
FIGURA 10.32
Ao abrir um arquivo XML no Excel, criar um esquema XML.
Depois de receber esta mensagem, o arquivo XML finalmente abre no Excel, conforme 10.33, com um extra
coluna chamada \"gerado\" que indica o tempo em que o arquivo foi criado.
FIGURA 10.33
Um arquivo XML aberto no Excel.
Se voc quiser exportar dados do Access para o Excel, eu recomendo usar a planilha ou
formato delimitado por vrgula em vez de XML; eles so muito mais fceis de trabalhar, e
suporte a verses anteriores do Excel que no possvel abrir arquivos XML.
Voc tambm pode usar o mtodo Save de um conjunto de registros ADO com o
adPersistXML
denominado constante como o valor de sua
PersistFormat
argumento, para produzir um arquivo XML,
mas um arquivo produzido usando esse mtodo tambm abre como cdigo-fonte.
NOTA NOTA
NOTA NOTA
347
Trabalhando com dados externos
10
15_047026 ch10.qxp 02\/04\/07 21:52 pgina 347
Enviando arquivos de texto exportado
Uma vez que voc tiver criado arquivos de texto de seus dados de acesso, talvez queira envi-las para outros
quem precisa de rever os dados. Clicando no boto de \"Enviar trabalho listas de contatos\" abre um formulrio
(mostrado na Figura 10-34) onde voc pode selecionar vrios contatos e um arquivo de trabalho (. csv ou. txt)
para enviar como um anexo para os contatos selecionados. A figura tambm mostra trs mensagens de e-mail com
o anexo de arquivo de trabalho selecionado.
FIGURA 10.34
Um formulrio para seleo de contatos e um arquivo de trabalho para email a eles, com trs mensagens de e-mail, criado a partir de
o formulrio.
O procedimento de evento cmdMergetoEMailMulti_Click listado abaixo:
Private Sub cmdMergetoEMailMulti_Click()
No erro GoTo ErrorHandler
Dim strJobFile As String
Conjunto lst = Me![lstSelectContacts]
348
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
15_047026 ch10.qxp 02\/04\/07 21:52 pgina 348
Verifique que foi selecionado pelo menos um contato.
Se lst.ItemsSelected.Count = 0 Then
MsgBox \"Por favor seleccione pelo menos um contato\"
LST.SetFocus
GoTo ErrorHandlerExit
End If
Teste para campos obrigatrios.
strSubject = Me![txtSubject].Valor
Se strSubject = \"\", em seguida,
MsgBox \"digite um assunto\"
Me![txtSubject].SetFocus
GoTo ErrorHandlerExit
End If
strBody = Me![txtBody].Valor
Se strBody = \"\", em seguida,
MsgBox \"digite um corpo da mensagem\"
Me![txtBody].SetFocus
GoTo ErrorHandlerExit
End If
Para cada varItem no lst.ItemsSelected
Verificar endereo de e-mail.
strEMailRecipient = Nz (lst.Coluna (1, varItem))
Debug. Print \"endereo de E-mail:\"
Se strEMailRecipient = \"\", em seguida,
GoTo NextContact
End If
strJobFile = Nz (Me! [txtJobFile])
Criar uma nova mensagem de email com o anexo de arquivo de trabalho e enviar para entrar em contato.
Conjunto appOutlook = GetObject (, \"Outlook. Application\")
Set msg = appOutlook.CreateItem(olMailItem)
Com msg
.A = strEMailRecipient
.Assunto = strSubject
.Corpo = strBody
Se strJobFile <>\"\" ento
.Attachments.Add strJobFile
End If
.Exposio
Terminar com
349
Trabalhando com dados externos
10
15_047026 ch10.qxp 02\/04\/07 21:52 pgina 349
NextContact:
Prxima varItem
ErrorHandlerExit:
Conjunto appOutlook = Nothing
Exit Sub
ErrorHandler:
Outlook no est em execuo; Abra Outlook com CreateObject.
Se Err. Number = 429 ento
Conjunto appOutlook = CreateObject
Retomar em seguida
Outra coisa
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End If
End Sub
Voc pode ter contatos que tm apenas um endereo de e-mail, ou uma frase como \"Assistncia tcnica\"
entrou como o sobrenome, ou contatos com apenas um nome, ou um nome inteiro entrou
para o campo Sobrenome, ou conjuntos de contatos que trabalham para a mesma empresa, onde a empresa
nome inserido diferentemente em diferentes registros de contatos. Importao de tais contatos pode causar
problemas, como a criao de vrios registros de empresa com variaes de um nome de empresa.
Estou planejando atualizar o banco de dados de sincronizao de contatos para lidar com vrios tipos de problema
dados e adicionar alguns novos recursos; Procure uma verso atualizada do banco de dados no meu site,
http:\/\/www.helenfeddema.com
.
Resumo
Este captulo tratou de exportar para e importar de, uma variedade de arquivo formatos, que vo desde o
formatos mais antigos para aqueles to novos que so pouco teis ainda. Arquivos de texto, ambos comma-delimited
e largura fixa (colunar), tm sido utilizados para dados de exportao e importao desde os primeiros dias de
computadores e eles ainda so muito teis, especialmente o formato de arquivo delimitado por vrgula. Arquivos
exportados para esse formato, que pode ser importado por um grande muitas aplicaes, que o torna muito til
para exportar os dados para ser importado por um aplicativo que no diretamente suportado como um acesso
tipo de exportao. O inverso tambm verdadeiro: muitos aplicativos podem exportar seus dados para uma largura fixa ou
arquivo delimitado por vrgula, da qual eles podem ser importados para tabelas do Access.
Se voc tiver dados no antigo dBASE, Paradox, ou arquivos do Lotus, acesso oferece opes para a importao de
esses arquivos, assim voc pode obter seus dados antigos em tabelas do Access. Embora no seja provvel que seja necessrio
nos dias de hoje, voc tambm pode exportar dados de tabelas do Access para esses formatos legados.
E finalmente, os novos formatos HTML e XML so suportados, mas no muito bem. Estes importao e
tipos de exportao ainda tem pouca utilidade para importar dados em tabelas do Access, ou porque eles simplesmente
no funcionam ou porque eles no so realmente relevantes. Felizmente, esses formatos de arquivo ser melhor sup-
portado para acesso importao e exportao em futuras verses do Office.
NOTA NOTA
350
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
15_047026 ch10.qxp 02\/04\/07 21:52 pgina 350
F
ou muito tempo realmente, desde o Office 97, quando foi introduzido o Outlook
Eu queria escrever cdigo VBA para sincronizar contatos de acesso
com contatos do Outlook. Meu contatos so armazenados em um conjunto de acesso ligados
tabelas, com empresas ligadas a contatos e contatos ligados aos endereos,
nmeros de telefone e identificaes de vrios tipos, que permite a mxima flexibilidade
para entrada de dados e, ao mesmo tempo evita a necessidade de inserir os mesmos dados
em vrios registros. Outlook, por outro lado, tem uma muito atraente e
interface conveniente para inserir dados de contato, mas infelizmente armazena todas as
dados de contato no banco de dados MAPI arquivo simples, com um nmero limitado de campos para
endereos, nmeros de telefone e IDs.
Embora no seja difcil escrever cdigo para simplesmente importar dados do Outlook para
uma tabela do Access ou exportar dados de um acesso tabela contatos do Outlook, se
os contatos de acesso so um conjunto de tabelas vinculadas, como deveriam ser, a tarefa
muito mais difcil, mas no impossvel. Vinculao ao vivo est fora o ques-
o, por causa da diferena de estrutura entre uma pasta do Outlook con-
Tatos e um conjunto de associados tabelas do Access, mas os contatos podem ser comparados, e
dados copiados a partir de um contato do Outlook para um contato de acesso (ou vice-versa),
usar uma tabela de arquivo simples intermediria preenchido com dados do acesso vinculado
tabelas. Este captulo descreve a tcnica que eu uso para desnormalizar primeiro acesso
dados para comparao com os contatos do Outlook e, em seguida, renormalize o
dados atualizados a fim de escrev-lo de volta para as tabelas vinculadas do Access.
Consulte a seo \"Trabalhando com contatos do Outlook\"
Captulo 8 para obter informaes sobre o intercmbio de dados entre um
tabela de contatos de acesso nica e contatos do Outlook.
REFERNCIA CRUZADA REFERNCIA CRUZADA
351
NESTE CAPTULO
Atualizao de contatos do Outlook
Acesso e vice versa
Copiar anexos de
Outlook para acesso, e
vice-versa
Sincronizando o acesso e
Contatos do Outlook
16_047026 ch11.qxp 02\/04\/07 21:52 pgina 351
Criando uma tabela desnormalizada de
um conjunto de tabelas vinculadas
H situaes onde voc precisa criar uma nica tabela preenchida com dados de um conjunto de vinculado
Tabelas do Access (desnormalizar as tabelas). Uma tal situao a preparao de um arquivo de dados para
importar um mainframe, ou um banco de dados legado ou aplicativo de planilha eletrnica; outra para uso em
Acessar o cdigo do VBA ou por uma consulta.
Denomina-se o processo de criao de uma nica tabela de arquivo simples de dados em um conjunto de tabelas vinculadas
desnormalizao; o processo inverso gravar dados de uma tabela de arquivo simples volta a um conjunto de
lig mesas chamado Renormalizando.
Se voc encontrar uma mensagem de \"Consulta muito complexa\" ao tentar executar uma consulta profundamente aninhada com base
em vrias tabelas (este um problema agora do que com verses anteriores do Access, mas ainda menor
pode acontecer com consultas extremamente complexas), voc pode executar uma consulta criar tabela para criar um arquivo simples
tabela baseada em algumas das consultas vinculadas e uso que de tabela como parte da consulta final, para reduzir sua
complexidade. As tcnicas que eu uso no presente captulo para preparar uma nica tabela de dados do Access para com-
parison com contatos do Outlook pode ser modificado para uso em qualquer lugar que voc precisa para produzir um nico plano-
tabela de arquivos de dados de tabelas vinculadas do Access.
O banco de dados de amostra para este captulo Contacts.accdb de sincronizao.
No acesso, meus dados de contato so armazenados em um conjunto de tabelas vinculadas, conforme as relaes
diagrama (Figura 11.1).
As tabelas so normalizadas, o que significa que eles so projetados para que os dados de um determinado tipo
armazenados em uma nica tabela, e apenas os campos de identificao ligando tm valores correspondentes. O tblCompanyInfo
tabela um-para-muitos vinculado com duas tabelas: tblCompanyIDsPhones e tblContactInfo, porque um
empresa pode ter vrios nmeros de telefone e IDs e tambm vrios contatos. tblContactInfo
tambm ligada a um-para-muitos com duas tabelas: tblContactIDsPhones, contendo nmeros de telefone e
Identificaes para contatos e tblContactAddresses, que contm endereos.
NOTA NOTA
NOTA NOTA
352
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
16_047026 ch11.qxp 02\/04\/07 21:52 pgina 352
FIGURA 11.1
O diagrama de relacionamentos do banco de dados de sincronizao de contatos.
Porque o Outlook s suporta um nmero fixo de endereos e e-mails (trs de cada) e um
maior (17) mas ainda fixa o nmero de nmeros de telefone, para fins de sincronizao de dados de contato
entre o Outlook e acesso, sero apenas os endereos de correspondncia, e-mails e nmeros de telefone
sincronizado. Na prtica, isso no susceptvel de deixar muito dados sincronizados, exceto no caso
nmeros de telefone.
Para obter melhores resultados quando a sincronizao de dados, ao entrar um nmero de telefone ou ID em um
de subformulrios no frmContactInfo, selecione dentre as selees padro para endereos,
e-mails e nmeros de telefone na lista suspensa; eles so as nicas selees que synchro-
galvanizado com itens de contato do Outlook.
A Figura 11.2 mostra um nmero de telefone selecionado no formulrio de informaes de contato (frmContactInfo).
DICA DICA
353
Sincronizando contatos do Outlook e acesso
11
16_047026 ch11.qxp 02\/04\/07 21:52 pgina 353
FIGURA 11.2
Selecionando um tipo de nmero de telefone do padro do formulrio de informaes de contato.
claro, s vezes precisar inserir nmeros de telefone que no esto nesta lista de padro
opes de nmeros de telefone (como mostrado na Figura 11.4 nmero da linha de colheita de caf); possvel
Insira um telefone personalizado ou descrio ID manualmente conforme necessrio, mas esses nmeros de telefone e IDs
no vai ser sincronizado com o Outlook.
354
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
16_047026 ch11.qxp 02\/04\/07 21:52 pgina 354
Figura 11.3 mostra o guia de endereos de contato de forma a obter informaes de contato; a menos que voc precise
inserir dados para pessoas muito ricas que tm mais de trs endereos, as trs opes padro
deve ser o suficiente.
FIGURA 11.3
Selecionando um tipo de endereo para um novo endereo de contato.
A empresa e informaes de contato (frmCompanyInfo) formam a empresa exibe e contato
informaes para que voc facilmente pode igualar-se contatos com suas empresas. Figura 11.4 mostra o
Guia de informaes, desta forma, com um subformulrio empresa IDs e telefones da empresa.
355
Sincronizando contatos do Outlook e acesso
11
16_047026 ch11.qxp 02\/04\/07 21:52 pgina 355
FIGURA 11.4
A guia de informao da empresa da forma empresa e informaes de contato.
Figura 11.5 mostra a guia informaes de contato, com um subformulrio IDs de contato e telefones.
356
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
16_047026 ch11.qxp 02\/04\/07 21:52 pgina 356
FIGURA 11.5
Guia informaes de contato da empresa e informaes de contato de forma.
Menu principal da amostra do banco de dados (mostrado na Figura 11.6) tem um boto de comando para selecionar o
Caminho da pasta de anexos; seu procedimento de evento usa a mesma tcnica quanto ao comando semelhante mas-
toneladas nos captulos anteriores, abrindo uma caixa de dilogo selecionador de pasta Office para que voc selecione uma pasta. No presente
Captulo pasta selecionada usado para armazenar temporariamente os arquivos para uso como anexos ao copiar
anexos de um registro de tabela do Access para um contato do Outlook ou vice-versa.
357
Sincronizando contatos do Outlook e acesso
11
16_047026 ch11.qxp 02\/04\/07 21:52 pgina 357
FIGURA 11.6
O menu principal do banco de dados sincronizao de contatos.
O cdigo para o boto do caminho da pasta de anexos (listado em seguida) inicia, aparecendo um selecionador de pasta
na caixa de dilogo para selecionar a pasta onde so armazenados os arquivos a serem usados como anexos. O caminho selecionado
salvo para a caixa de texto sob o boto de comando:
Private Sub cmdAttachmentsFolderPath_Click()
No erro GoTo ErrorHandler
Crie um objeto FileDialog como uma caixa de dilogo selecionador de pasta.
Definir fd = Application.FileDialog(msoFileDialogFolderPicker)
Conjunto txt = Me![txtOutputDocsPath]
strPath = GetOutputDocsPath()
Com fd
.Title = \"Procurar pasta onde anexos\" _
& should be stored
.ButtonName = \"Selecione\"
.InitialView = msoFileDialogViewDetails
.InitialFileName = strPath
358
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
16_047026 ch11.qxp 02\/04\/07 21:52 pgina 358
Se for.Mostrar = -1 ento
txt.Valor = CStr (fd.SelectedItems.Item(1))
Outra coisa
Debug. Print \"usurio pressionado cancelar\"
End If
Terminar com
Em erro continuar prximo
Chamada acCmdSaveRecord
ErrorHandlerExit:
Exit Sub
ErrorHandler:
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End Sub
Comparando o Outlook e contatos do Access
A caixa de combinao do formulrio selecione no menu principal (Figura 11.7) permite-lhe seleccionar trs formas, duas das
que comparar dados do Access e Outlook. Dentre as formas de comparao de dados classificada por contato
ID e o outro pelo nome do contato (classificao por nome til para correspondncia Access e Outlook
contatos quando o contato do Outlook no tem um valor na propriedade CustomerID).
Itens de contato do Outlook tem um nmero de internos muito til campos de ID, que para alguns
razo inexplicvel no so exibidos no item padro de contato. O CustomerID
campo o que eu uso para vincular contatos do Outlook para registros de acesso em tblContactInfo (usando o campo de chave
ContactID). O campo de GovernmentIDNumber (correspondente a GovernmentID, em tblContactInfo) pode
ser usado para armazenar um nmero de Segurana Social (para os Estados Unidos) ou o ID de governo equivalente
nmero de outros pases. H tambm outro campo til para armazenar um ID empresa:
OrganizationalIDNumber, correspondente a CompanyID em tblCompanyInfo.
Para testar a sincronizao de dados de contactos, faa uma nova pasta de contatos e copiar alguns (ou todos)
contactos-lo da pasta de contactos regular; dessa forma, voc pode experimentar
com fazer vrias mudanas sem bagunar seus dados de contatos real.
DICA DICA
NOTA NOTA
359
Sincronizando contatos do Outlook e acesso
11
16_047026 ch11.qxp 02\/04\/07 21:52 pgina 359
FIGURA 11.7
Selecionar uma forma de comparao entre os contatos do Outlook e acesso.
Quando voc selecionar uma destas formas para abrir, uma caixa de mensagem, mostrada na Figura 11.8, aparece.
FIGURA 11.8
Uma pergunta sobre a abertura de uma forma de comparao.
Voc receber vrias outras mensagens como as tabelas de dados do Access e Outlook so criadas, incluindo
uma caixa de dilogo Selecionar pasta de Outlook para selecionar a pasta de contatos do Outlook para usar quando synchroniz -
ing o acesso e contatos do Outlook. Esta caixa de dilogo mostrada na Figura 11.9.
360
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
16_047026 ch11.qxp 02\/04\/07 21:52 pgina 360
FIGURA 11.9
Uma caixa de dilogo Selecionar pasta de Outlook para selecionar a pasta de contatos para a sincronizao.
Re-criando as tabelas do arquivo simples de acesso
e dados do Outlook
Se voc recentemente inseridos novos dados de contatos ou modificado o registros dos contatos existentes, por acesso em
ou o Outlook, clique em Sim para atualizar os dados nas tabelas que sero comparados. Clicar em Sim chama dois
procedimentos que claro tblOutlookContacts e tblAccessContacts e enchem-los com actualizada
dados. OImportOutlookContacts procedimento (listado em seguida) mais simples: ele copia os dados de todas as
os itens de contato na pasta selecionada para registros em tblOutlookContacts:
Funo pblica ImportOutlookContacts()
' Chamado de cmdForms_Click em fmnuMain
No erro GoTo ErrorHandler
Conjunto appOutlook = GetObject (, \"Outlook. Application\")
Dim fldContacts como Outlook.Folder
Dim con como Outlook.ContactItem
Dim strSQL As String
Dim strTable As String
Conjunto appOutlook = GetObject (, \"Outlook. Application\")
Conjunto nms = appOutlook.GetNamespace(\"MAPI\")
Defina uma varivel para a pasta de contatos para usar durante a sincronizao:
Use as seguintes linhas para importar a pasta de contatos padro local.
' Definir fldContacts = nms.GetDefaultFolder(olFolderContacts)
' GoTo ImportData
361
Sincronizando contatos do Outlook e acesso
11
16_047026 ch11.qxp 02\/04\/07 21:52 pgina 361
Use a seo de cdigo a seguir para permitir a seleo de uma pasta de contatos personalizada da pasta
Caixa de dilogo selecionador.
SelectContactFolder:
Definir fldContacts = nms.PickFolder
Se fldContacts no nada ento
strTitle = \"Selecionar pasta\"
strPrompt = \"Por favor, selecione uma pasta de contatos\"
MsgBox strPrompt, vbExclamation + vbOKOnly, strTitle
GoTo SelectContactFolder
End If
Debug. Print \"padro item tipo:\"
fldContacts.DefaultItemType
Se fldContacts.DefaultItemType olContactItem de <>, em seguida,
MsgBox strPrompt, vbExclamation + vbOKOnly, strTitle
GoTo SelectContactFolder
End If
Debug. Print fldContacts.Items.Count
& fldContacts.Name & folder
Claro a tabela do Outlook dados de registros antigos de contato:
ImportData:
strTable = \"tblOutlookContacts\"
strSQL = \"DELETE * FROM\"
DoCmd.SetWarnings False
StrSQL DoCmd.RunSQL
Conjunto dbs = CurrentDb
Definir rstTarget = dbs.OpenRecordset(strTable)
Iterar atravs de contatos na pasta contatos selecionada e import-los para a tabela de acesso, configurao
cada campo na tabela de destino com o valor de um campo no item contato atual:
Para cada itm em fldContacts.Items
Se itm.Classe = olContact Then
Conjunto con = itm
rstTarget.AddNew
Com con
rstTarget![CdigoDoCliente] = Nz (.CustomerID)
rstTarget![Ttulo] = Nz (.Ttulo)
rstTarget![Nome] = Nz (.FirstName)
rstTarget![MiddleName] = Nz (.MiddleName)
rstTarget![Sobrenome] = Nz (.Sobrenome)
rstTarget![Sufixo] = Nz (.Sufixo)
rstTarget![Nick] = Nz (.Apelido)
rstTarget![CompanyName] = Nz (.CompanyName)
rstTarget![Departamento] = Nz (.Departamento)
rstTarget![JobTitle] = Nz (.JobTitle)
362
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
16_047026 ch11.qxp 02\/04\/07 21:52 pgina 362
rstTarget![BusinessAddressStreet] = _
Nova Zelndia (.BusinessAddressStreet)
rstTarget![BusinessAddressPostOfficeBox] = _
Nova Zelndia (.BusinessAddressPostOfficeBox)
rstTarget![BusinessAddressCity] = _
Nova Zelndia (.BusinessAddressCity)
rstTarget![BusinessAddressState] = _
Nova Zelndia (.BusinessAddressState)
rstTarget![BusinessAddressPostalCode] = _
Nova Zelndia (.BusinessAddressPostalCode)
rstTarget![BusinessAddressCountry] = _
Nova Zelndia (.BusinessAddressCountry)
rstTarget![BusinessHomePage] = _
Nova Zelndia (.BusinessHomePage)
rstTarget![SiteFTP] = Nz (.SiteFTP)
rstTarget![HomeAddressStreet] = _
Nova Zelndia (.HomeAddressStreet)
rstTarget![HomeAddressPostOfficeBox] = _
Nova Zelndia (.HomeAddressPostOfficeBox)
rstTarget![HomeAddressCity] = _
Nova Zelndia (.HomeAddressCity)
rstTarget![HomeAddressState] = _
Nova Zelndia (.HomeAddressState)
rstTarget![HomeAddressPostalCode] = _
Nova Zelndia (.HomeAddressPostalCode)
rstTarget![HomeAddressCountry] = _
Nova Zelndia (.HomeAddressCountry)
rstTarget![OtherAddressStreet] = _
Nova Zelndia (.OtherAddressStreet)
rstTarget![OtherAddressPostOfficeBox] = _
Nova Zelndia (.OtherAddressPostOfficeBox)
rstTarget![OtherAddressCity] = _
Nova Zelndia (.OtherAddressCity)
rstTarget![OtherAddressState] = _
Nova Zelndia (.OtherAddressState)
rstTarget![OtherAddressPostalCode] = _
Nova Zelndia (.OtherAddressPostalCode)
rstTarget![OtherAddressCountry] = _
Nova Zelndia (.OtherAddressCountry)
rstTarget![AssistantTelephoneNumber] = _
Nova Zelndia (.AssistantTelephoneNumber)
rstTarget![BusinessFaxNumber] = _
Nova Zelndia (.BusinessFaxNumber)
rstTarget![BusinessTelephoneNumber] = _
Nova Zelndia (.BusinessTelephoneNumber)
rstTarget![Business2TelephoneNumber] = _
Nova Zelndia (.Business2TelephoneNumber)
rstTarget![CallbackTelephoneNumber] = _
Nova Zelndia (.CallbackTelephoneNumber)
rstTarget![CarTelephoneNumber] = _
Nova Zelndia (.CarTelephoneNumber)
363
Sincronizando contatos do Outlook e acesso
11
16_047026 ch11.qxp 02\/04\/07 21:52 pgina 363
rstTarget![CompanyMainTelephoneNumber] = _
Nova Zelndia (.CompanyMainTelephoneNumber)
rstTarget![HomeFaxNumber] = _
Nova Zelndia (.HomeFaxNumber)
rstTarget![HomeTelephoneNumber] = _
Nova Zelndia (.HomeTelephoneNumber)
rstTarget![Home2TelephoneNumber] = _
Nova Zelndia (.Home2TelephoneNumber)
rstTarget![ISDNNumber] = Nz (.ISDNNumber)
rstTarget![MobileTelephoneNumber] = _
Nova Zelndia (.MobileTelephoneNumber)
rstTarget![OtherFaxNumber] = _
Nova Zelndia (.OtherFaxNumber)
rstTarget![OtherTelephoneNumber] = _
Nova Zelndia (.OtherTelephoneNumber)
rstTarget![PagerNumber] = Nz (.PagerNumber)
rstTarget![PrimaryTelephoneNumber] = _
Nova Zelndia (.PrimaryTelephoneNumber)
rstTarget![RadioTelephoneNumber] = _
Nova Zelndia (.RadioTelephoneNumber)
rstTarget![TTYTDDTelephoneNumber] = _
Nova Zelndia (.TTYTDDTelephoneNumber)
rstTarget![TelexNumber] = Nz (.TelexNumber)
rstTarget![Conta] = Nz (.Conta)
rstTarget![AssistantName] = Nz (.AssistantName)
Use um tratamento especial para um campo de data (a data em branco no Outlook realmente uma data de 1\/1\/4501):
Se for.Aniversrio <>#1\/1\/4501 #, em seguida,
rstTarget![Aniversrio] =.Aniversrio
End If
Se for.Aniversrio <>#1\/1\/4501 #, em seguida,
rstTarget![Aniversrio] =.Aniversrio
End If
Se for.LastModificationTime <>#1\/1\/4501 #, em seguida,
rstTarget![LastUpdated] = _
.LastModificationTime
End If
rstTarget![Categorias] = Nz (.Categorias)
rstTarget![Crianas] = Nz (.Crianas)
rstTarget![PersonalHomePage] = _
Nova Zelndia (.PersonalHomePage)
rstTarget![Email1Address] = Nz (.Email1Address)
rstTarget![Email1DisplayName] = _
Nova Zelndia (.Email1DisplayName)
rstTarget![Email2Address] = Nz (.Email2Address)
rstTarget![Email2DisplayName] = _
Nova Zelndia (.Email2DisplayName)
rstTarget![Email3Address] = Nz (.Email3Address)
rstTarget![Email3DisplayName] = _
364
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
16_047026 ch11.qxp 02\/04\/07 21:52 pgina 364
Nova Zelndia (.Email3DisplayName)
rstTarget![GovernmentIDNumber] = _
Nova Zelndia (.GovernmentIDNumber)
rstTarget![Hobby] = Nz (.Hobby)
rstTarget![ManagerName] = Nz (.ManagerName)
rstTarget![OrganizationalIDNumber] = _
Nova Zelndia (.OrganizationalIDNumber)
rstTarget![Profisso] = Nz (.Profisso)
rstTarget![Cnjuge] = Nz (.Cnjuge)
rstTarget![Pgina Web] = Nz (.Pgina da Web)
rstTarget![IMAddress] = Nz (.IMAddress)
Use um tratamento especial para anexos, chamar outro procedimento:
Se for.Attachments.Count > 0 ento
Definir rstTargetAttachments = _
rstTarget![Anexos].Valor
Chamar CopyOutlookAttsToAccess (con _
rstTargetAttachments)
End If
rstTarget.Update
.Fechar (olSave)
Terminar com
End If
Itm prximo
rstTarget.Close
strTitle = \"Tabela de Outlook criada\"
strPrompt = \"tabela de dados do Outlook Contato (\"_
& strTable _
& ) created and filled with data from the _
& fldContacts.Name & folder
MsgBox strPrompt, vbInformation + vbOKOnly, strTitle
ErrorHandlerExit:
Exit Function
ErrorHandler:
' No est executando o outlook; Abra o Outlook com CreateObject
Se Err. Number = 429 ento
Conjunto appOutlook = CreateObject
Retomar em seguida
Outra coisa
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End If
End Function
365
Sincronizando contatos do Outlook e acesso
11
16_047026 ch11.qxp 02\/04\/07 21:52 pgina 365
Se voc sempre sincronizar seus contatos de acesso para a mesma pasta do Outlook, voc pode
Comente o
SelectContactFolder
segmento de cdigo e inserir um disco rgido-codificado
caminho da pasta em vez disso; Se voc quiser usar a pasta de contatos padro local, basta remover o apstrofo
na linha de
' Definir fldContacts = nms.GetDefaultFolder(olFolderContacts)
e qualquer
Comente ou excluir o
SelectContactFolder
segmento de cdigo.
O outro procedimento, CreateDenormalizedContactsTable , consideravelmente mais complexa,
porque ele deve ter dados de cinco tabelas vinculadas, criando um registro por contato e atualizando seus
campos de tabelas diferentes:
Funo pblica CreateDenormalizedContactsTable()
' Chamado de cmdForms_Click em fmnuMain
No erro GoTo ErrorHandler
Dim lngTargetID como longo
Dim strQueryContacts As String
Dim strQueryContactIDs As String
Dim strQueryCompanyIDs As String
Dim strQueryContactAddresses As String
Dim strTargetCustomerID As String
Conjunto dbs = CurrentDb
strQueryContacts = \"qryAccessContacts\"
strQueryContactIDs = \"qryContactIDsPhones\"
strQueryCompanyIDs = \"qryCompanyIDsPhones\"
strQueryContactAddresses = \"qryContactAddresses\"
Limpar quadros antigos dados.
DoCmd.SetWarnings False
strTable = \"tblAccessContacts\"
strSQL = \"DELETE * FROM\"
StrSQL DoCmd.RunSQL
O conjunto de registros de rstTarget baseia-tblAccessContacts; Esta a tabela a ser preenchida com denormal-
ized dados. rstSource representa a primeira tabela de dados de acesso vinculados, tblContactInfo. Informaes
desta tabela escrito para correspondncia de campos na tabela de destino, com tratamento especial para anexar-
mentos (consulte a seo sobre anexos para obter mais informaes sobre esse tpico):
Definir rstSource = dbs.OpenRecordset (strQueryContacts _
dbOpenDynaset)
Definir rstTarget = dbs.OpenRecordset (strTable _
dbOpenDynaset)
Fazer enquanto no rstSource.EOF
Criar um registro na tabela de destino, por contacto e escrever a empresa e entre em contato com dados tambm
Crie um registro na tabela de correspondncia por contacto, para uso em comparar os contatos:
DICA DICA
366
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
16_047026 ch11.qxp 02\/04\/07 21:52 pgina 366
rstTarget.AddNew
rstTarget![CdigoDoCliente] = Nz (rstSource!CustomerID)
strTargetCustomerID = rstTarget![CdigoDoCliente]
rstTarget![CompanyName] = _
NZ (rstSource!CompanyName)
rstTarget![Conta] = Nz (rstSource!Conta)
rstTarget![Categorias] = Nz (rstSource!Categorias)
rstTarget![OrganizationalIDNumber] = _
NZ (rstSource!OrganizationalIDNumber)
rstTarget![Pgina Web] = Nz (rstSource!Pgina da Web)
rstTarget![SiteFTP] = Nz (rstSource!SiteFTP)
rstTarget![Ttulo] = Nz (rstSource!Ttulo)
rstTarget![Nome] = Nz (rstSource!FirstName)
rstTarget![MiddleName] = Nz (rstSource!MiddleName)
rstTarget![Sobrenome] = Nz (rstSource!Sobrenome)
rstTarget![Sufixo] = Nz (rstSource!Sufixo)
rstTarget![Nick] = Nz (rstSource!Apelido)
rstTarget![Departamento] = Nz (rstSource!Departamento)
rstTarget![JobTitle] = Nz (rstSource!JobTitle)
rstTarget![AssistantName] = Nz (rstSource!AssistantName)
rstTarget![Aniversrio] = Nz (rstSource!Aniversrio)
rstTarget![Aniversrio] = Nz (rstSource!Aniversrio)
rstTarget![Crianas] = Nz (rstSource!Crianas)
rstTarget![GovernmentIDNumber] = _
NZ (rstSource!GovernmentIDNumber)
rstTarget![Hobby] = Nz (rstSource!Hobby)
rstTarget![ManagerName] = Nz (rstSource!ManagerName)
rstTarget![Profisso] = Nz (rstSource!Profisso)
rstTarget![Cnjuge] = Nz (rstSource!Cnjuge)
Use um tratamento especial para anexos, chamar outro procedimento:
Definir rstSourceAttachments = _
rstSource![Anexos].Valor
Se rstSourceAttachments.RecordCount > 0 ento
Definir rstTargetAttachments = _
rstTarget![Anexos].Valor
Chamar CopyAccessAttsToAccess (rstSourceAttachments _
rstTargetAttachments)
Outra coisa
rstSourceAttachments.Close
End If
rstTarget![LastUpdated] = Nz (rstSource!LastUpdated)
rstTarget.Update
rstSource.MoveNext
Loop
rstSource.Close
367
Sincronizando contatos do Outlook e acesso
11
16_047026 ch11.qxp 02\/04\/07 21:52 pgina 367
O prximo objeto fonte qryContactIDsPhones (consulte a Figura 11.10). Ele tem apenas dois campos, assim
para corresponder aos muitos telefone e campos de ID na tabela de destino, eu criei uma consulta com muitos calculado
campos, um para cada campo de ID em tblAccessContacts ou telefone.
FIGURA 11.10
Um campo calculado que converte um nmero de telefone no tblContactIDsPhones em um valor a ser gravada
tblAccessContacts.
Cada calculado campo retorna um valor para um nmero de telefone ou ID dentre o padro de correspondncia
Telefone do Outlook e ID selees; uma parte do cdigo que funciona com essa consulta est listada abaixo:
Definir rstSource = dbs.OpenRecordset (strQueryContactIDs _
dbOpenDynaset)
Fazer enquanto no rstSource.EOF
Procurar destino registro e atualizar os campos ID de contato e telefone:
strTargetCustomerID = rstSource![CdigoDoCliente]
strSearch = \"[CdigoDoCliente] =\"
& strTargetCustomerID & Chr$(39)
Descomente a linha seguinte para inspecionar a seqncia de caracteres de pesquisa na janela Verificao imediata.
\"Debug. Print\" string de busca: \"
rstTarget.FindFirst strSearch
Se rstTarget.NoMatch = False Then
GoTo NextSourceRecord1
End If
rstTarget.Edit
rstTarget![AssistantTelephoneNumber] = _
NZ (rstSource!AssistantTelephoneNumber)
368
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
16_047026 ch11.qxp 02\/04\/07 21:52 pgina 368
rstTarget![BusinessFaxNumber] = _
NZ (rstSource!BusinessFaxNumber)
rstTarget![BusinessTelephoneNumber] = _
NZ (rstSource!BusinessTelephoneNumber)
rstTarget![Business2TelephoneNumber] = _
NZ (rstSource!Business2TelephoneNumber)
rstTarget![CallbackTelephoneNumber] = _
NZ (rstSource!CallbackTelephoneNumber)
rstTarget![CarTelephoneNumber] = _
NZ (rstSource!CarTelephoneNumber)
rstTarget![HomeFaxNumber] = _
NZ (rstSource!HomeFaxNumber)
rstTarget![HomeTelephoneNumber] = _
NZ (rstSource!HomeTelephoneNumber)
rstTarget![Home2TelephoneNumber] = _
NZ (rstSource!Home2TelephoneNumber)
rstTarget![ISDNNumber] = Nz (rstSource!ISDNNumber)
rstTarget![MobileTelephoneNumber] = _
NZ (rstSource!MobileTelephoneNumber)
rstTarget![OtherFaxNumber] = _
NZ (rstSource!OtherFaxNumber)
rstTarget![OtherTelephoneNumber] = _
NZ (rstSource!OtherTelephoneNumber)
rstTarget![PagerNumber] = Nz (rstSource!PagerNumber)
rstTarget![PrimaryTelephoneNumber] = _
NZ (rstSource!PrimaryTelephoneNumber)
rstTarget![RadioTelephoneNumber] = _
NZ (rstSource!RadioTelephoneNumber)
rstTarget![TTYTDDTelephoneNumber] = _
NZ (rstSource!TTYTDDTelephoneNumber)
rstTarget![TelexNumber] = Nz (rstSource!TelexNumber)
rstTarget![Email1Address] = _
NZ (rstSource!Email1Address)
rstTarget![Email1DisplayName] = _
NZ (rstSource!Email1DisplayName)
rstTarget![Email2Address] = _
NZ (rstSource!Email2Address)
rstTarget![Email2DisplayName] = _
NZ (rstSource!Email2DisplayName)
rstTarget![Email3Address] = _
NZ (rstSource!Email3Address)
rstTarget![Email3DisplayName] = _
NZ (rstSource!Email3DisplayName)
rstTarget![IMAddress] = Nz (rstSource!IMAddress)
rstTarget![PersonalHomePage] = _
NZ (rstSource!PersonalHomePage)
rstTarget.Update
369
Sincronizando contatos do Outlook e acesso
11
16_047026 ch11.qxp 02\/04\/07 21:52 pgina 369
NextSourceRecord1:
rstSource.MoveNext
Loop
rstSource.Close
Telefones de empresa e IDs so tratados da mesma forma; apenas um valor possvel (telefone de empresa) syn-
chronized, porque esse o nico que corresponde a um campo no Outlook:
Definir rstSource = dbs.OpenRecordset (strQueryCompanyIDs _
dbOpenDynaset)
Fazer enquanto no rstSource.EOF
Procurar destino registro e atualizar o campo telefone da empresa.
strTargetCustomerID = rstSource![CdigoDoCliente]
strSearch = \"[CdigoDoCliente] =\"
& strTargetCustomerID & Chr$(39)
\"Debug. Print\" string de busca: \"
rstTarget.FindFirst strSearch
rstTarget.Edit
rstTarget![CompanyMainTelephoneNumber] = _
NZ (rstSource!CompanyMainTelephoneNumber)
rstTarget.Update
NextSourceRecord2:
rstSource.MoveNext
Loop
rstSource.Close
Finalmente, endereos de contato esto em tratamento, usando uma consulta que converte cada campo de endereo para o
adequado campo de endereo comercial, casa ou outros na tabela de destino. Figura 11.11 mostra um dos
os campos calculados nesta consulta.
370
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
16_047026 ch11.qxp 02\/04\/07 21:52 pgina 370
FIGURA 11.11
Um campo calculado consulta que converte StreetAddress para BusinessAddressStreet.
O conjunto de registros de rstSource ento selecionado, baseado em uma consulta que seleciona entre em contato endereos; o cdigo parece
para um registro de destino correspondente, e se ele for encontrado, ele atualizado com informaes do conjunto de registros:
Definir rstSource = _
DBS.OpenRecordset (strQueryContactAddresses _
dbOpenDynaset)
Fazer enquanto no rstSource.EOF
strTargetCustomerID = rstSource![CdigoDoCliente]
strSearch = \"[CdigoDoCliente] =\"
& strTargetCustomerID & Chr$(39)
\"Debug. Print\" string de busca: \"
rstTarget.FindFirst strSearch
rstTarget.Edit
rstTarget![BusinessAddressStreet] = _
NZ (rstSource!BusinessAddressStreet)
rstTarget![BusinessAddressPostOfficeBox] = _
NZ (rstSource!BusinessAddressPostOfficeBox)
rstTarget![BusinessAddressCity] = _
NZ (rstSource!BusinessAddressCity)
rstTarget![BusinessAddressState] = _
NZ (rstSource!BusinessAddressState)
rstTarget![BusinessAddressPostalCode] = _
NZ (rstSource!BusinessAddressPostalCode)
rstTarget![BusinessAddressCountry] = _
NZ (rstSource!BusinessAddressCountry)
371
Sincronizando contatos do Outlook e acesso
11
16_047026 ch11.qxp 02\/04\/07 21:52 pgina 371
rstTarget![HomeAddressStreet] = _
NZ (rstSource!HomeAddressStreet)
rstTarget![HomeAddressPostOfficeBox] = _
NZ (rstSource!HomeAddressPostOfficeBox)
rstTarget![HomeAddressCity] = _
NZ (rstSource!HomeAddressCity)
rstTarget![HomeAddressState] = _
NZ (rstSource!HomeAddressState)
rstTarget![HomeAddressPostalCode] = _
NZ (rstSource!HomeAddressPostalCode)
rstTarget![HomeAddressCountry] = _
NZ (rstSource!HomeAddressCountry)
rstTarget![OtherAddressStreet] = _
NZ (rstSource!OtherAddressStreet)
rstTarget![OtherAddressPostOfficeBox] = _
NZ (rstSource!OtherAddressPostOfficeBox)
rstTarget![OtherAddressCity] = _
NZ (rstSource!OtherAddressCity)
rstTarget![OtherAddressState] = _
NZ (rstSource!OtherAddressState)
rstTarget![OtherAddressPostalCode] = _
NZ (rstSource!OtherAddressPostalCode)
rstTarget![OtherAddressCountry] = _
NZ (rstSource!OtherAddressCountry)
rstTarget.Update
NextSourceRecord3:
rstSource.MoveNext
Loop
strTitle = \"Acesso a tabela criada\"
strPrompt = \"desnormalizada tabela de dados de acesso (\"_
& strTable & ) created
MsgBox strPrompt, vbInformation + vbOKOnly _
strTitle
ErrorHandlerExit:
rstSource.Close
rstTarget.Close
Exit Function
ErrorHandler:
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End Function
372
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
16_047026 ch11.qxp 02\/04\/07 21:52 pgina 372
As duas tabelas (tblOutlookContacts e tblAccessContacts) tm correspondncia de campos; elas so exibidas
em subformulrios sobre as duas formas usadas para comparar o Access e o Outlook dados de contato. Figura 11.12
mostra o formulrio que compara contatos por ID de contato (frmCompareContactsByID), com dados de
um contato de acesso esquerda e o contato correspondente do Outlook (se houver) direita.
FIGURA 11.12
Um formulrio que compara os contatos do Outlook e acesso por ContactID.
Figura 11.13 mostra a forma que compara contatos por nome.
373
Sincronizando contatos do Outlook e acesso
11
16_047026 ch11.qxp 02\/04\/07 21:52 pgina 373
FIGURA 11.13
Um formulrio que compara os contatos do Outlook e acesso por nome.
Copiando dados de contato do Access para Outlook
(ou vice-versa)
A caixa de combinao selecione contato no canto superior esquerdo permite que voc selecione um contato, classificados por ID de contato.
Figura 11.14 mostra a caixa de combinao com a sua lista, caiu para baixo.
Caixa de combinao selecione a ao no lado direito do cabealho do formulrio mostrado na Figura 11.11
oferece um conjunto diferente de opes, dependendo se os contatos do Outlook e acesso so identi-
cal, diferente, ou um est faltando, como mostrado na tabela 11.1.
374
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
16_047026 ch11.qxp 02\/04\/07 21:52 pgina 374
FIGURA 11.14
Selecionando um contato por contato ID.
TABELA 11.1
Entre em contato com Status de partida e aes para selecionar
Entre em contato com a Status Aes disponveis
Contatos do Outlook e acesso so idnticos Ir para em seguida entrar em contato com a record
Contato de marca para excluso
Copie todos os contatos do Access para Outlook
Copie todos os contatos do Outlook para acesso
Contatos do Outlook e acesso so diferentes Modificar acesso contato para combinar o contato do Outlook
Modificar o contato do Outlook para coincidir com o contato de acesso
Ir para em seguida entrar em contato com a record
Contato de marca para excluso
Copie todos os contatos do Access para Outlook
Copie todos os contatos do Outlook para acesso
Nenhum contato do Outlook Criar novo contato do Outlook para coincidir com o contato de acesso
Ir para em seguida entrar em contato com a record
Contato de marca para excluso
Copie todos os contatos do Access para Outlook
Copie todos os contatos do Outlook para acesso
Nenhum contato de acesso Criar novo contato acesso para coincidir com o contato do Outlook
Ir para em seguida entrar em contato com a record
Contato de marca para excluso
Copie todos os contatos do Access para Outlook
Copie todos os contatos do Outlook para acesso
375
Sincronizando contatos do Outlook e acesso
11
16_047026 ch11.qxp 02\/04\/07 21:52 pgina 375
Para copiar dados de um campo, em vez de atualizar todo um registro de contato, selecione por \"acesso para
Outlook\"ou\"Outlook para acesso\"na caixa de combinao no centro da seo copiar dados de campo da
formulrio, conforme mostrado na Figura 11.15, onde o valor \"Vice-presidente\" no registro de contato de acesso
sendo substitudo por \"vice-presidente snior\" no registro do Outlook. Voc tambm pode digitar novos dados,
ou editar os dados existentes, conforme necessrio, antes de copiar o registro.
FIGURA 11.15
Copiando dados de um nico campo do Outlook para acesso.
Se voc quiser remover completamente um contato, selecione \"Mark registro para excluso\" e ele sero excludos
Quando os contatos esto atualizados. Quando tiver terminado a cpia, edio e marcao registros para
excluso, o boto de \"Atualizar informaes de contato\" no menu principal oferece-lhe uma escolha de actua-
ing o acesso contatos primeiro e depois os contatos do Outlook. Todos os dados (incluindo anexos, se houver)
de tblOutlookContacts ser copiado para os contatos na pasta contatos selecionada, criando
novos contatos conforme necessrio. O procedimento atualiza os contatos do Outlook listado aqui:
Public Sub UpdateAllOutlookContacts()
' Chamado de cmdUpdateContactInfo_Click() em fmnuMain
No erro GoTo ErrorHandler
Conjunto appOutlook = GetObject (, \"Outlook. Application\")
Conjunto nms = appOutlook.GetNamespace(\"MAPI\")
strTable = \"tblOutlookContacts\"
Conjunto dbs = CurrentDb
Definir rstSource = _
DBS.OpenRecordset (strTable, dbOpenDynaset)
376
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
16_047026 ch11.qxp 02\/04\/07 21:52 pgina 376
Voc pode usar as seguintes linhas para exportar para a pasta de contatos padro local ou um disco rgido-codificado
pasta de sua escolha. Para usar a pasta de contatos padro, basta remover o apstrofo no incio-
Ning da prxima linha (isto chamado eliminar o comentrio uma linha de cdigo, porque o apstrofo na frente do
a linha transforma-lo em um comentrio); para usar uma pasta personalizada embutido, digite seu nome.
' Definir fldContacts = nms.GetDefaultFolder(olFolderContacts)
' GoTo UpdateContacts
Use a seo de cdigo a seguir para permitir a seleo de uma pasta de contatos personalizada da pasta
Caixa de dilogo selecionador:
SelectContactFolder:
Em erro continuar prximo
Definir fldContacts = nms.PickFolder
Se fldContacts no nada ento
strTitle = \"Selecionar pasta\"
strPrompt = \"Por favor, selecione uma pasta de contatos\"
MsgBox strPrompt, vbExclamation + vbOKOnly, strTitle
GoTo SelectContactFolder
End If
Debug. Print \"padro item tipo:\" _
& fldContacts.DefaultItemType
Se fldContacts.DefaultItemType olContactItem de <>, em seguida,
MsgBox strPrompt, vbExclamation + vbOKOnly _
strTitle
GoTo SelectContactFolder
End If
UpdateContacts:
Fazer enquanto no rstSource.EOF
Procurar cada contato na pasta contatos selecionada no caso ele j existe e definir uma referncia a ele,
Pesquisar primeiro por CustomerID e, em seguida, por nome e sobrenome (contatos do Outlook podem no ter um
valor da propriedade de CustomerID):
strCustomerID = Nz (rstSource! [CustomerID])
strSearch = \"[CdigoDoCliente] =\"
& strCustomerID & Chr$(39)
Debug. Print \"string de busca:\"
blnDelete = rstSource![Apagar]
Busca por CustomerID.
Conjunto con = fldContacts.Items.Find(strSearch)
Se TypeName(con) = \"Nada\", em seguida,
Debug. Print \"cliente ID\"
& not found in & fldContacts.Name & folder
strFirstName = Nz (rstSource! [FirstName])
strLastName = Nz (rstSource! [LastName])
strSearch = \"[nome] =\"
377
Sincronizando contatos do Outlook e acesso
11
16_047026 ch11.qxp 02\/04\/07 21:52 pgina 377
& strFirstName & Chr$(39) _
& And [LastName] = & Chr$(39) _
& strLastName & Chr$(39)
\"Debug. Print\" string de busca: \"
Pesquisar por nome.
Conjunto con = fldContacts.Items.Find(strSearch)
Se TypeName(con) = \"Nada\", em seguida,
Debug. Print \"Nome do contato\"
& & strLastName & not found in _
& fldContacts.Name & folder
Crie novo item de contato.
Debug. Print \"Criar novo item de contato com\" _
& CustomerID & strCustomerID
Se blnDelete = False Then
Conjunto con = fldContacts.Items.Add
Outra coisa
GoTo NextSourceRecord
End If
Outra coisa
_ Debug. Print \"Found nome do contato\"
& strFirstName _
& & strLastName
Se blnDelete = True Then
con.Excluir
GoTo NextSourceRecord
End If
End If
Outra coisa
Debug. Print \"Encontrado o ID de cliente\" _
& strCustomerID
Se blnDelete = True Then
con.Excluir
GoTo NextSourceRecord
End If
End If
Atualize item de contato com os valores dos controles no subformulrio Outlook:
No erro GoTo ErrorHandler
con.CustomerID = Nz (rstSource! [CustomerID])
con.Ttulo = Nz (rstSource! [Ttulo])
con.FirstName = Nz (rstSource! [FirstName])
con.MiddleName = Nz (rstSource! [MiddleName])
con.LastName = Nz (rstSource! [LastName])
con.Sufixo = Nz (rstSource! [Sufixo])
con.Alcunha = Nz (rstSource! [Nick])
378
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
16_047026 ch11.qxp 02\/04\/07 21:52 pgina 378
con.CompanyName = Nz (rstSource! [CompanyName])
con.Departamento = Nz (rstSource! [Departamento])
con.JobTitle = Nz (rstSource! [JobTitle])
con.BusinessAddressStreet = _
Nova Zelndia (rstSource! [BusinessAddressStreet])
con.BusinessAddressPostOfficeBox = _
Nova Zelndia (rstSource! [BusinessAddressPostOfficeBox])
con.BusinessAddressCity = _
Nova Zelndia (rstSource! [BusinessAddressCity])
con.BusinessAddressState = _
Nova Zelndia (rstSource! [BusinessAddressState])
con.BusinessAddressPostalCode = _
Nova Zelndia (rstSource! [BusinessAddressPostalCode])
con.BusinessAddressCountry = _
Nova Zelndia (rstSource! [BusinessAddressCountry])
con.BusinessHomePage = _
Nova Zelndia (rstSource! [BusinessHomePage])
con.SiteFTP = Nz (rstSource! [SiteFTP])
con.HomeAddressStreet = _
Nova Zelndia (rstSource! [HomeAddressStreet])
con.HomeAddressPostOfficeBox = _
Nova Zelndia (rstSource! [HomeAddressPostOfficeBox])
con.HomeAddressCity = _
Nova Zelndia (rstSource! [HomeAddressCity])
con.HomeAddressState = _
Nova Zelndia (rstSource! [HomeAddressState])
con.HomeAddressPostalCode = _
Nova Zelndia (rstSource! [HomeAddressPostalCode])
con.HomeAddressCountry = _
Nova Zelndia (rstSource! [HomeAddressCountry])
con.OtherAddressStreet = _
Nova Zelndia (rstSource! [OtherAddressStreet])
con.OtherAddressPostOfficeBox = _
Nova Zelndia (rstSource! [OtherAddressPostOfficeBox])
con.OtherAddressCity = _
Nova Zelndia (rstSource! [OtherAddressCity])
con.OtherAddressState = _
Nova Zelndia (rstSource! [OtherAddressState])
con.OtherAddressPostalCode = _
Nova Zelndia (rstSource! [OtherAddressPostalCode])
con.OtherAddressCountry = _
Nova Zelndia (rstSource! [OtherAddressCountry])
con.AssistantTelephoneNumber = _
Nova Zelndia (rstSource! [AssistantTelephoneNumber])
con.BusinessFaxNumber = _
Nova Zelndia (rstSource! [BusinessFaxNumber])
con.BusinessTelephoneNumber = _
Nova Zelndia (rstSource! [BusinessTelephoneNumber])
con.Business2TelephoneNumber = _
Nova Zelndia (rstSource! [Business2TelephoneNumber])
379
Sincronizando contatos do Outlook e acesso
11
16_047026 ch11.qxp 02\/04\/07 21:52 pgina 379
con.CallbackTelephoneNumber = _
Nova Zelndia (rstSource! [CallbackTelephoneNumber])
con.CarTelephoneNumber = _
Nova Zelndia (rstSource! [CarTelephoneNumber])
con.CompanyMainTelephoneNumber = _
Nova Zelndia (rstSource! [CompanyMainTelephoneNumber])
con.HomeFaxNumber = Nz (rstSource! [HomeFaxNumber])
con.HomeTelephoneNumber = _
Nova Zelndia (rstSource! [HomeTelephoneNumber])
con.Home2TelephoneNumber = _
Nova Zelndia (rstSource! [Home2TelephoneNumber])
con.ISDNNumber = Nz (rstSource! [ISDNNumber])
con.MobileTelephoneNumber = _
Nova Zelndia (rstSource! [MobileTelephoneNumber])
con.OtherFaxNumber = Nz (rstSource! [OtherFaxNumber])
con.OtherTelephoneNumber = _
Nova Zelndia (rstSource! [OtherTelephoneNumber])
con.PagerNumber = Nz (rstSource! [PagerNumber])
con.PrimaryTelephoneNumber = _
Nova Zelndia (rstSource! [PrimaryTelephoneNumber])
con.RadioTelephoneNumber = _
Nova Zelndia (rstSource! [RadioTelephoneNumber])
con.TTYTDDTelephoneNumber = _
Nova Zelndia (rstSource! [TTYTDDTelephoneNumber])
con.TelexNumber = Nz (rstSource! [TelexNumber])
con.Conta = Nz (rstSource! [Conta])
con.AssistantName = Nz (rstSource! [AssistantName])
con.Categorias = Nz (rstSource! [Categorias])
con.Crianas = Nz (rstSource! [Crianas])
con.PersonalHomePage = _
Nova Zelndia (rstSource! [PersonalHomePage])
con.Email1Address = Nz (rstSource! [Email1Address])
con.Email1DisplayName = _
Nova Zelndia (rstSource! [Email1DisplayName])
con.Email2Address = Nz (rstSource! [Email2Address])
con.Email2DisplayName = _
Nova Zelndia (rstSource! [Email2DisplayName])
con.Email3Address = Nz (rstSource! [Email3Address])
con.Email3DisplayName = _
Nova Zelndia (rstSource! [Email3DisplayName])
con.GovernmentIDNumber = _
Nova Zelndia (rstSource! [GovernmentIDNumber])
con.Passatempo = Nz (rstSource! [Passatempo])
con.ManagerName = Nz (rstSource! [ManagerName])
con.OrganizationalIDNumber = _
Nova Zelndia (rstSource! [OrganizationalIDNumber])
con.Profisso = Nz (rstSource! [Profisso])
con.Cnjuge = Nz (rstSource! [Cnjuge])
con.Web page = Nz (rstSource! [Web page])
con.IMAddress = Nz (rstSource! [IMAddress])
380
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
16_047026 ch11.qxp 02\/04\/07 21:52 pgina 380
Use a manipulao de data especial (uma data em branco no Outlook realmente uma data de 1\/1\/4501):
Se Nz (rstSource! [Aniversrio]) <>\"\" ento
con.Aniversrio = Nz (rstSource! [Aniversrio])
Outra coisa
con.Aniversrio = #1\/1\/4501 #
End If
Se Nz (rstSource! [Aniversrio]) <>\"\" ento
con.Aniversrio = Nz (rstSource! [Aniversrio])
Outra coisa
con.Aniversrio = #1\/1\/4501 #
End If
Use um tratamento especial para anexos, chamar outro procedimento:
Definir rstSourceAttachments = _
rstSource![Anexos].Valor
Se rstSourceAttachments.RecordCount > 0 ento
Chamar CopyAccessAttsToOutlook (con _
rstSourceAttachments)
Outra coisa
rstSourceAttachments.Close
End If
con.Fechar (olSave)
strFirstName = \"\"
strLastName = \"\"
strCustomerID = \"\"
NextSourceRecord:
rstSource.MoveNext
Loop
strTitle = \"Contatos do Outlook atualizados\"
strPrompt = \"Outlook todos os contatos no\" _
& fldContacts.Name & folder updated
MsgBox strPrompt, vbInformation + vbOKOnly _
strTitle
ErrorHandlerExit:
Exit Sub
ErrorHandler:
' No est executando o outlook; Abra o Outlook com CreateObject
Se Err. Number = 429 ento
Conjunto appOutlook = CreateObject
Retomar em seguida
Outra coisa
MsgBox \"erro nenhum:\"
381
Sincronizando contatos do Outlook e acesso
11
16_047026 ch11.qxp 02\/04\/07 21:52 pgina 381
& ; Description: & Err.Description
Resume ErrorHandlerExit
End If
End Sub
O UpdateAllAccessContacts procedimento tem a tarefa mais complexa da cpia atualizada, con-
dados de tato de tblAccessContacts de volta para as tabelas vinculadas de contatos. Esse procedimento faz o inverso de
o CreateDenormalizedContactsTable procedimento; usando o tblAccessContacts como uma fonte de dados,
ele atualiza os dados de contato vinculados em tblCompanyInfo, tblContactInfo, tblCompanyIDsPhones,
tblContactAddresses e tblContactIDsAndPhones, criando novos registros, conforme necessrio:
Public Sub UpdateAllAccessContacts()
' Chamado de cmdUpdateContactInfo_Click() em fmnuMain
No erro GoTo ErrorHandler
Dim lngContactID como longo
Dim lngCompanyID como longo
Dim strSourceTable As String
Dim strTarget As String
Dim strAddressType As String
Dim strDescription As String
Conjunto dbs = CurrentDb
strSourceTable = \"tblAccessContacts\"
Definir rstSource = dbs.OpenRecordset (strSourceTable _
dbOpenDynaset)
UpdateCompanyInfo:
Fazer enquanto no rstSource.EOF
Debug. Print \"ID de destino de processamento:\" _
& rstSource![TargetID]
Procure o registro da empresa na tabela de destino de correspondncia e atualiz-lo se encontrado; caso contrrio, criar novos
registro da empresa e gravar dados da empresa para ele.
strTarget = \"tblCompanyInfo\"
Definir rstTarget = dbs.OpenRecordset (strTarget _
dbOpenDynaset)
blnDelete = rstSource![Apagar]
Se blnDelete = True Then
Para evitar problemas com a excluso de registros em uma tabela no lado \"um\" de uma relao um-para-muitos,
antes de atualizar as tabelas, o procedimento executado que trs excluir consultas para excluir registros ligados ao con-
Tatos marcados para excluso:
382
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
16_047026 ch11.qxp 02\/04\/07 21:52 pgina 382
Em erro continuar prximo
DoCmd.SetWarnings False
DoCmd.OpenQuery \"qdelContactIDs\"
DoCmd.OpenQuery \"qdelContactAddresses\"
DoCmd.OpenQuery \"qdelContacts\"
GoTo NextSourceRecord
End If
Em seguida, os registros em tblCompanyInfo so atualizados conforme necessrio:
No erro GoTo ErrorHandler
lngCompanyID = Nz (rstSource! [OrganizationalIDNumber])
strSearch = \"[CompanyID] =\"
Debug. Print \"string de busca:\"
rstTarget.FindFirst strSearch
Se rstTarget.NoMatch = True Then
Crie nova empresa registro na tabela de destino.
rstTarget.AddNew
Outra coisa
rstTarget.Edit
End If
rstTarget![CompanyName] = _
NZ (rstSource!CompanyName)
rstTarget![Conta] = Nz (rstSource!Conta)
rstTarget![Categoria] = Nz (rstSource!Categorias)
rstTarget![Site] = Nz (rstSource!Pgina da Web)
rstTarget![SiteFTP] = Nz (rstSource!SiteFTP)
rstTarget![LastUpdated] = agora
rstTarget.Update
rstTarget.Close
Em seguida, os registros em tblContactInfo so atualizados conforme necessrio:
UpdateContactInfo:
Procure o registro de contato na tabela de destino de correspondncia e atualiz-lo se encontrado; caso contrrio, crie um novo
entre em contato com a record e gravar dados de contato para ele:
strTarget = \"tblContactInfo\"
Definir rstTarget = dbs.OpenRecordset (strTarget _
dbOpenDynaset)
strCustomerID = rstSource![CdigoDoCliente]
lngContactID = CLng(strCustomerID)
strSearch = \"[ContactID] =\"
Debug. Print \"string de busca:\"
rstTarget.FindFirst strSearch
Se rstTarget.NoMatch = True Then
383
Sincronizando contatos do Outlook e acesso
11
16_047026 ch11.qxp 02\/04\/07 21:52 pgina 383
Crie um novo contato registro na tabela de destino.
rstTarget.AddNew
rstTarget![CdigoDoCliente] = strCustomerID
rstTarget![ContactID] = CLng(strCustomerID)
Outra coisa
rstTarget.Edit
End If
rstTarget![Prefixo] = Nz (rstSource!Ttulo)
rstTarget![Nome] = Nz (rstSource!FirstName)
rstTarget![MiddleName] = Nz (rstSource!MiddleName)
rstTarget![Sobrenome] = Nz (rstSource!Sobrenome)
rstTarget![Sufixo] = Nz (rstSource!Sufixo)
rstTarget![Nick] = Nz (rstSource!Apelido)
rstTarget![Departamento] = Nz (rstSource!Departamento)
rstTarget![JobTitle] = Nz (rstSource!JobTitle)
rstTarget![AssistantName] = _
NZ (rstSource!AssistantName)
rstTarget![Aniversrio] = Nz (rstSource!Aniversrio)
rstTarget![Aniversrio] = Nz (rstSource!Aniversrio)
rstTarget![Crianas] = Nz (rstSource!Crianas)
rstTarget![GovernmentID] = _
NZ (rstSource!GovernmentIDNumber)
rstTarget![Hobby] = Nz (rstSource!Hobby)
rstTarget![ManagerName] = _
NZ (rstSource!ManagerName)
rstTarget![Profisso] = Nz (rstSource!Profisso)
rstTarget![Cnjuge] = Nz (rstSource!Cnjuge)
rstTarget![LastUpdated] = agora
Tratamento especial para anexos.
Definir rstSourceAttachments = _
rstSource![Anexos].Valor
Se rstSourceAttachments.RecordCount > 0 ento
Definir rstTargetAttachments = _
rstTarget![Anexos].Valor
Chamar CopyAccessAttsToAccess (rstSourceAttachments _
rstTargetAttachments)
Outra coisa
rstSourceAttachments.Close
End If
rstTarget.Update
rstTarget.Close
UpdateContactAddresses:
384
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
16_047026 ch11.qxp 02\/04\/07 21:52 pgina 384
Para atualizar os dados em tblContactAddresses, se houver dados em qualquer um dos campos de endereo de negcios, o
strAddressType varivel definida para o negcio, e o cdigo procura correspondentes registros no
tblContactAddresses. Se nenhum for encontrado, criado um novo registro de endereo; se um registro for encontrado, seu
campos so atualizados de campos apropriados na tblAccessContacts. A casa e o outro endereo
campos so tratados da mesma forma:
strTarget = \"tblContactAddresses\"
Definir rstTarget = dbs.OpenRecordset (strTarget _
dbOpenDynaset)
Atualize informaes de endereo de negcios.
Se Nz (rstSource!BusinessAddressStreet) <>\"\" ou _
NZ (rstSource!BusinessAddressPostOfficeBox) <>\"\" _
Ou Nz (rstSource!BusinessAddressCity) <>\"\" _
Ou Nz (rstSource!BusinessAddressState) <>\"\" _
Ou Nz (rstSource!BusinessAddressPostalCode) <>\"\" _
Ou Nz (rstSource!BusinessAddressCountry) <>\"\" ento
strAddressType = \"Negcio\"
strSearch = \"[ContactID] =\"
& And [AddressType] = & Chr$(39) _
& strAddressType & Chr$(39)
Debug. Print \"string de busca:\"
rstTarget.FindFirst strSearch
Se rstTarget.NoMatch = True Then
Crie um novo registro de endereo de contato na tabela de destino.
rstTarget.AddNew
rstTarget![ContactID] = lngContactID
rstTarget![AddressType] = strAddressType
Outra coisa
rstTarget.Edit
End If
rstTarget![StreetAddress] = _
NZ (rstSource!BusinessAddressStreet)
rstTarget![POBox] = _
NZ (rstSource!BusinessAddressPostOfficeBox)
rstTarget![Cidade] = _
NZ (rstSource!BusinessAddressCity)
rstTarget![StateOrProvince] = _
NZ (rstSource!BusinessAddressState)
rstTarget![CEP] = _
NZ (rstSource!BusinessAddressPostalCode)
rstTarget![Pas] = _
NZ (rstSource!BusinessAddressCountry)
rstTarget.Update
End If
385
Sincronizando contatos do Outlook e acesso
11
16_047026 ch11.qxp 02\/04\/07 21:52 pgina 385
Informao de endereo de casa de atualizao.
Se Nz (rstSource!HomeAddressStreet) <>\"\" _
Ou Nz (rstSource!HomeAddressPostOfficeBox) <>\"\" _
Ou Nz (rstSource!HomeAddressCity) <>\"\" _
Ou Nz (rstSource!HomeAddressState) <>\"\" _
Ou Nz (rstSource!HomeAddressPostalCode) <>\"\" _
Ou Nz (rstSource!HomeAddressCountry) <>\"\" ento
strAddressType = \"Pgina inicial\"
strSearch = \"[ContactID] =\"
& And [AddressType] = & Chr$(39) _
& strAddressType & Chr$(39)
Debug. Print \"string de busca:\"
rstTarget.FindFirst strSearch
Se rstTarget.NoMatch = True Then
Crie um novo registro de endereo de contato na tabela de destino.
rstTarget.AddNew
rstTarget![ContactID] = lngContactID
rstTarget![AddressType] = strAddressType
Outra coisa
rstTarget.Edit
End If
rstTarget![StreetAddress] = _
NZ (rstSource!HomeAddressStreet)
rstTarget![POBox] = _
NZ (rstSource!HomeAddressPostOfficeBox)
rstTarget![Cidade] = _
NZ (rstSource!HomeAddressCity)
rstTarget![StateOrProvince] = _
NZ (rstSource!HomeAddressState)
rstTarget![CEP] = _
NZ (rstSource!HomeAddressPostalCode)
rstTarget![Pas] = _
NZ (rstSource!HomeAddressCountry)
rstTarget.Update
End If
Atualize outras informaes de endereo.
Se Nz (rstSource!OtherAddressStreet) <>\"\" _
Ou Nz (rstSource!OtherAddressPostOfficeBox) <>\"\" _
Ou Nz (rstSource!OtherAddressCity) <>\"\" _
Ou Nz (rstSource!OtherAddressState) <>\"\" _
Ou Nz (rstSource!OtherAddressPostalCode) <>\"\" _
Ou Nz (rstSource!OtherAddressCountry) <>\"\" ento
strAddressType = \"Outros\"
386
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
16_047026 ch11.qxp 02\/04\/07 21:52 pgina 386
strSearch = \"[ContactID] =\"
& And [AddressType] = & Chr$(39) _
& strAddressType & Chr$(39)
Debug. Print \"string de busca:\"
rstTarget.FindFirst strSearch
Se rstTarget.NoMatch = True Then
Crie um novo registro de endereo de contato na tabela de destino.
rstTarget.AddNew
rstTarget![ContactID] = lngContactID
rstTarget![AddressType] = strAddressType
Outra coisa
rstTarget.Edit
End If
rstTarget![StreetAddress] = _
NZ (rstSource!OtherAddressStreet)
rstTarget![POBox] = _
NZ (rstSource!OtherAddressPostOfficeBox)
rstTarget![Cidade] = _
NZ (rstSource!OtherAddressCity)
rstTarget![StateOrProvince] = _
NZ (rstSource!OtherAddressState)
rstTarget![CEP] = _
NZ (rstSource!OtherAddressPostalCode)
rstTarget![Pas] = _
NZ (rstSource!OtherAddressCountry)
rstTarget.Update
End If
rstTarget.Close
UpdateCompanyPhone:
Se houver um valor no registro do telefone da empresa no banco de dados fonte, est escrito a um registro
a tabela de destino (este o nico nmero de telefone da empresa ou ID que pode ser combinado com o Outlook,
assim o nico que sincronizado). Se nenhum for encontrado, um novo registro criado e atualizado
com o nmero de telefone da empresa:
strTarget = \"tblCompanyIDsPhones\"
Definir rstTarget = dbs.OpenRecordset (strTarget _
dbOpenDynaset)
strDescription = \"Telefone de empresa\"
strSearch = \"[CompanyID] =\"
& And [Description] = & Chr$(39) _
& strDescription & Chr$(39)
Debug. Print \"string de busca:\"
rstTarget.FindFirst strSearch
Se rstTarget.NoMatch = True Then
387
Sincronizando contatos do Outlook e acesso
11
16_047026 ch11.qxp 02\/04\/07 21:52 pgina 387
Crie um novo registro de telefone da empresa na tabela de destino.
rstTarget.AddNew
rstTarget![CompanyID] = lngCompanyID
rstTarget![Descrio] = \"Telefone da empresa\"
Outra coisa
rstTarget.Edit
End If
rstTarget![IDOrPhone] = _
NZ (rstSource!CompanyMainTelephoneNumber)
rstTarget.Update
rstTarget.Close
Os IDs de contato e telefones em tblContactIDsPhones so atualizados de forma semelhante: primeiro o
cdigo procura um valor em um desses campos, e se ele for encontrado, o strDescription varivel
encontra-se com o telefone ou a descrio do ID, e um registro requerido usando ContactID e strDescription.
Se um registro for encontrado, ele atualizado; caso contrrio, um novo registro criado em tblContactIDsAndPhones
e o nmero de telefone ou ID escrito para ele:
UpdateContactIDs:
Procurar um registro de contato ID correspondente na tabela de destino e atualiz-lo se encontrado; caso contrrio, cre-
comeu um novo registrar e gravar dados de ID de contato para ele.
strTarget = \"tblContactIDsPhones\"
Definir rstTarget = dbs.OpenRecordset (strTarget _
dbOpenDynaset)
Se Nz (rstSource! [AssistantTelephoneNumber]) <>\"\" ento
strDescription = \"Assistente de telefone\"
strSearch = \"[ContactID] =\"
& And [Description] = & Chr$(39) & _
strDescription
Debug. Print \"string de busca:\"
rstTarget.FindFirst strSearch
Se rstTarget.NoMatch = True Then
Crie um novo contato ID registro na tabela de destino.
rstTarget.AddNew
rstTarget![ContactID] = lngContactID
rstTarget![Descrio] = strDescription
Outra coisa
rstTarget.Edit
End If
rstTarget![IDOrPhone] = _
Nova Zelndia (rstSource! [AssistantTelephoneNumber])
rstTarget.Update
End If
388
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
16_047026 ch11.qxp 02\/04\/07 21:52 pgina 388
Se Nz (rstSource! [<>Do BusinessFaxNumber]) \"\", em seguida,
strDescription = \"Fax de negcios\"
strSearch = \"[ContactID] =\"
& And [Description] = & Chr$(39) _
& strDescription & Chr$(39)
Debug. Print \"string de busca:\"
rstTarget.FindFirst strSearch
Se rstTarget.NoMatch = True Then
Crie um novo contato ID registro na tabela de destino.
rstTarget.AddNew
rstTarget![ContactID] = lngContactID
rstTarget![Descrio] = strDescription
Outra coisa
rstTarget.Edit
End If
rstTarget![IDOrPhone] = _
Nova Zelndia (rstSource! [BusinessFaxNumber])
rstTarget.Update
End If
[Eu sou no listar um grande nmero de segmentos semelhantes, cada uma delas atualiza um telefone diferente
nmero ou ID.]
Se Nz (rstSource! [<>PersonalHomePage]) \"\", em seguida,
strDescription = \"Web Page\"
strSearch = \"[ContactID] =\"
& And [Description] = & Chr$(39) _
& strDescription & Chr$(39)
Debug. Print \"string de busca:\"
rstTarget.FindFirst strSearch
Se rstTarget.NoMatch = True Then
Crie um novo contato ID registro na tabela de destino.
rstTarget.AddNew
rstTarget![ContactID] = lngContactID
rstTarget![Descrio] = strDescription
Outra coisa
rstTarget.Edit
End If
rstTarget![IDOrPhone] = _
Nova Zelndia (rstSource! [PersonalHomePage])
rstTarget.Update
End If
NextSourceRecord:
rstSource.MoveNext
389
Sincronizando contatos do Outlook e acesso
11
16_047026 ch11.qxp 02\/04\/07 21:52 pgina 389
Loop
rstTarget.Close
strTitle = \"Acesso a tabelas atualizadas\"
strPrompt = \"Tabelas de acesso vinculados de dados de contactos\" _
& updated from form
MsgBox strPrompt, vbInformation + vbOKOnly, strTitle
ErrorHandlerExit:
Em erro continuar prximo
rstSource.Close
rstTarget.Close
Exit Sub
ErrorHandler:
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End Sub
No caso voc quer copiar todos os contatos de acesso ao Outlook, ou vice-versa, h duas selees
na lista da caixa de combinao selecione a ao que vai deixar voc fazer isso. A \"cpia todos acessem contatos para
Outlook\"seleo corre o CopyAccessContactsToOutlook procedimento, que primeiro coloca-se um
mensagem de confirmao para assegurar que o usurio quer acabar com os contatos do Outlook existentes, e
substitu-los com contatos copiados do acesso. Se o usurio clica em Sim, o procedimento primeiro chama o
CreateDenormalizedContactsTable procedimento para gravar dados para tblAccessContacts, e
em seguida, executa o cdigo que semelhante ao cdigo na UpdateAllOutlookContacts procedimento,
exceto que ele ignora a busca e apenas cria todos os novos itens de contactos Outlook.
Da mesma forma, as execues de seleo \"Copy Outlook contatos todos para acesso\" o CopyAllOutlook
ContactsToAccess procedimento, que pede confirmao, ento corre o ImportOutlook
Contatos procedimento para gravar dados de contatos do Outlook para tblOutlookContacts, em seguida, executa o cdigo
que semelhante ao cdigo aUpdateAllAccessContacts procedimento, exceto que ele no
busca de registros correspondentes, apenas cria novos registros de acesso para todos os registros de contatos de Outlook.
Ao copiar todos os contatos do Outlook para acesso, voc vai acabar com o Access e o Outlook
Contatos cujos valores de CustomerID no combinam. Isso ocorre porque o ContactID de campo em
tblContactInfo um campo AutoNumerao, ento ele no pode ser definido como um valor especfico. Existem duas maneiras de
lidar com essa discrepncia: usar o Compare pelo formulrio do nome, se voc no se importa se o cliente
ID o mesmo no Access e no Outlook; ou selecione a seleo de \"Cpia acesso contatos todos para Outlook\"
para salvar o valor de acesso ContactID AutoNumerao volta para os registros correspondentes do Outlook.
NOTA NOTA
390
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
16_047026 ch11.qxp 02\/04\/07 21:52 pgina 390
Trabalhando com anexos
Outlook teve anexos para muitas verses agora; Access 2007 introduziu os dados do anexo
tipo para tabelas do Access. No Outlook, os acessrios so uma coleo pertencentes a vrios tipos de item,
principalmente as mensagens de correio; Acesso 2007 anexos so um conjunto de registros pertencentes a um campo da
Tipo de dados anexo. Porque podem ter um item de contato do Outlook e uma tabela do Access anexar-
mentos, eu precisava ser capaz de lidar com anexos de cpia de um item de contato do Outlook para um
Acesso tabela e vice-versa.
O tipo de dados de campo do anexo novo no Access 2007.
Quando voc adiciona um campo de tipo de dados de anexo a uma tabela do Access 2007, tem trs subcampos,
que voc pode ver no diagrama de relacionamentos (Ver Figura 11.1). O acessrio em si armazenado em
o subcampo FileData; Digite seu nome de arquivo e caminho o subcampo de nome de arquivo e o arquivo a
Subcampo de FileType. Geralmente, voc s precisa trabalhar com os subcampos FileData e nome do arquivo
ao copiar anexos de acesso.
A situao com anexos do Outlook mais simples: voc apenas salvar o nome de arquivo do anexo e
caminho para a coleo de anexos de um item, usando o Adicionar mtodo para essa coleo.
Provavelmente, voc ter alguns anexos, em contatos do Outlook, ou no acesso entre em contato
registros, para que o meu cdigo de sincronizao precisa lidar com anexos. Para copiar os anexos de um
lugar para outro, voc precisa salv-los em arquivos em uma pasta; a pasta usada para essa finalidade
selecionado usando o boto do caminho da pasta de anexos no menu principal, que corre um evento proce-
dure que aparece em uma caixa de dilogo selecionador de pasta. Os procedimentos listados em seguida so chamados de mais tempo
procedimentos que fazem a cpia de dados entre o acesso a dois comparam tabelas, como visto nos dois
entre em contato com formas de comparao, ou entre o Access e o Outlook:
Public Sub CopyAccessAttsToOutlook(con As _
Outlook.ContactItem, rstSourceAttachments As _
DAO.Recordset2)
' Chamado de UpdateAllOutlookContacts
No erro GoTo ErrorHandler
Set fso = CreateObject(\"Scripting.FileSystemObject\")
Com rstSourceAttachments
Enquanto no.EOF
strDocsPath = GetOutputDocsPath
Preciso extrair o nome do arquivo do campo nome do arquivo, usando a funo SplitFileName, porque ele
s vezes contm o caminho (s vezes vrias vezes) bem como o nome do arquivo.
NOVO RECURSO NOVO RECURSO
391
Sincronizando contatos do Outlook e acesso
11
16_047026 ch11.qxp 02\/04\/07 21:52 pgina 391
strFile = _
SplitFileName(rstSourceAttachments.Fields(\"FileName\"))
Debug. Print \"nome do arquivo:\"
strFileAndPath = strDocsPath
Debug. Print \"arquivo e o caminho:\"
Em erro continuar prximo
Verifique se esse arquivo j existe na pasta e salve-o para a pasta se no.
Conjunto fil = fso.GetFile(strFileAndPath)
Se o fil nada ento
Salve este anexo para um arquivo na pasta de documentos de sada.
.Fields(\"FileData\").SaveToFile strFileAndPath
Debug. Print \"poupana\"
& to & strDocsPath & folder
End If
Adicione este acessrio para a coleo de anexos de item de contato do Outlook.
Debug. Print \"Adicionar anexo\"
& to & con.FullName & contact
con.Salvar
con.Fonte de Attachments.Add: = strFileAndPath, _
Tipo: = olByValue
con.Fechar (olSave)
Matar strFileAndPath
.MoveNext
Loop
rstSourceAttachments.Close
Terminar com
ErrorHandlerExit:
Exit Sub
ErrorHandler:
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End Sub
Public Sub CopyOutlookAttsToAccess(con _
Como Outlook.ContactItem, rstTargetAttachments As _
DAO.Recordset2)
392
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
16_047026 ch11.qxp 02\/04\/07 21:52 pgina 392
' Chamado de NewAccessContactAndID e
' ImportOutlookContacts
No erro GoTo ErrorHandler
Set fso = CreateObject(\"Scripting.FileSystemObject\")
Para cada att em con.Anexos
Extrair o nome do arquivo da propriedade de nome de arquivo de anexo.
strFile = ATT.Nome do arquivo
strDocsPath = GetOutputDocsPath
strFileAndPath = strDocsPath
Debug. Print \"arquivo e o caminho:\"
Em erro continuar prximo
Verifique se esse arquivo j existe na pasta e salve-o para a pasta se no
Conjunto fil = fso.GetFile(strFileAndPath)
Se o fil nada ento
Salve este anexo para um arquivo na pasta de documentos de sada.
ATT.SaveAsFile strFileAndPath
End If
No erro GoTo ErrorHandler
Carrega este anexo ao campo anexos da tabela de destino.
Com rstTargetAttachments
.AddNew
.Fields(\"FileData\").LoadFromFile _
(strFileAndPath)
.Atualizao
Terminar com
Matar strFileAndPath
Prxima att
ErrorHandlerExit:
Exit Sub
ErrorHandler:
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End Sub
393
Sincronizando contatos do Outlook e acesso
11
16_047026 ch11.qxp 02\/04\/07 21:52 pgina 393
Public Sub CopyAccessAttsToAccess(rstSourceAttachments _
Como DAO.Recordset2, rstTargetAttachments _
Como DAO.Recordset2)
' Chamado de CreateDenormalizedContactsTable,
' UpdateAllAccessContacts, UpdateOutlookContactID,
' UpdateAccessContactID, UpdateOutlookContactName,
' UpdateAccessContactName, UpdateAllAccessContacts,
' UpdateOutlookContactID, cboAttachments_Click em
' fsubCopyFieldData
No erro GoTo ErrorHandler
Set fso = CreateObject(\"Scripting.FileSystemObject\")
Fazer enquanto no rstSourceAttachments.EOF
Preciso extrair o nome do arquivo do campo nome do arquivo, usando a funo SplitFileName, porque ele
s vezes contm o caminho (s vezes vrias vezes) bem como o nome do arquivo.
strFile = _
SplitFileName(rstSourceAttachments.Fields(\"FileName\"))
Debug. Print \"nome do arquivo:\"
strFileAndPath = strDocsPath
Debug. Print \"arquivo e o caminho:\"
Em erro continuar prximo
Verifique se esse arquivo j existe na pasta e salve-o para a pasta se no.
Conjunto fil = fso.GetFile(strFileAndPath)
Se o fil nada ento
Salve este anexo para um arquivo na pasta de documentos de sada.
rstSourceAttachments.Fields(\"FileData\").SaveToFile _
strFileAndPath
Debug. Print \"poupana\"
End If
Carrega este anexo ao campo anexos da tabela de destino.
rstTargetAttachments.AddNew
rstTargetAttachments.Fields(\"FileData\").LoadFromFile _
(strFileAndPath)
rstTargetAttachments.Update
Matar strFileAndPath
rstSourceAttachments.MoveNext
394
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
16_047026 ch11.qxp 02\/04\/07 21:52 pgina 394
Loop
rstSourceAttachments.Close
rstTargetAttachments.Close
ErrorHandlerExit:
Exit Sub
ErrorHandler:
Se Err. Number = 3839 ento
' O arquivo j existe; exclu-lo
Matar strFileAndPath
Currculo
Outra coisa
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End If
End Sub
SplitFileName(strFileAndPath) de funo como String
No erro GoTo ErrorHandler
Dim strFullPath() As String
Dim intUBound As Integer
Extrair o nome da varivel com o arquivo e o caminho.
strFullPath = Split (strFileAndPath, \"\/\", -1, vbTextCompare)
intUBound = UBound(strFullPath)
strFile = strFullPath(intUBound)
SplitFileName = strFile
ErrorHandlerExit:
Exit Function
ErrorHandler:
MsgBox \"erro nenhum:\"
Err
Resume ErrorHandlerExit
End Function
11,16 Figura mostra um contato do Outlook com um acessrio criado a partir de um registro de contato do acesso.
395
Sincronizando contatos do Outlook e acesso
11
16_047026 ch11.qxp 02\/04\/07 21:52 pgina 395
FIGURA 11,16
Um contato do Outlook com um acessrio criado a partir de um registro de contato do acesso.
Resumo
As tcnicas de sincronizao neste captulo permitir que voc mantenha seus dados de contacto de um conjunto
de tabelas vinculadas do Access, adicionar qualquer nmero de nmeros de telefone personalizada identificaes conforme necessrio e syn-
chronize em contato com seus dados de acesso ao Outlook, para que possa trabalhar com as propriedades padro de
contatos do Outlook conveniente entrar em contato com a interface e trabalham com quaisquer campos personalizados adicionais
voc precisa de acesso, sem ter que manualmente entrar (e atualizar) os mesmos dados de contatos em
Acesso e Outlook.
Alm disso, voc pode usar as tcnicas de denormalizing e renormalizing que costumava trabalhar com con-
Tatos para qualquer situao que requer a converso de um conjunto de tabelas vinculadas do Access para uma nica tabela de arquivos simples,
ou o contrrio algo que poder surgir durante a troca de dados com programas antigos ou
bancos de dados do mainframe.
396
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
16_047026 ch11.qxp 02\/04\/07 21:52 pgina 396
E
arlier captulos neste livro descreveram como trabalhar com Word, Excel,
e Outlook, usando o cdigo do VBA para criar documentos do Word, Excel trabalho-
folhas e itens do Outlook e encha-os com dados de acesso. Este
captulo descreve algumas tcnicas mais avanadas para trabalhar com os outros
Componentes do Office, tais como aqueles que voc podem precisar em um banco de dados com o navio-
ping e solicitar informaes.
Criando a palavra extravagante
Etiquetas de envio
No captulo 6, voc aprendeu como criar etiquetas de endereamento bsicas, com nome e
informaes de endereo extradas de uma tabela ou consulta, usando tanto o TypeText
mtodo ou mala direta. Um nome e o endereo tudo que voc precisa para imprimir um conjunto de
rtulos para um mailing mensal para uma lista de membros do clube, ou para uma lista de pessoas
Quem receber uma remessa de produtos regulares. Mas no mundo real,
muitas vezes existem exigncias mais complexas para impresso de etiquetas. Antes de
envio de um produto, talvez tambm seja necessrio verificar o inventrio para um prod-
Registe o seu produto, a data em que o produto necessrio e a disponibilidade de transporte sup-
Plies, veculos e pessoal para fazer o transporte.
O banco de dados de amostra para este captulo Northwind
Plus.accdb.
Talvez voc tambm precise imprimir mais informaes em suas etiquetas de envio em
Alm do endereo, como o n de encomenda, produto n , nome do produto,
Categoria, o nmero do processo em uma seqncia de casos, ou outros dados. Para
imprimir etiquetas com informaes extras, ou para tomar decises sobre se um conjunto de
etiquetas devem ser impressas, voc mais precisa elaborar o cdigo do VBA.
NOTA NOTA
397
NESTE CAPTULO
Criar etiquetas de envio de palavra
com informaes sobre
embarques
Criar grficos dinmicos do Excel preenchido
com os dados de acesso
Enviando relatrios de acesso de
transporte e reordenao
informaes
Indo alm
o bsico
17_047026 ch12.qxp 02\/04\/07 21:53 pgina 397
O exemplo de banco de dados do Northwind Plus contm tabelas do banco de dados Northwind. mdb, com sev-
Eral campos extras em algumas tabelas, consultas, (usadas na prxima seo) e trs novas formas dois principais
formas (um para selecionar registros para transporte e outro para reordenao inventrio empobrecido) Alm de um
formulrio suplementar para edio de quantidades de produto.
Ao abrir o Northwind Plus no Vista, voc pode receber o alerta de segurana mostrado na Figura 12.1.
Para ativar temporariamente o cdigo do banco de dados, clique no boto \"Permitir contedo\" e selecione o
Opo \"Habilitar este contedo\" na caixa de dilogo. Para impedir que este alerta de segurana que aparecem a cada vez voc
Abra o banco de dados, Cadastre o cdigo VBA com uma assinatura digital, conforme descrito na barra lateral.
FIGURA 12.1
Um alerta de segurana Vista ao abrir um banco de dados com cdigo VBA no assinado.
NOTA NOTA
398
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
Criar uma assinatura Digital de
Assinar seu cdigo VBA do Access
1. No menu Iniciar do Windows Vista, selecione todos os programas.
2. Selecione a pasta do Microsoft Office.
3. Selecione a pasta Ferramentas do Microsoft Office.
17_047026 ch12.qxp 02\/04\/07 21:53 pgina 398
399
Indo alm do bsico
12
4. Selecione o certificado Digital para item de projetos do VBA:
Selecionar o certificado Digital para a ferramenta de projeto do VBA.
5. Digite seu nome e clique em OK:
Digitar um nome para o certificado digital.
continuou
17_047026 ch12.qxp 02\/04\/07 21:53 pgina 399
400
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
continuou
6. Voc dever receber uma mensagem de sucesso:
Mensagem de sucesso depois de criar um certificado digital.
7. Clique no boto Office, selecione o comando publicar e, em seguida, o pacote e
Sinal de comando.
8. Selecione o certificado a ser usado na caixa de dilogo Selecionar certificado:
17_047026 ch12.qxp 02\/04\/07 21:53 pgina 400
anos 60
Indo alm do bsico
12
9. Clique em criar para salvar o arquivo de pacote para um local de sua escolha:
10. Se esta a primeira vez que voc usou este certificado, a segurana de acesso do Microsoft Office
Abre a caixa de dilogo de aviso:
continuou
17_047026 ch12.qxp 02\/04\/07 21:53 pgina 401
402
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
continuou
11. Voc pode clicar em Mostrar detalhes de assinatura para exibir as informaes disponveis sobre o
certificado selecionado:
12. Aps clicar no boto de \"Confiar em todos da editora\" sobre a segurana de acesso do Microsoft Office
Caixa de dilogo de aviso, voc pode trabalhar em banco de dados.
13. No futuro, se voc abrir o arquivo de pacote, voc obter uma caixa de dilogo oferecendo para extrair o banco de dados:
14. Clicar em OK, o banco de dados extrado abre como um banco de dados Access 2007 normal.
17_047026 ch12.qxp 02\/04\/07 21:53 pgina 402
403
Indo alm do bsico
12
Figura 12.2 mostra o menu principal da Northwind Plus banco de dados de amostra, com botes para abrir-
ing as duas principais formas e botes para selecionar as pastas de documentos e modelos. A pasta
funo de botes de seleo como os controles semelhantes em vrios outros captulos, usando um seletor de pasta
caixa de dilogo criada pelo objeto FileDialog Office.
FIGURA 12.2
O menu principal do banco de dados de exemplo Northwind Plus.
Eu poderia ter determinado que ordens estavam prontos para enviar apenas examinando o sucesso-
inventrio capaz e a data da ordem necessrio, mas no mundo real no so o
apenas os fatores a considerar-se no h pessoas suficientes para fazer o transporte, ou todos os caminhes esto fora
na estrada, no podemos enviar o produto, mesmo se houver suficiente inventrio.
Figura 12.3 mostra a forma de seleo de ordem.
NOTA NOTA
17_047026 ch12.qxp 02\/04\/07 21:53 pgina 403
FIGURA 12.3
O formulrio utilizado para fiscalizar ordens e marcando-os para a expedio.
As ordens de selecionar para o envio de formulrio (frmSelectOrdersForShipping) um formulrio principal com uma folha de dados
subformulrio. Ele usado para inspecionar as ordens que esto no intervalo de tempo correto para o transporte e marc-los
para agora o transporte. O formulrio principal exibe campos das ordens, e o subformulrio de folha de dados listas
os produtos na ordem selecionada. No formulrio principal, a caixa de seleo \"Parcial\" navio\" verificada se a
ordem parcial pode ser enviado, caso haja suficiente inventrio para enviar pelo menos um produto sobre o
ordem. A caixa de seleo \"Pronto para enviar\" indica que a ordem est pronta para enviar, tendo em conta
fatores alm do estoque disponvel.
Para imprimir etiquetas de transporte com informaes extras, fiz uma consulta
(qryNorthwindShippingLabels ), com base em qryNorthwindAll (uma consulta que inclui todas as
as Northwind dados tabelas vinculadas), contendo todas as informaes para imprimir nas etiquetas. Para alm da
o envio de nome e endereo, a consulta tambm inclui os seguintes campos:
OrderDate
DataDeEntrega (com um critrio de > Date) ) E < DateAdd(\"d\",30,Date()) Para
incluir apenas ordens necessrias a partir de amanh, a menos de 30 dias no futuro
DateShipped
Fornecedor (um alias para CompanyName em tblSuppliers)
ProductID
ProductName
OrderID
NoCases (um alias para quantidade)
404
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
17_047026 ch12.qxp 02\/04\/07 21:53 pgina 404
CategoryName
ReadyToShip, um campo booleano com um critrio de Verdadeiro para selecionar as ordens que esto prontas para enviar
O cmdCreateLabels procedimento de evento listado aqui, com explicao de como ele processa o
conjuntos de etiquetas para imprimir:
Private Sub cmdCreateLabels_Click()
No erro GoTo ErrorHandler
Dim appWord como Word. Application
Dim blnShipPartial As Boolean
Dim dbs como DAO.Banco de dados
Dim doc como Word.Document
Dim fil como Scripting.File
Dim fso como scripting. FileSystemObject novo
Dim lngCaseNo como longo
Dim lngNoCases como longo
Dim lngCasesInStock como longo
Dim lngCount como longo
Dim lngSet como longo
Dim lngNoSets como longo
Dim lngOrderID como longo
Dim lngSetNo como longo
Dim lngSubtract como longo
Dim rstOrder como DAO.Conjunto de registros
Dim rstShip como DAO.Conjunto de registros
Dim strCategory As String
Dim strDocsPath As String
Dim strOrderDate As String
Dim lngProductID como longo
Dim strProductName As String
Dim strPrompt As String
Dim strQueryShip As String
Dim strQueryOrder As String
Dim strSaveName As String
Dim strSaveNameAndPath As String
Dim strShipAddress As String
Dim strShipCityStatePC As String
Dim strShipCountry As String
Dim strShipDate As String
Dim strShipName As String
Dim strSQL As String
Dim strSupplier As String
Dim strTemplate As String
Dim strTemplateNameAndPath As String
Dim strTemplatePath As String
Dim strTitle As String
Dim varValue como variante
405
Indo alm do bsico
12
17_047026 ch12.qxp 02\/04\/07 21:53 pgina 405
Defina a varivel de aplicativo do Word:
Set appWord = GetObject (, \"Word. Application\")
appWord.Visible = True
Obter caminhos de modelos do usurio e documentos das selees do usurio no menu principal, utilizando dois
funes que pegar em trajetos salvos da tblInfo:
strTemplatePath = GetTemplatesPath
Debug. Print \"caminho do modelo:\"
strDocsPath = GetDocumentsPath
Debug. Print \"pasta de documentos:\"
strTemplate = \"Avery 5164 frete Labels.dotx\"
strTemplateNameAndPath = strTemplatePath
Debug. Print \"nome do modelo e o caminho:\" _
& strTemplateNameAndPath
Em erro continuar prximo
Procure o modelo na pasta modelos, tentando definir uma varivel de arquivo FileSystemObject
para ele:
Conjunto fil = fso.GetFile(strTemplateNameAndPath)
Se o fil nada ento
strPrompt = \"No pode encontrar\"
& strTemplatePath & ; canceling
MsgBox strPrompt, vbCritical + vbOKOnly
GoTo ErrorHandlerExit
End If
No erro GoTo ErrorHandler
Calcule o nmero de conjuntos de etiquetas para imprimir:
lngSelected = Nz (DCount (\"*\", _
\"qrySelectedNorthwindShippingLabels\"))
Me![lblSetsToPrint].Legenda = _ lngSelected
& sets of shipping labels to print
Sair com uma mensagem se seleccionaram-se sem ordens:
Se lngSelected = 0 Then
strTitle = \"No possvel imprimir etiquetas\"
strPrompt no = \"nenhum pedidos selecionados; por favor, marque alguns \"_
& orders for shipping
MsgBox strPrompt, vbExclamation + vbOKOnly, strTitle
GoTo ErrorHandlerExit
End If
406
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
17_047026 ch12.qxp 02\/04\/07 21:53 pgina 406
Configurar um conjunto de registros (rstShip) com base na qrySelectedNorthwindShippingLabels consulta,
que tem um registro para cada produto em um pedido selecionado:
Conjunto dbs = CurrentDb
strQueryShip = \"qrySelectedNorthwindShippingLabels\"
Definir rstShip = dbs.OpenRecordset(strQueryShip)
Obter o nmero de registros para uso em atualizar o medidor de progresso:
rstShip.MoveLast
rstShip.MoveFirst
lngNoSets = rstShip.RecordCount
Inicie o medidor de progresso na barra de status, usando o objeto SysCmd:
strPrompt = \"Criando\"
& sets of shipping labels
Application.SysCmd acSysCmdInitMeter, strPrompt _
lngNoSets
Configure um loop para processar os conjuntos de etiquetas para as encomendas:
Para lngSet = 1 para lngNoSets
lngOrderID = rstShip![CdigoDoPedido]
blnShipPartial = rstShip![ShipPartial]
Criar um conjunto de registros filtrado (rstOrder) para este fim apenas, com registros correspondentes a prod-
dade em ordem:
strQueryOrder = \"qryOrder\"
Conjunto dbs = CurrentDb
strSQL = \"SELECT * FROM\"
& [OrderID] = & lngOrderID & ;
Debug. Print \"SQL\"
lngCount = CreateAndTestQuery (strQueryOrder, strSQL)
Debug. Print \"n registros encontrados: \"
Definir rstOrder = dbs.OpenRecordset(strQueryOrder)
Configurar um loop para processar cada produto esta ordem, verificando se h estoque suficiente
enviamos o produto nesta ordem:
Fazer enquanto no rstOrder.EOF
lngProductID = rstOrder![ProductID]
strProductName = rstOrder![ProductName]
lngNoCases = rstOrder![NoCases]
lngCasesInStock = rstOrder![CasesInStock]
Se lngNoCases > lngCasesInStock, em seguida,
Se blnShipPartial = False Then
407
Indo alm do bsico
12
17_047026 ch12.qxp 02\/04\/07 21:53 pgina 407
Para encomendas com ShipPartial desmarcado, no podemos enviar a ordem porque um produto inadequado
inventrio:
strTitle = \"Inadequado inventrio\"
strPrompt = \"Apenas\"
& cases in inventory; cant fill Order ID _
& lngOrderID & for & strProductName
MsgBox strPrompt, vbExclamation, strTitle
GoTo NextOrder
ElseIf blnShipPartial = True Then
Para encomendas com ShipPartial marcada, no podemos enviar este produto na ordem:
strTitle = \"Inadequado inventrio\"
strPrompt = \"Apenas\"
& cases in inventory; cant fill _
& strProductName & item on _
& Order ID & lngOrderID
MsgBox strPrompt, vbExclamation, strTitle
Figura 12.4 mostra uma mensagem tpica \"inventrio inadequado\" quando no h estoque suficiente
Encha um item de linha de produto em uma ordem com ShipPartial marcada.
FIGURA 12.4
Uma mensagem indicando que no h estoque inadequado para enviar um item de produto em uma ordem.
Confira o prximo produto da ordem de:
GoTo NextProduct
End If
Outra coisa
H suficiente inventrio para enviar este produto; Crie um novo documento de etiquetas para este conjunto de rtulos
com base no modelo:
Conjunto doc = _
appWord.Documents.Add (modelo: = _
strTemplateNameAndPath _
DocumentType: = wdNewBlankDocument, _
Visvel: = True)
doc.Ativar
408
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
17_047026 ch12.qxp 02\/04\/07 21:53 pgina 408
Definir variveis com informaes para imprimir em todos os rtulos por esta ordem:
strCategory = rstOrder![NomeDaCategoria]
strOrderDate = CStr (rstOrder! [DataDoPedido])
strShipName = rstOrder![NomeDoDestinatrio]
strShipAddress = rstOrder![ShipAddress]
strShipCityStatePC = rstOrder![ShipCityStatePC]
strShipCountry = rstOrder![PasDeDestino]
strSupplier = rstOrder![Fornecedor]
strShipDate = Format (data, \"dd-mmm-aaaa\")
Configurar um loop para imprimir um conjunto de etiquetas para este fim, enviado um rtulo por caixa:
Para lngCaseNo = 1 para lngNoCases
Com appWord.Selection
Colocar dados em um rtulo (uma clula no documento do Word):
.TypeText Text: = \"de:\"
.Unidade de MoveLeft: = wdCharacter, Count: = 1
.Unidade de MoveLeft: = wdWord, Count: = 2, _
Estender: = wdExtend
.Bold = True
.Unidade teclaterminar: = wdLine
.Bold = False
.TypeText Text: = \"Adamastor\"
.TypeParagraph
Recuo da margem esquerda para coincidir com a configurao de tabulao, para que o endereo fique alinhada com o nome.
Em vez de procurar palavra mtodos, propriedades e outros componentes de modelo de objeto de
o pesquisador de objetos, voc pode capturar a sintaxe para uma ao de palavra gravando uma macro
em palavra, em seguida, copiando e colando o cdigo do VBA em seu procedimento VBA do Access. Basta inserir o seu
Aplicao da palavra varivel onde necessrio e guarnio os argumentos que voc no precisa preparar o cdigo
para uso em acesso.
.ParagraphFormat.TabIndent (1)
.TypeText Text: = \"2839 El Presidio St.\"
.TypeParagraph
.TypeText Text: = \"em lugar nenhum, WA 92838\"
.TypeParagraph
Voltar para a margem esquerda normal antes de imprimir \"TO:\":
.ParagraphFormat.LeftIndent = 8
.TypeParagraph
.Bold = True
.TypeText Text: = \"para:\"
.Unidade de MoveLeft: = wdCharacter, Count: = 1
.Unidade de MoveLeft: = wdCharacter, Count: = 3, _
Estender: = wdExtend
NOTA NOTA
409
Indo alm do bsico
12
17_047026 ch12.qxp 02\/04\/07 21:53 pgina 409
.Unidade teclaterminar: = wdLine
.Bold = False
.TypeText strShipName
.TypeParagraph
Recuo da margem esquerda para coincidir com a configurao de tabulao, para que o endereo fique alinhada com o nome:
.ParagraphFormat.TabIndent (1)
.TypeText strShipAddress
.TypeParagraph
.TypeText strShipCityStatePC
.TypeParagraph
.TypeText strShipCountry
.TypeParagraph
Voltar margem esquerda normal antes de imprimir a informao extra:
.ParagraphFormat.LeftIndent = 8
.TypeParagraph
.Font = 10
.Bold = True
.TypeText \"Order ID:\"
& CStr(lngOrderID)
.TypeParagraph
.TypeText \"Categoria:\"
& strCategory
.TypeParagraph
.TypeText \"produto:\"
& lngProductID & ( _
& strProductName & )
.TypeParagraph
.TypeText \"fornecedor:\"
& strSupplier
.TypeParagraph
.TypeText \"data do navio:\"
& strShipDate
.TypeParagraph
.Font = 12
.Bold = False
.TypeParagraph
.TypeText vbTab
& lngCaseNo & of & lngNoCases
.MoveRight unidade: = wdCell
Terminar com
Prxima lngCaseNo
Salve o documento de etiquetas do Word para este conjunto de rtulos:
strSaveName = _ \"Transporte rtulos para identificao de ordem\"
& lngOrderID & ( & strProductName _
& ) shipped on & strShipDate & .doc
410
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
17_047026 ch12.qxp 02\/04\/07 21:53 pgina 410
strSaveNameAndPath = strDocsPath
Debug. Print \"Salve o nome:\"
Em erro continuar prximo
Verificar a existncia de um arquivo com esse nome e se encontrado:
Conjunto fil = fso.GetFile(strSaveNameAndPath)
Fil nada ento se no
Matar strSaveNameAndPath
End If
No erro GoTo ErrorHandler
doc.SaveAs FileName: = strSaveNameAndPath
O medidor de progresso de atualizao:
Application.SysCmd acSysCmdUpdateMeter, lngSet
Atualize o campo de ReadyToShip em tblOrders para False:
DoCmd.SetWarnings False
strSQL = \"UPDATE tblOrders SET\" _
& tblOrders.ReadyToShip = False _
& WHERE OrderID = & lngOrderID
Debug. Print \"seqncia SQL:\"
StrSQL DoCmd.RunSQL
Subtrair a quantidade de produto enviado a quantidade em estoque em tblProducts:
lngSubtract = lngCasesInStock - lngNoCases
strSQL = \"UPDATE tblProducts SET\" _
& tblProducts.UnitsInStock = _
& lngSubtract & WHERE ProductID = _
& lngProductID
Debug. Print \"seqncia SQL:\"
StrSQL DoCmd.RunSQL
Em tblOrderDetails, conjunto QuantityShipped QuantidadePedida e DateShipped data de hoje:
strSQL = \"UPDATE tblOrderDetails SET\" _
& tblOrderDetails.QuantityShipped = _
& [QuantityOrdered], _
& tblOrderDetails.DateShipped = Date() _
& WHERE tblOrderDetails.OrderID = _
& lngOrderID _
& And tblOrderDetails.ProductID = _
& lngProductID & ;
Debug. Print \"seqncia SQL:\"
StrSQL DoCmd.RunSQL
411
Indo alm do bsico
12
17_047026 ch12.qxp 02\/04\/07 21:53 pgina 411
strTitle = \"Conjunto de rtulos criado.\"
strPrompt = _
_ \"Um conjunto de rtulos criado de envio\"
& for Order ID & lngOrderID _
& , Product ID & lngProductID _
& ( & strProductName & )
MsgBox strPrompt, vbInformation, strTitle
Figura 12.5 mostra a mensagem de sucesso para o ltimo conjunto de rtulos, com o medidor de progresso em cheio na
a barra de status de janela de acesso.
FIGURA 12.5
Uma mensagem indicando que foi criado um conjunto de rtulos de uma ordem.
End If
NextProduct:
rstOrder.MoveNext
Loop
NextOrder:
rstShip.MoveNext
Recalcule o nmero de conjuntos de etiquetas para imprimir:
lngSelected = Nz (DCount (\"*\", _
\"qrySelectedNorthwindShippingLabels\"))
Me![lblSetsToPrint].Legenda = _ lngSelected
& sets of shipping labels to print
Prxima lngSet
DoCmd.Close acForm, Me.Name
Terminado:
strTitle = \"Acabou!\"
strPrompt = _
\"Um conjunto de transporte rtulos criado para cada\" _
412
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
17_047026 ch12.qxp 02\/04\/07 21:53 pgina 412
& order shipped on _
& Format(Date, dd-mmm-yyyy)
MsgBox strPrompt, vbInformation, strTitle
ErrorHandlerExit:
Figura 12.6 mostra \"Acabou!\" mensagem depois de todos os conjuntos de rtulos foram criados.
FIGURA 12.6
A mensagem de sucesso depois que todos os rtulos foram impressos.
Limpe o medidor de progresso:
Application.SysCmd acSysCmdClearStatus
Exit Sub
ErrorHandler:
Se errar = 429 ento
Palavra no est em execuo; Abra o Word com CreateObject :
Set appWord = CreateObject(\"Word.Application\")
Retomar em seguida
Outra coisa
MsgBox \"erro nenhum:\"
& Err.Description
Resume ErrorHandlerExit
End If
End Sub
O GetDocumentsPath funo que recupera o caminho de documentos de tblInfo listada em seguida;
o GetTemplatesPath funo semelhante:
GetDocumentsPath() funo pblica como String
No erro GoTo ErrorHandler
Conjunto dbs = CurrentDb
Set rst = dbs.OpenRecordset(\"tblInfo\")
413
Indo alm do bsico
12
17_047026 ch12.qxp 02\/04\/07 21:53 pgina 413
RST.MoveFirst
GetDocumentsPath = rst![DocumentsPath]
RST.Fechar
ErrorHandlerExit:
Exit Function
ErrorHandler:
MsgBox \"erro nenhum:\"
Err
Resume ErrorHandlerExit
End Function
Figura 12.7 mostra uma pgina de etiquetas de envio.
FIGURA 12.7
Um conjunto de palavra etiquetas de envio preenchido com dados de acesso.
414
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
17_047026 ch12.qxp 02\/04\/07 21:53 pgina 414
Cada projeto de desenvolvimento tem requisitos exclusivos; ao usar o Access para criar etiquetas de endereamento
(ou qualquer outro tipo de documentos do Word), voc tem a liberdade para criar tabelas e formulrios que
exatamente suas necessidades, armazenando todos (e apenas) as informaes que voc precisa para selecionar e imprimir o
dados que voc precisa em documentos do Word. O cdigo usado para criar as etiquetas de envio descritas neste
seo inclui vrias tcnicas que so teis para a produo de documentos de Word, de vrios tipos,
como criar conjuntos de registros filtrados para trabalhar com registros de detalhes, clculo de nmeros de \"x y\"
Quando estiver trabalhando com conjuntos de registros, exibindo um medidor de progresso na barra de status e de atualizao
tabelas de cdigo.
Criao de grficos dinmicos do Excel
Consultas de acesso
Voc pode criar grficos interactivos grandes e tabelas usando as ferramentas do prprio acesso (grficos dinmicos e
Tabelas dinmicas), como observado no captulo 1. No entanto, h um inconveniente a usar grficos dinmicos de acesso
e tabelas dinmicas eles s so interativos enquanto trabalhava no acesso. Se voc salvar um grfico dinmico
ou tabela dinmica como um PDF (se voc tiver instalado o salvar como utilitrio PDF) ou instantneo de arquivos e envi-lo
a outra pessoa, apenas uma imagem, no um interativo grfico ou tabela. Se voc precisa colocar os dados de acesso
em um grfico interativo ou tabela para outros para trabalhar com (mesmo se eles no tm o Access instalado),
voc pode usar uma abordagem diferente: exportar os dados de acesso a uma planilha do Excel e, em seguida, criar um
Excel grfico dinmico ou tabela dinmica que usurios podem manipular como quiserem.
Quando voc criar uma tabela dinmica do Excel, automaticamente criado com um vinculado
Tabela dinmica.
O primeiro passo na criao de uma tabela dinmica do Excel criar uma consulta do Access com os dados a serem
cartografado. Grficos dinmicos do Excel no so exatamente o mesmo que acesso grficos dinmicos; em particular, eles no tm
o recurso de agrupamento de data que automaticamente cria uma variedade de data classifica-se de um campo de data (ano,
No ms, trimestre, semana). Se voc quiser analisar dados em uma tabela dinmica do Excel por ms, trimestre, ou
ano, voc precisa fazer a repartio em uma consulta de acesso, antes de exportar os dados para o Excel ou cre -
comeu os grupos Data manualmente no Excel usando o comando do grupo.
No Office 2007, voc pode criar uma tabela dinmica do Excel manualmente, seguindo estes passos:
1. Criar uma consulta do Access com os dados a ser cartografado;
qryQuarterlySalesByCategory tem apenas trs campos: OrderQuarter, categoria, e
Preo. O campo OrderQuarter extrai o ano e trimestre o campo DataDoPedido,
usando esta expresso:
OrderQuarter: Year([OrderDate])
DatePart(\"q\",[OrderDate])
2. Esta consulta de exportao para o Excel usando o comando Excel no grupo de exportao do externo
Dados guia da faixa de opes, como mostrado na Figura 12.8.
NOTA NOTA
415
Indo alm do bsico
12
17_047026 ch12.qxp 02\/04\/07 21:53 pgina 415
FIGURA 12.8
Exportar uma consulta para o Excel usando o comando da faixa de opes.
3. Na caixa de dilogo Exportar, edite o nome da planilha conforme desejado e navegue para um suplente
local, se voc no quiser armazenar a planilha na pasta de documentos do padro (em
Figura 12.9, eu editei o nome da planilha e deixou a pasta com a configurao padro).
FIGURA 12.9
Edio da planilha, salve o nome na caixa de dilogo Exportar.
416
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
17_047026 ch12.qxp 02\/04\/07 21:53 pgina 416
4. Abra a planilha recm criada no Excel.
5. Clique em qualquer lugar no intervalo de dados, selecione o guia Inserir da faixa de opes e selecione
Grfico dinmico no menu drop-down no grupo tabelas, como mostrado na Figura 12.10.
FIGURA 12.10
Criando um grfico dinmico de dados em uma planilha do Excel.
6. Criar tabela dinmica com grfico dinmico dilogo abre, como mostrado na Figura 12.11, com o
gama pr-selecionados; Basta clicar em OK para criar o grfico dinmico na outra planilha em que o
mesma pasta de trabalho.
417
Indo alm do bsico
12
17_047026 ch12.qxp 02\/04\/07 21:53 pgina 417
FIGURA 12.11
Tabela a criar dinmica com dilogo grfico dinmico.
7. O grfico dinmico novo e em branco aparece, conforme mostrado na Figura 12.12.
FIGURA 12.12
Um grfico de Excel recm-criado dinmico.
418
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
17_047026 ch12.qxp 02\/04\/07 21:53 pgina 418
8. O layout de um grfico dinmico diferente no Excel do que no acesso (uma discrepncia Microsoft
deve esclarecer, mas isso outro assunto). Os campos da consulta constam a
Lista de campos da tabela dinmica no painel direita da planilha; Eu arrastei OrderQuarter
para os campos de eixo drop zone, CategoryName ao soltar do campos de legenda e o preo para
os valores de drop zone (Excel automaticamente faz uma soma de preo). Figura 12.13 mostra
o grfico claramente formatado dinmico neste ponto.
FIGURA 12.13
Um grfico de Excel dinmico com campos atribudos a soltar zonas.
9. Para formatar o nmero de eixo esquerdo, boto direito do mouse qualquer valor de categoria em um grfico dinmico e selecione
\"Formatar eixo\" no menu de contexto, como mostrado na Figura 12.14.
419
Indo alm do bsico
12
17_047026 ch12.qxp 02\/04\/07 21:53 pgina 419
FIGURA 12.14
A formatao de nmero do eixo.
10. Abre a caixa de dilogo Formatar eixo; Eu formatei o nmero de eixo esquerdo para E.U. moeda por
selecionando o nmero para a opo de eixo, moeda para a categoria, 0 casas decimais,
e Ingls (US) para o smbolo, conforme mostrado na Figura 12.15.
FIGURA 12.15
Formatando o eixo esquerdo para moeda dos EUA.
420
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
17_047026 ch12.qxp 02\/04\/07 21:53 pgina 420
Quando o grfico dinmico (ou um de seus componentes) seleccionado, voc deve ver especial
Grfico dinmico comandos nos grupos de Design e o Layout da faixa de opes; Se voc no v
-los, clique em grfico dinmico para dar-lhe o foco.
11. Para dar o grfico de um ttulo (geralmente uma boa idia), selecionei o Layout 1 no quadro
Grupo de layouts na guia Design da faixa de opes (no modo de grfico dinmico ferramentas), como mostrado na
Figura 12.16.
FIGURA 12.16
As ferramentas de grfico dinmico.
12. Esta seleco adiciona um controle do ttulo do grfico para o grfico; Clique sobre ela e selecione Editar texto para
editar o nome do grfico como desejado; Eu fiz isso \"Vendas trimestrais por categoria.\"
13. A etapa final selecionar um estilo de grfico. o estilo padro (barras de cor contrastantes) gener-
aliar-se muito bem, mas h muitas mais opes disponveis. Para selecionar um estilo grfico diferente, soltar
a tecla mais no canto inferior direito do grupo estilos de grfico, como mostrado na
Figura 12.17.
FIGURA 12.17
Abrir a paleta de estilos de grfico.
14. Uma paleta de 54 estilos abre como mostrado na Figura 12.18.
15. O grfico dinmico formatado mostrado na Figura 12,19.
NOTA NOTA
421
Indo alm do bsico
12
17_047026 ch12.qxp 02\/04\/07 21:53 pgina 421
FIGURA 12.18
Selecionando um estilo grfico da paleta.
FIGURA 12,19
Um grfico dinmico com barras de cores contrastantes e um fundo claro.
422
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
17_047026 ch12.qxp 02\/04\/07 21:53 pgina 422
16. Para uma apresentao de computador, um fundo escuro pode ser prefervel; Figura 12.20 mostra
o grfico dinmico com um estilo de fundo escuro selecionado.
FIGURA 12.20
Um grfico dinmico com barras de cores contrastantes e um fundo escuro.
Os quatro estilos que mais recentemente selecionado aparecem na linha superior dos estilos de grfico
Grupo, assim eles esto sempre disponveis para a seleo de um clique.
Excel 2007 tem um novo recurso: modelos de grfico. No entanto, estes modelos apenas trabalho
com grficos padro, no grficos dinmicos, ento infelizmente so sem uso quando
Criando grficos dinmicos.
Os grficos de barras produzidos nesta seo so apenas uma pequena seleo dos tipos de grfico dinmico, que voc pode
produzi em Excel, com base em dados de acesso. Os seis mais populares tipos de grfico so mostrados nos grficos
Grupo da aba inserir na faixa de opes, mostrada na Figura 12.21.
FIGURA 12.21
Os seis tipos de grfico do Excel mais populares.
NOVO RECURSO NOVO RECURSO
NOTA NOTA
423
Indo alm do bsico
12
17_047026 ch12.qxp 02\/04\/07 21:53 pgina 423
Para ver todos os tipos de grfico disponveis, clique no comando de outros grficos, ento a todos os tipos de grfico com-
Matos na parte inferior da paleta de grfico de soltar-para baixo, conforme mostrado na Figura 12.22.
FIGURA 12.22
Selecionando o comando de todos os grficos para ver todos os tipos de grfico do Excel.
A caixa de dilogo Criar grfico aberta pelo comando todos os grficos mostrada na Figura 12,23.
424
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
17_047026 ch12.qxp 02\/04\/07 21:53 pgina 424
FIGURA 12,23
A caixa de dilogo Criar tabela.
Embora a maioria dos tipos de grficos esto disponveis em Access e Excel, existem algumas diferenas: O
Tipo de grfico polar est disponvel somente no acesso, e o tipo de grfico de superfcie s est disponvel no Excel.
Figura 12.24 mostra os tipos de grficos de acesso esquerda e os tipos de grfico do Excel direita, para
torn-lo mais fcil de identificar o tipo de grfico que voc deseja usar.
425
Indo alm do bsico
12
17_047026 ch12.qxp 02\/04\/07 21:53 pgina 425
FIGURA 12.24
Tipos de grfico de Access e Excel.
E-mail de envio e relatrios de reordenao
Depois que voc enviar ordens, usando as etiquetas de envio descritas em uma seo anterior, voc pode precisar
para produzir relatrios detalhando as quantidades de produtos diferentes que foram enviados e os montantes
que precisam ser solicitados para repor o estoque e ento enviar estes relatrios para todas as pessoas. O
Relatrios de envio e reordenao de formar, mostrado na Figura 12.25, permite que voc veja o inventrio para todos
Quando a quantidade em estoque, mais a quantia em ordem seja na ou sob a reordenar nvel para
esse produto. O campo de ReorderAmount (inicialmente definido como zero para todos os produtos) indica o nmero
dos casos que voc deseja reordenar.
Uma vez que este formulrio s tem dados, se pelo menos um produto abaixo a reposio de inventrio nvel, quando voc
Clique no boto \"E-mail de envio e reordenao de relatrios\" no menu principal, se no houver suficiente
inventrio de todos os produtos, voc receber a mensagem mostrada na Figura 12,26.
426
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
17_047026 ch12.qxp 02\/04\/07 21:53 pgina 426
FIGURA 12.25
Um formulrio para reabastecer o estoque.
FIGURA 12,26
Uma mensagem quando todos os produtos tm suficiente inventrio.
Se voc clicar no boto Sim este dilogo, os montantes de Editar formulrio ser aberto, como mostrado na Figura 12.27,
onde voc pode editar a quantidade de produto conforme necessrio.
427
Indo alm do bsico
12
17_047026 ch12.qxp 02\/04\/07 21:53 pgina 427
FIGURA 12.27
Um formulrio para edio de quantidades de produto.
No formulrio de envio de relatrios e reordenao, o \"2 x reordenar\" boto define a quantidade de reordenar
duas vezes o nvel reordenar para todos os registros; o boto \"Zero reordenar\" define a quantidade de reordenar
zero para todos os registros. Voc pode tambm manualmente editar a quantidade de reordenar qualquer produto conforme desejado.
Depois de definir a quantidade de reordenar conforme desejado para todos os registros, clique o \"Enviar relatrios de envio\" mas-
tonelada para salvar o relatrio de envio (rptShipping) como um arquivo PDF, atualizar valores de campo em tblProducts como
necessrio e criar uma nova mensagem de e-mail com o arquivo de relatrio anexado a ele, pronto para o e-mail para o
endereo apropriado (se o relatrio sempre enviado para a mesma pessoa ou departamento, o e-mail
Endereo poderia ser embutidos). Figura 12,28 mostra o relatrio de envio.
Embora o formato PDF no torn-lo para a verso de lanamento do Access 2007,
A Microsoft forneceu um utilitrio para download que adiciona suporte a PDF para acesso. Este
utilitrio pode ser baixado em http:\/\/www.microsoft.com\/downloads\/details.aspx?familyid=
F1FC413C-6D89-4F15-991B-63B07BA5F2E5
pgina para \"Salvar em PDF\"). Depois de ter baixado e instalado, voc ver um novo \"Salve
Seleo de PDF\"no submenu salvar como do menu arquivo, como mostrado na Figura 12,29 e voc pode usar
o
acFormatPDF
denominado constante como o valor da
OutputFile
argumento do
SadaPara
mtodo para criar um arquivo PDF, como no exemplo de cdigo abaixo.
NOVO RECURSO NOVO RECURSO
428
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
17_047026 ch12.qxp 02\/04\/07 21:53 pgina 428
FIGURA 12,28
Um relatrio de envio lista os produtos lanados hoje.
FIGURA 12,29
A nova seleo PDF para salvar um objeto de banco de dados.
429
Indo alm do bsico
12
17_047026 ch12.qxp 02\/04\/07 21:53 pgina 429
FIGURA 12.30
Uma mensagem de e-mail com um arquivo PDF anexado, criado a partir de um relatrio do Access.
Clicando no boto \"Enviar solicitaes reordenar\" funciona da mesma forma; Ele cria um arquivo PDF de produtos
relatrio de reordenar e e-mails-lo como um anexo. 12,31 Figura mostra os produtos para relatrio de reordenar.
FIGURA 12,31
Produtos para relatrio de reordenar.
430
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
17_047026 ch12.qxp 02\/04\/07 21:53 pgina 430
O cmdReorderInventory procedimento de evento listado aqui:
Private Sub cmdReorderInventory_Click()
Esse manipulador de erro ignora a seo CreateSnapshot, se houver um erro na linha que produz
o arquivo para o formato PDF.
No erro GoTo CreateSnapshot
strCurrentPath = Application.CurrentProject.Path
strReport = \"rptProductsToReorder\"
Primeiro tentar exportar os produtos para reordenar relatrio em PDF (isto s ir funcionar se voc tiver instalado
Salvar a utilidade do PDF)
strReportFile = strCurrentPath
Debug. Print \"relatrio e caminho:\"
Objecttype DoCmd.OutputTo: = acOutputReport, _
ObjectName: = strReport, _
configurao: = acFormatPDF, _
OutputFile: = strReportFile
Se o arquivo PDF foi criado com xito, v para a seo de CreateEmail, ignorando o CreateSnapshot
seo de cdigo.
GoTo CreateEmail
No erro GoTo ErrorHandler
CreateSnapshot:
Exporte o relatrio para formato de instantneo.
strReportFile = strCurrentPath
Debug. Print \"relatrio e caminho:\"
Objecttype DoCmd.OutputTo: = acOutputReport, _
ObjectName: = strReport, _
configurao: = acFormatSNP, _
OutputFile: = strReportFile
CreateEmail:
Criar uma mensagem de e-mail do Outlook, preencha o seu assunto e anexar o PDF ou arquivo de instantneo para a mensagem:
Conjunto appOutlook = GetObject (, \"Outlook. Application\")
Set msg = appOutlook.CreateItem(olMailItem)
MSG.Attachments.Add strReportFile
MSG.Assunto = \"Produtos para reordenar para\" _
& Format(Date, dd-mmm-yyyy)
MSG.Salvar
431
Indo alm do bsico
12
17_047026 ch12.qxp 02\/04\/07 21:53 pgina 431
Pedir confirmao definir todos os valores de ReorderAmount a zero e adicione a quantidade que ordenou a
UnidadesPedidas:
strTitle = \"Confirmao\"
strPrompt = \"reordenar claro e em quantidades da ordem?\"
intReturn = MsgBox (strPrompt, vbQuestion + vbYesNo, _
strTitle)
Se intReturn = vbYes Then
DoCmd.SetWarnings False
strSQL = \"UPDATE qryProductsToReorder SET\" _
& qryProductsToReorder.UnitsOnOrder = _
& [UnitsOnOrder]+[ReorderAmount], _
& qryProductsToReorder.ReorderAmount = 0;
Debug. Print \"seqncia SQL:\"
StrSQL DoCmd.RunSQL
End If
Exibir a mensagem de email do Outlook com o PDF ou acessrio de instantneo:
MSG.Exposio
DoCmd.Close acForm, Me.Name
ErrorHandlerExit:
Exit Sub
ErrorHandler:
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End Sub
Resumo
As tcnicas descritas neste captulo devem lhe dar mais idias sobre como voc pode usar a palavra,
Excel e Outlook para expandir a funcionalidade dos bancos de dados do Access, usando o cdigo do VBA para examinar
dados e fazer decises sobre quais dados devem ser exportados e formatar os documentos do Office
preenchido com os dados de acesso.
432
Escrever cdigo VBA para trocar dados entre os componentes do Office
Parte II
17_047026 ch12.qxp 02\/04\/07 21:53 pgina 432
Adicionando mais
Funcionalidade para
Escritrio
NESTA PARTE
Captulo 13
Criando os suplementos com
Visual Basic 6
Captulo 14
Criando suplementos do Access
Captulo 15
Personalizar a faixa de opes com XML
em bancos de dados Access e suplementos
Captulo 16
Personalizar a faixa de opes de acesso
com um Visual Studio 2005 compartilhado
Suplemento
Captulo 17
Criando Scripts Standalone com
Windows Script Host
Captulo 18
Trabalhando com dados do SQL Server
18_047026 pt03.qxp 02\/04\/07 21:53 pgina 433
18_047026 pt03.qxp 02\/04\/07 21:53 pgina 434

Office 2000 introduziu os suplementos como uma nova ferramenta de desenvolvimento, de uma
alternativa para criar suplementos VBA para Access, Excel, Outlook, e
Palavra. Um suplemento de COM criado como uma biblioteca de vnculo dinmico (DLL)
que est registrado para trabalhar com aplicativos do Office. Suplementos de COM (pelo menos a-
oretically) pode ser escrito para trabalhar com vrios programas do Office, porm
realista, por causa das diferenas de funcionalidade entre acesso, palavra,
Outlook e Excel, apenas muito simples os suplementos da \"Ol, mundo!\"
tipo na verdade pode ser projetado para trabalhar em vrios aplicativos do Office.
Se voc comprou a edio de desenvolvedor do Office 2000 (ou posterior, Office XP) voc
poderia criar suplementos de COM na janela de acesso Visual Basic, usando seu sup-
porta para abrir e editar projetos do VBA, embora no era fcil por causa de
a falta de suporte depurao. No havia nenhum desenvolvedor Edition do Office
2003, e no h para o Office 2007, para que a opo no mais vivel,
a menos que voc ainda tem a edio de desenvolvedor do Office 2000 ou Office XP
instalado.
Ferramentas do Visual Studio para o Office permite que voc criar Visual Studio
Adicionar-ins para alguns componentes do Office, mas, infelizmente,
at a ltima edio, aquele que suporta o Office 2007, ainda carece de apoio
para a criao de suplementos do Access. Consulte o captulo 16 para uma discusso de criao Visual
Studio suplementos para trabalhar com o Access 2007 fita.
No entanto, isso no significa que voc no pode criar suplementos de COM para o Office 2007.
Visual Basic foi atualizado em 1998 (v. 6.0), mas ainda muito til, e
totalmente suportado pela Microsoft, ao contrrio de mais outros aplicativos da Microsoft de
que vintage. Se voc tem trabalhado com VB 6 anos, voc no tem que
pr de lado sua experincia duramente conquistada e comear a aprender o Visual Studio 2005;
voc pode criar suplementos de COM que iro trabalhar no Office 2007 usando o VB 6.
(Se voc quer aprender como criar suplementos de com Visual Studio 2005,
Veja captulo 16).
REFERNCIA CRUZADA REFERNCIA CRUZADA
435
NESTE CAPTULO
Criando os suplementos com
Visual Basic 6
Instalando e Solucionando problemas
Suplementos de COM
Comparando os suplementos e
Acesso Adicionar-ins
Criar suplementos de COM
com o Visual Basic 6
19_047026 ch13.qxp 02\/04\/07 21:54 pgina 435
Em verses anteriores do Access, suplementos COM botes colocado no menu ou barra de ferramentas especificado,
usando a coleo CommandBars. No Access 2007, os suplementos de colocar botes na barra de ferramentas
Comanda o grupo da Add-Ins guia da faixa de opes, para trs compatibilidade com o velho
Coleo CommandBars.
Alm de suplementos de COM e suplementos do Access, Access 2007 tambm oferece uma opo de novinho em folha: usando
o XML linguagem de programao para adicionar controles para a faixa de opes, alimentada por cdigo escrito em VBA.
Essa tcnica abordada em Captulo 15.
Criar um suplemento usando
Visual Basic 6.0
Quando voc cria um suplemento, em vez de criar um banco de dados biblioteca com uma tabela USysRegInfo (como
voc faria para um suplemento do Access), voc cria um projeto do VB, com um mdulo especial de Designer, um stan -
mdulo de Dard e (opcionalmente) um formulrio. Quando criar um COM add-in usando o VB 6, voc pode economizar tempo
usando um modelo de projeto de suplemento de COM. O que eu uso foi criado para uso no desenvolvedor
Edio do Office 2000, mas com algumas pequenas modificaes, ele funciona bem em VB tambm.
Usando o modelo de suplemento COM
Para disponibilizar o modelo de suplemento de COM como uma das selees ao criar um novo proj VB-
ect, copiar o suplemento COM arquivos de modelo para a pasta de projetos sob a pasta de modelos do VB (usu-
aliado a c: \/ Program Files\/Microsoft Visual Studio\/VB98\/modelo\/projetos), como mostrado na Figura 13.1.
Quando voc abrir em seguida VB, voc ver uma seleo COM Add-In como um dos projetos tem-
opes de placa, como mostrado na Figura 13.2.
Uma vez que voc selecionou o modelo COM Add-In e clicar em OK, um novo projeto criado
baseado no modelo, incluindo um formulrio e um mdulo de um designer. Esses objetos esto localizados no
Gerenciador de projeto (do lado direito da janela do VB), como mostrado na Figura 13.3.
436
Adicionando mais funcionalidades ao Office
Parte III
19_047026 ch13.qxp 02\/04\/07 21:54 pgina 436
FIGURA 13.1
Copiando os arquivos de projeto COM Add-In para a pasta de projetos do VB.
FIGURA 13.2
COM Add-In projeto modelo seleo em VB 6.
437
Criando suplementos COM o Visual Basic 6
13
19_047026 ch13.qxp 02\/04\/07 21:54 pgina 437
FIGURA 13.3
Um novo projeto VB criado usando o modelo de projeto COM Add-in.
Para definir uma referncia em um projeto VB 6, drop-down menu projeto e selecione as referncias, conforme mostrado
na Figura 13.4.
FIGURA 13.4
Abrindo a caixa de dilogo VB 6 referncias.
Para melhor funcionamento, um COM add-in projetado para rodar em acesso deve ter uma referncia
definida como o acesso e (se necessrio) bibliotecas de objeto DAO, como mostrado na Figura 13.5. Se voc
criar seu prprio suplemento a partir do zero, voc provavelmente precisar definir um ou ambos se referem-
cias; Defini-los no projeto de modelo VB de amostra, para que eles j so verificados em projetos
feita a partir deste modelo.
NOTA NOTA
438
Adicionando mais funcionalidades ao Office
Parte III
19_047026 ch13.qxp 02\/04\/07 21:54 pgina 438
FIGURA 13.5
Referncias como os Access e DAO bibliotecas de objeto na caixa de dilogo referncias VB.
Voc pode modificar a forma (se voc precisa de um formulrio em seu Adicionar-in) e o cdigo no padro
mdulo e designer, para criar um personalizado COM add-in para usam no Access:
1. Primeiro abra o designer e preencha as informaes bsicas sobre o add-in no seu geral
guia (guia Avanado raramente precisa ser modificado de suas configuraes padro).
2. Digite o nome de exibio do suplemento e descrio no \"Addin exibir nome\" e \"Addin
Caixas de descrio\", selecione o aplicativo do Office (acesso neste caso) a
Aplicao suspensa lista (Ver Figura 13.6). A verso de Office atualmente em execuo est
automaticamente selecionado na caixa de verso do aplicativo.
3. Finalmente, selecione comportamento de carga do add-in suspensa \"Comportamento de carga inicial\"
Inicializao a escolha apropriada se voc quiser adicionar-in para estar sempre disponveis em qualquer
Banco de dados Access (que o caso usual).
O mdulo de SharedCode (como seu nome sugere) contm o cdigo que se aplica o todo suplemento,
como um manipulador de erro e o cdigo padro que cria e remove barra de ferramentas mas - o suplemento
toneladas ou itens de menu (para o caso raro onde um multi-aplicao suplemento coloca um comando
o mesmo menu ou barra de ferramentas em cada aplicativo do Office).
O cdigo no Designer (que chamei de AccessDesigner para indicar que um Designer de acesso)
contm cdigo especfico para o acesso. (Se voc estiver criando um suplemento vrios aplicativos, voc precisa criar
um Designer para cada aplicativo do Office que o add-in oferece suporte). Algum cdigo padro no
o Designer trabalha com o formulrio de frmCOMAddIn; se seu Adicionar-in no precisa exibir um formulrio,
voc pode excluir ou comentar qualquer cdigo que faz referncia a essa forma, mas uma boa idia para deixar todos os
os procedimentos no mdulo, no caso que pode precisar deles mais tarde sobre.
439
Criando suplementos COM o Visual Basic 6
13
19_047026 ch13.qxp 02\/04\/07 21:54 pgina 439
Figura 13.6
Entrar o suplemento de COM do identificando informaes e outras opes na janela de Designer.
O cdigo do Designer inclui os processos que implementam a funcionalidade do suplemento; eles exigem
pouca (ou nenhuma) modificao daqueles que seria executado em um suplemento do Access.
Criando o controle de LNB renomeando COM Add-in
Os procedimentos que fazem a renomeao dos controles de formulrio e relatrio na renomeao de controle de LNB
Suplemento COM so basicamente o mesmo que o acesso de renomear LNC suplemento, que foi abordado em detalhes
em meu livro anterior Desenvolvimento de aplicativos de um especialista Microsoft Access ; Este captulo de concentrao-
trates sobre as diferenas necessrias para fazer o cdigo funcionar em um COM add-in.
Para mais detalhes sobre o LNB renomear Adicionar-in, consulte meu livro especialista Microsoft-em-um
Desenvolvimento de aplicaes de acesso (ISBN: 0764559044).
O mdulo de SharedCode
Comeando com um projeto criado a partir do modelo de projeto COM, no mdulo SharedCode,
Eu removi as declaraes padro (as declaraes s preciso so aqueles no
Mdulo de AccessDesigner), e tambm tirei o padroAddToCommandBar e
DeleteFromCommandBar funes. Porque eu precisava para criar (e remover) duas barra de comando
botes, destinados especificamente as barras de ferramentas Design de formulrio de acesso e de relatrio, coloquei
esses procedimentos no Designer do Access.
REFERNCIA CRUZADA REFERNCIA CRUZADA
440
Adicionando mais funcionalidades ao Office
Parte III
19_047026 ch13.qxp 02\/04\/07 21:54 pgina 440
Eu adicionei o StripChars funo para este mdulo; chamado todo o add-in para remover
vrios personagens e espaos de controlam nomes durante a renomeao, assim como evitar problemas quando
os controles so referenciados no cdigo. Modifiquei o modelo padro AddInErr procedimento
ligeiramente; Ele cria uma seqncia de caracteres de caixa de mensagem que chamada de manipuladores de erro no add-in. O
Mdulo de SharedCode que contm esses procedimentos est listado em seguida:
Opo explcita
Pblico funo StripChars(strText _
Como String) As String
Tiras de uma variedade de caracteres no-alfanumricos de uma seqncia de caracteres de texto.
No erro GoTo ErrorHandler
Dim strTestString As String
Dim strTestChar As String
Dim lngFound como longo
Dim i As Integer
Dim strStripChars As String
strStripChars = \"' ~! @#$ % ^
& Chr$(34) & Chr$(13) & Chr$(10)
strTestString = strText
Eu = 1
Fazer enquanto eu < = Len(strTestString)
Encontre um caractere strippable.
strTestChar = Mid$ (strTestString, i, 1)
lngFound = InStr (strStripChars, strTestChar)
Se lngFound > 0 ento
strTestString = Left (strTestString, i - 1) _
& Mid(strTestString, i + 1)
Outra coisa
i = i + 1
End If
Loop
StripChars = strTestString
ErrorHandlerExit:
Exit Function
ErrorHandler:
AddInErr Err
Resume ErrorHandlerExit
End Function
441
Criando suplementos COM o Visual Basic 6
13
19_047026 ch13.qxp 02\/04\/07 21:54 pgina 441
Public Sub AddInErr(errX As ErrObject)
Exibe mensagem de caixa com informaes de erro
Dim strMsg As String
strMsg = _
\"Ocorreu um erro na\"
& vbCrLf & Error #: & errX.Number _
& vbCrLf & Description: & errX.Description
MsgBox strMsg, \"Erro!\"
End Sub
O mdulo de AccessDesigner
O suplemento precisa de vrias entradas na seo declaraes do mdulo AccessDesigner.
Para abrir o mdulo designer, abra a pasta de Designers na rvore do projeto, com o boto direito do
AccessDesigner item e selecione Exibir cdigo no menu de contexto, como mostrado na Figura 13.7.
FIGURA 13.7
Abrindo o mdulo de cdigo de AccessDesigner.
O cdigo padro de designer precisa de algumas modificaes para poder trabalhar com suplemento eventos que
fogo quando o suplemento carregado ou descarregado, ou quando inicia o aplicativo de host (acesso neste caso)
ou desliga. Esses eventos so implementados atravs da biblioteca de IDTExtensibility2, usando o
Implementa linha no incio do mdulo.
442
Adicionando mais funcionalidades ao Office
Parte III
19_047026 ch13.qxp 02\/04\/07 21:54 pgina 442
Os procedimentos comeam com Private Sub IDTExtensibility2 h suporte os eventos
Esta biblioteca. Voc precisa ter todos os procedimentos de evento cinco no mdulo Designer, mesmo que seu
Adicionar-in no pode usar todos eles. Os que eu no preciso tem apenas uma linha de comentrio:
' Nenhum cdigo necessrio, mas deve ter o esboo do evento
OS suplementos geralmente colocar um ou mais botes ou comandos na barra de ferramentas ou menu de acolhimento
aplicao; cada um requer umWithEvents instruo na seo de declaraes da
Mdulo designer, para apoiar o cdigo no evento Click do boto ou comando. Meu controle de LNB
Renomear cdigo tem dois desses eventos, para apoiar os dois botes da barra de ferramentas.
O restante da seo de declaraes contm grupos de variveis pblicas e privadas, para uso em
Adicionar-em vrios procedimentos. Os procedimentos neste mdulo tem a funcionalidade descrita a seguir:
O OnConnection procedimento de evento define variveis de boto de barra de comando e usa
o CreateFormCommandBarButton e CreateReportCommandBarButton
funes para criar barras de ferramentas de acesso as botes no Design do formulrio (ou Design de relatrio)
(em verses anteriores do Access), ou ao grupo de comandos da barra de ferramentas na recuar
Guia de compatibilidade de suplementos da faixa de opes (no Access 2007 em execuo no Windows XP).
O OnDisconnection procedimento de evento executa uma funo que remove os dois com-
botes de barra de Matos quando o suplemento for desconectado por descarregar o suplemento a
Caixa de dilogo suplementos de COM (eles no so removidos quando o acesso fechado).
Os dois procedimentos de evento de clique executar o LNCRenameFormControls e
LNCRenameReportControls funes, que respectivamente renomear o formulrio e
controles de relatrio.
Um boto de barra de comando de 2000 2003 acesso tem sua
OnAction
Propriedade para o nome
de uma macro (um procedimento Sub sem argumentos) que executado quando o boto clicado;
a sintaxe diferente para os botes colocados em barras de comando de um suplemento de COM. Em vez disso, o
OnAction
Propriedade definida como o ProgId do suplemento COM e Click evento do boto tratado pelo clique
procedimento de evento no mdulo de Designer.
O CreateFormCommandBarButton cria o boto de barra de ferramentas de acesso que renomeia
controles em formulrios abertos. Os primeiros conjuntos de funo a pappAccess varivel para a
Access.Application objeto, em seguida, define uma referncia para a barra de ferramentas de Design do formulrio (onde o
boto ser colocado), procura de um boto existente sobre esta barra de ferramentas, usando sua marca prop-
patrimnio e cri-lo se ele j no existir.
O CreateReportCommandBarButton procedimento faz um trabalho semelhante para o relatrio
Boto de barra de ferramentas de design que renomeia controles de relatrio.
O RemoveAddInCommandBarButton funo (chamado OnDisconnection
procedimento de evento) remove botes de comando do suplemento.
O LNCRenameFormControls e LNCRenameReportControls funes so
basicamente semelhante ao cdigo acesso LNC renomear Adicionar-in, por isso no vou discutir os
em detalhe. A principal diferena que as funes de suplemento COM renomear controles sobre a
Abrir formulrios (ou relatrios); a Rename controles de formulrio e controles de relatrio de renomear
menu add-ins renomear controles em todos os formulrios ou relatrios, ou no esto abertas.
NOTA NOTA
443
Criando suplementos COM o Visual Basic 6
13
19_047026 ch13.qxp 02\/04\/07 21:54 pgina 443
O cdigo de AccessDesigner est listado a seguir, com as modificaes especficas necessrias para implementar o
funcionalidade na suplemento, usando os procedimentos de evento suportados pela biblioteca IDTExtensibility2 a cre-
comeu o comando barra de botes e procedimentos de atribuir a eles. O mdulo tambm contm o proce-
dures usado para controlar a mudana de nome:
Implements IDTExtensibility2
Private WithEvents frmcbb como Office.CommandBarButton
Private WithEvents rptcbb como Office.CommandBarButton
Varivel global para armazenar a referncia ao aplicativo host (acesso)
Pblico pappAccess como Access.Application
Variveis regulares para criar botes de barra de ferramentas
Privado cbrMenu como Office.CommandBar
Privado cbbAddIn como Office.CommandBarButton
Variveis pblicas para a manipulao de renomeao
Pblico pctl como Access.Control
Pdbs pblica como DAO.Banco de dados
Pblico pfrm como Access.Form
Public pintRenameFail As Integer
Public pintReturn As Integer
PlngControlType pblico como longo
Pblico prpt como Access.Report
Prst pblica como DAO.Conjunto de registros
Public pstrMessage As String
Public pstrNewCtlName As String
Public pstrOldCtlName As String
Public pstrSQL As String
Public pstrSourceObject As String
Variveis particulares para a manipulao de renomeao
Privada como inteiro
Private blnTag As Boolean
Private intTag As Integer
Private strPrefix As String
Private blnUnbound As Boolean
Private strControlSource As String
Private strCaption As String
Private strObjectName As String
Private strCtlName As String
444
Adicionando mais funcionalidades ao Office
Parte III
19_047026 ch13.qxp 02\/04\/07 21:54 pgina 444
Constantes para personagens que cercam o ProgID
PROG_ID_START const como String = \"! <\"
PROG_ID_END const como String = \">\"
Private Sub IDTExtensibility2_OnAddInsUpdate(custom() _
Como variante)
No erro GoTo ErrorHandler
' Nenhum cdigo necessrio, mas deve ter o esboo do evento
ErrorHandlerExit:
Exit Sub
ErrorHandler:
AddInErr Err
Resume ErrorHandlerExit
End Sub
Private Sub IDTExtensibility2_OnBeginShutdown(custom() _
Como variante)
No erro GoTo ErrorHandler
' Nenhum cdigo necessrio, mas deve ter o esboo do evento
ErrorHandlerExit:
Exit Sub
ErrorHandler:
AddInErr Err
Resume ErrorHandlerExit
End Sub
Private Sub IDTExtensibility2_OnConnection(ByVal _
Aplicao como objeto, _ ByVal ConnectMode
Como AddInDesignerObjects.ext_ConnectMode _
ByVal AddInInst como objeto, como variante de custom())
445
Criando suplementos COM o Visual Basic 6
13
19_047026 ch13.qxp 02\/04\/07 21:54 Page 445
Chamadas compartilhado o cdigo para criar um novo boto de barra de comando para renomear os controles em um formulrio ou relatrio.
No erro GoTo ErrorHandler
Definir frmcbb = CreateFormCommandBarButton (aplicativo, _
ConnectMode, AddInInst)
Definir rptcbb = CreateReportCommandBarButton (aplicativo, _
ConnectMode, AddInInst)
ErrorHandlerExit:
Exit Sub
ErrorHandler:
AddInErr Err
Resume ErrorHandlerExit
End Sub
Private Sub IDTExtensibility2_OnDisconnection(ByVal _
RemoveMode como AddInDesignerObjects.ext_DisconnectMode _
Como variante de Custom())
No erro GoTo ErrorHandler
Chame o procedimento comum para desconectar-se adicionar-in.
RemoveAddInCommandBarButton RemoveMode
ErrorHandlerExit:
Exit Sub
ErrorHandler:
AddInErr Err
Resume ErrorHandlerExit
End Sub
Private Sub IDTExtensibility2_OnStartupComplete(custom() _
Como variante)
No erro GoTo ErrorHandler
' Nenhum cdigo necessrio, mas deve ter o esboo do evento
ErrorHandlerExit:
Exit Sub
446
Adicionando mais funcionalidades ao Office
Parte III
19_047026 ch13.qxp 02\/04\/07 21:54 Page 446
ErrorHandler:
AddInErr Err
Resume ErrorHandlerExit
End Sub
Private Sub frmcbb_Click (ByVal ctl As _
Office.CommandBarButton, CancelDefault As Boolean)
Em erro continuar prximo
Chame LNCRenameFormControls
End Sub
Private Sub rptcbb_Click (ByVal ctl As _
Office.CommandBarButton, CancelDefault As Boolean)
Em erro continuar prximo
Chame LNCRenameReportControls
End Sub
Public Function CreateFormCommandBarButton (ByVal _
Aplicao como objeto, _ ByVal ConnectMode
Como AddInDesignerObjects.ext_ConnectMode _
ByVal AddInInst como objeto) como Office.CommandBarButton
No erro GoTo ErrorHandler
Armazenar uma referncia para o objeto de aplicativo em uma varivel pblica para outros procedimentos do add-in
pode us-lo.
Definir pappAccess = aplicativo
Retorne uma referncia para a barra de comandos...
Definir cbrMenu = pappAccess.CommandBars (\"Design do formulrio\")
Adicione um boto para chamar o add-in da barra de comando, se ele j no existir.
Procure o boto na barra de comandos.
Definir cbbAddIn = _
cbrMenu.FindControl (Tag: = \"Renomear os controles do formulrio\")
Em erro continuar prximo
Se cbbAddIn no nada ento
447
Criando suplementos COM o Visual Basic 6
13
19_047026 ch13.qxp 02\/04\/07 21:54 pgina 447
Adicione o novo boto.
Definir cbbAddIn = _
cbrMenu.Controls.Add (tipo: = msoControlButton, _
Parmetro: = \"Renomear os controles do formulrio\")
Defina propriedades de legenda, etiqueta, estilo e OnAction do boto.
Com cbbAddIn
.Caption = \"renomear
.Tag = \"Renomear a controles de formulrio\"
.Style = msoButtonCaption
Execute a funo de suplemento principal.
.OnAction = PROG_ID_START
& PROG_ID_END
Terminar com
End If
No erro GoTo ErrorHandler
Retorne uma referncia para o novo boto de barra de comando.
Definir CreateFormCommandBarButton = cbbAddIn
ErrorHandlerExit:
Exit Function
ErrorHandler:
AddInErr Err
Resume ErrorHandlerExit
End Function
Public Function CreateReportCommandBarButton (ByVal _
Aplicao como objeto, ByVal ConnectMode como _
AddInDesignerObjects.ext_ConnectMode _
ByVal AddInInst como objeto) como Office.CommandBarButton
No erro GoTo ErrorHandler
Armazenar uma referncia para o objeto de aplicativo em uma varivel pblica para outros procedimentos do add-in
pode us-lo.
Definir pappAccess = aplicativo
448
Adicionando mais funcionalidades ao Office
Parte III
19_047026 ch13.qxp 02\/04\/07 21:54 pgina 448
Retorne uma referncia para a barra de comandos...
Definir cbrMenu = pappAccess.CommandBars (\"relatrio Design\")
Adicione um boto para chamar o add-in da barra de comando, se ele j no existir.
Procure o boto na barra de comandos.
Definir cbbAddIn = _
cbrMenu.FindControl (Tag: = \"Renomear relatrio controles\")
Se cbbAddIn no nada ento
Adicione o novo boto.
Definir cbbAddIn = _
cbrMenu.Controls.Add (tipo: = msoControlButton, _
Parmetro: = \"Renomear relatrio controles\")
Defina propriedades de legenda, etiqueta, estilo e OnAction do boto.
Com cbbAddIn
.Caption = \"renomear
.Tag = \"Renomear controles de relatrio\"
.Style = msoButtonCaption
Execute a funo de suplemento principal.
.OnAction = PROG_ID_START
& PROG_ID_END
Terminar com
End If
Retorne uma referncia para o novo boto de barra de comandos.
Definir CreateReportCommandBarButton = cbbAddIn
ErrorHandlerExit:
Exit Function
ErrorHandler:
AddInErr Err
Resume ErrorHandlerExit
End Function
Funo RemoveAddInCommandBarButton (_ ByVal
RemoveMode como AddInDesignerObjects.ext_DisconnectMode)
449
Criando suplementos COM o Visual Basic 6
13
19_047026 ch13.qxp 02\/04\/07 21:54 pgina 449
Este procedimento remove os botes da barra de comando para o suplemento, se o usurio desconectado.
Em erro continuar prximo
Se o usurio descarregado o add-in, remova o boto. Caso contrrio, o suplemento est sendo descarregado
porque o aplicativo est fechando; Nesse caso, deixe o boto como .
Se RemoveMode = ext_dm_UserClosed Then
Exclua os botes da barra de comando personalizado.
Com pappAccess.CommandBars (\"Design do formulrio\")
.Controles (\"controles de formulrio renomear\").Excluir
Terminar com
Com pappAccess.CommandBars (\"relatrio Design\")
.Controles (\"controles de relatrio de renomear\").Excluir
Terminar com
End If
ErrorHandlerExit:
Exit Function
ErrorHandler:
AddInErr Err
Resume ErrorHandlerExit
End Function
LNCRenameFormControls() funo pblica como variante
Renomeia todos os controles em formulrios abertos.
Em erro continuar prximo
Gere tabela de tipos de controle para usar em renomeando controles (se ainda no existir).
CreateCTTable
No erro GoTo ErrorHandler
Determine se quaisquer formulrios abertos e sair se no.
Se pappAccess.Forms.Count = 0 Then
MsgBox \"no h formulrios esto abertos; sair\"
GoTo ErrorHandlerExit
End If
450
Adicionando mais funcionalidades ao Office
Parte III
19_047026 ch13.qxp 02\/04\/07 21:54 pgina 450
Determine se original os nomes de controle devem ser armazenados na propriedade Tag.
pstrMessage = _
_ \"Quando processamento controles de formulrio, dever o original\"
& control name be saved to the controls Tag _
& property?
intTag = MsgBox (pstrMessage, vbYesNo + vbQuestion + _
vbDefaultButton2, \"Backup de nome controle\")
Se intTag = vbYes Then
blnTag = True
Outra coisa
blnTag = False
End If
Processe os formulrios abertos.
Para cada pfrm em pappAccess.Forms
Para cada pctl em pfrm.Controles
strCtlName = pctl.Nome
plngControlType = pctl.ControlType
blnUnbound = False
Selecione o caso plngControlType
Controles de fonte de controle
Caso acTextBox
strPrefix = \"txt\"
Eu = ControlCS (pctl, strPrefix, blnTag)
Caso acComboBox
strPrefix = \"cbo\"
Eu = ControlCS (pctl, strPrefix, blnTag)
Caso acCheckBox
strPrefix = \"chk\"
strControlSource = pctl.OrigemDoControle
Se blnUnbound = False Then
Eu = ControlCS (pctl, strPrefix, blnTag)
Outra coisa
Eu = ControlNA (pctl, strPrefix, blnTag)
End If
Caso acBoundObjectFrame
strPrefix = \"frb\"
Eu = ControlCS (pctl, strPrefix, blnTag)
451
Criando suplementos COM o Visual Basic 6
13
19_047026 ch13.qxp 02\/04\/07 21:54 pgina 451
Caso acListBox
strPrefix = \"lst\"
Eu = ControlCS (pctl, strPrefix, blnTag)
Caso acOptionGroup
strPrefix = \"fra\"
Eu = ControlCS (pctl, strPrefix, blnTag)
Caso acOptionButton
strPrefix = \"opt\"
strControlSource = pctl.OrigemDoControle
Se blnUnbound = False Then
Eu = ControlCS (pctl, strPrefix, blnTag)
Outra coisa
Eu = ControlNA (pctl, strPrefix, blnTag)
End If
Controles com legenda s
Caso acToggleButton
strPrefix = \"tgl\"
Eu = ControlCA (pctl, strPrefix, blnTag)
Caso acLabel
strPrefix = \"lbl\"
Eu = ControlCA (pctl, strPrefix, blnTag)
Caso acCommandButton
strPrefix = \"cmd\"
Eu = ControlCA (pctl, strPrefix, blnTag)
Controles com apenas o objeto de origem
Caso acSubform
strPrefix = \"sub\"
Eu = ControlSO (pctl, strPrefix, blnTag)
Controles com nenhuma das anteriores
Caso acObjectFrame
strPrefix = \"fru\"
Eu = ControlNA (pctl, strPrefix, blnTag)
Caso acImage
strPrefix = \"img\"
Eu = ControlNA (pctl, strPrefix, blnTag)
Caso acTabCtl
strPrefix = \"tab\"
Eu = ControlNA (pctl, strPrefix, blnTag)
452
Adicionando mais funcionalidades ao Office
Parte III
19_047026 ch13.qxp 02\/04\/07 21:54 pgina 452
Caso acLine
strPrefix = \"lin\"
Eu = ControlNA (pctl, strPrefix, blnTag)
Caso acPage
strPrefix = \"pge\"
Eu = ControlNA (pctl, strPrefix, blnTag)
Caso acPageBreak
strPrefix = \"brk\"
Eu = ControlNA (pctl, strPrefix, blnTag)
Caso acRectangle
strPrefix = \"shp\"
Eu = ControlNA (pctl, strPrefix, blnTag)
End Select
Prxima pctl
Prxima pfrm
Chamada MsgBox (\"todos formam controles renomeados!\" _
vbOKOnly, \"Feito\")
ErrorHandlerExit:
Exit Function
ErrorHandler:
Se um boto de opo ou caixa de seleo desacoplada, conjunto blnUnbound Para Verdadeiro Portanto, o cdigo usa o NA
funo em vez de CS.
Se Err. Number = 2455 ento
blnUnbound = True
Retomar em seguida
Outra coisa
AddInErr Err
Resume ErrorHandlerExit
End If
End Function
[Eu estou omitindo o LNCRenameReportControls funo desta lista, porque ele sub-
stantially semelhante a LNCRenameFormControls funo].
Os procedimentos a seguir renomeie controles de formulrio e relatrio de vrios tipos. Controles so agrupados
dependendo se eles esto ligados e outras propriedades relevantes. Cada grupo de con-
XO (ControlCS ControlCA e assim por diante) precisa de um cdigo diferente para criar um nome apropriado para
453
Criando suplementos COM o Visual Basic 6
13
19_047026 ch13.qxp 02\/04\/07 21:54 pgina 453
o controle. Os controles acoplados, por exemplo, criar um nome usando o nome do campo acoplado;
rtulos de criar um nome usando o texto da legenda e assim por diante:
Pblico funo ControlCS(ctl As Access.Control, _
strPrefix As String, blnTag As Boolean) As Integer
Grupo renomeao de todos os controles com fontes de controle em um formulrio ou relatrio.
No erro GoTo ErrorHandler
Dim strControlSource As String
strControlSource = Nz (ctl.OrigemDoControle)
pstrOldCtlName = ctl.Nomedocontrole
Verificar se o controle j chamado corretamente e caso tambm especial para controles cujo original
nome comea com \"Opo\" ou \"Frame\" (mesmo primeiras trs letras como prefixo).
Se deixou (pstrOldCtlName, 3) = strPrefix e _
Esquerda (pstrOldCtlName, 6) <>\"Opo\" e _
Esquerda (pstrOldCtlName, 3) = strPrefix e _
Esquerda (pstrOldCtlName, 5) <>\"Frame\", em seguida,
GoTo ErrorHandlerExit
Se a fonte de controle no vazia, us-lo.
ElseIf strControlSource <>\"\" ento
pstrNewCtlName = strPrefix
StripChars(strControlSource)
Outra coisa
Caso contrrio, use o nome original do controle.
pstrNewCtlName = strPrefix
StripChars(pstrOldCtlName)
End If
Corrigir o nome de \"Page x de y\" textbox controles em relatrios do Assistente de banco de dados.
Se pstrNewCtlName = \"txtPagePageofPages\", em seguida,
pstrNewCtlName = \"txtPages\"
End If
Mostrar ao usurio
o nome original de controle
o tipo de controle
fonte de controle
proposto novo nome
454
Adicionando mais funcionalidades ao Office
Parte III
19_047026 ch13.qxp 02\/04\/07 21:54 pgina 454
e perguntar se o novo nome aceitvel.
pintRenameFail = True
Enquanto pintRenameFail
pintRenameFail = False
pintReturn = MsgBox (_
\"Renomear\"
DLookup (\"[ControlTypeName]\", _
\"zLNCtblControlType\" _
\"[ControlType] =\"
& control currently named _
& pstrOldCtlName & vbCrLf & _
\"(Control Source:\"
& to & vbCrLf & pstrNewCtlName & ?, _
vbYesNo + vbQuestion + vbDefaultButton1 _
\"Renomear controle\")
Se o usurio clicar no boto Sim, mudar o nome do controle.
Se pintReturn = vbYes Then
Se blnTag = True Then
CTL.Tag = ctl.Nomedocontrole
End If
CTL.ControlName = pstrNewCtlName
Caso contrrio, aparecer uma caixa de entrada para editar o nome.
ElseIf pintReturn = vbNo Then
pstrNewCtlName = _
InputBox (\"Modificar Nome controle de novo\" _
Renomear controlo, pstrNewCtlName)
CTL.ControlName = pstrNewCtlName
End If
Loop
ErrorHandlerExit:
Exit Function
ErrorHandler:
Se o nome de controle proposto j est em uso, retorne para a caixa de dilogo de renomeao.
pintRenameFail = True
Se Err. Number = 2104 ento
MsgBox \"No h outro controle chamado\"
pstrNewCtlName
\"Controle nome usado\"
pstrNewCtlName = pstrNewCtlName
455
Criando suplementos COM o Visual Basic 6
13
19_047026 ch13.qxp 02\/04\/07 21:54 pgina 455
Outra coisa
AddInErr Err
Resume ErrorHandlerExit
End If
Retomar em seguida
End Function
Pblico funo ControlCA(ctl As Access.Control, _
strPrefix As String, blnTag As Boolean) As Integer
Grupo renomeao de todos os controles com as legendas em um formulrio ou relatrio.
No erro GoTo ErrorHandler
Dim strCaption As String
pstrOldCtlName = ctl.Nomedocontrole
strCaption = ctl.Legenda
Se deixou (pstrOldCtlName, 3) = strPrefix, em seguida,
Exit Function
ElseIf strCaption <>\"\" ento
Se deixou (strCaption, 3) = \"frm\", em seguida,
pstrNewCtlName = strPrefix
Mid(StripChars(strCaption), 4)
ElseIf Left(strCaption, 4) = \"fsub\", em seguida,
pstrNewCtlName = strPrefix
Mid(StripChars(strCaption), 5)
Outra coisa
pstrNewCtlName = strPrefix
StripChars(strCaption)
End If
ElseIf strCaption = \"\", em seguida,
Se deixou (pstrOldCtlName, 3) = \"frm\", em seguida,
pstrNewCtlName = strPrefix
Mid(StripChars(pstrOldCtlName), 4)
ElseIf Left(pstrOldCtlName, 4) = \"fsub\", em seguida,
pstrNewCtlName = strPrefix
Mid(StripChars(pstrOldCtlName), 5)
Outra coisa
pstrNewCtlName = strPrefix
StripChars(pstrOldCtlName)
End If
End If
Se direito (pstrNewCtlName, 12) = \"SubformLabel\", em seguida,
pstrNewCtlName = Left (pstrNewCtlName, _
Len(pstrNewCtlName) - 12)
456
Adicionando mais funcionalidades ao Office
Parte III
19_047026 ch13.qxp 02\/04\/07 21:54 pgina 456
ElseIf Right(pstrNewCtlName, 5) = \"Label\", em seguida,
pstrNewCtlName = Left (pstrNewCtlName, _
Len(pstrNewCtlName) - 5)
End If
pintRenameFail = True
Enquanto pintRenameFail
pintRenameFail = False
pintReturn = MsgBox (\"Rename\" _
& DLookup([ControlTypeName], _
\"zLNCtblControlType\", \"[ControlType] =\" _
& ctl.ControlType) _
& control currently named & pstrOldCtlName _
& vbCrLf & (caption: & strCaption & ) to _
& vbCrLf & pstrNewCtlName & ?, vbYesNo + _
vbQuestion + vbDefaultButton1, \"Renomear o controle\")
Se pintReturn = vbYes Then
Se blnTag = True ento ctl.Tag = ctl.Nomedocontrole
CTL.ControlName = pstrNewCtlName
ElseIf pintReturn = vbNo Then
pstrNewCtlName = _
InputBox (\"Modificar Nome controle de novo\" _
Renomear controlo, pstrNewCtlName)
CTL.ControlName = pstrNewCtlName
End If
Loop
ErrorHandlerExit:
Exit Function
ErrorHandler:
Se o nome de controle proposto j est em uso, retorne para a caixa de dilogo de renomeao.
pintRenameFail = True
Se Err. Number = 2104 ento
MsgBox \"No h outro controle chamado\"
pstrNewCtlName
\"Controle nome usado\"
pstrNewCtlName = pstrNewCtlName
Outra coisa
AddInErr Err
Resume ErrorHandlerExit
End If
Retomar em seguida
End Function
Pblico funo ControlSO(ctl As Access.Control, _
strPrefix As String, blnTag As Boolean) As Integer
457
Criando suplementos COM o Visual Basic 6
13
19_047026 ch13.qxp 02\/04\/07 21:54 Page 457
Grupo renomeao de todos os controles com fonte de objetos em um formulrio ou relatrio.
' Chamado de RenameFormControls e RenameReportControls
' neste mdulo
No erro GoTo ErrorHandler
pstrOldCtlName = ctl.Nomedocontrole
pstrSourceObject = Nz (ctl.SourceObject)
Se deixou (pstrOldCtlName, 3) = strPrefix, em seguida,
Exit Function
ElseIf pstrSourceObject <>\"\" ento
Se deixou (pstrSourceObject, 3) = \"frm\", em seguida,
pstrNewCtlName = strPrefix
Mid(StripChars(pstrSourceObject), 4)
ElseIf Left(pstrSourceObject, 4) = \"fsub\", em seguida,
pstrNewCtlName = strPrefix
Mid(StripChars(pstrSourceObject), 5)
Outra coisa
pstrNewCtlName = strPrefix
StripChars(pstrSourceObject)
End If
ElseIf pstrSourceObject = \"\", em seguida,
Se deixou (pstrOldCtlName, 3) = \"frm\", em seguida,
pstrNewCtlName = strPrefix
Mid(StripChars(pstrOldCtlName), 4)
ElseIf Left(pstrOldCtlName, 4) = \"fsub\", em seguida,
pstrNewCtlName = strPrefix
Mid(StripChars(pstrOldCtlName), 5)
Outra coisa
pstrNewCtlName = strPrefix
StripChars(pstrOldCtlName)
End If
Outra coisa
pstrNewCtlName = strPrefix
StripChars(pstrOldCtlName)
End If
Se direito (pstrNewCtlName, 7) = \"Subformulrio\", em seguida,
pstrNewCtlName = Left (pstrNewCtlName, _
Len(pstrNewCtlName) - 7)
End If
pintRenameFail = True
Enquanto pintRenameFail
pintRenameFail = False
pintReturn = MsgBox (\"Rename\" _
& DLookup([ControlTypeName], _
\"zLNCtblControlType\", \"[ControlType] =\" _
458
Adicionando mais funcionalidades ao Office
Parte III
19_047026 ch13.qxp 02\/04\/07 21:54 pgina 458
& ctl.ControlType) _
& control currently named & pstrOldCtlName _
& vbCrLf & (source object: & pstrSourceObject _
& ) to & vbCrLf & pstrNewCtlName & ?, vbYesNo _
+ vbQuestion + vbDefaultButton1, \"Renomear o controle\")
Se pintReturn = vbYes Then
Se blnTag = True ento ctl.Tag = ctl.Nomedocontrole
CTL.ControlName = pstrNewCtlName
ElseIf pintReturn = vbNo Then
pstrNewCtlName = _
InputBox (\"Modificar Nome controle de novo\" _
Renomear controlo, pstrNewCtlName)
CTL.ControlName = pstrNewCtlName
End If
Loop
ErrorHandlerExit:
Exit Function
ErrorHandler:
Se o nome de controle proposto j est em uso, retorne para a caixa de dilogo de renomeao.
pintRenameFail = True
Se Err. Number = 2104 ento
MsgBox \"No h outro controle chamado\"
pstrNewCtlName
\"Controle nome usado\"
pstrNewCtlName = pstrNewCtlName
Outra coisa
AddInErr Err
Resume ErrorHandlerExit
End If
Resume ErrorHandlerExit
End Function
Pblico funo ControlNA(ctl As Access.Control, _
strPrefix As String, blnTag As Boolean) As Integer
Grupo renomeao de todos os controles, no cabendo as outras categorias em um formulrio ou relatrio.
' Chamado de RenameFormControls e RenameReportControls
' neste mdulo
No erro GoTo ErrorHandler
pstrOldCtlName = ctl.Nomedocontrole
459
Criando suplementos COM o Visual Basic 6
13
19_047026 ch13.qxp 02\/04\/07 21:54 pgina 459
Caso especial de linhas cujo nome padro \"Linha\" ou \"Opo\" (o mesmo trs primeiras letras como o stan-
prefixo de dard).
Se deixou (pstrOldCtlName, 3) = strPrefix e _
Esquerda (pstrOldCtlName, 6) <>\"Opo\" e _
Esquerda (pstrOldCtlName, 4) <>\"Linha\", em seguida,
Exit Function
Outra coisa
pstrNewCtlName = _ strPrefix
& StripChars(pstrOldCtlName)
End If
pintRenameFail = True
Enquanto pintRenameFail
pintRenameFail = False
pintReturn = MsgBox (\"Rename\"
DLookup (\"[ControlTypeName]\", _
\"zLNCtblControlType\", \"[ControlType] =\" _
& ctl.ControlType) & control currently named _
& pstrOldCtlName & to & vbCrLf _
& pstrNewCtlName & ?, vbYesNo + vbQuestion _
+ vbDefaultButton1 _
\"Renomear controle\")
Se pintReturn = vbYes Then
Se blnTag = True ento ctl.Tag = ctl.Nomedocontrole
CTL.ControlName = pstrNewCtlName
ElseIf pintReturn = vbNo Then
pstrNewCtlName = _
InputBox (\"Modificar Nome controle de novo\" _
Renomear controlo, pstrNewCtlName)
CTL.ControlName = pstrNewCtlName
End If
Loop
ErrorHandlerExit:
Exit Function
ErrorHandler:
Se o nome de controle proposto j est em uso, retorne para a caixa de dilogo de renomeao.
pintRenameFail = True
Se Err. Number = 2104 ento
MsgBox \"No h outro controle chamado\"
pstrNewCtlName
\"Controle nome usado\"
pstrNewCtlName = pstrNewCtlName
Outra coisa
AddInErr Err
460
Adicionando mais funcionalidades ao Office
Parte III
19_047026 ch13.qxp 02\/04\/07 21:54 pgina 460
End If
Resume ErrorHandlerExit
End Function
Funo pblica CreateCTTable()
' Chamado de LNCRenameFormControls e
' Funo de LNCRenameReportControls
' neste mdulo
Dim strCTTable As String
strCTTable = \"zLNCtblControlType\"
Exclua a tabela antiga, se houver.
Conjunto pdbs = CurrentDb
strCTTable = \"zLNCtblControlType\"
Em erro continuar prximo
PDBs.TableDefs.Delete strCTTable
No erro GoTo ErrorHandler
Gere a tabela de tipos de controle para usar na renomeao de controles. Se houver um erro de \"tabela no encontrada\",
sai da funo.
pstrSQL = \"CREATE TABLE\"
\"(ControlType LONG, ControlTypeName texto (50));\"
DoCmd.RunSQL pstrSQL
Acrescente dados tabela de tipos de controle.
Conjunto pdbs = CurrentDb
Conjunto prst = pdbs.OpenRecordset (strCTTable, dbOpenTable)
Com prst
.AddNew
!ControlType = 100
!ControlTypeName = \"Label\"
.Atualizao
.AddNew
!ControlType = 101
!ControlTypeName = \"Retngulo\"
.Atualizao
.AddNew
!ControlType = 102
!ControlTypeName = \"Linha\"
.Atualizao
.AddNew
461
Criando suplementos COM o Visual Basic 6
13
19_047026 ch13.qxp 02\/04\/07 21:54 pgina 461
!ControlType = 103
!ControlTypeName = \"Imagem\"
.Atualizao
.AddNew
!ControlType = 104
!ControlTypeName = \"Boto de comando\"
.Atualizao
.AddNew
!ControlType = 105
!ControlTypeName = \"Boto de opo\"
.Atualizao
.AddNew
!ControlType = 106
!ControlTypeName = \"Caixa de seleo\"
.Atualizao
.AddNew
!ControlType = 107
!ControlTypeName = \"Grupo de opes\"
.Atualizao
.AddNew
!ControlType = 108
!ControlTypeName = \"Quadro de objeto acoplado\"
.Atualizao
.AddNew
!ControlType = 109
!ControlTypeName = \"Caixa de texto\"
.Atualizao
.AddNew
!ControlType = 110
!ControlTypeName = \"Caixa de listagem\"
.Atualizao
.AddNew
!ControlType = 111
!ControlTypeName = \"Caixa de combinao\"
.Atualizao
.AddNew
!ControlType = 112
!ControlTypeName = \"Subformulrio\/sub-relatrio\"
.Atualizao
.AddNew
!ControlType = 114
!ControlTypeName = \"Quadro de objeto\"
.Atualizao
.AddNew
!ControlType = 118
!ControlTypeName = \"Quebra de pgina\"
.Atualizao
.AddNew
462
Adicionando mais funcionalidades ao Office
Parte III
19_047026 ch13.qxp 02\/04\/07 21:54 pgina 462
!ControlType = 122
!ControlTypeName = \"Alternar boto\"
.Atualizao
.AddNew
!ControlType = 123
!ControlTypeName = \"Controle de guia\"
.Atualizao
.AddNew
!ControlType = 124
!ControlTypeName = \"Pgina\"
.Atualizao
.Fechar
Terminar com
ErrorHandlerExit:
Exit Function
ErrorHandler:
Se Err. Number = 3010 ento
Tabela de tipos de controle j existe.
Exit Function
Outra coisa
AddInErr Err
Resume ErrorHandlerExit
End If
End Function
Criando DLL
Depois de modificar o cdigo em mdulos SharedCode e AccessDesigner conforme necessrio, salve o projeto
com um nome significativo (chamei a amostra COM add-in \"LNB controle renomear\"). O projeto
nome tambm vai ser usado como o nome do arquivo DLL quando voc faz esse arquivo. A etapa final a criao
DLL o suplemento selecionando o arquivo, fazer projeto DLL (com o nome de projeto real substituindo o
\"Nome do projeto\"). Se houver qualquer erro de sintaxe no projeto, voc receber uma mensagem de erro neste
ponto e voc pode corrigir os erros e tente novamente, at que a DLL criada com xito.
Para renomear um projeto VB, selecione o projeto (linha superior no Project Explorer) e
modifica seu nome na folha de propriedades. Para modificar o nome de um Designer, abri-lo,
em seguida, selecion-lo e modificar seu nome na folha de propriedades. O nome que voc d um projeto VB a
que ser usado por padro ao criar uma DLL.
Instalar um suplemento de COM
Se voc copiar o arquivo DLL criado por um COM add-in na pasta de Add-ins padro (geralmente c: \/ documentos
e configuraes \/ Nome de usurio \/ Application Data\/Microsoft\/AddIns), seus correspondentes devem aparecer automaticamente
o grupo de comandos da barra de ferramentas da guia Add-Ins da faixa de opes (como mostrado na Figura 13.8); pelo menos
Se voc estiver executando o Windows XP.
DICA DICA
463
Criando suplementos COM o Visual Basic 6
13
19_047026 ch13.qxp 02\/04\/07 21:54 pgina 463
FIGURA 13.8
Um COM add-in boto na guia Add-Ins da faixa de opes no Access 2007.
Se voc no vir correspondentes do seu suplemento COM em um banco de dados do Access depois de copiar o arquivo DLL
para a pasta de Add-ins, voc pode instalar o add-in na caixa de dilogo suplementos de COM, que pode ser
aberto a partir da pgina de Add-ins da caixa de dilogo Opes do Access. Para instalar um suplemento de COM, manualmente,
Faa o seguinte:
1. Para o Windows Vista apenas, executar acesso como administrador, clicando com o
MSACCESS.Arquivo EXE na subpasta sob a pasta Microsoft Office, escritrio 12
e selecionando \"Executar como administrador\" de seu menu de contexto do boto direito do mouse.
2. Em um banco de dados do Access, clique no boto Office e, em seguida, clique no boto Opes do Access, o
inferior direita, como mostrado na Figura 13.9.
FIGURA 13.9
Abrindo a caixa de dilogo Opes do Access.
3. Selecione a pgina de Add-ins na caixa de dilogo opes de acesso para ver seus suplementos instalados (voc vai
consulte acesso e COM suplementos listados l, alm de um ou mais suplementos instalados
com o Office). Se o suplemento est listado no grupo \"inativo aplicativo Add-Ins\", voc vai
precisa instal-lo na caixa de dilogo suplementos de COM.
464
Adicionando mais funcionalidades ao Office
Parte III
19_047026 ch13.qxp 02\/04\/07 21:54 pgina 464
4. Para instalar ou desinstalar os suplementos, selecione suplementos de COM na lista drop-down no
inferior da tela, como mostrado na Figura 13.10.
FIGURA 13.10
A pgina de Add-ins da caixa de dilogo Opes do Access.
5. Clicar em OK, voc ver o velho dilogo suplementos de COM, o mesmo que no Access 2003, como
mostrado na Figura 13.11.
FIGURA 13.11
A caixa de dilogo suplementos de COM.
465
Criando suplementos COM o Visual Basic 6
13
19_047026 ch13.qxp 02\/04\/07 21:54 pgina 465
6. O nome exibido na lista de \"Add-Ins disponveis\" aquele inserido como nome do suplemento
no Designer, mas curiosamente, a descrio inserida na descrio do Designer
campo no aparece esta caixa de dilogo.
7. Se seu suplemento de COM no aparecer na lista de add-ins disponveis, clique no boto Adicionar para
Procurar por ele; aps localiz-lo, clique em OK na caixa de dilogo Adicionar suplemento, conforme mostrado na Figura 13.12.
FIGURA 13.12
Navegar para um arquivo DLL COM Add-in.
8. O suplemento deve agora aparecer na caixa de dilogo suplementos de COM. Voc pode verificar seu
caixa de seleo (se necessrio) e fechar a caixa de dilogo; seus correspondentes ento devem aparecer no Adicionar-
Guia de ins da faixa de opes, no contexto adequado; por exemplo, um boto que pretende dis-
jogo da barra de ferramentas de Design do formulrio (como a mostrada na Figura 13.6) aparecer quando
voc tem um formulrio aberto no modo design.
No Access 2000 a 2003, COM add-in botes apareceram na barra de ferramentas designada
ou menu; no caso deste suplemento, que seria a barra de ferramentas de design de formulrio ou relatrio. Em
Acesso 2007, todos os botes aparecem diretamente sobre o grupo de comandos da barra de ferramentas na guia Suplementos. Se voc
estiver executando o Windows Vista, voc no ver a guia Add-Ins, a menos que voc executar o acesso como administrador, como
descrito no passo 1 acima.
Voc pode desmarcar o checkbox do add-in para temporariamente descarreg-lo, ou voc pode selecion-lo e clique em remover
para desinstal-lo completamente.
Solucionando problemas de um suplemento de COM
Se voc copiar o arquivo Renaming.dll do LNB para outro computador, instalar o add-in e encontrar que voc
recebo uma mensagem de erro quando execut-lo de seu boto, abra o arquivo Renaming.vpb LNC em VB 6
e fazer a DLL novamente; Isso deve resolver o problema.
NOTA NOTA
466
Adicionando mais funcionalidades ao Office
Parte III
19_047026 ch13.qxp 02\/04\/07 21:54 pgina 466
Para reabrir um COM add-in para edio, clique duas vezes no arquivo. vbp (projeto do VB). Voc precisa de ter qualquer
suporte arquivos (. bas, .dsr e frm) na mesma pasta que o arquivo de .vpb, porque eles fazem parte do
o projeto.
Se seu suplemento no est se comportando como voc espera, descarreg-lo primeiro (menu COM Add-ins),
em seguida, fechar o acesso e reabrir um banco de dados para ver se funciona agora. Isso pode resolver problemas que podem
ocorrem quando uma verso antiga do suplemento do cdigo est sendo executada em vez da verso atual.
Se voc tiver carregado de um banco de dados aberto com o suplemento de COM, voc receber uma permisso\"
negado\"mensagem ao tentar fazer a DLL, porque a DLL est sendo usada. Fechar
todos os bancos de dados e tente novamente, e voc deve ser capaz de salvar a DLL modificada.
Em seguida, Verificar duplicatas do arquivo DLL (talvez copias) que podem ser executados em vez disso
a atual verso da DLL. Na minha experincia, mesmo DLLs no localizados na pasta AddIns
pode ser executado, por isso melhor ter apenas uma DLL no seu computador para qualquer determinado suplemento (o mais recente
verso). Cpias de segurana podem ser transferidas para outro computador, em um disco, ou em formato zip, para evitar
confuso.
Se voc encontrar esse cdigo fazer referncia a objetos de acesso no estiver funcionando (com nenhuma mensagem de erro, ou um inap-
prognstico mensagem de erro, como \"Sem formas abrir\" quando voc tem formulrios abertos), pode ser necessrio
Adicione uma referncia de aplicao especfica de acesso ao seu cdigo. Especificamente, Considerando que o suplemento COM cdigo em
um Designer de acesso usando apenas Formulrios para fazer referncia a coleo de formas de acesso, ou Relatrios ref-
ERNCIA a coleo de relatrios de um banco de dados, funcionou muito bem em verses anteriores do Office, Office 2007 o
Varivel de aplicativo de acesso pappAccess deve ser usado, ento a sintaxe atual deve ser
pappAccess.Forms em vez de apenas Formulrios .
Se voc alterar o nome de um boto de barra de ferramentas criado por um suplemento de COM, voc pode ver o boto antigo
na barra de ferramentas, em vez de (ou alm) um novo. Para remover o velho boto, adicione uma linha de
cdigo para o RemoveAddInCommandBarButton funo para remover o boto, usando o mas-
nome de tonelada antigo em vez de \"Nome antigo de controle\":
.Controles (\"antigo nome de controle\").Excluir
Criar uma nova DLL, abrir um banco de dados do Access para carregar o add-in e, em seguida, descarregar o suplemento a
Caixa de dilogo suplementos de COM para executar o cdigo com a linha extra uma vez. Fechar o acesso, reabra o projeto VB,
excluir a linha e re-criar a DLL. Que deve se livrar do velho boto.
Usando um suplemento de COM
Usar um suplemento de COM fcil: basta clicar no boto ele colocado na guia Add-Ins da faixa de opes, como
mostrado na Figura 13.8. Para renomear controles em quaisquer formas de acesso abertas, por exemplo, abrir um formulrio em
visualizao de design e clique no boto renomear controles de formulrio na guia Suplementos. Primeiro voc receber um
mensagem perguntando se voc deseja salvar os nomes de controle original para sua propriedade Tag, conforme mostrado na
Figura 13.13.
AVISO AVISO
467
Criando suplementos COM o Visual Basic 6
13
19_047026 ch13.qxp 02\/04\/07 21:54 pgina 467
FIGURA 13.13
Uma COM add-in pergunta.
Salvar o nome original de controle para a propriedade Tag pode ocasionalmente ser til, especialmente quando
Voc est renomeando controles em um banco de dados criado por outra pessoa, e voc pode precisar de saber o
nome original de controle a fim de corrigir uma referncia mais tarde. No entanto, a opo padro no,
porque na maior parte, no necessrio conservar o original nome de controle.
Depois de selecionar uma opo, o cdigo ento passa a ciclo por meio de formulrios abertos e, para cada
forma, percorrer seus controles. Para qualquer controle que no tem o prefixo de controle apropriado, um
novo nome criado e apresentado para aprovao em uma caixa de mensagem, como mostrado na Figura 13.14.
FIGURA 13.14
Um nome de controle novo proposto.
Geralmente, o novo nome pode ser aceite como ; ocasionalmente (por exemplo, para rtulos com muito
legendas longas ou controles com expresses), o novo nome precisa ser editado, que feito pela
clicar em no e, em seguida, editar o nome do controle em um InputBox.
Ainda em 2007, quando voc cria uma nova forma de limite usando o boto de formulrio na guia criar de acessar
da faixa de opes, todos os controles acoplados tero os mesmos nomes como seus campos, o que podem levar ao circuito-
erros de referncia de lar durante a execuo de cdigo. Assim, uma boa idia para executar os controles de formulrio renomear
(ou renomear relatrio controles) comando imediatamente depois de criar um formulrio de limite ou relatrio, antes
escrever cdigo que referncias de seus campos ou controles.
468
Adicionando mais funcionalidades ao Office
Parte III
19_047026 ch13.qxp 02\/04\/07 21:54 pgina 468
Comparando os suplementos com
Acesso Adicionar-ins
Em verses anteriores do Office, os suplementos tinham uma vantagem em relao aos suplementos de acesso: voc
poderia colocar um boto em qualquer menu ou barra de ferramentas, considerando acesso menu add-ins s apareceu na
No menu Add-ins. Embora o VB 6 os suplementos funcionam no Access 2007, perderam este advan-
Tage sobre acesso add-ins, porque todos os comandos criados por um COM add-in agora consta o
Grupo de comandos de barra de ferramentas da guia da faixa de opes, no no grupo apropriado ou guia de suplementos
a faixa de opes.
Voc pode adicionar grupos, botes e as selees de menu para a faixa de opes usando o XML; Esta tecnologia-
nique discutida no captulo 15.
Em comparao com os suplementos, suplementos de acesso tem vrios recursos extras: voc pode criar no apenas
menu add-ins, mas tambm os feiticeiros de vrios tipos e construtores; Isso permite que voc adicionar funcionalidade a dif-
diferentes locais em um banco de dados do Access. No Access 2000 a 2003, voc poderia criar assistentes que
apareceria como escolhas extras na caixa de dilogo novo formulrio, embora no Access 2007 agora deve ser
feito usando XML para modificar a faixa de opes. No entanto, construtores de propriedade que executar vrios adequada-
laos ainda funcionam bem no Access 2007 (pelo menos se voc estiver executando o Windows XP), ento meu LNB renomear
suplemento pode ser executado a partir da propriedade nome de um controle para renomear um controle individual; Esta func-
nalidade no pode ser duplicada em um suplemento de COM.
Resumo
Neste captulo voc aprendeu a criar um VB 6 COM add-in que funciona com Access 2007, colocao
botes do grupo de comandos da barra de ferramentas da guia Add-Ins da faixa de opes. Se voc tem um VB 6
Adicionar-in criado em uma verso anterior do Office, voc pode modific-lo ligeiramente, para que ele vai trabalhar
Acesso 2007, reutilizando o seu cdigo. Se, por outro lado, voc quer aprender uma nova programao lan-
calibre, assim voc pode colocar botes e grupos especficos guias da faixa de opes, consulte os prximos dois captulos
para trabalhar com a faixa de opes XML e Visual Studio 2005 add-ins.
REFERNCIA CRUZADA REFERNCIA CRUZADA
469
Criando suplementos COM o Visual Basic 6
13
19_047026 ch13.qxp 02\/04\/07 21:54 pgina 469
19_047026 ch13.qxp 02\/04\/07 21:54 pgina 470
M
OST os bancos de dados de amostra para captulos anteriores includos objetos
do banco de dados Access 2007 Backup, usado para fazer incremen-
Tally backups de banco de dados numerados. Para utilizar esse recurso em um
banco de dados, voc precisar importar vrios objetos do Access 2007 Backup.accdb
no banco de dados atual e o conjunto de uma referncia para o Microsoft Scripting
Biblioteca de tempo de execuo, que um incmodo. Seria muito mais conveniente para
apenas ter backup disponvel em todos os seus bancos de acesso dados, dizer a partir de um menu
comando.
Um suplemento de acesso vai fazer apenas isso, encapsulando um conjunto de objetos de banco de dados e
cdigo em um nico pacote que est disponvel para todos os bancos de dados do Access. No presente
captulo eu uso como exemplo um acesso add-in (2007.accda Extras, que inclui
uma verso melhorada do cdigo Backup (a partir de basBackup em acesso 2007
Backup.accdb), com algumas melhorias: um formulrio de configurao para especificar o
pasta de backup; e um conjunto de objetos e cdigos que permitem que voc imprima listas de
tabelas ou consultas e seus campos, excluindo aqueles com especificado pelo usurio
prefixos muito til para quando voc precisa saber quais campos esto em que
durante o desenvolvimento de banco de dados, ou para documentar a estrutura de banco de dados de tabelas.
O banco de dados de amostra para este captulo 2007.accda Extras.
Se voc est tentando instalar um suplemento no Access 2007
executar no Windows Vista, voc pode receber o aviso de segurana
mostrado na Figura 14-1. Isto provavelmente porque voc no est executando o acesso
como um administrador. Para executar o acesso como administrador, boto direito do mouse o
MSACCESS.Arquivo EXE na subpasta Office 12 do Microsoft Office
pasta e selecione \"executar como administrador,\" Abra um banco de dados do Access e
Instale o add-in. Este no um problema ao instalar o add-ins para Access 2007
executando no Windows XP.
CUIDADO CUIDADO
NOTA NOTA
471
NESTE CAPTULO
Criao de acesso menu add-ins
Criao de assistentes de acesso
Criando a propriedade de acesso
construtores
Consideraes especiais e
Solucionando problemas de acesso
Adicionar-ins
Criando suplementos do Access
20_047026 ch14.qxp 02\/04\/07 21:54 pgina 471
FIGURA 14.1
Um aviso de segurana ao tentar instalar um suplemento do Access para o Access 2007 em execuo no Windows
Vista.
A finalidade de acesso Add-ins
Um suplemento do Access um banco de dados biblioteca banco de dados (um acesso de com a extenso. MDA para acesso
formato, ou accda para Access 2007) que contm os objetos e mdulos necessrios para apoiar o
funcionalidade na suplemento e uma tabela de sistema especial chamaram UsysRegInfo com o registro chave infor-
o necessria para instalar o add-in. suplementos normalmente so armazenados na pasta padro Microsoft AddIns
(C: \/ Documents and Settings \/ Nome de usurio \/ Application Data\/Microsoft\/AddIns), que foi tambm o
Acesso Adicionar-ins pasta padro para Access 2003). No Access 2007, a pasta padro da Microsoft
prprio suplementos a pasta ACCWIZ sob a pasta Office (no meu sistema, isto e: \/ Microsoft
Office 2007 Beta\/Office12\/ACCWIZ). No entanto, uma boa idia para manter seus prprios add-ins
principal pasta de suplementos (c: \/ Documents and Settings \/ Nome de usurio \/ Application Data\/Microsoft\/AddIns para
Windows XP ou c: \/ Users \/ Nome de usurio \/ AppData\/Roaming\/Microsoft\/AddIns para Windows Vista)
ao invs de misturadas com aqueles instalados pelo Office.
Um add-in instalado usando o Gerenciador de Add-ins de acesso (aberto no menu Add-Ins na
Banco de dados ferramentas guia da faixa de opes), e uma vez que um add-in foi instalado, ele pode ser usado em qualquer
Banco de dados do Access.
Acesso Adicionar-ins criado em verses anteriores do Access (como bancos de dados biblioteca. MDA) vontade gen-
erally executar no Access 2007 em execuo no Windows XP, pelo menos se eles no tm conflitos
com a nova interface. Por exemplo, meu Rename.mda LNC Adicionar-in, que renomeia os objetos de banco de dados
e controles de acordo com a Conveno de nomenclatura Leszynski, funciona bem no Access 2007, embora ele
no processo controles vinculados aos campos do novo tipo de dados anexo. Uma velha suplemento que cre-
barras de menus personalizados de ates, no entanto, definitivamente ter problemas, porque a nova faixa de opes substitui o
interface antiga de barras de comando. No Windows Vista, recursos de segurana atualmente evitar suplementos que criar
Assistentes ou construtores de propriedade de execuo (esse problema est programado para ser corrigido em uma prxima
Servio de Patch).
Tipos de suplemento
Existem trs tipos de acesso add-ins, com vrios subtipos, conforme listado na tabela 14.1.
Todos estes tipos de suplementos so armazenados como assistentes no registro. s vezes, voc ver um construtor ou
Suplemento do menu referido como um assistente, mas eu reservar o Assistente do termo para o Adicionar-ins que so
chamado quando um novo objeto criado, como listado na coluna do Assistente de tabela 14.1.
NOTA NOTA
472
Adicionando mais funcionalidades ao Office
Parte III
20_047026 ch14.qxp 02\/04\/07 21:54 pgina 472
TABELA 14.1
Tipos de acesso Add-ins
Assistente Construtor Suplemento de menu
Chamado quando uma nova tabela, Permite que voc defina propriedades em No contexto especfico, chamado de
consulta, formulrio, relatrio, ou visualizao Design no menu Add-ins
controle criado.
Subtipos
Assistentes de tabela Construtores de propriedade.
Assistentes de consulta Construtores de expresso
Assistentes de formulrio
Assistentes de relatrio
Assistentes de controle
Criando um banco de dados biblioteca
Esta seo orienta voc atravs da criao de um banco de dados biblioteca. Para fazer isso, comece criando um novo
Banco de dados Access no formato de banco de dados de sua escolha. Voc pode criar e salvar um banco de dados diretamente
o formato de banco de dados de biblioteca. MDA mais velho, mas para o novo formato do accda, voc precisa primeiro criar
o banco de dados como um banco de dados. accdb, altere a extenso para accda mais tarde, em um painel de Explorer,
ignorando o aviso terrvel que o arquivo pode se tornar inutilizvel.
Em seguida, voc precisa criar a tabela USysRegInfo para armazenar as informaes de registro a cruciais. Como um curto-
corte, voc pode importar esta tabela de banco de dados biblioteca outra (formato. MDA ou accda), se voc
tenho um disponvel; Talvez voc precise primeiro visibilizar tabelas do sistema, conforme descrito nesta seo. EU
recomendo importar essa tabela, porque ela vai lhe poupar tempo na insero de alguns muito enigmtica infor -
mao, embora obviamente voc tem que adicionar (ou modificar) linhas da tabela com dados especficos para sua
Add-in.
A tabela USysRegInfo uma tabela do sistema, assim voc no v-lo (ou ser capaz de editar o seu contedo) a menos que
voc marcar a caixa de seleo \"Mostrar objetos do sistema\". Em verses anteriores do Access, foi essa caixa de seleo
localizado na pgina de exibio da caixa de dilogo opes; no Access 2007 o dia de opes de navegao-
log, que pode ser aberto da seguinte maneira:
1. Clique no boto do Office no canto superior esquerdo da janela do Access.
2. Em seguida, clique no boto de opes de acesso no menu do Office, como mostrado na Figura 14.2.
473
Criando suplementos do Access
14
20_047026 ch14.qxp 02\/04\/07 21:54 pgina 473
FIGURA 14.2
O menu de acesso 2007 Office.
3. Na caixa de dilogo Opes do Access, selecione a seo de banco de dados atual, conforme mostrado na
Figura 14.3.
FIGURA 14.3
A seo de banco de dados atual da caixa de dilogo Opes do Access.
474
Adicionando mais funcionalidades ao Office
Parte III
20_047026 ch14.qxp 02\/04\/07 21:54 pgina 474
4. Clique no boto de opes de navegao para abrir a caixa de dilogo opes de navegao, onde
Finalmente, voc pode verificar a caixa de seleo \"Mostrar objetos do sistema\", como mostrado na Figura 14.4.
FIGURA 14.4
Verificar a caixa de seleo \"Mostrar objetos do sistema\" na caixa de dilogo opes de navegao.
5. Clique em OK para fechar a caixa de dilogo opes de navegao e novamente para fechar as opes de acesso
caixa de dilogo.
Na seo tabelas do painel de navegao, voc agora ver um nmero de tabelas do sistema, comeando
com o prefixo MSys e exibidos em uma fonte esmaecida (Figura 14.5). Se voc importou o
USysRegInfo tabela de outro banco de dados, voc ver que h tambm, embora, curiosamente, no
esmaecido.
Voc no precisa fazer nada especial para fazer o USysRegInfo tabela a uma tabela do sistema; uma tabela com
Este nome automaticamente Categorizado como uma tabela de sistema. Se voc estiver criando a tabela a partir do zero,
consulte a tabela 14.2 para obter uma listagem de seus tipos de dados e os campos necessrios.
475
Criando suplementos do Access
14
20_047026 ch14.qxp 02\/04\/07 21:54 pgina 475
FIGURA 14.5
Tabelas do sistema no painel de navegao.
TABELA 14.2
Os campos de tabela USysRegInfo
Campo Tipo de dados Uso
Subchave Texto O nome da subchave do registro, onde armazenada a uma configurao especfica do registro; pode
se HKEY_CURRENT_ACCESS_PROFILE ou HKEY_LOCAL_MACHINE.
Acesso Adicionar-ins, o HKEY_CURRENT_ACCESS_PROFILE prefervel,
porque ele usa automaticamente a seo do registro para a verso em execuo do
Acesso, permitindo que o mesmo add-in para trabalhar em vrias verses do Access.
Tipo Nmero O tipo de entrada para criar; pode ser a chave (0), string (1) ou DWORD (4)
ValName Texto O nome do valor do registro
Valor Texto O valor do valor do registro
Se voc criar a tabela USysRegInfo do zero, voc receber um erro ao entrar
o nome de \"Valor\" para o ltimo campo (como mostrado na Figura 14.6). Isso ocorre porque Microsoft
violou suas prprias regras, dando um nome que uma palavra reservada (no caso, uma propriedade de um campo
nome). No entanto, voc pode salvar o campo, e ele funciona. No altere o nome de campo, porque cada
Esta tabela deve ter um nome especfico para funcionar corretamente.
NOTA NOTA
476
Adicionando mais funcionalidades ao Office
Parte III
20_047026 ch14.qxp 02\/04\/07 21:54 pgina 476
FIGURA 14.6
Erro ao criar o campo valor na tabela UsysRegInfo.
Se voc copiar a tabela USysRegInfo outro suplemento, ele tem um valor padro de GenUniqueID()
no campo tipo, e tambm tem algumas informaes teis na coluna Descrio, informando a
valor necessrio para cada tipo de dados de campo, como mostrado na Figura 14.7.
FIGURA 14.7
Uma tabela USysRegInfo importada com informaes de descrio.
Cada tipo de suplemento requer um conjunto de registros na tabela USysRegInfo, conforme descrito a seguir
sees. O Extras 2007 add-in que o exemplo add-in para este captulo um conjunto de menu add-ins,
que ser descrita em detalhes; para os outros suplemento tipos fizer referncia a dois suplementos que eu cre -
ated em verses anteriores do Access.
Voc pode pensar que os suplementos seriam encontrado na guia Add-Ins da faixa de opes no Access
2007 (este guia pode no estar visvel se voc estiver executando o Windows Vista). Mas este no o
caso. Seu acesso suplementos esto localizados no menu Add-ins da guia ferramentas de banco de dados. O guia de suplementos
tem um conjunto de menus como nas verses anteriores do Access, exceto que eles no funcionam. A finalidade
desses menus no-funcional exibir menus de comandos colocados no Access 2003 (ou anteriores)
por suplementos trabalhando com a coleo CommandBars. Este um mtodo muito difceis de implementar-
ing para trs compatibilidade; Se voc tiver tal um add-in, voc provavelmente vai querer refaz-lo para colocar
comandos em vrias guias da faixa de opes, conforme descrito no captulo 15.
NOTA NOTA
477
Criando suplementos do Access
14
20_047026 ch14.qxp 02\/04\/07 21:54 pgina 477
Menu Add-ins
Um suplemento de menu tem trs linhas na tabela USysRegInfo, cada um com um valor apropriado no
Digite campo e alguns com valores no campo ValName ou valor, bem como, como descrito em detalhe em seguida:
Na primeira linha do add-in, o campo subchave (que o mesmo para todos do add-in
linhas) tem as informaes de chave do registro, fazendo referncia a seo do Menu Add-Ins sob o
Chave HKEY_CURRENT_ACCESS_PROFILE (que faz referncia a execuo ver-
Sion de acesso) e terminando com o nome de comando para exibir no menu Add-Ins,
com um e comercial se desejar fazer uma tecla de acesso. O campo de tipo tem um valor de 0, indicado-
o incio de um novo suplemento de ing. Os campos ValName e o valor esto em branco.
Na segunda linha do add-in, o campo de tipo tem um valor de 1, o campo ValName tem o
valor \"Biblioteca\" e o campo de valor tem o local e nome do banco de dados biblioteca,
usando o |ACCDIR \/ espao reservado para apontar para a pasta de suplementos (em verses anteriores do
Acesso, esta foi a pasta de acesso prprio, o que explica o nome).
No suplemento terceira linha, o campo de tipo tem um valor de 1, o campo ValName tem o valor
\"Expresso\" e o campo de valor tem o nome da funo a ser executada (precedido por um igual
assinar e seguido por um par de parnteses).
Na tabela 14.3, que lista as trs linhas para o comando \"Back up Database\" sobre os suplementos
menu, o texto em itlico a informao especfica para este add-in; as outras informaes so com-
seg para todos os menu add-ins.
Ao criar uma tabela UsysRegInfo para um suplemento do Access 2007 que est a ser executada
Windows Vista, voc precisar alterar a capitalizao do \"Menu Add-ins\" para adicionar Menu-
Ins\"(capitalizando o eu); Se voc deix-lo em quanto a verses anteriores do Office e Windows,
voc no ser capaz de instalar o suplemento.
TABELA 14.3
USysRegInfo linhas necessrias para um Menu Add-in
Subchave Tipo ValName Valor
HKEY_CURRENT_ACCESS_PROFILE\/Menu Add-Ins \/ 0
&Back up Database
HKEY_CURRENT_ACCESS_PROFILE\/Menu Add-Ins \/ 1 Biblioteca |ACCDIR\/Extras 2007.accda
&Back up Database
HKEY_CURRENT_ACCESS_PROFILE\/Menu Add-Ins \/ 1 Expresso =BackupFrontEnd()
&Back up Database
Se voc fazer cpias de seu banco de dados add-in biblioteca de vez enquanto trabalhava nele
(sempre uma boa idia), no salvar as cpias na pasta suplementos, porque caso contrrio eles
vai aparecer como extras selees na caixa de dilogo Gerenciador de suplementos, e pode no ser claro qual o lat-
verso do est do add-in ao instalar ele, ou qual verso est sendo executado quando voc usar o suplemento.
DICA DICA
DICA DICA
478
Adicionando mais funcionalidades ao Office
Parte III
20_047026 ch14.qxp 02\/04\/07 21:54 pgina 478
Assistentes
Meu esquemas projeto add-in (que finalmente pode ser aposentado por causa do superior de caractersticas de formatao
de acesso 2007) contm vrias Form Wizard suplementos.
Assistente de formulrio Adicionar-ins precisa quatro linhas na tabela USysRegInfo, conforme descrito na lista a seguir
(a sintaxe semelhante para assistentes de relatrio):
Na primeira linha do add-in, o campo subchave (que o mesmo para todos do add-in
linhas) tem as informaes de chave do registro, fazendo referncia a seo forma assistentes sob o
Chave HKEY_CURRENT_ACCESS_PROFILE (que faz referncia a execuo ver-
Sion de acesso) e terminando com o nome de comando para exibir no menu Add-Ins,
com um e comercial se desejar fazer uma tecla de acesso. O campo de tipo tem um valor de 0, indicado-
o incio de um novo suplemento de ing. Os campos ValName e o valor esto em branco.
No add-in segunda linha, o campo de tipo tem um valor de 1, o campo ValName tem o valor
\"Descrio\" e o campo de valor tem o texto para exibir na tela inicial do assistente no
caso do Assistente de formulrio personalizado, que a caixa de dilogo novo formulrio.
No suplemento terceira linha, o campo de tipo tem um valor de 1, o campo ValName tem o valor
\"Biblioteca\" e o campo de valor tem o local e o nome da biblioteca de banco de dados, usando o
|ACCDIR \/ espao reservado para apontar para a pasta de suplementos.
No suplemento quarta linha, o campo de tipo tem um valor de 1, o campo ValName tem o valor
\"Funo\" e o campo de valor tem o nome da funo executar (sem um sinal de igual).
Tabela 14.4 lista as linhas USysRegInfo para o comando do Assistente de formulrio personalizado no menu suplementos
Esquemas do projeto Adicionar-in.
TABELA 14.4
Linhas USysRegInfo necessrias para um Form Wizard Add-in
Subchave Tipo ValName Valor
HKEY_CURRENT_ACCESS_PROFILE\/assistentes \/ 0
Assistente de formulrio do formulrio personalizado assistentes
HKEY_CURRENT_ACCESS_PROFILE\/assistentes \/ 1 Descrio Selecione um tipo de forma e cor
Assistente de formulrio do formulrio personalizado assistentes esquema para o fundo da forma
Propriedades de cores e controle
HKEY_CURRENT_ACCESS_PROFILE\/assistentes \/ 1 Biblioteca |ACCDIR\/Design Schemes.mda
Assistente de formulrio do formulrio personalizado assistentes
HKEY_CURRENT_ACCESS_PROFILE\/assistentes \/ 1 Funo StartDSWizard
Assistente de formulrio do formulrio personalizado assistentes
479
Criando suplementos do Access
14
20_047026 ch14.qxp 02\/04\/07 21:54 pgina 479
Um menu add-in, a funo de chamada do Adicionar-in precedida por um sinal de igual; em um
Assistente para adicionar-in, no h nenhum sinal de igual.
Construtores de propriedade.
Meu LNB renomear suplemento (originalmente criado no Access 97 e actualizada para o Access 2000) ainda uso-
ful no Access 2007 em execuo no Windows XP, porque a Microsoft ainda no implementada automtico
objeto e controle de nomeao de acordo com uma Conveno de nomenclatura. Este add-in permite automaticamente
renomear objetos de banco de dados e controles de formulrio e relatrio de acordo com a nomenclatura de Leszynski
Conveno. Ele inclui vrios menu add-ins e Propriedade dois construtores, que vo da
Nome de propriedade de um controle (para renomear um controle nico) ou a seo de detalhes de um formulrio ou relatrio
(para renomear todos os controles em um formulrio ou relatrio).
Para mais detalhes sobre o LNB renomear Adicionar-in, consulte meu livro especialista Microsoft-em-um
Desenvolvimento de aplicaes de acesso (ISBN: 0764559044).
Construtores de propriedade exigem cinco linhas na tabela USysRegInfo, conforme descrito na lista a seguir:
Na primeira linha do add-in, o campo subchave (que o mesmo para todos do add-in
linhas) tem as informaes de chave do registro, fazendo referncia a seo Propriedade assistentes em
a chave HKEY_CURRENT_ACCESS_PROFILE (que faz referncia o atualmente executando
verso do Access) e terminando com o nome de comando para exibir no menu Add-Ins,
com um e comercial se desejar fazer uma tecla de acesso. O campo de tipo tem um valor de 0, indicado-
o incio de um novo suplemento de ing. Os campos ValName e o valor esto em branco.
No add-in segunda linha, o campo de tipo tem um valor de 1, o campo ValName tem o valor
\"Descrio\" e o campo de valor tem o texto para exibir na caixa de dilogo Builder no caso de
do LNCBuilder Assistente de propriedade, que a caixa de dilogo escolher Construtor aberto a partir do
Propriedade nome da folha de propriedades de um controle.
No suplemento terceira linha, o campo de tipo tem um valor de 4, o campo ValName tem o valor
\"Pode editar\" e o campo de valor tem um valor de 1, indicando que o assistente pode ser chamado
para um objeto existente.
No suplemento quarta linha, o campo de tipo tem um valor de 1, o campo ValName tem o valor
\"Biblioteca\" e o campo de valor tem o local e o nome da biblioteca de banco de dados, usando o
|ACCDIR \/ espao reservado para apontar para a pasta de suplementos.
Quinta linha no suplemento, o campo de tipo tem um valor de 1, campo ValName tem o valor
\"Funo\" e o campo de valor tem o nome da funo executar (sem um igual
sinal).
Tabela 14.5 alista as linhas USysRegInfo para o Assistente de propriedade renomeando um nico controle de
o LNC renomear Adicionar-in.
REFERNCIA CRUZADA REFERNCIA CRUZADA
NOTA NOTA
480
Adicionando mais funcionalidades ao Office
Parte III
20_047026 ch14.qxp 02\/04\/07 21:54 pgina 480
TABELA 14.5
USysRegInfo linhas necessrias para um construtor de propriedade.
Subchave Tipo ValName Valor
HKEY_CURRENT_ACCESS_PROFILE\/assistentes \/ 0
Construtor LNC\/assistentes\/nome de propriedade
HKEY_CURRENT_ACCESS_PROFILE\/assistentes \/ 1 Descrio LNB renomear controle atual
Construtor LNC\/assistentes\/nome de propriedade
HKEY_CURRENT_ACCESS_PROFILE\/assistentes \/ 4 Pode editar 1
Construtor LNC\/assistentes\/nome de propriedade
HKEY_CURRENT_ACCESS_PROFILE\/assistentes \/ 1 Biblioteca |Rename.mda ACCDIR\/LNB
Construtor LNC\/assistentes\/nome de propriedade
HKEY_CURRENT_ACCESS_PROFILE\/assistentes \/ 1 Funo LNCBuilder
Construtor LNC\/assistentes\/nome de propriedade
Estritamente falando, um banco de dados biblioteca contm suplementos (geralmente vrias), mas geralmente a
banco de dados biblioteca inteira referido como um add-in.
Coisas que voc precisa saber quando
Escrever Adicionar-ins
Existem vrias coisas para manter em mente quando voc tentar gravar seus prprios add-ins. Alguns so
armadilhas que podem impedir o suplemento de funcionamento e outros so recomendaes para o bom
Adicionar-no projeto.
Requisitos especiais para o cdigo de suplemento
Quando voc executa um add-in, o cdigo est sendo executado de um outro banco de dados (o suplemento biblioteca
banco de dados), e voc precisa ter isso em conta ao fazer referncia a objetos de banco de dados em
seu cdigo. Se voc quiser usar um objeto de banco de dados biblioteca, use CodeDb para definir uma refer-
ENCE para esse banco de dados; Se voc deseja fazer referncia a um objeto do banco de dados chamada, use
CurrentDb (ambos CodeDb e CurrentDb so usados no Extras 2007 suplemento do cdigo).
Apenas funes podem ser executadas a partir do registro; todos os procedimentos referenciados na
Tabela USysRegInfo deve ser funes, at mesmo, um procedimento que normalmente seria um Sub
(porque ele no retorna um valor). No entanto, outros procedimentos utilizados na biblioteca do suplemento
banco de dados (os que no so executados diretamente do registro e no so referenciados em
a tabela USysRegInto) pode ser subs.
NOTA NOTA
481
Criando suplementos do Access
14
20_047026 ch14.qxp 02\/04\/07 21:54 pgina 481
Um suplemento pode exibir formulrios, geralmente como caixas de dilogo no acopladas. Normalmente, todos os suplementos excepto
menu add-ins. use uma ou mais formas (e menu add-ins pode usar formulrios tambm). Os Extras
suplemento do 2007 tem um formulrio de configurao onde os usurios podem inserir informaes que sero usadas pela var-
procedimentos de IOUs add-in.
Voc pode fazer referncia a tabelas no banco de dados biblioteca Adicionar-in usando o CodeDb sintaxe, que
permite que voc armazene dados do suplemento em tabelas se necessrio. Isso til quando voc deseja armazenar infor-
mao que ser usada para todos os bancos de dados, executando o add-in, por exemplo, as listas de tabela
e prefixos para a excluso de tabelas de consulta e consulta da listagem, 2007 Extras Adicionar-in.
Substituir macros e consultas com cdigo a execuo de funes pblicas, assim eles podem ser executados
directamente a partir de mdulos da biblioteca.
Formulrios vinculados, executados a partir de um suplemento tem como suas tabelas de origem do registro do banco de dados do cdigo,
no o banco de dados chamado. Se a forma precisa exibir dados do banco de dados chamada, ele
deve ser copiado para uma tabela do banco de dados do cdigo aps o enchimento com dados de chamada
banco de dados, como eu fao Extras 2007 add-in para consulta e tabela e opes de backup,
campos.
O DDL CreateTable instruo cria uma tabela no banco de dados atual; Se voc precisa
criar uma tabela do banco de dados do cdigo, voc deve usar o mais complexo TableDef
mtodo DAO, especificando CodeDb como o banco de dados no qual deseja criar a tabela.
Um suplemento que pretendiam trabalhar em ambos Access 2007 e verses anteriores do Access podem precisar
para processar as extenses. mdb e. accdb, ou lidar com o novo tipo de dados anexo.
Quando oCopyObject mtodo executado a partir de um suplemento, o cdigo procura a fonte
objeto (o SourceObjectName argumento) primeiro no banco de dados biblioteca e, em seguida, na
banco de dados atual. Isso pode exigir que voc criar uma cpia de uma tabela, dizer com \"Em branco\" na
final de seu nome, a fim de copiar uma tabela nova, em branco no banco de dados chamada, substituindo um
cheio de tabela, como eu fao no Extras 2007 suplemento do cdigo. Caso contrrio, voc vai acabar copiando
a tabela preenchida no banco de dados chamada de volta para si.
Quando executado a partir de um banco de dados da biblioteca, o ExecutarSQL mtodo do objeto DoCmd funciona em
tabelas do banco de dados chamada e o OpenQuery mtodo funciona em tabelas no cdigo
banco de dados.
Dicas sobre adicionar-em construo
Ao criar o tipo de assistente Adicionar-ins, voc pode fazer, em seguida, mais user-friendly, modelagem sua
aparncia aps o built-in acessar o Adicionar-ins. Access 2007 possui muitos novos recursos de interface, mas o
assistentes muito a mesma aparncia como nas verses anteriores (formato Access), embora possa haver alguns
cosmticas diferenas se voc estiver executando o Office 2007 sobre Windows Vista. Para fazer seu assistente
formas parecem os familiares assistentes de acesso e construtores, use as configuraes listadas aqui:
Conjunto AutoCentralizar Propriedade dos formulrios para sim.
Desligue a seletores de registros.
Definir as barras de rolagem para nenhum deles.
482
Adicionando mais funcionalidades ao Office
Parte III
20_047026 ch14.qxp 02\/04\/07 21:54 pgina 482
Desative botes de navegao.
Se seu assistente tem vrias formas, certifique-se de que os controles usados em mais de uma forma em
uma srie de telas do Assistente para aparecer no mesmo lugar em cada formulrio.
Faa de todas o formas dilogo Assistente de caixas, definindo sua propriedade Modal para Sim, PopUp
Sim e BorderStyle para a caixa de dilogo, para que o usurio no possvel mover para a prxima caixa at o atual
um foi preenchido.
Copiar imagens de assistente do wizards acesso, salv-los como arquivos de imagem e coloc-los em
os formulrios do assistente.
O cdigo de suplemento de Extras
O cdigo que implementa a funcionalidade do add-in para a criao de cpias de backup do banco de dados ou
seu back-end e para a lista de campos de tabela e consulta, est listado na seo seguinte.
Opes extras
O mdulo de formulrio fdlgExtrasOptions contm o cdigo por trs da caixa de dilogo opes Extras, onde
voc pode configurar suas preferncias para o backup, salvar a pasta ou os prefixos excluir quando listagem
campos:
Opo Compare Database
Opo explcita
DbsCalling privado como DAO.Banco de dados
Fd privada como Office.FileDialog
Private intChoice As Integer
Private prps como DAO.Propriedades
Private prp como DAO.Propriedade
Private strBackupChoice As Integer
Private strBackupPath As String
Private strCallingDb As String
Private strPropName As String
Private strTable As String
Tdfs privado como DAO.TableDefs
Tdf privado como DAO.TableDef
Txt privado como Access.TextBox
VarPropValue privado como variante
Private Sub cmdCancel_Click()
Em erro continuar prximo
DoCmd.Close acSaveNo de acForm, Me.Name,
End Sub
483
Criando suplementos do Access
14
20_047026 ch14.qxp 02\/04\/07 21:54 pgina 483
Private Sub cmdCustomBackupPath_Click()
No erro GoTo ErrorHandler
Dim strSelectedPath As String
Crie um objeto FileDialog como uma caixa de dilogo selecionador de pasta.
Definir fd = Application.FileDialog(msoFileDialogFolderPicker)
Conjunto txt = Me![txtBackupPath]
Com fd
se = _
\"Procure a pasta onde os backups devem ser armazenados\"
.ButtonName = \"Selecione\"
.InitialView = msoFileDialogViewDetails
.InitialFileName = strBackupPath
Se for.Mostrar = -1 ento
strSelectedPath = CStr (fd.SelectedItems.Item(1))
txt.Valor = strSelectedPath
Definir dbsCalling = CurrentDb
strPropName = \"BackupPath\"
Chamar SetProperty (strName: = strPropName, _
lngType: = dbText, varValue: = strSelectedPath)
Outra coisa
Debug. Print \"usurio pressionado cancelar\"
End If
Terminar com
ErrorHandlerExit:
Exit Sub
ErrorHandler:
MsgBox \"erro nenhum:\"
& ; Description: & err.Description
Resume ErrorHandlerExit
End Sub
Private Sub cmdSave_Click()
Em erro continuar prximo
DoCmd.Close acForm, Me.Name
End Sub
Private Sub Form_Load()
484
Adicionando mais funcionalidades ao Office
Parte III
20_047026 ch14.qxp 02\/04\/07 21:54 pgina 484
Em erro continuar prximo
Chamada acCmdSizeToFitForm
No erro GoTo ErrorHandler
intChoice = Nz (Me! [BackupChoice], 2)
Selecione o caso intChoice
Caso 1
Me![cmdCustomBackupPath].Ativado = False
Caso 2
Me![cmdCustomBackupPath].Ativado = False
Caso 3
Me![cmdCustomBackupPath].Ativado = True
End Select
ErrorHandlerExit:
Exit Sub
ErrorHandler:
MsgBox \"erro nenhum:\"
& ; Description: & err.Description
Resume ErrorHandlerExit
End Sub
Private Sub fraBackupOptions_AfterUpdate()
No erro GoTo ErrorHandler
intChoice = Nz (Me! [fraBackupOptions].Valor, 2)
strBackupChoice = CStr(intChoice)
strBackupPath = Nz (Me! [BackupPath])
Selecione o caso intChoice
Caso 1
Me![cmdCustomBackupPath].Ativado = False
Caso 2
Me![cmdCustomBackupPath].Ativado = False
Caso 3
Me![cmdCustomBackupPath].Ativado = True
End Select
485
Criando suplementos do Access
14
20_047026 ch14.qxp 02\/04\/07 21:54 pgina 485
Salve a opo do usurio em uma propriedade de banco de dados no banco de dados chamada.
Definir dbsCalling = CurrentDb
strPropName = \"BackupChoice\"
Chamar SetProperty (strName: = strPropName, _
lngType: = dbText, varValue: = strBackupChoice)
ErrorHandlerExit:
Exit Sub
ErrorHandler:
MsgBox \"erro nenhum:\"
& ; Description: & err.Description
Resume ErrorHandlerExit
End Sub
basExtras mdulo
O mdulo padro de basExtras contm funes que so chamadas de tabela USysRegInfo:
Funo pblica ExtrasOptions()
' Chamado de USysRegInfo (menu add-in)
No erro GoTo ErrorHandler
Dim strBackEndSyntaxChoice As String
Dim strBackEndSyntax As String
Dim strBackEndPathChoice As String
Dim strBackEndPath As String
Dim strDefault As String
Obter informaes de propriedades de banco de dados no banco de dados chamada e grav-los em zstblBackupChoices em
banco de dados de cdigo para uso como fonte de registro do formulrio:
Definir dbsCalling = CurrentDb
strPropName = \"BackupChoice\"
strDefault = \"2\"
strBackupChoice = GetProperty (strPropName, strDefault)
Debug. Print \"Backup escolha:\"
strPropName = \"BackupPath\"
strDefault = \"\"
strBackupPath = GetProperty (strPropName, strDefault)
Debug. Print \"caminho do Backup:\"
strTable = \"zstblBackupChoice\"
Definir dbsCode = CodeDb
Set rst = dbsCode.OpenRecordset(strTable)
486
Adicionando mais funcionalidades ao Office
Parte III
20_047026 ch14.qxp 02\/04\/07 21:54 pgina 486
RST.MoveFirst
RST.Editar
RST![BackupChoice] = strBackupChoice
RST![BackupPath] = strBackupPath
RST.Atualizao
RST.Fechar
Em erro continuar prximo
Copie a tabela zstblBackupInfo no banco de dados chamada, se necessrio:
strCallingDb = CurrentDb.Name
strTable = \"zstblBackupInfo\"
Definir tdfsCalling = dbsCalling.TableDefs
Definir tdfCalling = tdfsCalling(strTable)
Se tdfCalling no nada ento
Debug. Print strTable
DoCmd.CopyObject destinationdatabase: = strCallingDb, _
NewName: = strTable, _
sourceobjectType: = _ acTable,
SourceObjectName: = strTable
Debug. Print \"Copiado\"
End If
Abra o formulrio de dilogo para selecionar as opes:
strForm = \"fdlgSetExtrasOptions\"
DoCmd. OpenForm nomedoformulrio: = strForm, _
exibio: = acNormal, _
windowMode: = acDialog
ErrorHandlerExit:
Exit Function
ErrorHandler:
MsgBox \"erro nenhum:\"
& ; Description: & err.Description
Resume ErrorHandlerExit
End Function
Funo pblica CopyListObjects()
' Chamado de listTableFields() e ListQueryFields()
Em erro continuar prximo
Dim ctr como DAO.Recipiente
Dim doc como DAO.Documento
487
Criando suplementos do Access
14
20_047026 ch14.qxp 02\/04\/07 21:54 pgina 487
Copie vrios objetos no banco de dados chamada, se eles j no existem. Esses objetos so necessrios para
suporte a funcionalidade do suplemento:
Definir dbsCalling = CurrentDb
strCallingDb = CurrentDb.Name
Definir tdfsCalling = dbsCalling.TableDefs
strTable = \"zstblAccessDataTypes\"
Definir tdfCalling = tdfsCalling(strTable)
DoCmd.SetWarnings False
Se tdfCalling no nada ento
Debug. Print strTable
DoCmd.CopyObject destinationdatabase: = strCallingDb, _
NewName: = strTable, _
sourceobjectType: = _ acTable,
SourceObjectName: = strTable
End If
Conjunto ctr = dbsCalling.Containers(\"Reports\")
strReport = \"zsrptTableAndFieldNames\"
Conjunto doc = CTR.Documents(strReport)
Se o doc no nada ento
DoCmd.CopyObject destinationdatabase: = strCallingDb, _
NewName: = strReport, _
sourceobjectType: = acReport, _
SourceObjectName: = strReport
End If
strReport = \"zsrptQueryAndFieldNames\"
Conjunto doc = CTR.Documents(strReport)
Se o doc no nada ento
DoCmd.CopyObject destinationdatabase: = strCallingDb, _
NewName: = strReport, _
sourceobjectType: = acReport, _
SourceObjectName: = strReport
End If
ErrorHandlerExit:
Exit Function
ErrorHandler:
MsgBox \"erro nenhum:\"
& ; Description: & err.Description
Resume ErrorHandlerExit
End Function
488
Adicionando mais funcionalidades ao Office
Parte III
20_047026 ch14.qxp 02\/04\/07 21:54 pgina 488
Faa backup de dados
O BackupFrontEnd funo chamada de tabela USysRegInfo para fazer backup de dados atual-
base para o caminho selecionado na caixa de dilogo opes Extra:
Funo pblica BackupFrontEnd()
' Chamado de USysRegInfo
No erro GoTo ErrorHandler
Definir dbsCalling = CurrentDb
Definir tdfsCalling = dbsCalling.TableDefs
Set fso = CreateObject(\"Scripting.FileSystemObject\")
strCurrentDB = Application.CurrentProject.Name
Debug. Print \"db atual:\"
intExtPosition = InStr (strCurrentDB, \".\")
strExtension = Mid (strCurrentDB, intExtPosition)
intExtLength = Len(strExtension)
Criar a seqncia de caminho de backup, dependendo da escolha do usurio, com um padro de 2 (\"pasta Backups
sob a pasta de banco de dados\") no caso do usurio no fez uma escolha:
strPropName = \"BackupChoice\"
strBackupChoice = GetProperty (strPropName, \"2\")
Debug. Print \"Backup escolha:\"
strPropName = \"BackupPath\"
strPath = GetProperty (strPropName, \"\")
Debug. Print \"caminho de backup personalizado:\"
Selecione o caso strBackupChoice
Caso \"1\"
Mesma pasta do banco de dados
strBackupPath = _
Application.CurrentProject.Path
Caso \"2\"
Pasta backups de banco de dados
strBackupPath = _
Application.CurrentProject.Path
Caso \"3\"
489
Criando suplementos do Access
14
20_047026 ch14.qxp 02\/04\/07 21:54 pgina 489
Pasta personalizada
strBackupPath = strPath
End Select
Debug. Print \"caminho do Backup:\"
Verifique se o caminho vlido.
Em erro continuar prximo
Definir sfld = fso.GetFolder(strBackupPath)
Se sfld no nada ento
Se strBackupChoice = \"3\", em seguida,
strTitle = \"Caminho invlido\"
strPrompt = _ strBackupPath
& is an invalid path; please select _
& another custom path
MsgBox strPrompt, vbOKOnly + vbExclamation, strTitle
GoTo ErrorHandlerExit
ElseIf strBackupChoice = \"2\", em seguida,
Crie pasta.
Definir sfld = fso.CreateFolder(strBackupPath)
End If
End If
Se no tiver sido feita a instalao, copie zstblBackupInfo no banco de dados chamada:
strCallingDb = CurrentDb.Name
strTable = \"zstblBackupInfo\"
Definir tdfCalling = dbsCalling.TableDefs(strTable)
Se tdfCalling no nada ento
Debug. Print strTable
DoCmd.CopyObject destinationdatabase: = strCallingDb, _
NewName: = strTable, _
sourceobjectType: = _ acTable,
SourceObjectName: = strTable
Debug. Print \"Copiado\"
End If
Crie uma proposta salve o nome para o arquivo de backup do banco de dados:
strDayPrefix = Format (data, \"yyyy-mm-dd\")
strSaveName = Left (strCurrentDB, _
Len(strCurrentDB) - intExtLength)
& , & strDayPrefix & strExtension
490
Adicionando mais funcionalidades ao Office
Parte III
20_047026 ch14.qxp 02\/04\/07 21:54 pgina 490
strProposedSaveName = strBackupPath
Debug. Print \"Backup salve o nome:\"
strTitle = \"Backup do banco de dados\"
strPrompt = \"salvar banco de dados\"
& ?
strSaveName = Nz (InputBox (prompt: = strPrompt, _
Ttulo: = strTitle, padro: = strProposedSaveName))
Lidar com usurio Cancelando para fora o InputBox.
Se strSaveName = \"\", em seguida,
GoTo ErrorHandlerExit
End If
Set rst = dbsCalling.OpenRecordset(\"zstblBackupInfo\")
Com rst
.AddNew
![SaveDate] = Format (data, \"d-mmm-aaaa\")
![SaveNumber] = SaveNo
.Atualizao
.Fechar
Terminar com
FSO.CopyFile Source:=CurrentDb.Name _
destino: = strSaveName
ErrorHandlerExit:
Exit Function
ErrorHandler:
MsgBox \"erro nenhum:\"
Err.Descrio
Resume ErrorHandlerExit
End Function
Backup de banco de dados Back End
O BackupBackEnd funo chamada de tabela USysRegInfo para fazer backup de dados atual-
back-end do base (se houver) para o caminho selecionado na caixa de dilogo opes Extra:
Funo pblica BackupBackEnd()
' Chamado de USysRegInfo
No erro GoTo ErrorHandler
Dim strBackEndDBNameAndPath As String
Dim strBackEndDBName As String
Dim strBackEndDBPath As String
Dim strFilePath As String
491
Criando suplementos do Access
14
20_047026 ch14.qxp 02\/04\/07 21:54 pgina 491
Dim strFullDBName As String
Dim strFileName As String
Dim strFullPath() As String
Dim strDBName As String
Dim intUBound As Integer
Dim strConnect As String
Definir dbsCalling = CurrentDb
Definir tdfsCalling = dbsCalling.TableDefs
Set fso = CreateObject(\"Scripting.FileSystemObject\")
strCurrentDB = Application.CurrentProject.Name
Debug. Print \"db atual:\"
strDayPrefix = Format (data, \"yyyy-mm-dd\")
intExtPosition = InStr (strCurrentDB, \".\")
strExtension = Mid (strCurrentDB, intExtPosition)
intExtLength = Len(strExtension)
strExcludeTable = \"zstblTablePrefixes\"
Crie a seqncia de caminho de backup, dependendo da escolha do usurio.
strPropName = \"BackupChoice\"
strBackupChoice = GetProperty (strPropName, \"2\")
Debug. Print \"Backup escolha:\"
strPropName = \"BackupPath\"
strPath = GetProperty (strPropName, \"\")
Debug. Print \"caminho de backup personalizado:\"
Verifique se h qualquer ligada tabelas e sair se no.
strBackEndDBNameAndPath = \"\"
Em erro continuar prximo
Volte nome do banco de dados de fim de conectar-se propriedade de uma tabela.
Para cada tdfCalling em tdfsCalling
strTable = tdfCalling.Name
Debug. Print \"nome da tabela:\"
strConnect = Nz(tdfCalling.Connect)
Debug. Print \"conectar a propriedade:\"
Se strConnect <>\"\" ento
strBackEndDBNameAndPath = Mid (strConnect, _
InStr (strConnect, \"=\") + 1)
Debug. Print \"nome do db do fim e o caminho de volta:\" _
& strBackEndDBNameAndPath
GoTo ContinueBackup
End If
Prxima tdfCalling
No erro GoTo ErrorHandler
492
Adicionando mais funcionalidades ao Office
Parte III
20_047026 ch14.qxp 02\/04\/07 21:54 pgina 492
No encontradas de tabelas vinculadas.
strTitle no = \"Nenhum back-end\"
strPrompt = \"No h nenhuma tabelas vinculadas neste banco de dados;\" _
& please use the Back up Database command instead
MsgBox strPrompt, vbExclamation + vbOKOnly, strTitle
GoTo ErrorHandlerExit
ContinueBackup:
Extrair o nome do back-end e o caminho de seqncia de propriedade Connect.
strFullPath = Split (strBackEndDBNameAndPath, \"\/\", -1, _
vbTextCompare)
intUBound = UBound(strFullPath)
strBackEndDBName = strFullPath(intUBound)
strBackEndDBPath = Mid (strBackEndDBNameAndPath, 1, _
Len(strBackEndDBNameAndPath) - Len(strBackEndDBName))
Debug. Print \"nome do banco de dados:\"
Debug. Print \"caminho do banco de dados:\"
Em erro continuar prximo
Verifique se o caminho de back-end vlido.
Definir sfld = fso.GetFolder(strBackEndDBPath)
Se sfld no nada ento
strTitle = \"Caminho invlido\"
strPrompt = _ strBackEndDBPath
& is an invalid path; please re-link tables and try
mais uma vez\"
MsgBox strPrompt, vbOKOnly + vbExclamation, strTitle
GoTo ErrorHandlerExit
End If
Se a instalao no tenha sido feita, copie zstblBackupInfo para chamar o banco de dados.
strCallingDb = CurrentDb.Name
strTable = \"zstblBackupInfo\"
Definir tdfCalling = dbsCalling.TableDefs(strTable)
Se tdfCalling no nada ento
Debug. Print strTable
DoCmd.CopyObject destinationdatabase: = strCallingDb, _
NewName: = strTable, _
sourceobjectType: = _ acTable,
SourceObjectName: = strTable
Debug. Print \"Copiado\"
End If
493
Criando suplementos do Access
14
20_047026 ch14.qxp 02\/04\/07 21:54 pgina 493
Selecione o caso strBackupChoice
Caso \"1\"
Mesma pasta do banco de dados de back-end
strBackupPath = strBackEndDBPath
Caso \"2\"
Pasta de backups sob a pasta de banco de dados back-end
strBackupPath = strBackEndDBPath
Caso \"3\"
Pasta personalizada
strBackupPath = strPath
End Select
Debug. Print \"caminho do Backup:\"
Em erro continuar prximo
Verifique novamente se o demarcador selecionado vlido.
Definir sfld = fso.GetFolder(strBackupPath)
Se sfld no nada ento
Se strBackupChoice = \"3\", em seguida,
strTitle = \"Caminho invlido\"
strPrompt = _ strBackupPath
& is an invalid path; please select another custom
caminho\"
MsgBox strPrompt, vbOKOnly + vbExclamation, strTitle
GoTo ErrorHandlerExit
ElseIf strBackupChoice = \"2\", em seguida,
Crie pasta.
Definir sfld = fso.CreateFolder(strBackupPath)
End If
End If
No erro GoTo ErrorHandler
Crie proposta salve o nome para o backup.
strDayPrefix = Format (data, \"yyyy-mm-dd\")
strSaveName = Left (strBackEndDBName, _
494
Adicionando mais funcionalidades ao Office
Parte III
20_047026 ch14.qxp 02\/04\/07 21:54 pgina 494
Len(strBackEndDBName) - intExtLength) _
& Copy & BackEndSaveNo _
& , & strDayPrefix & strExtension
strProposedSaveName = strBackupPath
Debug. Print \"Backup salve o nome:\"
strTitle = \"Backup do banco de dados\"
strPrompt = \"salvar back-end banco de dados para\" _
& strProposedSaveName & ?
strSaveName = Nz (InputBox (prompt: = strPrompt, _
Ttulo: = strTitle, padro: = strProposedSaveName))
Lidar com usurio Cancelando para fora o InputBox.
Se strSaveName = \"\", em seguida,
GoTo ErrorHandlerExit
End If
Set rst = dbsCalling.OpenRecordset(\"zstblBackupInfo\")
Com rst
.AddNew
![BackEndSaveDate] = Format (data, \"d-mmm-aaaa\")
![BackEndSaveNumber] = BackEndSaveNo
.Atualizao
.Fechar
Terminar com
FSO.CopyFile origem: = strBackEndDBNameAndPath, _
destino: = strSaveName
ErrorHandlerExit:
Exit Function
ErrorHandler:
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End Function
Campos de consulta da lista
O ListQueryFields funo (chamada de tabela USysRegInfo) lista os campos em toda a
Selecione consultas no banco de dados, usando a coleo QueryDefs do modelo de objeto DAO:
Funo pblica ListQueryFields()
' Chamado de USysRegInfo
Em erro continuar prximo
Chame CopyListObjects
495
Criando suplementos do Access
14
20_047026 ch14.qxp 02\/04\/07 21:54 pgina 495
Definir dbsCode = CodeDb
Definir dbsCalling = CurrentDb
Exclua tabela antiga no banco de dados de cdigo (se houver).
strTable = \"zstblQueryAndFieldNames\"
Definir tdfsCode = dbsCode.TableDefs
Definir tdfCode = tdfsCode(strTable)
Se tdfCode no nada, ento
tdfsCode.Delete (strTable)
End If
Exclua tabela antiga no banco de dados de chamada (se houver).
Definir tdfsCalling = dbsCalling.TableDefs
Definir tdfCalling = tdfsCalling(strTable)
Se tdfCalling no nada, ento
tdfsCalling.Delete (strTable)
End If
Crie uma nova tabela em branco do banco de dados de cdigo para preencher com dados:
DoCmd.CopyObject destinationdatabase: = strCodeDB, _
NewName: = strTable, _
sourceobjectType: = _ acTable,
SourceObjectName: = strTable
Preencha a tabela do banco de dados de cdigo com nomes de tabela e campo do banco de dados chamado:
Set rst = dbsCode.OpenRecordset (strTable, dbOpenTable)
strExcludeTable = \"zstblQueryPrefixes\"
Para cada qdf em dbsCalling.QueryDefs
strQuery = qdf.Nome
Debug. Print \"nome da consulta:\"
Se ExcludePrefix (strQuery, strExcludeTable) = _
False, em seguida
Conjunto flds = qdf.Campos
Para cada fld na flds
strFieldName = FLD.Nome
Com rst
.AddNew
!QueryName = strQuery
!FieldName = strFieldName
!DataType = FLD.Tipo
!Necessrio = FLD.Necessrio
.Atualizao
Terminar com
Prxima fld
End If
496
Adicionando mais funcionalidades ao Office
Parte III
20_047026 ch14.qxp 02\/04\/07 21:54 pgina 496
Prxima qdf
RST.Fechar
Copiar a tabela preenchida no banco de dados chamada assim estar disponvel para impresso na chamada
banco de dados:
strTable = \"zstblQueryAndFieldNames\"
Definir tdfCode = dbsCode.TableDefs(strTable)
DoCmd.CopyObject destinationdatabase: = strCallingDb, _
NewName: = strTable, _
sourceobjectType: = _ acTable,
SourceObjectName: = strTable
DoCmd.OpenTable strTable
strTitle = \"Tabela cheia\"
strPrompt = \"Imprimir relatrio agora?\"
intReturn = MsgBox (strPrompt, vbQuestion + vbYesNo, _
strTitle)
Se intReturn = vbYes Then
strReport = \"zsrptQueryAndFieldNames\"
DoCmd.OpenReport strReport
End If
ErrorHandlerExit:
Exit Function
ErrorHandler:
MsgBox \"erro nenhum:\"
& ; Description: & err.Description
Resume ErrorHandlerExit
End Function
Campos de lista de tabela
O ListTableFields funo (chamada de tabela USysRegInfo) lista os campos em toda a
tabelas no banco de dados, usando a coleo TableDefs do modelo de objeto DAO:
Funo pblica ListTableFields()
' Chamado de USysRegInfo
Em erro continuar prximo
Chame CopyListObjects
Definir dbsCode = CodeDb
Definir dbsCalling = CurrentDb
497
Criando suplementos do Access
14
20_047026 ch14.qxp 02\/04\/07 21:54 Page 497
Exclua a tabela antiga no banco de dados de cdigo (se houver):
strTable = \"zstblTableAndFieldNames\"
Definir tdfsCode = dbsCode.TableDefs
Definir tdfCode = tdfsCode(strTable)
Se tdfCode no nada, ento
tdfsCode.Delete (strTable)
End If
Exclua a tabela antiga do banco de dados chamada (se houver):
Definir tdfsCalling = dbsCalling.TableDefs
Definir tdfCalling = tdfsCalling(strTable)
Se tdfCalling no nada, ento
tdfsCalling.Delete (strTable)
End If
Crie uma nova tabela em branco do banco de dados de cdigo para preencher com dados:
DoCmd.CopyObject destinationdatabase: = strCodeDB, _
NewName: = strTable, _
sourceobjectType: = _ acTable,
SourceObjectName: = strTable
Preencha a tabela do banco de dados de cdigo com nomes de tabela e campo do banco de dados chamado:
Set rst = dbsCode.OpenRecordset (strTable, dbOpenTable)
strExcludeTable = \"zstblTablePrefixes\"
Para cada tdfCalling em dbsCalling.TableDefs
strTable = tdfCalling.Name
Se ExcludePrefix (strTable, strExcludeTable) = _
False, em seguida
Conjunto flds = tdfCalling.Fields
Para cada fld na flds
strFieldName = FLD.Nome
Com rst
.AddNew
!TableName = strTable
!FieldName = strFieldName
!DataType = FLD.Tipo
!ValidationRule = FLD.ValidationRule
!Necessrio = FLD.Necessrio
.Atualizao
Terminar com
Prxima fld
End If
Prxima tdfCalling
RST.Fechar
498
Adicionando mais funcionalidades ao Office
Parte III
20_047026 ch14.qxp 02\/04\/07 21:54 Page 498
Copie a tabela preenchida no banco de dados chamada assim estar disponvel para impresso no banco de dados chamado:
strTable = \"zstblTableAndFieldNames\"
Definir tdfCode = dbsCode.TableDefs(strTable)
DoCmd.CopyObject destinationdatabase: = strCallingDb, _
NewName: = strTable, _
sourceobjectType: = _ acTable,
SourceObjectName: = strTable
DoCmd.OpenTable strTable
strTitle = \"Tabela cheia\"
strPrompt = \"Imprimir relatrio agora?\"
intReturn = MsgBox (strPrompt, vbQuestion + vbYesNo, _
strTitle)
Se intReturn = vbYes Then
strReport = \"zsrptTableAndFieldNames\"
DoCmd.OpenReport strReport
End If
ErrorHandlerExit:
Exit Function
ErrorHandler:
MsgBox \"erro nenhum:\"
& ; Description: & err.Description
Resume ErrorHandlerExit
End Function
Outros procedimentos
O SetProperty e GetProperty funes so chamadas de vrios procedimentos em Adicionar-
no salvar valores de propriedades de banco de dados personalizado, ou recuperar valores deles:
Public Sub SetProperty(strName As String, lngType As Long, _
varValue como variante)
' Chamado de vrios procedimentos
No erro GoTo ErrorHandler
Tente definir a propriedade especificada:
Definir dbsCalling = CurrentDb
Conjunto prps = dbsCalling.Properties
PRPs(strName) = varValue
ErrorHandlerExit:
Exit Sub
499
Criando suplementos do Access
14
20_047026 ch14.qxp 02\/04\/07 21:54 pgina 499
ErrorHandler:
Se errar.Nmero = 3270 ento
A propriedade no foi encontrada; cri-lo:
Conjunto prp = dbsCalling.CreateProperty (nome: = strName, _
Digite: = lngType, valor: = varValue)
dbsCalling.Properties.Append prp
Retomar em seguida
Outra coisa
MsgBox \"erro nenhum:\"
& ; Description: & err.Description
Resume ErrorHandlerExit
End If
End Sub
Pblico funo GetProperty(strName As String, _
strDefault As String) como variante
' Chamado de vrios procedimentos
No erro GoTo ErrorHandler
Tente obter o valor da propriedade especificado:
Definir dbsCalling = CurrentDb
GetProperty = dbsCalling.Properties(strName).Valor
ErrorHandlerExit:
Exit Function
ErrorHandler:
Se errar.Nmero = 3270 ento
A propriedade no foi encontrada; Use valor padro:
GetProperty = strDefault
Retomar em seguida
Outra coisa
MsgBox \"erro nenhum:\"
& ; Description: & err.Description
Resume ErrorHandlerExit
End If
End Function
500
Adicionando mais funcionalidades ao Office
Parte III
20_047026 ch14.qxp 02\/04\/07 21:54 pgina 500
O SaveNo e BackEndSaveNo funes de criar um nmero incrementado para o banco de dados (ou
cpias de banco de dados back-end):
SaveNo() funo pblica como String
' Chamado de BackupFrontEnd()
No erro GoTo ErrorHandler
Crie um exclusivo incrementando salvar nmero para hoje:
intDayNo = Nz (DMax (\"[SaveNumber]\", \"zstblBackupInfo\", _
\"[SaveDate] = Date()\"))
Debug. Print \"dia nenhum.\"
strNextNo = CStr(intDayNo + 1)
Debug. Print \"prximo n.\"
SaveNo = strNextNo
ErrorHandlerExit:
Exit Function
ErrorHandler:
MsgBox \"erro nenhum:\"
Err.Descrio
Resume ErrorHandlerExit
End Function
BackEndSaveNo() funo pblica como String
' Chamado de BackupBackEnd()
No erro GoTo ErrorHandler
Crie um nico salvar nmero para hoje:
intDayNo = Nz (DMax (\"[BackEndSaveNumber]\", _
\"zstblBackupInfo\" _
\"[BackEndSaveDate] = Date()\"))
Debug. Print \"Back final dia no.\"
strNextNo = CStr(intDayNo + 1)
Debug. Print \"Back end no prximo.\"
BackEndSaveNo = strNextNo
ErrorHandlerExit:
Exit Function
ErrorHandler:
MsgBox \"erro nenhum:\"
Err.Descrio
Resume ErrorHandlerExit
End Function
501
Criando suplementos do Access
14
20_047026 ch14.qxp 02\/04\/07 21:54 pgina 501
Finalizando o Add-in
Depois de obter as suas funes, formas e outros objetos para funcionar corretamente, a etapa final para entrar
informaes de identificao em propriedades especficas da folha de propriedades da biblioteca do banco de dados, para dar
informaes aos usurios sobre o add-in quando ele listado na caixa de dilogo Gerenciador de suplementos. As informaes
sobre um add-in que aparece no Gerenciador de suplemento dilogo vem da pgina Resumo do
folha de propriedades do suplemento do banco de dados. Para abrir a folha de propriedades para o add-in, selecione Arquivo, gerenciar,
Propriedades de banco de dados, como mostrado na Figura 14.8.
FIGURA 14.8
Abrir a folha de propriedades do banco de dados.
Uma vez aberta, a folha de propriedades parece no Access 2003 (mostrado na Figura 14.9).
O texto que voc inserir na folha de propriedades da biblioteca do banco de dados usado da seguinte maneira:
O ttulo valor do campo exibido como nome do suplemento na lista de suplementos disponveis.
O valor do campo Company (campo no o autor, como voc poderia esperar) aparece como o
Adicionar-em nome do autor da lista de suplementos disponveis.
Valor do campo de comentrios aparece como descrio no suplemento na parte inferior do Add-
Na caixa de dilogo do Gerenciador.
502
Adicionando mais funcionalidades ao Office
Parte III
20_047026 ch14.qxp 02\/04\/07 21:54 pgina 502
FIGURA 14.9
Inserindo informaes de identificao do suplemento na folha de propriedades.
Solucionando problemas de suplementos
Se voc precisar depurar cdigo de add-in para determinar o que est causando o problema, voc tem dois
Opes. Uma colocar um Parar instruo o cdigo add-in, que vai parar o cdigo nesse ponto
quando ele est em execuo, ento voc pode percorrer o cdigo desse ponto. Para fazer isso, voc deve primeiro
fechar qualquer abrir banco de dados e, em seguida, abra o banco de dados add-in biblioteca e adicionar o Parar instruo, salvar
fechar o Adicionar-in, abrir um banco de dados e executar o add-in que tem o Parar instruo no seu
cdigo. Mais tarde, voc precisar de remover o Parar declarao do cdigo de suplemento de forma semelhante.
A alternativa de outra (e rpida) definir uma referncia para o banco de dados da biblioteca, assim voc pode abrir sua
mdulos de cdigo e coloque pontos de interrupo e at mesmo modificar o cdigo temporariamente, para testar vrias alterna-
maristas. Para definir uma referncia a um banco de dados do Access add-in biblioteca, execute as seguintes etapas:
Se voc pretende definir uma referncia a um banco de dados biblioteca, assim voc pode depurar seu cdigo eas-
Sabrina (como descrita em seguida), dar seu projeto Visual Basic um nome significativo, ento ele vai dizer
\"Extras\" (ou qualquer outro) em vez de \"Projeto1\" nas referncias dilogo. Para citar o projeto VB, abrir
a janela do Visual Basic, selecionar a linha do projeto (linha superior) no explorador de projeto e renome-lo em
a propriedade de nome da folha de propriedades, como mostrado na Figura 14.10.
DICA DICA
503
Criando suplementos do Access
14
20_047026 ch14.qxp 02\/04\/07 21:54 pgina 503
FIGURA 14.10
Renomeando projeto um add-in do.
1. Abra um mdulo em qualquer banco de dados do Access e selecione Ferramentas, referncias para abrir o
Caixa de dilogo References, conforme mostrado na Figura 14.11.
FIGURA 14.11
A caixa de dilogo referncias no Access 2007.
504
Adicionando mais funcionalidades ao Office
Parte III
20_047026 ch14.qxp 02\/04\/07 21:54 pgina 504
2. Clique no boto Procurar para procurar o banco de dados add-in biblioteca e selecione Add-ins
(*.mda) na lista suspensa arquivos do tipo, se voc estiver definindo uma referncia a um acesso
2003 ou anterior. (MDA) biblioteca banco de dados, ou todos os arquivos (*. *) para definir uma referncia para um acesso
banco de dados biblioteca de 2007 (accda) (Ver Figura 14.12).
FIGURA 14.12
Definir uma referncia a um banco de dados do Access 2002-2003 biblioteca.
3. Clique em abrir para definir a referncia; o nome do projeto do add-in agora aparece marcado na
o dilogo de referncias, como mostrado na Figura 14.13.
FIGURA 14.13
Uma referncia a um banco de dados biblioteca Adicionar-in.
505
Criando suplementos do Access
14
20_047026 ch14.qxp 02\/04\/07 21:54 pgina 505
4. Agora voc pode ver o add-in projeto no Project Explorer e abra seu mdulo (s) e
trabalho com eles como mdulos do banco de dados atual, como mostrado na Figura 14.14.
FIGURA 14.14
Abrindo um Adicionar-in mdulo na janela de um banco de dados do Visual Basic.
Embora voc pode editar o cdigo em um banco de dados biblioteca depois de definir uma referncia a ele e correr
o cdigo para testar se as modificaes corrigir um problema, as alteraes no so salvas para
o banco de dados biblioteca, ento salvar qualquer modificado o cdigo para um arquivo de texto, que voc pode em seguida, copie e cole
banco de dados do biblioteca de quando voc em seguida abri-lo diretamente.
Interpretao de mensagens de erro de suplemento
Voc pode obter esta mensagem de erro (Figura 14.15) quando executar (ou tentar executar) um add-in em
Access 2007.
FIGURA 14.15
Uma mensagem de erro ao executar um add-in.
CUIDADO CUIDADO
506
Adicionando mais funcionalidades ao Office
Parte III
20_047026 ch14.qxp 02\/04\/07 21:54 pgina 506
s vezes, esse erro ocorre quando voc fez alteraes para o suplemento, mas acesso ainda est em execuo
o cdigo antigo. No caso esta a causa do problema, tente desinstalar o add-in, Add-in
Gerenciador de dilogo e, em seguida, reinstal-lo. Em alguns casos, isso ir corrigir o problema. Se voc ainda obter o erro
mensagem depois de reinstalar o add-in, pode ser porque voc criou uma sub em vez de uma funo para
Use a tabela USysRegInfo (somente funes podem ser chamadas de registro), ou voc alterou o
nome da funo a ser chamado, portanto, o um no registro no pode ser encontrado. Verifique se o func -
entradas de o na tabela USysRegInfo correspondem aos nomes de funo no banco de dados biblioteca (e que
os procedimentos chamados so funes, no subs).
Se um formulrio em seu Adicionar-in no aparece quando a funo que deve abri-lo executada, sem qualquer
mensagem de erro, isso pode ser porque a fonte de registro do formulrio est ausente. Voc no vai obter um erro; o
forma apenas no abre. Verifique se a fonte de registro do formulrio existe e situa-se a dados de cdigo-
base, no chamado banco de dados. Em alguns casos pode ser necessrio preencher uma tabela chamada dados-
base e depois copi-lo de volta para o banco de dados de cdigo para usar como fonte de registro de um formulrio, como fao
Extras Adicionar-in.
Se voc receber um erro \"este recurso no est instalado\" mensagem quando tentar executar o suplemento, pode
resultar de qualquer nmero de erros no cdigo do suplemento. Em primeiro lugar, verificar problemas no seguinte
reas:
Sintaxe incorreta em uma Adicionar-in funo (por exemplo, o nmero errado ou tipo de argumen-
mentos).
Incompatibilidade entre o mdulo de cdigo e o nome da funo na tabela USysRegInfo.
Nome do suplemento foi mudado, mas a referncia a ele na tabela USysRegInfo ainda tem
o nome antigo.
Erros de sintaxe geral o cdigo de suplemento.
O cdigo de add-in no foi compilado.
Em seguida, conclua as seguintes etapas:
1. Primeiro desinstale o banco de dados e fechar o acesso.
2. Abra o banco de dados biblioteca, corrigir quaisquer erros e compilar o banco de dados add-in.
3. Repita conforme necessrio at que o suplemento executado sem erros.
Instalando um Add-in
Um suplemento s precisa ser instalado uma vez em qualquer banco de dados do Access; Depois que instalado, ele est disponvel
todos os bancos de dados do Access. Para instalar o suplemento do 2007 Extras, primeiro copie o banco de dados da biblioteca para sua
Pasta de suplementos. No Access 2007 em execuo no Windows XP, a pasta de suplementos no mesmo lugar como
no Office 2003, c: \/ Documents and Settings \/ Nome de usurio \/ Application Data\/Microsoft\/AddIns; Se voc
estiver executando o Windows Vista, a pasta de suplementos est em j: \/ usurios\/Helen Feddema\/AppData\/Roaming \/
Microsoft\/AddIns.
507
Criando suplementos do Access
14
20_047026 ch14.qxp 02\/04\/07 21:54 pgina 507
Se voc est tentando instalar um suplemento no Access 2007 sendo executado no Windows Vista, voc pode
recebo um aviso de segurana. Nesse caso, tente executar acesso como administrador, clicando com o
MSACCESS.Arquivo EXE na subpasta sob a pasta Microsoft Office, Office 12 e selecionando
a seleo \"Executar como administrador\". Agora, voc deve ser capaz de instalar o suplemento.
Outro requisito de Vista: na tabela USysRegInfo, alterar a capitalizao do \"Menu Add-ins\"
(para \"Menu Add-Ins\", com um capital eu). De acordo com a Microsoft, sero abordada neste maisculas e minsculas
em um servio prximo patch, mas voc precisa fazer a mudana para habilitar o menu add-ins para trabalhar
Vista agora mesmo.
Se voc prefere manter seus prprios add-ins em uma pasta personalizada, voc pode adicionar outra pasta lista de
locais confiveis para selecionar arquivo, opes de acesso e, em seguida, selecionar a pgina da central de confiabilidade do
Acesse a caixa de dilogo de opes, como mostrado na Figura 14,16.
Consulte a barra lateral \"Recebendo seu Adicionar-ins para trabalho em Vista\" no captulo 15 para mais infor-
o sobre os requisitos especficos para a instalao de add-ins no Windows Vista.
FIGURA 14,16
A pgina da central de confiabilidade da caixa de dilogo Opes do Access.
Clique no boto Configuraes da central de confiar e selecione a pgina de locais confiveis. Em seguida, use o \"Adicionar novo
boto de localizao\"para adicionar a pasta onde voc deseja armazenar seu Adicionar-ins, como mostrado na Figura 14,17.
REFERNCIA CRUZADA REFERNCIA CRUZADA
508
Adicionando mais funcionalidades ao Office
Parte III
20_047026 ch14.qxp 02\/04\/07 21:54 pgina 508
Em seguida, abra qualquer banco de dados do Access e selecione a guia ferramentas de banco de dados da faixa de opes, clique em suplementos
drop-down no grupo ferramentas de banco de dados e selecione Add-In Manager (Ver Figura 14,18).
FIGURA 14,17
Adicionar uma pasta para o grupo de locais confiveis.
FIGURA 14,18
Abrindo o Gerenciador de suplemento no Access 2007.
Depois de abrir o Gerenciador de suplemento, parece apenas que o dilogo familiar de anteriores ver-
Sion de acesso, listando os add-ins que so encontrados na pasta AddIns e deix-lo a instalar ou
desinstal-los. Para instalar o suplemento do 2007 Extras, selecione-o e clique no boto instalar, como mostrado na
Figura 14.19.
509
Criando suplementos do Access
14
20_047026 ch14.qxp 02\/04\/07 21:54 Page 509
FIGURA 14.19
Instalar o suplemento do 2007 Extras.
Aps clicar em instalar, um x aparece esquerda do instalado Adicionar-in, e quando voc fechar o Adicionar-
No Gerenciador, vrias novas selees aparecem no menu Add-Ins, como mostrado na Figura 14.20.
FIGURA 14.20
Add-ins de dados Extras 2007.accda biblioteca no menu Add-Ins.
O trs menu suplementos comeando com \"Renomear\" na parte inferior da lista so de minha
LNB renomear add-in.
Usando o Extras 2007 Add-in
Depois de instalar o Extras 2007.accda suplemento, voc pode executar seus trs menu add-ins de suplementos
menu, que encontrado no grupo ferramentas de banco de dados na faixa de opes de ferramentas de banco de dados.
Se voc estiver criando um add-in que pode ser usado em vrias verses do Access (no
precisa de alguma especiais novos recursos do Access 2007 e no cria menus ou barras de ferramentas
que s funcionar em verses mais antigas), criar o add-in em um formato mais velho, ento ele pode ser executado em ambos os
Access 2007 e verses mais velhos. O suplemento do LNC Rename.mda ser executado em qualquer verso do acesso de
Acessar 2000 atravs do Access 2007, pelo menos se voc estiver executando no Windows XP.
DICA DICA
NOTA NOTA
510
Adicionando mais funcionalidades ao Office
Parte III
20_047026 ch14.qxp 02\/04\/07 21:54 pgina 510
Opes extras
Esta seleo abre uma caixa de dilogo de configurao (mostrada na Figura 14.21) com um grupo de opes para selecionar o
pasta para armazenar os backups de banco de dados e dois subformulrios listando os prefixos de tabela e consulta para
tabelas e consultas que deseja omitir quando usando a lista de campos de consulta ou lista de campos da tabela
Adicionar-ins. Essas tabelas so pr-preenchidos com sistema prefixos, hfens e sublinhados e \"Copiar de\"
(este ltimo o prefixo usado em cpias de objeto do Access 2007).
Se voc selecionar a opo Custom Path, um boto de comando habilitado que abre um dia do selecionador de pasta-
onde voc pode selecionar uma pasta personalizada de backup de log. A escolha de backup armazenada separadamente para cada
banco de dados, usando propriedades de banco de dados; os prefixos, no entanto, so armazenados no banco de dados cdigo, ento eles
so as mesmas para todos os bancos de dados.
Voc no precisa abrir a caixa de dilogo de instalao de Extras para usar o outro menu add-ins; Se voc ainda no fez
Todas as selees, o cdigo usa a opo de backup padro da opo 2 (pasta de Backups em banco de dados
pasta) e os prefixos padro.
511
Criando suplementos do Access
14
Assinar o cdigo de Add-in com uma assinatura Digital no!
Y
ou pode ser usado para assinar bancos de dados de cdigo em Access 2003 (ou anterior) com uma assinatura digital (veja
barra lateral de \"Criar uma assinatura Digital para a assinatura de seu cdigo VBA do Access\" no captulo 12 para
detalhes sobre como criar sua assinatura digital pessoal). Pode parecer uma boa idia assinar um
Cdigo de acesso 2007 Adicionar-in com uma assinatura digital mas se voc experiment-lo, voc vai correr em bloqueios de estradas.
Depois de criar uma assinatura digital pessoal, se voc tentar selecionar a assinatura de ferramentas, Digital
Assinatura na janela de mdulo do add-in, voc ter um longo e intrigante mensagem (consulte a fig-
URE abaixo). Observe que o formato accda no mencionado.
Voc pode seguir as instrues para um banco de dados. accdb e selecione Arquivo, publicar, pacote e sinal
o banco de dados da biblioteca, selecione a assinatura digital e criar um pacote assinado (ter o
extenso. accdc). Mas se voc tentar instalar o arquivo accdc como um add-in, voc receber um
Mensagem de erro \"formato de banco de dados no reconhecido\" e voc no pode instalar o arquivo de pacote assinado. Assim
(neste momento, pelo menos) no h nenhuma maneira de assinar digitalmente um banco de dados do Access 2007 suplemento biblioteca.
20_047026 ch14.qxp 02\/04\/07 21:54 pgina 511
FIGURA 14.21
O dilogo de instalao de add-ins Extras 2007.
Faa backup de dados
Esta opo faz um backup do banco de dados atual (um banco de dados standalone ou um front-end
banco de dados), apresentando o nome proposto da cpia do banco de dados em um InputBox, ento voc pode edit-lo se
desejada, por exemplo adicionar informaes especficas sobre um marco alcanado. A InputBox
mostrado na Figura 14.22.
Backup de banco de dados Back End
Esta opo faz um backup do banco de dados de back-end do banco de dados atual, se houver e coloca
uma mensagem informativa para cima se o banco de dados no contm quaisquer tabelas vinculadas. A InputBox simi-
lar para que para o Back-up de dados menu add-in.
FIGURA 14.22
Um nome proposto para uma cpia de backup do banco de dados de exemplo Northwind.
512
Adicionando mais funcionalidades ao Office
Parte III
20_047026 ch14.qxp 02\/04\/07 21:54 pgina 512
Campos de consulta da lista
Este comando preenche uma tabela com os nomes das consultas select (omitindo aqueles cujos prefixos so em
a lista de excluso) e seus nomes de campo e ofertas para imprimir um relatrio baseado na tabela. A tabela
mostrado na Figura 14.23.
Apenas consultas select sero listadas. Embora sejam de consultas de outros tipos (consultas de ao)
no listados por nome na coleo QueryDefs, eles tm nenhum campos para a lista.
FIGURA 14.23
Uma mesa repleta de nomes de consulta e campos.
Anote o nome do campo de Expr1008, indicando que o mesmo campo includo na consulta duas vezes. O
campos na tabela so listados na ordem em que eles ocorrem na consulta no modo design; o relatrio
com base nesta tabela d uma listagem alfabtica, conforme mostrado na Figura 14.24.
A tabela e relatrio so armazenados no banco de dados chamado, e assim eles podem ser abertos mais tarde sem
re-executar o menu add-in.
NOTA NOTA
513
Criando suplementos do Access
14
20_047026 ch14.qxp 02\/04\/07 21:54 pgina 513
FIGURA 14.24
O relatrio de consulta e os nomes de campo.
Campos de lista de tabela
Esse suplemento funciona da mesma forma o campos de consulta lista Adicionar-in, exceto que ele lista tabelas e sua
campos em vez de consultas e seus campos.
Acesso Adicionar-ins, depois de ter aprendido as tcnicas especiais necessrias para cri-los, um grande
forma de reforar seu acesso bases de dados com funcionalidades extras, mesmo apoiando vrias verses
de acesso.
Resumo
Este captulo tratou criando Adicionar-ins de acesso em formato de banco de dados de biblioteca do Access 2007 (accda)
(voc pode usar as mesmas tcnicas para criar suplementos no formato. MDA mais velho para uso com bancos de dados
criado em anteriores formatos de banco de dados de acesso como Access 2007). Acesso Adicionar-ins que voc encap-
sulate um conjunto de objetos de banco de dados (principalmente cdigo e formas), para uso em qualquer banco de dados do Access, como uma forma
de adicionar funcionalidades extras para um banco de dados sem a necessidade de importar manualmente objetos em qualquer
onde voc precisar da funcionalidade de banco de dados.
O prximo captulo cobre usando XML da faixa de opes para trabalhar com a faixa de opes de acesso, em suplementos de acesso como
assim como outros tipos de suplementos.
514
Adicionando mais funcionalidades ao Office
Parte III
20_047026 ch14.qxp 02\/04\/07 21:54 pgina 514
A
s um usurio avanado ou desenvolvedor, voc pode ser usado para manualmente personaliz-
ing o acesso as barras de ferramentas e menus, removendo os controles, voc no
necessidade, outros movendo-se para locais mais convenientes e em geral
reorganizando as barras de ferramentas e menus, assim como preferir, e voc pode ter
escrita de funes para execuo de comandos de menu ou botes da barra de ferramentas personalizada. Se
voc pretende continuar estas prticas no Access 2007, voc dentro para um choque.
O novo Office 2007 fita uma alterao de interface principal de acesso (tambm
como os outros aplicativos do Office), e requer uma mudana importante no programa -
tcnicas de Ming para personalizar a interface de acesso. Em vez de trabalhar
com a coleo CommandBars para criar menus e barras de ferramentas ou adicionar com-
mands para os padres, voc personalizar a faixa de opes com cdigo XML
armazenados em uma tabela, trabalhando com guias e grupos em vez de menus e ferramenta-
barras (embora a faixa de opes incluem um menu-o menu do Office e
uma barra de ferramentas, a barra de ferramentas de acesso rpido).
Para outros aplicativos do Office, como Word e Excel, personalizao da faixa de opes
requer a criao e carregando um documento XML separado, mas no Access, voc
tem uma opo muito mais conveniente: basta criar uma tabela contendo o XML
cdigo para a criao da faixa de opes, carreg-lo automaticamente, fechando e reabrindo
o banco de dados e em seguida, selecione a faixa de opes que voc deseja usar a partir do acesso
Tela de opes. Depois de um fechamento de mais e a reabertura do banco de dados, sua
Personalizaes da faixa de opes iro aparecer.
515
NESTE CAPTULO
Personalizar a faixa de opes em uma
Banco de dados Access
Personalizar a faixa de opes com um
Suplemento de acesso
Ferramentas para trabalhar com XML
cdigo
Personalizar a faixa de opes
com XML no Access
Bancos de dados e adicionar-ins
21_047026 ch15.qxp 02\/04\/07 22:06 pgina 515
516
Adicionando mais funcionalidades ao Office
Parte III
Fontes de informaes sobre como personalizar a faixa de opes
T
Ele MSDN documentar \"Personalizando a Interface do usurio da faixa de opes Office (2007) para desenvolvedores\"
(Partes 1 a 3) uma referncia muito til ao criar o XML da faixa de opes para acesso (e outros
Aplicativos do Office).
A lista de IDs de controle (Controls.xls de fita de acesso) de valor inestimvel para trabalhar com a faixa de opes; ele
listas de controle, grupo e nomes de guia que voc precisa para usar ao criar cdigo XML da faixa de opes. Voc pode baixo-
carregar esta planilha de
http:\/\/www.Microsoft.com\/downloads\/details.aspx?Family
ID = 4329d9e9 - 4D 11-46a5-898 d-23e4f331e9ae
no site da Microsoft.
Vrios blogs tambm so recursos valiosos para obter informaes sobre como trabalhar com a faixa de opes em VBA ou VB
cdigo: blog do Erik Rucker, consulte a 13 de julho de 2006 postar sobre como personalizar a nova interface do usurio para acesso
informaes sobre como personalizar a faixa de opes de acesso. Os blogs mantidos por Jensen Harris e Patrick
Schmid tm muita informao valiosa sobre a personalizao da faixa de opes (Jensen Harris o programa
Gerente responsvel pela equipe de interface do usurio do Office e Patrick Schmid um MVP). o terceiro de cinco blog
tambm til. Consulte o site de web do Office Developer Center para a mais recente lista de blogs relacionados ao Office.
No entanto, observe que essa planilha foi actualizada em novembro de 2006, e alguns dos nomes tm
mudou desde ento, portanto, no inteiramente exato, especialmente para nomes de grupo e guia.
Aqui esto os links para os recursos mencionados no pargrafo anterior:
Personalizando a Interface do usurio Office Ribbon (2007) para desenvolvedores, partes 1 a 3:
http:\/\/msdn2.Microsoft.com\/en-us\/library\/ms406046.
aspx #OfficeCustomizingRibbonUIforDevelopers_AppLevel
http:\/\/msdn2.Microsoft.com\/en-us\/library\/aa338199.aspx
http:\/\/msdn2.Microsoft.com\/en-us\/library\/aa722523.aspx
Office 2007 Developer Center:
http:\/\/msdn2.Microsoft.com\/en-US\/Office\/
aa905358.aspx
Extensibilidade da faixa de opes no Access 2007:
http:\/\/msdn2.Microsoft.com\/en-US\/
biblioteca\/bb187398.aspx
Fazendo a transio de seus aplicativos existentes do Access para o Access 2007:
http:\/\/msdn2.
Microsoft.com\/en-us\/library\/bb203849.aspx
Blog de Erik Rucker:
http:\/\/Blogs.msdn.com\/Access
Blog do Jensen Harris:
http:\/\/Blogs.msdn.com\/jensenh\/default.aspx
Blog de Patrick Schmid:
http:\/\/pschmid.net\/blog\/2006\/10\/09\/58
Tero do Blog cinco:
http:\/\/Blogs.msdn.com\/thirdoffive\/
21_047026 ch15.qxp 02\/04\/07 22:06 Page 516
Ferramentas teis para criao e edio
Cdigo XML
Embora voc pode criar cdigo XML em qualquer texto editor at mesmo o bloco de notas muito mais fcil de criar
e editar o cdigo XML em um editor especializado. Vrios editores de XML esto disponveis gratuitamente gratuitamente, ou como
parte de outro aplicativo; eles so descritos nas sees a seguir.
XML Notepad 2007
Uma dessas ferramentas o XML Notepad 2007, disponvel como um download gratuito na pgina Downloads do
Web site da Microsoft, no seguinte link.
http:\/\/www.Microsoft.com\/downloads\/details.aspx?FamilyId=72d6aa49
-787 d-4118-ba5f-4f30fe913628
Figura 15.1 mostra a guia de TreeView do bloco de notas XML editor, com o cdigo da lista campos XML.
Esta vista mostra cada atributo em uma linha separada da rvore no painel esquerdo, com seu valor dis-
jogado no painel da direita.
O utilitrio de XML Notepad 2007 foi atualizado no final do beta do Office
2007\/Windows Vista e funcionou bem naquela poca. Infelizmente, na verso de lanamento
de Vista, ele tem um problema curioso: ele ser executado apenas minimizado ou maximizado, no restaurado. Espero que isso
falha vai esclarecer com um patch algum momento em breve. At ento, quando voc executar este utilitrio, ele aparecer
minimizado; boto direito do mouse o cone da barra de tarefas e selecione maximizar para abri-lo em tela cheia.
FIGURA 15.1
Na guia modo de exibio de rvore do editor de XML Notepad 2007.
CUIDADO CUIDADO
517
Personalizar a faixa de opes com XML em bancos de dados Access e suplementos
15
21_047026 ch15.qxp 02\/04\/07 22:06 pgina 517
A guia de sada XSL deste editor mostra o cdigo em um layout recuado, como mostrado na Figura 15.2.
Editor de XML do VB 2005
Se voc tem uma edio recente da VB .NET, Visual Basic ou Visual Studio 2005 e acima, voc pode usar
o editor de XML que um componente desses programas. Se voc tem o Express Edition do Visual
Basic 2005, SQL Server 2005 ou Visual Web Developer 2005 (downloads gratuitos do Visual
Pgina do Studio do site da web Microsoft encontrados aqui: http:\/\/msdn.Microsoft.com\/vstudio\/
Express\/vb\/download \/ ), estas edies do VB e SQL Server contm tambm editores de XML. Consulte
Figura 15.4 no final deste captulo para a exibio de cdigo XML neste editor.
FIGURA 15.2
A guia de sada XSL do editor XML Notepad 2007.
Office 2007 Custom UI Editor
De http:\/\/openxmldeveloper.org\/Archive\/2006\/05\/26\/CustomUIeditor.aspx
voc pode baixar a ferramenta Editor de interface do usurio personalizada, para uso na escrita de cdigo XML para personalizar o Office
Fita de 2007.
Eu instalei este utilitrio, tentado abrir um arquivo XML salvo nele (aquele que abriu bem no VB
2005 Express XML editor e XML Notepad 2007) e recebi uma mensagem que contm o arquivo cor-
rupted dados. No entanto, eu era capaz de copiar o cdigo XML para a rea de transferncia e col-lo no editor
janela. Custom UI Editor (Ver Figura 15.3) no to til para edio de cdigo de XML da faixa de opes, como
o Editor de XML do VB 2005 ou XML Notepad 2007, ento eu recomendo usar um daqueles
editores em vez disso.
518
Adicionando mais funcionalidades ao Office
Parte III
21_047026 ch15.qxp 02\/04\/07 22:06 pgina 518
Se voc tiver o Visual Studio 2005 (qualquer edio), use seu editor de XML embutido; caso contrrio, eu recomendo
o editor de XML Notepad 2007 para trabalhar com cdigo XML.
FIGURA 15.3
Cdigo XML no Office 2007 Custom UI Editor.
Personalizar a faixa de opes em um acesso
Banco de dados
Se voc quiser adicionar guias, grupos ou controles da faixa de opes em um banco de dados do Access, voc tem que escrever
XML e (opcionalmente) VBA cdigo ao contrrio de como personalizar menus e barras de ferramentas, voc apenas no pode arrastar uma
comando para um local em qualquer barra de ferramentas ou menu, como nas verses anteriores do Access. O nico homem-
ual personalizao disponvel no Access 2007 adicionando comandos barra de ferramentas de acesso rpido. Em um
grande mudana de verses anteriores do Office, voc no pode adicionar programaticamente comandos para stan-
Dard grupos de fita, ou remover comandos padro de grupos, embora voc pode ocultar guias com-
pletamente, e adicionar novos grupos contendo comandos personalizados.
519
Personalizar a faixa de opes com XML em bancos de dados Access e suplementos
15
21_047026 ch15.qxp 02\/04\/07 22:06 pgina 519
520
Adicionando mais funcionalidades ao Office
Parte III
Patrick Schmid em personalizao de Ribbon do Access 2007
T
He melhor discusso de personalizao da faixa de opes do Access 2007 (ou a falta dela) da
18 De outubro de 2006 entrada no blog do MVP Patrick Schmid:
Se voc me perguntar sobre a possibilidade de personalizao da fita nova interface do usurio no Office 2007, minha resposta seria:
demasiado pouco, demasiado difcil. Em comparao com verses anteriores do Office, especialmente o Office 2003, 2007 simplesmente
tem uma deficincia grave de personalizao. Na verdade, a maioria dos usurios provavelmente concluir que a faixa de opes
no pode ser personalizada em tudo.
Em contraste, o Office 2003 o escritrio mais personalizvel nunca. Voc pode localizar seus menus e ferramenta-
bares em qualquer lugar que voc quer na tela, criar seus prprios menus e barras de ferramentas, alterar cones e
Etiquetas, modificar os menus e barras de ferramentas e assim por diante. No h quase nenhum limite sobre quais componentes da
UI, um usurio pode alterar. Como personalizar o Office 2003 tambm fcil de fazer, como a alterao pode ser alcanada com uma
alguns cliques do mouse.
A interface do usurio da faixa de opes do Office 2007, porm, uma histria completamente diferente. Esttica com muito limitado, cus-
tomizability a descrio, provavelmente a maioria dos usurios, dar-se-ia esta nova interface do usurio. A maioria dos usurios provavelmente s
descobrir a barra de ferramentas de acesso rpido (QAT) e, em seguida, concluir que deve ser isso. que realmente tudo
no h? Como ns acabou com tal falta de personalizao?
Por que o Office 2007 tem uma deficincia de personalizao
Microsoft teve de criar a interface do usurio completamente do zero. Se voc leu atravs de alguns da
Bblia de interface do usurio do Office, voc pode ter uma idia da enorme quantidade de recursos que entrou em criar este novo
INTERFACE DO USURIO. No entanto, mesmo na Microsoft, os recursos so limitados. Portanto, a necessidade de todos os recursos do
nova interface do usurio tinha que ser justificada. Real possibilidade de personalizao foi, infelizmente, uma caracterstica que no fazer o corte.
Como explica a Bblia de interface do usurio do Office, a equipe de interface do usurio no poderia fazer o caso para personalizao, se s
~1.9% as sesses de Office 2003 de cerca de 100 milhes usurios estavam com personalizao.
O caso ainda mais fraco, como 85% dessas personalizaes envolvem quatro ou menos botes. Por conseguinte,
Microsoft decidiu apoiar o caso encontrado em 99,7% de todos os usurios: nenhuma personalizao ou quatro
ou menos botes. Isso deixou o restante 0,3% na chuva. Os 0,3% representam cerca de 1,35 milhes
as pessoas, pois h 450 milhes pagos a clientes do escritrio e so tambm aqueles que so mais susceptveis de
participar do processo de desenvolvimento do Office, por exemplo, atravs da participao no beta. Minha opinio
sobre essa abordagem pode ser encontrada no meu projeto com post de estatsticas.
Alm deste argumento, uma interface de usurio altamente personalizvel, infelizmente, apresenta um apoio macio
problema. Voc pode ver isso, se voc tentar lembrar quantas vezes voc acidentalmente mudou-se um menu ou
barra de ferramentas no Office 2003, ou personalizado de outra forma por acaso. Voc provavelmente sabe como desfazer
o acidente, mas muitos, muitos usurios no.
21_047026 ch15.qxp 02\/04\/07 22:06 Page 520
Embora voc no pode personalizar as abas de faixa de opes padro e grupos, voc pode adicionar novas guias e
grupos para a faixa de opes, embora a tcnica completamente diferente do que escrever cdigo VBA para trabalhar
com CommandBars, como em verses anteriores do Access. Existem vrios passos para personalizar o
Fita em um banco de dados do Access:
1. Escreva o cdigo XML para definir as personalizaes da faixa de opes.
2. Crie uma tabela no banco de dados Access para armazenar os nomes de fita e seu cdigo XML.
3. (Opcional) Escrever procedimentos de retorno de chamada VBA para executar a partir da faixa de opes personalizada comando mas-
toneladas.
4. Feche o banco de dados e, em seguida, reabri-lo, para carregar o Ribbon(s) da tabela.
5. Selecione a faixa de opes para carregar o banco de dados.
6. Feche e reabra o banco de dados para carregar a faixa de opes.
Alm de criar o XML de cdigo, cdigo do VBA (se necessrio) e a tabela, voc tambm tem que fechar e
reabra o banco de dados duas vezes para obter as personalizaes da faixa de opes para aparecer uma vez para carregar a faixa de opes,
e novamente aps selecionar a faixa de opes para usar no banco de dados. As prximas sees guiaro-lo
atravs da personalizao da faixa de opes em um banco de dados do Access.
O banco de dados de amostra para esta seo Ribbon.accdb de teste.
NOTA NOTA
521
Personalizar a faixa de opes com XML em bancos de dados Access e suplementos
15
Por que eu continuar chamando-uma deficincia de personalizao?
A Microsoft decidiu que, para fazer os 99,7% de todos os usurios felizes, uma barra de ferramentas era suficiente. Em
a fim de evitar a personalizao acidental e tornar-se usurios sempre tem essa barra de ferramentas acessvel,
tornou-se no-flutuante. Nasceu, portanto, foi a barra de ferramentas de acesso rpido. Ou seja no o fim do
personalizao histria embora. H tambm uma guia da faixa de opes que voc pode ocultar ou mostrar, ou seja o
Guia do desenvolvedor. Voc tambm pode personalizar totalmente a barra de status. Barras de ferramentas e menus criados em um anterior
Verso do Office e pelo legado (significado no - Office 2007) add-ins tambm podem ser usados, mas no criado,
em 2007. ltimas mas no menos importante, galerias podem ser personalizadas. Alguns \"personalizam\"-se automati-
camente, por exemplo, a lista de documentos recentes ou a Galeria de formas. Outros podem ser manualmente personalizado, espe -
cialmente no Word. Por exemplo, as galerias para nmeros de pgina, cabealhos e rodaps podem ser personalizadas
pelo usurio.
Mas isso. Srio, isso. Tudo o resto, especialmente a grande maioria da faixa de opes, esttico
e no podem ser personalizados. Portanto, descrevendo o Office 2007 como tendo um \"personalizao defi-
ccia\"ou reclamando sobre a falta de personalizao nele, reflete adequadamente a situao
em 2007.
21_047026 ch15.qxp 02\/04\/07 22:06 pgina 521
Criando o cdigo XML
Tabela 15.1 lista alguns dos mais usados elementos XML para personalizar um Access 2007
Faixa de opes.
TABELA 15.1
Elementos XML para uso em personalizar a faixa de opes
Nome do elemento Uso Comentrios
customUI O elemento de nvel superior para uma faixa de opes personalizada
faixa de opes A definio da faixa de opes Defina o atributo startFromScratch como
\"verdadeiro\"
para criar uma fita de nova e em branco.
(As aspas so necessrias, uma diferena
do cdigo do VBA com sua
Verdadeiro
e
Falso
Palavras-chave.) Se definido como
\"falso\"
ou
omitido, as personalizaes sejam aplicadas
para a faixa de opes padro.
Guia Cria ou faz referncia a um guia da faixa de opes
Grupo Cria ou faz referncia a um grupo em uma guia
ID Nome exclusivo de um controle personalizado
idMso Nome de um controle padro
rtulo Texto exibido em um controle
boto Um boto de comando em uma faixa de opes O
onAction
atributo especifica o
nome de uma funo a ser executada quando o
boto clicado.
menu suspenso Uma lista drop-down Automaticamente limitado para selees de lista.
comboBox Uma lista drop-down que permite entradas manuais Os usurios podem entrar selees ou selecione
a lista.
imageMso A imagem a ser usado para o controle Definir com o nome de uma fita interna
controle (ou uma imagem personalizada que voc tem
criado).
tamanho O tamanho do controle As escolhas so
\"normal\"
e
\"grande\"
.
SuperTip O texto para exibir o pop-up que aparece
Quando o mouse passa sobre um controle
visvel Se o controle visvel ou no As escolhas so
\"verdadeiro\"
ou
\"falso\"
.
habilitado Se o controle est habilitado ou no As escolhas so
\"verdadeiro\"
ou
\"falso\"
.
Nomes de elementos XML usam camel casing notao; a primeira letra do nome do elemento
minsculas e outros componentes tem sua primeira letra maiscula (dando a aparecer-
dade da corcunda de um camelo). Exemplo:
menu suspenso
.
NOTA NOTA
522
Adicionando mais funcionalidades ao Office
Parte III
21_047026 ch15.qxp 02\/04\/07 22:06 pgina 522
Voc pode comear criando uma tabela para armazenar o cdigo XML da faixa de opes, ou criar o cdigo XML em primeiro lugar, como voc
preferem. Se voc tem apenas uma tabela de cdigo da faixa de opes, a Conveno cham-lo DbRibbons, com o
USys prefixo indicando que uma tabela de sistema criados pelo usurio. A tabela possui trs campos, conforme descrito
na tabela 15.2.
TABELA 15.2
A tabela DbRibbons
Nome do campo Tipo de dados Uso
ID AutoNumerao Campo de ID exclusivo
RibbonName Texto, 255 Nome da faixa de opes personalizada
RibbonXML Memo O cdigo XML com as configuraes de faixa de opes
523
Personalizar a faixa de opes com XML em bancos de dados Access e suplementos
15
Visualizar a tabela DbRibbons
T
tabela DbRibbons de He uma tabela de sistema, assim voc no vai v-lo, a menos que voc ligue o ecr do sistema
tabelas, abrindo a tela de opes de acesso do menu do Office:
Abrir a tela de opes do Access.
continuou
21_047026 ch15.qxp 02\/04\/07 22:06 pgina 523
524
Adicionando mais funcionalidades ao Office
Parte III
continuou
Selecione a pgina de banco de dados atual e clique no boto Opes de navegao:
Abrindo a caixa de dilogo opes de navegao.
Na caixa de dilogo opes de navegao, marque a caixa de seleo \"Mostrar objetos do sistema\":
Transformando-se em exposio de objetos de sistema na caixa de dilogo opes de navegao.
21_047026 ch15.qxp 02\/04\/07 22:06 pgina 524
525
Personalizar a faixa de opes com XML em bancos de dados Access e suplementos
15
A captura de tela a seguir mostra a tabela DbRibbons no modo folha de dados, com o registro para o
ListFields fita visvel:
A USysDBRibbons tabela no modo folha de dados.
Para mais exaustiva cobertura de XML, consulte XML de Wrox incio.
REFERNCIA CRUZADA REFERNCIA CRUZADA
Embora voc possa editar o cdigo XML diretamente na tabela DbRibbons acesso (use Ctrl + Enter para
ir para uma nova linha), muito mais fcil trabalhar com ele em um editor de XML, como no VB 2005
(padro ou expressa), ou a utilidade de XML Notepad 2007. Figura 15.4 mostra que o mesmo cdigo
olha como no editor de XML Notepad 2007, depois de abrir o cdigo salvo como Ribbon.
IntelliSense no funciona para o cdigo de acesso da faixa de opes XML no Visual Basic 2005 Express, mas
Ela funciona no Visual Studio 2005.
muito mais fcil trabalhar com cdigo XML no XML Notepad 2007 ou o Visual Studio 2005 edi-
Tor. No editor de XML Notepad 2007, voc tem um painel de TreeView a esquerda, e cada atributo
mostrado com seu valor correspondente no painel da direita; no editor do Visual Studio 2005, os componentes
so codificados por cores e voc tem IntelliSense para auxiliar na criao de cdigo. Suporte correspondente (consulte a
sombra <tabs> e <\/tabs> nomes na figura) tambm ajuda, caso voc comeou um entre colchetes
segmento de cdigo e esqueceu de acabar com ela. Para o cdigo XML no editor do Visual Studio 2005, as cores tm
os significados listados na tabela 15.3.
NOTA NOTA
21_047026 ch15.qxp 02\/04\/07 22:06 pgina 525
FIGURA 15.4
Cdigo XML no editor XML Notepad 2007.
TABELA 15.3
Cdigo de cores para o cdigo XML no Editor XML VB 2005
Cor Componente de cdigo (s)
Vermelho Nome do atributo
Azul Valor do atributo
Delimitador
Palavra-chave
Verde Comentrio
Brown Nome
Cinza Tag doc
Instruo de processamento
Preto Texto
Aqua Palavra-chave do XSLT
526
Adicionando mais funcionalidades ao Office
Parte III
21_047026 ch15.qxp 02\/04\/07 22:06 pgina 526
Para que documentos XML ser capaz de usar elementos e atributos que tm a
mesmo nome, mas vm de fontes diferentes, deve haver uma maneira de diferenciar
entre as vrias fontes de elementos de marcao. Em XML, um namespace uma coleo de nomes, identi-
cados por uma referncia de URL, que so usados como tipos de elemento e atributo nomes em documentos XML.
O cdigo XML comea com especificando o namespace como http:\/\/schemas.Microsoft.com\/
escritrio\/2006\/01\/customui . Este o namespace XML apenas usado para faixas de opes do Office 2007.
Em seguida, a faixa de opes startFromScratch atributo est definido como \"false\" (para programadores VBA, observe que
no cdigo XML, a sintaxe \"falsa\", com as citaes, no apenas falsa, como no cdigo VBA). Essa configurao
significa que voc est modificando a barra de ferramentas padro, em vez de criar uma faixa de opes do zero.
As prximas sees mostram como personalizar a faixa de opes de vrias maneiras.
Adicionando uma nova guia, grupo e controles da faixa de opes
Para criar uma guia personalizada para a faixa de opes, na seo <tabs>do cdigo XML, adicionar uma linha de guia
e definir seus atributos id e label, conforme desejado. O ID atributo um identificador exclusivo para um personalizado
Fita de controle que pode ser usado em outro lugar no cdigo XML para fazer referncia a guia, e o rtulo attrib-
Ute definido com a legenda texto para exibir a guia definir atributo de visvel na aba \"true\" para dis -
jog-lo. Em seguida, crie um ou mais grupos para o guia personalizada, definindo seus atributos id e etiqueta
com os nomes e as legendas dos grupos. Finalmente, adicione um ou mais controles para um grupo (ou vrios
grupos) na guia; para o exemplo de cdigo XML que criei dois botes, cada um deles executa um retorno de chamada
funo.
Consulte a que tabela 15.1 para obter uma lista dos mais comumente utilizados elementos para a criao de guias, grupos,
e controles da faixa de opes.
Controles (minimamente) possuem atributos id e label e tambm um habilitado atributo (geralmente, definido como
\"verdadeiro\" ). Eles geralmente exibem uma imagem, que normalmente definida com imageMso argumento, usando um
valor correspondente ao boto de fita padro que tem a imagem que voc deseja exibir.
Voc no pode remover um controle de um grupo de faixa de opes padro, ou adicionar um controle a um stan-
Grupo de dard; consulte que a barra lateral no incio deste captulo para Patrick Schmid do iluminando com-
mentary sobre esta questo. Para justificao da Microsoft desta poltica, consulte o Viso geral de desenvolvedor do
Interface de usurio para o 2007 Microsoft Office System artigo (
http:\/\/msdn2.Microsoft.com\/
en-us\/library\/aa338198.aspx
). Ele se resume a algo como \"ns fizemos a fita perfeita,
assim os usurios no precisam personaliz-lo.\" Escusado ser dizer, eu (e muitos outros desenvolvedores e usurios avanados)
discordo. A fita de fato uma grande melhoria sobre menus e barras de comandos, mas eu realmente
gostaria de ser capaz de arrastar um boto que eu preciso para um grupo padro ou remover um que eu nunca uso.
Para usar a imagem de formulrio em um controle personalizado, use \"CreateForm\" como o valor do argumento imageMso
ao definir o boto em cdigo XML.
Atributo de tamanho do controle tem apenas duas selees: \"grande\" e \"normal\". Por fim, para um comando
boto, defina o atributo onAction com o nome de uma funo a ser executada quando o boto clicado.
NOTA NOTA
REFERNCIA CRUZADA REFERNCIA CRUZADA
NOTA NOTA
527
Personalizar a faixa de opes com XML em bancos de dados Access e suplementos
15
21_047026 ch15.qxp 02\/04\/07 22:06 pgina 527
Removendo um guia ou grupo de faixa de opes
Para remover um dos guias padro ou grupos da faixa de opes (na realidade, voc se escondem, no
exclu-lo), defina o atributo visvel como \"false\", usando idMso em vez de id para indicar que voc est ref-
erencing um guia de fita interna ou grupo. A seguinte linha de cdigo XML desliga-se o padro
Crie guia:
<tab idMso=\"TabCreate\" visible=\"false\"\/>
528
Adicionando mais funcionalidades ao Office
Parte III
Encontrar nomes de controle para uso no cdigo XML
EU
f voc deseja atribuir uma imagem familiar do acesso a um boto na faixa de opes, voc precisa saber o
nome do controle de acesso padro que usa essa imagem, portanto, voc pode definir o
imageMso
argumento
para o boto com esse nome. Voc pode baixar uma planilha do Excel (AccessRibbonControls.xls) com
Esta informao do
http:\/\/www.Microsoft.com\/downloads\/details.aspx?FamilyId=
4329d9e9-4d11-46a5-898d-23e4f331e9ae
no site da Microsoft.
Mesmo embora o Office 2007 foi lanado, as ltimas planilhas de nomes de controle
foram preparados durante o beta (novembro de 2006), e eles no so totalmente precisos
para a verso de acesso, especialmente para nomes de guia. Esperemos que um conjunto atualizado de planilhas
ser publicado em breve.
No entanto, h um outro, mais conveniente mtodo que funciona bem para muitos controles: aberto o
Acessar a tela de opes de menu do Office e clique na pgina de personalizao. Esta pgina
destina-se para personalizar a barra de ferramentas de acesso rpido, mas tambm muito til para encontrar-se fora de controle
nomes para uso em cdigo XML. Para localizar um nome de controle, primeiro selecione o guia da faixa de opes de escolha\"
comando de\"na lista suspensa e, em seguida, selecione o controle na lista. Como voc passa o mouse sobre o
controle, seu nome aparece entre parnteses aps o nome amigvel:
Obtendo o nome do controle para uso em atribuir uma imagem para um controle na faixa de opes.
CUIDADO CUIDADO
21_047026 ch15.qxp 02\/04\/07 22:06 Page 528
Para remover uma guia interna ou grupo de faixa de opes, voc precisa saber seu nome. O
AccessRibbonControls.xls planilha til para encontrar os nomes dos guias ou grupos: apenas classificar o
planilha por tipo de controle e olhar para as linhas de guia ou de grupo. Para economizar tempo, os nomes de stan-
guias de dard esto listados na tabela 15.4.
TABELA 15.4
Acesso interno da fita guia nomes
TabAddIns TabPivotChartDesign
TabAdpDiagramDesign TabPivotTableDesign
TabAdpFunctionAndViewToolsDesign TabPrintPreviewAccess
TabAdpSqlStatementDesign TabQueryToolsDesign
TabAdpStoredProcedureToolsDesign TabRelationshipToolsDesign
TabControlLayout TabReportToolsAlignment
Guiacriar TabReportToolsDesign
TabDatabaseTools TabReportToolsFormatting
TabExternalData TabReportToolsLayout
TabFormToolsDesign TabReportToolsPageSetupDesign
TabFormToolsFormatting TabReportToolsPageSetupLayout
TabFormToolsLayout TabSourceControl
TabHomeAccess TabTableToolsDatasheet
TabMacroToolsDesign TabTableToolsDesignAccess
Tabela 15.5 listas os nomes de grupo padro.
TABELA 15.5
Nomes de grupo de fita de acesso interno
FileManageMenu GroupAdpOutputOperations
FilePrintMenu GroupAdpQueryTools
FileSaveAsMenuAccess GroupAdpQueryType
FileServerMenu GroupAdpSqlStatementDesignTools
GroupAdminister GroupAnalyze
GroupAdpDiagramLayout GroupAutoFormatAccess
GroupAdpDiagramShowHide GroupClipboard
continuou
529
Personalizar a faixa de opes com XML em bancos de dados Access e suplementos
15
21_047026 ch15.qxp 02\/04\/07 22:06 pgina 529
TABELA 15.5 (continuao)
GroupCollectData GroupMacro
GroupControlAlignment GroupMacroClose
GroupControlAlignmentLayout GroupMacroRows
GroupControlPositionLayout GroupMacroShowHide
GroupControlsAccess GroupMacroTools
GroupControlSize GroupMarginsAndPadding
GroupCreateForms GroupMarginsAndPaddingControlLayout
GroupCreateOther GroupMoveData
GroupCreateReports GroupPageLayoutAccess
GroupCreateTables GroupPivotChartActiveFieldAccess
GroupDatabaseSourceControl GroupPivotChartDataAccess
GroupDatabaseTools GroupPivotChartFilterAndSort
GroupDatasheetRelationships GroupPivotChartShowHide
GroupDataTypeAndFormatting GroupPivotChartTools
GroupDesignGridlines GroupPivotTableActiveFieldAccess
GroupExport GroupPivotTableDataAccess
GroupFieldsAndColumns GroupPivotTableFilterAndSort
GroupFieldsTools GroupPivotTableSelections
GroupFindAccess GroupPivotTableShowHideAccess
GroupFontAccess GroupPivotTableToolsAccess
GroupFormatting GroupPosition
GroupFormattingControls GroupPositionLayout
GroupFormattingGridlines GroupPrintPreviewClosePreview
GroupGroupingAndTotals GroupPrintPreviewData
GroupImport GroupPrintPreviewPrintAccess
GroupLayoutShowHide
530
Adicionando mais funcionalidades ao Office
Parte III
21_047026 ch15.qxp 02\/04\/07 22:06 pgina 530
Tabela 15.6 lista os nomes de controle padro.
TABELA 15.6
Nomes de controle do acesso interno da fita
531
Personalizar a faixa de opes com XML em bancos de dados Access e suplementos
15
AccessRelinkLists
AddInsMenu
AdpConstraints
AdpDiagramAddRelatedTables
AdpDiagramAddTable
AdpDiagramArrangeSelection
AdpDiagramArrangeTables
AdpDiagramAutosizeSelectedTables
AdpDiagramColumnNames
AdpDiagramColumnProperties
AdpDiagramCustomView
AdpDiagramDeleteTable
AdpDiagramHideTable
AdpDiagramIndexesKeys
AdpDiagramKeys
AdpDiagramModifyCustomView
AdpDiagramNameOnly
AdpDiagramNewLabel
AdpDiagramNewTable
AdpDiagramRecalculatePageBreaks
AdpDiagramRelationships
AdpDiagramShowRelationshipLabels
AdpDiagramTableModesMenu
AdpDiagramViewPageBreaks
AdpManageIndexes
AdpOutputOperationsAddToOutput
AdpOutputOperationsGroupBy
AdpOutputOperationsSortAscending
AdpOutputOperationsSortDescending
AdpOutputOperationsTableRemove
AdpPrimaryKey
AdpStoredProcedureEditSql
AdpStoredProcedureQueryAppend
AdpStoredProcedureQueryAppendValues
AdpStoredProcedureQueryDelete
AdpStoredProcedureQueryMakeTable
AdpStoredProcedureQuerySelect
AdpStoredProcedureQueryUpdate
AdpVerifySqlSyntax
AdpViewDiagramPane
AdpViewGridPane
AdpViewSqlPane
AdvertisePublishAs
AlignCenter
AlignLeft
AlignLeftToRightMenu
AlignRight
ApplyCommaFormat
ApplyCurrencyFormat
AplicarFiltro
ApplyPercentageFormat
AutoFormatGallery
AutoFormatWizard
AutoSumAverage
AutoSumCount
AutoSumMax
continuou
21_047026 ch15.qxp 02\/04\/07 22:06 pgina 531
AutoSumMin
Bold (realce)
Balas
BusinessFormWizard
CacheListData
ClearGrid
ClearMenuAccess
CloseDocument
ColumnWidth
ComAddInsDialog
ControlActiveX
ControlAlignToGrid
ControlAttachment
ControlBoundObjectFrame
ControlChart
ControlImage
ControlLayoutRemove
ControlLayoutStacked
ControlLayoutTabular
ControlLine
ControlLineColorPicker
ControlLineThicknessGallery
ControlLineTypeGallery
ControlLogo
ControlMarginsGallery
ControlPaddingGallery
ControlPage
ControlRectangle
ControlSetControlDefaults
ControlSnapToGrid
ControlSpecialEffectChiseled
ControlSpecialEffectEtched
ControlSpecialEffectFlat
532
Adicionando mais funcionalidades ao Office
Parte III
ControlSpecialEffectMenu
ControlSpecialEffectRaised
ControlSpecialEffectShadowed
ControlSpecialEffectSunken
ControlSubFormReport
ControlTabControl
ControlTitle
ControlToggleButton
ControlUnboundObjectFrame
ControlWizards
ConvertDatabaseFormat
Cpia
CreateClassModule
CreateDiagram
CreateEmail
CreateForm
CreateFormBlankForm
CreateFormInDesignView
CreateFormMoreFormsGallery
CreateFormPivotChart
CreateFormSplitForm
CreateFormWithMultipleItems
CreateLabels
CreateMacro
CreateModule
CreateOtherObjectsMenu
CreateQueryFromWizard
CreateQueryInDesignView
CreateReport
CreateReportBlankReport
CreateReportFromWizard
CreateReportInDesignView
CreateShortcutMenuFromMacro
TABELA 15.6 (continuao)
21_047026 ch15.qxp 02\/04\/07 22:06 pgina 532
533
Personalizar a faixa de opes com XML em bancos de dados Access e suplementos
15
CreateStoredProcedure
CreateTable
CreateTableInDesignView
CreateTableTemplatesGallery
CreateTableUsingSharePointListsGallery
CustomizeHide
Corte
DatabaseAccessBackEnd
DatabaseAnalyzePerformance
DatabaseAnalyzeTable
DatabaseCopyDatabaseFile
DatabaseDocumenter
DatabaseEncodeDecode
DatabaseLinedTableManager
DatabaseMakeMdeFile
DatabaseMoveToSharePoint
DatabaseObjectDependencies
DatabasePartialReplica
DatabasePermissions
DatabasePermissionsMenu
DatabaseRelationships
DatabaseSetLogonSecurity
DatabaseSqlServer
DatabaseSwitchboardManager
DatabaseUserAndGroupAccounts
DatabaseUserLevelSecurityWizard
DataRefreshAll
DatasheetColumnDelete
DatasheetColumnLookup
DatasheetColumnRename
DatasheetNewField
DateAndTimeInsert
DefaultView
Excluir
DeleteTab
DrillInto
DrillOut
ExportAccess
ExportDBase
ExportExcel
ExportHtmlDocument
ExportLotus
ExportMoreMenu
ExportOdbcDatabase
ExportParadox
ExportSavedExports
ExportSharePointList
ExportSnapshot
ExportTextFile
ExportWord
ExportXmlFile
Lista de campos
FileBackupDatabase
FileBackUpSqlDatabase
FileCloseDatabase
FileCompactAndRepairDatabase
FileDatabaseProperties
FileDropSqlDatabase
FileManageMenu
FileNewDatabase
FileOpenDatabase
FilePackageAndSign
FilePrintMenu
FicheiroPr
FilePrintQuick
FilePublishToSharePoint
continuou
21_047026 ch15.qxp 02\/04\/07 22:06 Page 533
534
Adicionando mais funcionalidades ao Office
Parte III
FileSave
FileSaveAs
FileSaveAsAccess2000
FileSaveAsAccess2002_2003
FileSaveAsAccess2007
FileSaveAsMenuAccess
FileSaveAsPdfOrXps
FileSendAsAttachment
FileServerLinkTables
FileServerMenu
FileServerTransferDatabase
FilterAdvancedByForm
FilterAdvancedMenu
FilterAfterSelection
FilterBeforeSelection
FilterBeginsWithSelection
FilterBetween
FilterBySelection
FilterClearAllFilters
FilterContainsSelection
FilterDoesNotBeginsWithSelection
FilterDoesNotContainSelection
FilterDoesNotEndWithSelection
FilterEndsWithSelection
FilterEqualsSelection
FilterExcludingSelection
FilterIsNotSelected
FilterIsSelected
FilterLargerThanSelection
FilterNotEqualsSelection
FilterSmallerThanSelection
FiltersMenu
FilterToggleFilter
FindDialog
FindNext
First10RecordsPreview
Fonte
FontAlternateFillBackColorPicker
FontColorPicker
FontConditionalFormatting
FontFillBackColorPicker
FontSize
FormatCellsDialog
FormatPainter
FormattingDataType
FormattingDecreaseDecimals
FormattingFormat
FormattingIncreaseDecimals
FormattingRequiredField
FormattingUnique
FormControlButton
FormControlCheckBox
FormControlComboBox
FormControlEditBox
FormControlGroupBox
FormControlLabel
FormControlListBox
FormControlRadioButton
FormHeaderOrFooterShowHide
GoToMenuAccess
GoToNewRecord
GridlinesColorPicker
GridlinesGallery
GridlinesStyleGallery
GridlinesWidthGallery
GridShowHide
TABELA 15.6 (continuao)
21_047026 ch15.qxp 02\/04\/07 22:06 pgina 534
535
Personalizar a faixa de opes com XML em bancos de dados Access e suplementos
15
GroupAddInsCustomToolbars
GroupAddInsMenuCommands
GroupAddInsToolbarCommands
GroupAdminister
GroupAdpDiagramLayout
GroupAdpDiagramShowHide
GroupAdpOutputOperations
GroupAdpQueryTools
GroupAdpQueryType
GroupAdpSqlStatementDesignTools
GroupAnalyze
GroupAutoFormatAccess
GroupClipboard
GroupCollectData
GroupControlAlignment
GroupControlAlignmentLayout
GroupControlPositionLayout
GroupControlsAccess
GroupControlSize
GroupCreateForms
GroupCreateOther
GroupCreateReports
GroupCreateTables
GroupDatabaseSourceControl
GroupDatabaseTools
GroupDatasheetRelationships
GroupDataTypeAndFormatting
GroupDesignGridlines
GroupExport
GroupFieldsAndColumns
GroupFieldsTools
GroupFontAccess
GroupFormatting
GroupFormattingControls
GroupFormattingGridlines
GroupGroupingAndTotals
GroupImport
Agrupamento
GroupLayoutShowHide
GroupMacro
GroupMacroClose
GroupMacroRows
GroupMacroShowHide
GroupMacroTools
GroupMarginsAndPadding
GroupMarginsAndPaddingControlLayout
GroupMoveData
GroupPageLayoutAccess
GroupPivotChartActiveFieldAccess
GroupPivotChartDataAccess
GroupPivotChartFilterAndSort
GroupPivotChartShowHide
GroupPivotChartTools
GroupPivotChartType
GroupPivotTableActiveFieldAccess
GroupPivotTableDataAccess
GroupPivotTableFilterAndSort
GroupPivotTableSelections
GroupPivotTableShowHideAccess
GroupPivotTableToolsAccess
GroupPosition
GroupPositionLayout
GroupPrintPreviewClosePreview
GroupPrintPreviewData
GroupPrintPreviewPrintAccess
GroupQueryClose
continuou
21_047026 ch15.qxp 02\/04\/07 22:06 pgina 535
536
Adicionando mais funcionalidades ao Office
Parte III
GroupQueryResults
GroupQuerySetup
GroupQueryShowHide
GroupQueryType
GroupRecords
GroupRelationships
GroupRelationshipsTools
GroupRichText
GroupSchemaTools
GroupSharePointList
GroupSharepointLists
GroupSizeAndPosition
GroupSortAndFilter
GroupSourceControlManage
GroupSourceControlShow
GroupTableDesignShowHide
GroupTableDesignTools
GroupTextFormatting
GroupToolsAccess
GroupViews
GroupViewsShowHide
GroupWindowAccess
GroupZoom
HeaderFooterPageNumberInsert
HideDetails
HorizontalSpacingDecrease
HorizontalSpacingIncrease
HorizontalSpacingMakeEqual
Hiperlinkinserir
ImportAccess
ImportDBase
ImportExcel
ImportHtmlDocument
ImportLotus
ImportMoreMenu
ImportOdbcDatabase
ImportOutlook
ImportParadox
ImportSavedImports
ImportSharePointList
ImportTextFile
ImportXmlFile
IndentDecrease
IndentIncrease
Itlico
LabelFontDialog
LoadFromQuery
MacroArguments
MacroConditions
MacroConvertMacrosToVisualBasic
MacroNames
MacroRun
MacroShowAllActions
MacroSingleStep
MailMergeGoToFirstRecord
MailMergeGoToNextRecord
MailMergeGoToPreviousRecord
MailMergeGotToLastRecord
ManageReplies
MasterViewClose
MenuPublish
MergeToWord
Numerao
ObjectBringToFront
ObjectGallery
ObjectsAlignBottom
TABELA 15.6 (continuao)
21_047026 ch15.qxp 02\/04\/07 22:06 pgina 536
537
Personalizar a faixa de opes com XML em bancos de dados Access e suplementos
15
ObjectsAlignLeft
ObjectsAlignRight
ObjectsAlignTop
ObjectSendToBack
ObjectsGroup
ObjectsSelect
ObjectsUngroup
OleDdeLinks
PageBreakInsertOrRemove
PageHeaderOrFooterShowHide
PageMarginsGallery
PageOrientationLandscape
PageOrientationPortrait
PageSetupDialog
PageSizeGallery
Colar
PasteAppend
PasteDuplicate
PasteSpecial
PasteSpecialDialog
PivotAutoCalcAverage
PivotAutoCalcCount
PivotAutoCalcMax
PivotAutoCalcMenu
PivotAutoCalcMin
PivotAutoCalcStandardDeviation
PivotAutoCalcStandardDeviationPopulation
PivotAutoCalcSum
PivotAutoCalcVariance
PivotAutoCalcVariancePopulation
PivotAutoFilter
PivotChartLegendShowHide
PivotChartMultiplePlots
PivotChartMultipleUnified
PivotChartSortByTotalAscending
PivotChartSortByTotalDescending
PivotChartSortByTotalMenu
PivotChartType
PivotClearCustomOrdering
PivotCollapseFieldAccess
PivotCollapseFieldAccess
PivotCreateCalculatedTotal
PivotCreateCalulatedField
PivotDropAreas
PivotExpandField
PivotExpandIndicators
PivotExportToExcel
PivotFieldList
PivotFilterBySelection
PivotFormulasMenu
PivotGroupItems
PivotHideDetails
PivotMoveField
PivotMoveToColumnArea
PivotMoveToDetailArea
PivotMoveToFieldArea
PivotMoveToFilterArea
PivotRefresh
PivotRemoveField
PivotShowAll
PivotShowAsMenu
PivotShowAsNormal
PivotShowAsPercentOfColumnTotal
PivotShowAsPercentOfGrandTotal
PivotShowAsPercentOfParentColumnItem
PivotShowAsPercentOfParentRowItem
continuou
21_047026 ch15.qxp 02\/04\/07 22:06 pgina 537
538
Adicionando mais funcionalidades ao Office
Parte III
PivotShowAsPercentOfRowTotal
PivotShowDetails
PivotShowOnlyTheBottomMenu
PivotShowOnlyTheTopMenu
PivotShowTopAndBottomItemsMenu
PivotSubtotal
PivotSwitchRowColumn
PivotUngroupItems
PositionAnchoringGallery
PositionFitToWindow
PostcardWizard
PrintColumns faz um
PrintDataOnly
PrintDialogAccess
PrintPreviewClose
PrintPreviewEightPages
PrintPreviewFourPages
PrintPreviewMultiplePagesMenu
PrintPreviewTwelvePages
PrintPreviewZoom10
PrintPreviewZoom1000
PrintPreviewZoom150
PrintPreviewZoom200
PrintPreviewZoom25
PrintPreviewZoom50
PrintPreviewZoom500
PrintPreviewZoom75
PrintPreviewZoomMenu
PrintPreviewZoomTwoPages
PropertySheet
PublishToPdfOrEdoc
QueryAppend
QueryBuilder
QueryCrosstab
QueryDataDefinition
QueryDelete
QueryInsertColumn
QueryInsertColumns
QueryMakeTable
QueryParameters
QueryReturnGallery
QueryRunQuery
QuerySelectQueryType
QueryShowTable
QuerySqlPassThroughQuery
QueryTableNamesShowHide
QueryTotalsShowHide
QueryUnionQuery
QueryUpdate
QuickAccessToolbarCustomization
RecordsAddFromOutlook
RecordsCollapseAllSubdatasheets
RecordsDeleteColumn
RecordsDeleteRecord
RecordsExpandAllSubdatasheets
RecordsFreezeColumns
RecordsHideColumns
RecordsInsertSubdatasheet
RecordsMoreRecordsMenu
RecordsRefreshMenu
RecordsRefreshRecords
RecordsRemoveSubdatasheet
RecordsSaveAsOutlookContact
RecordsSaveRecord
RecordsSubdatasheetMenu
RecordsTotals
TABELA 15.6 (continuao)
21_047026 ch15.qxp 02\/04\/07 22:06 pgina 538
539
Personalizar a faixa de opes com XML em bancos de dados Access e suplementos
15
RecordsUnfreeze
RecordsUnhideColumns
Refazer
RelationshipDesignAllRelationships
RelationshipsClearLayout
RelationshipsDirectRelationships
RelationshipsEditRelationships
RelationshipsHideTable
RelationshipsReport
ReplaceDialog
ReplicationCreateReplica
ReplicationOptionsMenu
ReplicationRecoverDesignMaster
ReplicationResolveConflicts
ReplicationSynchronizeNow
Reverter
RowHeight
RulerShowHide
SaveAsQuery
SaveObjectAs
SelectAllAccess
SelectAllRecords
SelectMenuAccess
SelectRecord
ServerConnection
ServerFilterApply
FiltroDoServidorPorFormulrio
Propriedades
ServerRestoreSqlDatabase
SetDatabasePassword
SharePointListsDiscardAllChanges
SharePointListsDiscardAllChangesAndRefresh
SharePointListsDiscardChangesMenu
SharePointListsWorkOffline
ShowClipboard
ShowMargins
SizeToFit
SizeToFitAccess
SizeToGridAccess
SizeToNarrowest
SizeToShortest
SizeToTallest
SizeToWidest
SortAndFilterAdvanced
SortDown
SortRemoveAllSorts
SortSelectionMenu
SortUp
SourceControlAddDatabase
SourceControlAddObjects
SourceControlCheckIn
SourceControlCheckOut
SourceControlCreateDatabaseFromProject
SourceControlGetLatestVersion
SourceControlOptions
SourceControlProperties
SourceControlRefreshStatus
SourceControlRun
SourceControlShareObjects
SourceControlShowDifferences
SourceControlShowHistory
SourceControlUndoCheckOut
SpellingAccess
SubformInNewWindow
SubformMenu
SynchronizeData
continuou
21_047026 ch15.qxp 02\/04\/07 22:06 pgina 539
540
Adicionando mais funcionalidades ao Office
Parte III
TabAddIns
TabAdpDiagramDesign
TabAdpFunctionAndViewToolsDesign
TabAdpSqlStatementDesign
TabAdpStoredProcedureToolsDesign
TabControlLayout
Guiacriar
TabDatabaseTools
TabExternalData
TabFormToolsDesign
TabFormToolsFormatting
TabFormToolsLayout
TabHomeAccess
TableColumnsDelete
TableDesign
TableIndexes
TableListAlertMe
TableListPermissions
TableRowsDelete
TableRowsInsertWord
TableSharePointListsModifyColumnsAndSettings
TableSharePointListsModifyWorkflow
TableSharePointListsRefreshList
TableTestValidationRules
TabMacroToolsDesign
TabOrder
TabPivotChartDesign
TabPivotTableDesign
TabPrintPreviewAccess
TabQueryToolsDesign
TabRelationshipToolsDesign
TabReportToolsAlignment
TabReportToolsDesign
TabReportToolsFormatting
TabReportToolsLayout
TabReportToolsPageSetupDesign
TabReportToolsPageSetupLayout
TabSetAdpDiagram
TabSetAdpFunctionAndViewTools
TabSetAdpSqlStatement
TabSetAdpStoredProcedure
TabSetFormReportExtensibility
TabSetFormTools
TabSetFormToolsLayout
TabSetMacroTools
TabSetPivotChartAccess
TabSetPivotTableAccess
TabSetQueryTools
TabSetRelationshipTools
TabSetReportTools
TabSetReportToolsLayout
TabSetTableToolsDatasheet
TabSetTableToolsDesign
TabSourceControl
TabTableToolsDatasheet
TabTableToolsDesignAccess
TextDirectionLeftToRight
TextDirectionRightToLeft
TextHighlightColorPicker
TotalsCountRecords
TotalsMenu
TotalsStandardDeviation
TotalsSum
TotalsVariance
Sublinhado
Desfazer
TABELA 15.6 (continuao)
21_047026 ch15.qxp 02\/04\/07 22:06 pgina 540
541
Personalizar a faixa de opes com XML em bancos de dados Access e suplementos
15
VerticalSpacingDecrease
VerticalSpacingIncrease
VerticalSpacingMakeEqual
ViewMessageBar
ViewsAdpDiagramPrintPreview
ViewsAdpDiagramSqlView
ViewsDatasheetView
ViewsDesignView
ViewsFormView
ViewsLayoutView
ViewsModeMenu
ViewsModeMenu
ViewsPivotChartView
ViewsPivotChartView
ViewsPivotTableView
ViewsReportView
ViewsSwitchToDefaultView
ViewVisualBasicCodeAccess
VisualBasic
WindowMoreWindowsDialog
WindowNameGoesHere
WindowsArrangeIcons
WindowsCascade
WindowsDataEntry
WindowSplit
WindowsSwitch
WindowsTileHorizontally
WindowsTileVertically
WindowUnhide
Zoom100
ZoomFitToWindow
ZoomOnePage
ZoomPrintPreviewExcel
O cdigo XML listado avanar (o nome da faixa de opes desvio) desativa a guia pgina inicial padro, e
Remove o grupo de exportao da guia dados externos:
< customUI xmlns =
\"http:\/\/schemas.microsoft.com\/office\/2006\/01\/customui\" >
<ribbon startFromScratch=\"false\">
<tabs>
< guia idMso = \"TabHomeAccess\"
visvel = \"false\" >
<\/tab>
< guia idMso = \"TabExternalData\"
visvel = \"true\" >
< Grupo idMso = \"GroupExport\"
visvel = \"false\" >
<\/group>
<\/tab>
<\/tabs>
<\/ribbon>
<\/customUI>
Para ver isto (ou qualquer) faixa de opes personalizada em um banco de dados do Access, voc precisar selecion-lo em
o \"Nome da faixa de opes\"-lista suspensa na caixa de dilogo Opes do Access, como mostrado na Figura 15.8.
NOTA NOTA
21_047026 ch15.qxp 02\/04\/07 22:06 pgina 541
Figura 15.5 mostra a guia dados externos, sem o grupo de exportao.
FIGURA 15.5
Na guia dados externos sem o grupo de exportao.
Cdigo VBA
Para abrir a caixa de dilogo referncias, selecione referncias no menu ferramentas no Visual Basic
janela.
Para executar comandos de controles na sua faixa de opes personalizada, voc precisa escrever um procedimento de retorno de chamada
para cada boto de comando da faixa de opes. Em primeiro lugar, definir uma referncia biblioteca de objeto do Office 12.0 na
Referncias de dilogo (Ver Figura 15.6); necessrio para oferecer suporte a vrios objetos relacionados faixa de opes no cdigo.
FIGURA 15.6
Definir uma referncia biblioteca de objeto do Office 12.0.
O banco de dados do teste da fita de amostra contm dois procedimentos para ser executado a partir de botes de fita a
Lista campos fita personalizada; Nota o Controle ByVal como IRibbonControl argumento, que
o procedimento para o controle de links:
Public Sub ListTableFields(ByVal control As IRibbonControl)
Em erro continuar prximo
DICA DICA
542
Adicionando mais funcionalidades ao Office
Parte III
21_047026 ch15.qxp 02\/04\/07 22:06 pgina 542
Em primeiro lugar, limpar os dados da tabela de nomes de tabela e campo velho:
strTable = \"zstblTableAndFieldNames\"
strReport = \"zsrptTableAndFieldNames\"
DoCmd.SetWarnings False
strSQL = \"DELETE * FROM\"
StrSQL DoCmd.RunSQL
Preencha a tabela com os nomes de tabela e campo, Iterando atravs da coleo TableDefs do banco de dados:
Conjunto dbs = CurrentDb
Set rst = dbs.OpenRecordset (strTable, dbOpenTable)
Para cada tdf em dbs.TableDefs
strTable = tdf.Nome
Se deixou (strTable, 4) <>\"MSys\", em seguida,
Conjunto flds = tdf.Campos
Para cada fld na flds
strFieldName = FLD.Nome
Com rst
.AddNew
!TableName = strTable
!FieldName = strFieldName
!DataType = FLD.Tipo
!ValidationRule = FLD.ValidationRule
!Necessrio = FLD.Necessrio
.Atualizao
Terminar com
Prxima fld
End If
Prxima tdf
RST.Fechar
DoCmd.OpenTable strTable
strTitle = \"Tabela cheia\"
strPrompt = \"Imprimir relatrio agora?\"
intReturn = MsgBox (strPrompt, vbQuestion + vbYesNo, _
strTitle)
Se intReturn = vbYes Then
strReport = \"zsrptTableAndFieldNames\"
DoCmd.OpenReport strReport
End If
ErrorHandlerExit:
Exit Sub
543
Personalizar a faixa de opes com XML em bancos de dados Access e suplementos
15
21_047026 ch15.qxp 02\/04\/07 22:06 Page 543
ErrorHandler:
MsgBox \"erro nenhum:\"
& ; Description: & err.Description
Resume ErrorHandlerExit
End Sub
Public Sub ListQueryFields(ByVal control As IRibbonControl)
Em erro continuar prximo
Dim strQueryName As String
Dim qdf como DAO.QueryDef
Em primeiro lugar, limpar dados da antiga tabela de nomes de campo e consulta:
strTable = \"zstblQueryAndFieldNames\"
strReport = \"zsrptQueryAndFieldNames\"
DoCmd.SetWarnings False
strSQL = \"DELETE * FROM\"
StrSQL DoCmd.RunSQL
Preencher a tabela com os nomes de campo e consulta, Iterando atravs da coleo QueryDefs do banco de dados
(somente consultas select tero seus campos listados):
Conjunto dbs = CurrentDb
Set rst = dbs.OpenRecordset (strTable, dbOpenTable)
Para cada qdf em dbs.QueryDefs
strQueryName = qdf.Nome
Debug. Print \"nome da consulta:\"
Se deixou (strQueryName, 4) <>\"MSys\", em seguida,
Conjunto flds = qdf.Campos
Para cada fld na flds
strFieldName = FLD.Nome
Com rst
.AddNew
!QueryName = strQueryName
!FieldName = strFieldName
!DataType = FLD.Tipo
!Necessrio = FLD.Necessrio
.Atualizao
Terminar com
Prxima fld
End If
Prxima qdf
RST.Fechar
DoCmd.OpenTable strTable
14
Adicionando mais funcionalidades ao Office
Parte III
21_047026 ch15.qxp 02\/04\/07 22:06 pgina 544
strTitle = \"Tabela cheia\"
strPrompt = \"Imprimir relatrio agora?\"
intReturn = MsgBox (strPrompt, vbQuestion + vbYesNo, _
strTitle)
Se intReturn = vbYes Then
strReport = \"zsrptTableAndFieldNames\"
DoCmd.OpenReport strReport
End If
ErrorHandlerExit:
Exit Sub
ErrorHandler:
MsgBox \"erro nenhum:\"
& ; Description: & err.Description
Resume ErrorHandlerExit
End Sub
Depois de ter criado o cdigo XML e armazenado na tabela DbRibbons e escritos de qualquer
necessrios procedimentos de retorno de chamada para executar a partir do comando botes na faixa de opes, voc precisa fechar o
banco de dados e reabri-lo, para carregar o Ribbon(s) personalizado. Ento voc tem que selecionar a faixa de opes voc
quer usar o banco de dados, conforme descrito aqui:
1. Feche o banco de dados e, em seguida, reabri-lo.
2. Clique no boto Office e, em seguida, no boto de opes de acesso (Figura 15.7).
FIGURA 15.7
Abrir a tela de opes do Access.
545
Personalizar a faixa de opes com XML em bancos de dados Access e suplementos
15
21_047026 ch15.qxp 02\/04\/07 22:06 pgina 545
3. Selecione a pgina de banco de dados atual e selecione a faixa de opes que voc deseja carregar da faixa de opes
Nome-lista suspensa, como mostrado na Figura 15.8.
FIGURA 15.8
Selecionar a faixa de opes para carregar em um banco de dados.
4. Feche o banco de dados e reabri-lo, e, como na Figura 15.9, agora voc deve ver a faixa de opes
personalizao.
FIGURA 15.9
Na guia Opes de listagem criada pela faixa de opes personalizada ListFields.
546
Adicionando mais funcionalidades ao Office
Parte III
21_047026 ch15.qxp 02\/04\/07 22:06 pgina 546
5. Para carregar uma outra fita, seleccione-o da lista suspensa nome de fita e feche e
reabra o banco de dados.
Voc pode obter uma mensagem de erro como o mostrado na Figura 15.10 Quando reabrir um
banco de dados depois de criar ou editar cdigo XML. Observe a referncia de linha e coluna, que
deve ajudar a descobrir qual o problema, mesmo que a descrio do erro no ajuda muito.
s vezes to simples como um suporte de faltando.
FIGURA 15.10
Uma mensagem de erro informativas ao carregar cdigo de XML de personalizao da faixa de opes.
Fitas de forma
Voc tambm pode fazer a forma de fitas, substituir ou personalizar as fitas internas. A fita de teste
banco de dados tem um formulrio de exemplo da faixa de opes, AddButtons. Esta faixa de opes exibe um formulrio especfico, aps
selecionando-o na pgina de banco de dados atual da tela opes do Access e na Propriedade do formulrio
folha. O XML para a faixa de opes de AddButtons mostrado na Figura 15.11.
FIGURA 15.11
O cdigo XML para o personalizado AddButtons formar faixa de opes.
NOTA NOTA
547
Personalizar a faixa de opes com XML em bancos de dados Access e suplementos
15
21_047026 ch15.qxp 02\/04\/07 22:06 pgina 547
Este cdigo adiciona uma guia personalizada chamada guia de forma personalizada, com um nico grupo e dois comando mas-
toneladas. O boto de colar interno executado o comando de colar padro (se houver algo no
rea de transferncia para colar); o clique Me boto aparece uma caixa de mensagem simples. Para exibir um personalizado
Fita em um formulrio, voc precisa selecionar o nome da faixa de opes na Propriedade do formulrio RibbonName, como
mostrado na Figura 15.12.
FIGURA 15.12
Selecionar uma faixa de opes para um formulrio.
O guia mostrado na Figura 15.13.
548
Adicionando mais funcionalidades ao Office
Parte III
21_047026 ch15.qxp 02\/04\/07 22:06 pgina 548
FIGURA 15.13
Um formulrio de faixa de opes personalizada com dois botes e a caixa de mensagem apareceu pelo clique Me boto.
Personalizar a faixa de opes com um
Suplemento de acesso
Porque acesso Adicionar-ins (em verses anteriores do Access) no adicionar botes de barras de comando
(menus ou barras de ferramentas), voc no pode substituir o cdigo antigo referenciando CommandBars com novo cdigo referenc
o da faixa de opes. No entanto, voc pode substituir um conjunto de menu add-ins com um nico menu add-in para carregar
uma faixa de opes personalizada e coloque o resto do comandos do seu suplemento na faixa de opes. Por exemplo, eu
fiz uma verso minha extras 2007.accda suplemento (o banco de dados sample para captulo 14) e modificado
-ao carregar uma fita personalizada.
O banco de dados da biblioteca de amostra para esta seo accda Extras (fita),
Se voc est tentando instalar um suplemento no Access 2007 sendo executado no Windows Vista, voc
pode receber o aviso de segurana mostrado na Figura 15,14. Impem-se algumas tcnicas especiais
para obter a faixa de opes do Access add-ins para funcionar no Vista; consulte a barra lateral \"Recebendo seu Adicionar-ins para trabalho em Vista\"
para obter detalhes. Este no um problema ao instalar o add-ins para o Access 2007 em execuo no Windows XP.
CUIDADO CUIDADO
NOTA NOTA
549
Personalizar a faixa de opes com XML em bancos de dados Access e suplementos
15
21_047026 ch15.qxp 02\/04\/07 22:06 pgina 549
FIGURA 15,14
Um aviso de segurana ao tentar instalar um suplemento do Access para o Access 2007 em execuo no Windows
Vista.
Para mais informaes, consulte a Solutions(Wiley, 2007) segurana PC revista Windows Vista
sobre como lidar com questes de segurana do Vista.
No Windows Vista, funes de retorno de chamada no ser executado de botes de faixa de opes, a menos que voc incluir
o nome do banco de dados do suplemento de projeto antes do nome da funo, como tenho feito
Cdigo XML listado abaixo.
A tcnica para criar o XML da faixa de opes e armazenando-o em uma tabela o mesmo para um regular
Access 2007 banco de dados, conforme descrito na seo anterior. O banco de dados biblioteca de Extras (fita)
tem apenas um suplemento com trs registros na tabela USysRegInfo, carregar o ExtrasRibbon do
Tabela DbRibbons. Seu cdigo XML est listado em seguida:
< customUI
xmlns=\"http:\/\/schemas.Microsoft.com\/Office\/2006\/01\/customUI\" >
<ribbon startFromScratch=\"false\">
<tabs>
< id de tab = \"dbCustomTab\"
Label = \"Extras\"
visvel = \"true\" >
< group id = \"dbListingGroup\"
Label = \"Campos de listagem\" >
< id do boto = \"btnListTableFields\"
Label = \"Lista de campos da tabela\"
Enabled = \"true\"
imageMso = \"CreateTable\"
tamanho = \"normal\"
onAction=\"Extras(Ribbon).ListTableFields \"\/ >
< id do boto = \"btnListQueryFields\"
Label = \"Campos de consulta da lista\"
Enabled = \"true\"
imageMso = \"CreateQueryInDesignView\"
tamanho = \"normal\"
onAction=\"Extras(Ribbon).ListQueryFields \"\/ >
< id do boto = \"btnOpenOptionsDialog\"
Label = \"Selecionar opes\"
Enabled = \"true\"
imageMso = \"CreateFormBlankForm\"
tamanho = \"normal\"
onAction=\"Extras(Ribbon).ExtrasOptions \"\/ >
NOTA NOTA
REFERNCIA CRUZADA REFERNCIA CRUZADA
550
Adicionando mais funcionalidades ao Office
Parte III
21_047026 ch15.qxp 02\/04\/07 22:06 pgina 550
<\/group>
< group id = \"dbBackupGroup\"
Label = \"Backup de banco de dados\" >
< id do boto = \"btnBackupFrontEnd\"
Label = \"backup de banco de dados atual\"
Enabled = \"true\"
imageMso = \"Copiar\"
tamanho = \"normal\"
onAction=\"Extras(Ribbon).BackupFrontEndDB \"\/ >
< id do boto = \"btnBackupBackEnd\"
Label = \"fazer backup de banco de dados de back-end\"
Enabled = \"true\"
imageMso = \"Copiar\" size = \"normal\"
onAction=\"Extras(Ribbon).BackupBackEndDB \"\/ >
<\/group>
<\/tab>
<\/tabs>
<\/ribbon>
<\/customUI>
A tabela USysRegInfo com a guia de Extras o menu add-in records mostrada na Figura 15.15.
FIGURA 15.15
A tabela USysRegInfo com um conjunto de registros para um nico menu add-in.
551
Personalizar a faixa de opes com XML em bancos de dados Access e suplementos
15
Com o seu Add-ins para trabalho em Vista
B
omo de novos recursos de segurana do Vista, voc precisa ter mais alguns passos, ao criar e
instalar um suplemento do Access 2007 para obt-lo para instalar e funcionar no Vista. O primeiro passo executar o
Acesso como administrador. Boto direito do mouse o MSACCESS. exe.Arquivo EXE na subpasta Office 12 a
Pasta Microsoft Office e selecione \"executar como administrador\":
continuou
21_047026 ch15.qxp 02\/04\/07 22:06 pgina 551
O suplemento de Extras (fita) tem apenas um nico menu add-in: O guia de Extras, que executa um proce -
dure (listado em seguida) que copia a tabela DbRibbons chamado banco de dados e tenta carregar
a tabela.
552
Adicionando mais funcionalidades ao Office
Parte III
continuou
Figura SB-6. Executando o acesso como administrador
Abra o add-in da janela do Access, abra a tabela UsysRegInfo e (se necessrio) alterar o
capitalizao do \"Menu Add-ins\" para \"Menu Add-Ins\" (capitalizando o eu). Isso s necessrio para
executando o add-ins em Vista; \"Menu Add-ins\" funciona bem para Access 97 at 2003.
Tambm pode ser necessrio um passo extra: se seu suplemento do Access 2007 cria uma faixa de opes e seus botes
tm funes de retorno de chamada, voc tambm precisa incluir o nome do projeto VBA antes do retorno de chamada func -
nome de o em cada
OnAction
argumento da tabela DbRibbons. Em vez de apenas
onAction = \"ListQueryFields\"
Voc precisa
onAction = \"Extras (fita).ListQueryFields \"\/ >
Aps fazer as alteraes acima tabelas do sistema do add-in, compilar o cdigo do suplemento e salvar
e fech-lo. Agora voc deve ser capaz de instalar o add-in e execute o seu menu add-in (s) e sua fita
botes devem funcionar.
21_047026 ch15.qxp 02\/04\/07 22:06 pgina 552
Uma tabela por meio de programao com a funo de LoadCustumUI de carregamento no sempre
trabalho; se a tabela no carregada automaticamente, voc pode carreg-lo manualmente, conforme descrito
no incio deste captulo (Ver Figura 15.8).
O mdulo de basExtrasRibbon tambm contm vrios procedimentos de retorno de chamada, que so os mesmos como
aqueles no padro Extras 2007.accda Adicionar-in, exceto para o ByVal controle como
IRibbonControl argumento (alm de um novo procedimento, para fazer backup de um banco de dados back-end).
Como para localizar o GUID para o biblioteca de objeto do Office 12? Eu encontrei o caminho do
Caixa de dilogo referncias, em seguida, procurada por ele no registro, usando o utilitrio de RegEdit; o
GUID est na linha acima a um anncio o caminho.
Funo pblica LoadRibbons()
' Deve ser uma funo, ento ele pode ser executado da tabela USysRegInfo.
Em erro continuar prximo
Dim i As Integer
Dim strRibbonName As String
Dim strRibbonXML As String
Definir dbsCode = CodeDb
Definir dbsCalling = CurrentDb
Adicione uma referncia biblioteca de objeto do Office 12 (se no houver um j).
Application.References.AddFromGuid _
\"{000C0126-0000-0000-C000-000000000046}\", 1, 0
Copiar a tabela DbRibbons no banco de dados chamada, aps a excluso de qualquer tabela existente de mesmo nome,
se houver um.
Definir dbsCalling = CurrentDb
strCallingDb = CurrentDb.Name
Definir tdfsCalling = dbsCalling.TableDefs
strTable = \"DbRibbons\"
Definir tdfCalling = tdfsCalling(strTable)
DoCmd.SetWarnings False
Se tdfCalling no nada ento
Debug. Print strTable
DoCmd.CopyObject destinationdatabase: = strCallingDb, _
NewName: = strTable, _
sourceobjectType: = _ acTable,
SourceObjectName: = strTable
Outra coisa
DICA DICA
CUIDADO CUIDADO
553
Personalizar a faixa de opes com XML em bancos de dados Access e suplementos
15
21_047026 ch15.qxp 02\/04\/07 22:06 pgina 553
Tabela encontrada; exclu-lo e, em seguida, copie a verso atual.
tdfsCalling.Delete (strTable)
DoCmd.CopyObject destinationdatabase: = strCallingDb, _
NewName: = strTable, _
sourceobjectType: = _ acTable,
SourceObjectName: = strTable
Debug. Print \"O velho\"; strTable _
& deleted; about to copy current version
End If
Set rst = dbsCalling.OpenRecordset(strTable)
RST.MoveFirst
Fazer enquanto no rst.EOF
strRibbonName = rst![RibbonName]
strRibbonXML = rst![RibbonXML]
Carrega a faixa de opes do registro de tabela (se no tiver j sido carregado).
Application.LoadCustomUI _
CustomUIName: = strRibbonName, _
customuixml: = strRibbonXML
RST.MoveNext
Loop
dbsCalling.Close
Definir dbsCalling = Nothing
ErrorHandlerExit:
Exit Function
ErrorHandler:
MsgBox \"erro nenhum:\"
& ; Description: & Err.Description
Resume ErrorHandlerExit
End Function
Uma vez que o suplemento foi carregado, voc pode selecionar o guia de Extras no menu Add-ins sobre o
Banco de dados guia de ferramentas da faixa de opes, como mostrado na Figura 15.16.
554
Adicionando mais funcionalidades ao Office
Parte III
21_047026 ch15.qxp 02\/04\/07 22:06 pgina 554
FIGURA 15.16
Selecionando um menu add-in para carregar uma faixa de opes personalizada de um suplemento do Access.
Consulte o captulo 14 para obter informaes sobre como instalar um suplemento do Access.
Feche e reabra o banco de dados. Se o ExtrasRibbon no foi carregado automaticamente, selecione-a manu-
aliar-se, em seguida, feche e reabra o banco de dados novamente; Agora voc deve ver o guia de Extras, como mostrado na
Figura 15.17.
FIGURA 15.17
A aba Extras carregados de um suplemento de acesso.
O boto \"Selecionar opes\" abre a caixa de dilogo onde vrias opes podem ser selecionadas; os outros mas-
toneladas executar funes de campos de tabela ou consulta de lista ou fazer backup do banco de dados atual ou o seu back-end.
REFERNCIA CRUZADA REFERNCIA CRUZADA
555
Personalizar a faixa de opes com XML em bancos de dados Access e suplementos
15
21_047026 ch15.qxp 02\/04\/07 22:06 pgina 555
Figura 15.18 mostra a caixa de dilogo Selecionar opes:
FIGURA 15.18
A caixa de dilogo Selecionar opes para selecionar uma pasta de backup e inserindo prefixos para excluir.
A fita um novo recurso para o Office e (no surpreendentemente) at mesmo na verso de lanamento
do Access 2007 no totalmente estvel, especialmente quando os botes executar procedimentos de
um add-in. Voc pode achar que voc tem repetidamente desinstalar e reinstalar um add-in, descarregar e
recarregar uma fita, e (acima de tudo!), repetidamente, feche e reabra a um banco de dados para obter uma fita que chama
suplemento procedimentos para trabalhar. Espero que essa instabilidade vai esclarecer em uma prxima patch ou servio
lanamento do Office 2007.
Se voc selecionar o comando de lista de campos de tabela, uma tabela preenchida com os nomes das tabelas e sua
campos e uma caixa de mensagem pergunta se voc deseja imprimir o relatrio vinculado tabela agora, como mostrado na
Figura 15.19:
CUIDADO CUIDADO
556
Adicionando mais funcionalidades ao Office
Parte III
21_047026 ch15.qxp 02\/04\/07 22:06 pgina 556
FIGURA 15.19
Uma mesa repleta de nomes de tabelas e seus campos.
Selecionar o comando \"Back-up de banco de dados de back-end\" extrai o nome do banco de dados back-end
da seqncia de conexo de uma tabela vinculada e apresenta uma InputBox com uma proposta salvar nome,
que pode ser editado como desejado. A InputBox mostrado na Figura 15.20
FIGURA 15.20
Um InputBox com uma proposta salvar nome para um banco de dados back-end.
557
Personalizar a faixa de opes com XML em bancos de dados Access e suplementos
15
21_047026 ch15.qxp 02\/04\/07 22:06 pgina 557
Se voc executar esse comando em um banco de dados que tem no tabelas vinculadas, em vez disso voc receber a mensagem
mostrado na Figura 15.21:
FIGURA 15.21
Uma mensagem ao tentar fazer backup de back-end para um banco de dados que tem no tabelas vinculadas.
Os procedimentos para a \"Lista de campos da tabela\", \"Campos de consulta da lista\", \"Selecionar opes\", \"Back-up atual
banco de dados\"e\"Faa backup de dados de back-end\"botes so similares na 2007.accda Extras
Adicionar-in, exceto que eles usam o controle ByVal IRibbonControl como argumento que necessrio para executar
-os botes de fita; seu cdigo no est listado aqui.
Resumo
Embora a princpio pode parecer que a nova faixa de opes no personalizvel, voc pode personalizar na verdade
ele, pelo menos pela adio de novas guias e grupos, com controles para executar seu cdigo. Este captulo coberto
escrevendo o cdigo XML para carregar uma faixa de opes personalizada e cdigo VBA para procedimentos executar do costume
Botes de fita, em bancos de dados Access 2007 regulares e em bancos de dados de biblioteca para Access 2007
Adicionar-ins. O prximo captulo descreve como escrever Shared add-ins trabalha com a faixa de opes de acesso
no Visual Basic 2005.
558
Adicionando mais funcionalidades ao Office
Parte III
21_047026 ch15.qxp 02\/04\/07 22:06 pgina 558
EU
n captulo 13, descrevi criando um VB 6 COM add-in para adicionar extra
funcionalidade para acesso. VB 6 (embora ainda suportado pela Microsoft) no
a verso mais recente do Visual Basic; Se voc quiser usar a verso mais recente,
que o VB 2005, includo no Visual Studio 2005, disponvel em vrias edies.
Existem diferenas significativas entre essas verses do VB e alguns com-
patibility problemas com Office 2007, mas voc podem criar o Visual Studio 2005
Adicionar-ins que funcionam com acesso, embora neste momento, o trabalho muito mais difcil do que
deve ser, e sua funcionalidade limitada, porque o Visual Studio Tools
para o Office Adicionar-in ainda no incluem um modelo de suplemento do Access.
Este captulo descreve a criao de um simples Visual Studio Shared add-in para
Acesso que ser executado no Windows XP e Windows Vista.
Preparando-se para escrever um Visual
Studio Add-in
Antes de voc comear a escrever um suplemento do Visual Studio, h vrias preliminares
etapas que voc precisa tomar. O primeiro para verificar como o.net suporte est habilitado para
Escritrio, para suportar o componente de interoperabilidade de acesso necessrio ao trabalho
com o acesso.
Adicionando suporte a .NET para escritrio
Desde a instalao do Office 2007 no pode ter .NET suporte habilitado,
voc precisa verificar que esse recurso foi selecionado; Ele necessrio em ordem
criar Shared add-ins. Verificar suporte de whether.NET estiver habilitado, voc
559
NESTE CAPTULO
Personalizar a faixa de opes com um
Visual Studio 2005 Shared add-in
Uma comparao de acesso e
Visual Studio add-ins
Personalizando o acesso
A fita com um Visual Studio
Suplemento de 2005 compartilhado
22_047026 ch16.qxp 02\/04\/07 22:07 pgina 559
precisar executar a instalao do Office. No Windows Vista, primeiro selecione programas no painel de controle, em seguida
Programas e recursos, selecione o item do Microsoft Office, como mostrado na Figura 16.1. Se voc est
com o Windows XP, iniciar, selecionando o miniaplicativo adicionar ou remover programas no painel de controle,
em seguida, o item do Microsoft Office 2007.
FIGURA 16.1
Alterando a instalao do Office 2007 no Windows Vista.
Na tela seguinte, mostrada na Figura 16.2, selecione a opo de alterar, em seguida, \"Adicionar ou remover recursos\"
para o Vista, ou a opo \"Adicionar ou remover recursos\" para o Windows XP.
Na caixa de dilogo opes de instalao, a Microsoft Office Access lista suspensa; se o .NET
Item de suporte programao tem um X vermelho grande, o que significa que ele no est instalado. Para instal-lo, soltar
para baixo de sua lista e selecione o \"executar de meu computador\" item (veja a Figura 16.3).
560
Adicionando mais funcionalidades ao Office
Parte III
22_047026 ch16.qxp 02\/04\/07 22:07 pgina 560
FIGURA 16.2
Selecionando a opo \"Adicionar ou remover recursos\" para mudar o Office no Windows XP.
FIGURA 16.3
Selecionando a opo \"Executar de meu computador\" para suporte de programao do .NET.
561
Personalizar a faixa de opes de acesso com um Visual Studio 2005 Shared Add-in
16
22_047026 ch16.qxp 02\/04\/07 22:07 pgina 561
Se voc deseja criar suplementos para quaisquer outros componentes do Office, selecione \"Executar de meu computador\"
seus componentes de suporte de programao .NET tambm. Aps clicar em continuar, o Office instala
os novos recursos, e quando feito, voc ter uma tela de sucesso, representada na Figura 16.4; clique em
Perto desta tela e, em seguida, feche o miniaplicativo adicionar ou remover programas.
FIGURA 16.4
A tela de sucesso depois de alterar a configurao do Office.
Embora o VB 2005 Express tem um assistente de atualizao, no til para atualizar um VB 6 COM Adicionar-
no VB 2005 porque a edio Express do VB 2005 no oferece suporte criando Adicionar-ins. Se voc
tentativa de atualizar um VB 6 COM add-in com este assistente (ou o similar assistente no Visual Studio
2005), todos os componentes do projeto sero atualizados, exceto o Designer de acesso crtico e voc
receber uma mensagem \"O Designer do Activex AccessDesigner.Dsr no foi atualizada\" no relatrio de atualizao,
como mostrado na Figura 16.5.
562
Adicionando mais funcionalidades ao Office
Parte III
22_047026 ch16.qxp 02\/04\/07 22:07 pgina 562
FIGURA 16.5
O relatrio de atualizao para um suplemento do VB 6 COM, mostrando que o Designer de acesso no foi atualizado.
O VB 6 suplemento foi o tema do captulo 13.
Voc pode pensar que o Visual Studio Tools for Office 2005 (VSTO) seria um instrumento adequado para
Criando suplementos acesso, quando suplementado com a atualizao para download que suporta o Office
2007 afinal de contas, o acesso parte do Office. Mas isso no assim. Embora voc pode criar suplementos para todos
os outros principais componentes do Office 2007 e alguns bem menores (Ver Figura 16.6), voc no pode
criar um suplemento do Access com o VSTO, e, portanto, nesta seo eu uso Visual Studio 2005 para criar-
ing um Shared add-in (este o novo nome para o que foi chamado um COM add-in).
Para criar um Shared add-in que adiciona a capacidade de acesso, inicie executando o Visual Studio 2005 e
Selecionar arquivo

Novo projeto. Na caixa de dilogo New Project, selecione a seleo de extensibilidade sob o
Outra categoria de tipos de projeto, em seguida, selecione o modelo de suplemento compartilhado. Digite o nome do suplemento e
nome da soluo; voc pode aceitar o local padro para arquivos do add-in ou procure um cus-
Localizao de Tom, como eu fiz na Figura 16.7.
REFERNCIA CRUZADA REFERNCIA CRUZADA
563
Personalizar a faixa de opes de acesso com um Visual Studio 2005 Shared Add-in
16
22_047026 ch16.qxp 02\/04\/07 22:07 pgina 563
FIGURA 16.6
A tela do novo escritrio de projeto VSTO, mostrando que a criao de add-in de acesso no suportada.
FIGURA 16.7
Criar um Shared add-in Visual Studio 2005.
Nome do suplemento no pode conter espaos ou marcas de Pontuao apenas letras e nmeros.
No entanto, o nome da soluo pode conter espaos ou marcas de Pontuao.
Aps clicar em OK, voc ter uma tela de \"Welcome to o assistente Add-in\", como visto na Figura 16.8.
CUIDADO CUIDADO
564
Adicionando mais funcionalidades ao Office
Parte III
22_047026 ch16.qxp 02\/04\/07 22:07 pgina 564
565
Personalizar a faixa de opes de acesso com um Visual Studio 2005 Shared Add-in
16
Executando o Visual Studio 2005 no Windows Vista
EU
n ordem para executar Visual Studio 2005 no Windows Vista, voc precisar instalar um Service Pack e, em seguida, um hot-
Fix. O primeiro download para instalar o Visual Studio 2005 Service Pack 1, que pode ser baixado
De
http:\/\/msdn2.Microsoft.com\/en-US\/vstudio\/bb265237.aspx
(em vrias verses
dependendo da edio do Visual Studio). O hotfix chamado o Visual Studio 2005 Service Pack 1
Atualizao para o Windows Vista Beta; Ele pode ser baixado em
http:\/\/www.Microsoft.com\/down-
cargas\/detalhes
. aspx? familyid = fb6bb56a-10b7 - 4 c 05-b81c-5863284503cf
.
Depois de instalar o service pack e os hotfixes, quando voc executar o Visual Studio 2005, voc provavelmente ter
Esta mensagem:
continuou
FIGURA 16.8
A primeira tela do Shared Add-in Wizard.
22_047026 ch16.qxp 02\/04\/07 22:07 pgina 565
566
Adicionando mais funcionalidades ao Office
Parte III
continuou
Se voc clicar no link, voc receber uma pgina de Web com mais links para pginas com informaes
executando o Visual Studio 2005 no Vista:
Para execuo Visual Studio 2005 no Vista, o link que voc precisa de um terceiro, \"correndo com elevada
permisses de administrador.\" H muita informao nesta pgina, mas basicamente voc s precisa
uma coisa: quando executando Visual Studio no Vista, clique em seu cone e selecione \"Executar como administrador\"
seu menu de contexto:
22_047026 ch16.qxp 02\/04\/07 22:07 pgina 566
567
Personalizar a faixa de opes de acesso com um Visual Studio 2005 Shared Add-in
16
Agora voc pode criar novos projetos ou abrir projetos existentes e trabalhar com eles como no Windows XP,
e suas fitas de suplemento do Visual Studio (e outras personalizaes) funcionar no Access 2007
bancos de dados.
22_047026 ch16.qxp 02\/04\/07 22:07 pgina 567
Na tela representada na Figura 16.9, selecione Visual Basic como a linguagem de programao para usar (
pode ser a nica opo, dependendo do suporte a linguagem selecionada durante a instalao do Visual
Studio).
FIGURA 16.9
Selecionando uma linguagem de programao para o suplemento.
Na tela seguinte, mostrada na Figura 16.10, selecione Microsoft Access como o aplicativo host.
FIGURA 16.10
Selecionando um aplicativo host do add-in.
568
Adicionando mais funcionalidades ao Office
Parte III
22_047026 ch16.qxp 02\/04\/07 22:07 pgina 568
Diante da tela 3 do assistente (Ver Figura 16,11), insira do suplemento nome e a descrio (no o
mesmo que o nome do projeto e o nome de soluo entrada na primeira tela).
FIGURA 16,11
Dando o add-in, um nome e uma descrio.
Em seguida, conforme representado na Figura 16.12, seleccione Adicionar-in durante o desenvolvimento, melhor verificar
apenas a primeira caixa de seleo, para que somente voc (desenvolvedor) pode trabalhar com o suplemento.
FIGURA 16.12
Selecionar as opes de suplemento.
569
Personalizar a faixa de opes de acesso com um Visual Studio 2005 Shared Add-in
16
22_047026 ch16.qxp 02\/04\/07 22:07 pgina 569
A ltima pgina do Shared Add-in Wizard (Ver Figura 16.13) d um resumo dos selecionados
Opes.
FIGURA 16.13
A pgina de resumo do Shared Add-in Wizard.
Em clicar em concluir, o novo projeto criado, com todos os componentes necessrios e a
Conectar a classe (mdulo vb) exibido, como mostrado na Figura 16.14 (Observe a semelhana
para o Designer de acesso no VB 6 COM add-in). Para trabalhar mais facilmente com as referncias, selecione
Projeto

Mostrar todos os arquivos e expanda a pasta de referncias no Solution Explorer na parte direita da
a tela.
Se voc no vir a pasta de referncias no Solution Explorer, selecione Mostrar todos os arquivos de
menu do projeto, para tornar a pasta visvel.
DICA DICA
570
Adicionando mais funcionalidades ao Office
Parte III
22_047026 ch16.qxp 02\/04\/07 22:07 pgina 570
FIGURA 16.14
O novo Shared add-in projeto.
Em seguida, adicione uma referncia para o item de acesso interoperabilidade. Para adicionar referncias, clique com boto direito as referncias
pasta e selecione Add Reference, em seguida, selecione a guia de .NET, selecione \"Microsoft.Office.Interop.Access\" (como
na Figura 16.15) e clique em OK.
Figura 16.16 mostra referncias na soluo no Solution Explorer.
571
Personalizar a faixa de opes de acesso com um Visual Studio 2005 Shared Add-in
16
22_047026 ch16.qxp 02\/04\/07 22:07 pgina 571
FIGURA 16.15
Adicionando uma referncia para o item de Interop.Access.
FIGURA 16.16
A referncia de interoperabilidade de acesso e referncias.
572
Adicionando mais funcionalidades ao Office
Parte III
22_047026 ch16.qxp 02\/04\/07 22:07 pgina 572
O prximo passo adicionar alguns Importaesdemonstraes segundo as declaraes de dois padro a
Seo de declaraes do mdulo de classe, usando o IntelliSense (Ver Figura 16.17):
Extensibilidade de importaes
Imports System.Runtime.InteropServices
Importaes Microsoft.Office.Core
Importa acesso = Microsoft.Office.Interop.Access
FIGURA 16.17
Usando o IntelliSense para adicionar uma instruo Imports para o mdulo de classe Connect.
Em seguida, substituir o (variveis de nvel de classe applicationObject e addInInstance ), ambos
declarados como Objeto , com rigidez de tipos referncias, substituindo Dim comPrivada (Eu tambm dei a
applicationObject varivel um nome mais especfico do aplicativo, appAccess ):
Private appAccess como Microsoft.Office.Interop.Access.Application
Private addInInstance como Microsoft.Office.Core.COMAddIn
Depois de adicionar instrues e modificar as variveis, h algumas modificaes mais para ser
feitas no cdigo no mdulo de classe Connect. Essas alteraes so descritas na prxima seo.
Modificar o cdigo do mdulo de classe Connect
Se voc (por exemplo) foram criando um Excel 2007 add-in usando 2005 VSTO com a atualizao de 2007,
voc pode adicionar suporte de fita para seu suplemento, simplesmente adicionando um item da faixa de opes de suporte para seu
projeto. Visual Studio 2005 no tem um item da faixa de opes de suporte e VSTO no suporta a criao de
Acesso Adicionar-ins, para que esta etapa exige extensa modificao manual do mdulo de classe Connect,
para oferecer suporte ao trabalho com o acesso e a faixa de opes.
573
Personalizar a faixa de opes de acesso com um Visual Studio 2005 Shared Add-in
16
22_047026 ch16.qxp 02\/04\/07 22:07 pgina 573
Na OnConnection mtodo, modifique as linhas que defina o aplicativo (acesso) e o suplemento vari -
veis como segue:
appAccess = DirectCast (aplicativo, _
Microsoft.Office.Interop.Access.Application)
addInInstance = DirectCast (addInInst, _
Microsoft.Office.Core.COMAddIn)
Em seguida, modifique as duas linhas que defina o acesso e o suplemento variveis como segue:
appAccess = DirectCast (aplicativo, Access.Application)
addInInstance = DirectCast (aplicativo, Core.COMAddIn)
Adicionar outro Implementa instruo para conectar-se classe como a seguir:
Implementa o Extensibility. IDTExtensibility2
IRibbonExtensibility implementa
Se toda essa modificao manual do Shared add-in cdigo est ficando entediante, espero que
a prxima verso (v. 3) do VSTO inclui um modelo de acesso que ir eliminar a maioria
da codificao manual para suporte de acesso compartilhado suplementos e a faixa de opes.
Depois de adicionar o IRibbonExtensibility implementa linha, um novo esboo de funo deve
aparecem no mdulo de classe Connect, GetCustomUI .
Se voc no vir o esboo da funo, tente fazer um Save All. Se ainda no aparecer, basta digitar
na funo inteira.
Adicione uma linha de cdigo para esta funo, conforme indicado em seguida:
Public Function GetCustomUI (ByVal RibbonID como String) As String _
Implementa GetCustomUI
My.Resources.Ribbon retorno
End Function
Finalmente, abra a classe de Assembly.vb a partir do Solution Explorer e adicionar informaes sobre o add-
em (voc no tem que preencher todas as informaes), como mostrado na Figura 16.18.
Isso completa as alteraes gerais no mdulo de classe Connect; Agora voc precisar adicionar cdigo para
funcionalidade especfica no add-in.
NOTA NOTA
NOTA NOTA
574
Adicionando mais funcionalidades ao Office
Parte III
22_047026 ch16.qxp 02\/04\/07 22:07 pgina 574
FIGURA 16.18
Adicionando informaes de Assembly para o suplemento.
Adicionar funcionalidade para o suplemento compartilhado
Para o Visual Studio add-in, usei componentes de modelo de objeto do Access para criar uma tabela, formulrio,
ou relatrio programaticamente, adicionando campos para a tabela e os controles para o formulrio ou relatrio. A imple-
mento essa funcionalidade, eu precisava escrever cdigo XML da faixa de opes personalizada, trs boto funes,
e algum cdigo de apoio.
Para criar o XML da faixa de opes e incorpor-lo dentro do projeto, primeiro crie um item de arquivo XML selecione-
ing projeto

Adicionar Novo Item e, em seguida, o item de arquivo XML na caixa de dilogo Add New Item (dar o arquivo
o nome da Ribbon), como mostrado na Figura 16.19.
575
Personalizar a faixa de opes de acesso com um Visual Studio 2005 Shared Add-in
16
22_047026 ch16.qxp 02\/04\/07 22:07 pgina 575
FIGURA 16.19
Criando um item de arquivo XML para sustentao da fita.
O cdigo XML para a faixa de opes neste suplemento est listado aqui (Ver captulo 15 para maiores infor-
informaes sobre como criar cdigo XML da faixa de opes):
<? xml verso = \"1,0\" encoding = \"utf-8\"? >
< customUI
xmlns=\"http:\/\/schemas.Microsoft.com\/Office\/2006\/01\/customUI\" >
<ribbon startFromScratch=\"false\">
<tabs>
< id de tab = \"dbDemoTab\"
Label = \"Visual Studio Add-in\"
visvel = \"true\" >
< group id = \"dbAccessObjectsGroup\"
Label = \"Criar objetos de acesso\" >
< id do boto = \"btnCreateTable\"
Label = \"Criar nova tabela\"
Enabled = \"true\"
imageMso = \"Tabela\"
tamanho = \"normal\"
onAction = \"CreateTableInDesignView\" \/ >
< id do boto = \"btnCreateForm\"
Label = \"Criar novo formulrio\"
Enabled = \"true\"
imageMso = \"CreateFormInDesignView\"
tamanho = \"normal\"
onAction = \"CreateNewForm\" \/ >
< id do boto = \"btnCreateReport\"
Label = \"Criar novo relatrio\"
Enabled = \"true\"
576
Adicionando mais funcionalidades ao Office
Parte III
22_047026 ch16.qxp 02\/04\/07 22:07 pgina 576
imageMso = \"CreateReportInDesignView\"
tamanho = \"normal\"
onAction = \"CreateNewReport\" \/ >
<\/group>
<\/tab>
<\/tabs>
<\/ribbon>
<\/customUI>
Em seguida, o arquivo XML precisa ser tratada como um recurso dentro do projeto, assim voc no tem que lidar com
um arquivo de texto separado. Para fazer isso, selecione Ribbon no Solution Explorer e selecione incorporada
Recursos como o valor para a propriedade Build Action em suas propriedades da folha (Ver Figura 16,20).
FIGURA 16,20
Selecionando o recurso incorporado a propriedade Build Action do arquivo Ribbon.
Em seguida, selecione \"Propriedades de CreateObjects\" do fundo do menu do projeto (se voc estiver trabalhando
com um projeto diferente, seu nome exibido em vez de CreateObjects). Clique na guia de recursos; Se voc
no j tiver criado um arquivo de recursos, tudo o que voc ver a ligao mostrada na Figura 16,21.
FIGURA 16,21
Um link para adicionar um recurso para um projeto.
Clique no link para criar um arquivo de recursos; uma folha de dados aparece, com colunas para o nome, valor, e
Comentrio. Arraste o arquivo de Ribbon do Solution Explorer para o painel de recursos; Agora, como em
Figura 16,22, voc ver um cone para o arquivo de Ribbon.
577
Personalizar a faixa de opes de acesso com um Visual Studio 2005 Shared Add-in
16
22_047026 ch16.qxp 02\/04\/07 22:07 pgina 577
FIGURA 16,22
O arquivo Ribbon adicionado ao arquivo de recursos do projeto.
Cada um dos botes no cdigo XML da faixa de opes precisa de seu prprio processo; os trs boto proce-
dures, alm de um manipulador de erro padro do suplemento (igual o VB 6 COM add-in) listadas em seguida:
Public Sub CreateNewTable(ByVal control As _
IRibbonControl)
No erro GoTo ErrorHandler
Dim strSQL As String
Dim strTable As String
Dim obj como AccessObject
strTable = \"tblTest\"
strSQL = \"CREATE TABLE\"
& FileNumber LONG, FileName TEXT (100), _
& Current YESNO);
Debug. Print (\"instruo SQL:\"
Se ele j no existir, crie tabela.
Para cada obj em appAccess.CurrentData.AllTables
Se obj.Nome = strTable Then
' J existe
GoTo ErrorHandlerExit
End If
Prxima
578
Adicionando mais funcionalidades ao Office
Parte III
22_047026 ch16.qxp 02\/04\/07 22:07 pgina 578
Crie a tabela.
appAccess.DoCmd.RunSQL(strSQL)
ErrorHandlerExit:
Exit Sub
ErrorHandler:
AddInErr(Err)
Resume ErrorHandlerExit
End Sub
Public Sub CreateNewForm(ByVal control As _
IRibbonControl)
No erro GoTo ErrorHandler
Dim frm como Microsoft.Office.Interop.Access.Form
Dim txt como Microsoft.Office.Interop.Access.TextBox
Dim lbl como Microsoft.Office.Interop.Access.Label
Dim cbo como Microsoft.Office.Interop.Access.ComboBox
Dim lst como Microsoft.Office.Interop.Access.ListBox
Dim chk como Microsoft.Office.Interop.Access.CheckBox
Crie um novo formulrio.
FRM = appAccess.CreateForm()
frm.RecordSource = \"tblTest\"
txt = appAccess.CreateControl (nomedoformulrio: = frm.Nome _
ControlType:=Microsoft.Office.Interop.Access.AcControlType.acTextBox _
Section:=Microsoft.Office.Interop.Access.AcSection.acDetail _
Esquerda: = 0, Top: = 0, largura: = 2500, altura: = 400)
LBL = appAccess.CreateControl (nomedoformulrio: = frm.Nome _
ControlType:=Microsoft.Office.Interop.Access.AcControlType.acLabel _
Section:=Microsoft.Office.Interop.Access.AcSection.acDetail _
Esquerda: = 0, Top: = 1000, largura: = 2500, altura: = 400)
CBO = appAccess.CreateControl (nomedoformulrio: = frm.Nome _
ControlType:=Microsoft.Office.Interop.Access.AcControlType.acComboBox _
Section:=Microsoft.Office.Interop.Access.AcSection.acDetail _
Esquerda: = 0, Top: = 2000, largura: = 2500, altura: = 400)
LST = appAccess.CreateControl (nomedoformulrio: = frm.Nome _
ControlType:=Microsoft.Office.Interop.Access.AcControlType.acListBox _
Section:=Microsoft.Office.Interop.Access.AcSection.acDetail _
Esquerda: = 0, Top: = 3000, largura: = 2500, altura: = 400)
579
Personalizar a faixa de opes de acesso com um Visual Studio 2005 Shared Add-in
16
22_047026 ch16.qxp 02\/04\/07 22:07 pgina 579
chk = appAccess.CreateControl (nomedoformulrio: = frm.Nome _
ControlType:=Microsoft.Office.Interop.Access.AcControlType.acCheckBox _
Section:=Microsoft.Office.Interop.Access.AcSection.acDetail _
Esquerda: = 0, Top: = 4000, largura: = 2500, altura: = 400)
ErrorHandlerExit:
Exit Sub
ErrorHandler:
AddInErr(Err)
Resume ErrorHandlerExit
End Sub
Public Sub CreateNewReport(ByVal control As _
IRibbonControl)
No erro GoTo ErrorHandler
Dim rpt como Microsoft.Office.Interop.Access.Report
Dim txt como Microsoft.Office.Interop.Access.TextBox
Dim lbl como Microsoft.Office.Interop.Access.Label
Dim cbo como Microsoft.Office.Interop.Access.ComboBox
Dim lst como Microsoft.Office.Interop.Access.ListBox
Dim chk como Microsoft.Office.Interop.Access.CheckBox
Crie um novo relatrio.
RPT = appAccess.CreateReport()
RPT.RecordSource = \"tblTest\"
txt = appAccess.CreateReportControl (ReportName: = rpt.Nome _
ControlType:=Microsoft.Office.Interop.Access.AcControlType.acTextBox _
Section:=Microsoft.Office.Interop.Access.AcSection.acDetail _
Esquerda: = 0, Top: = 0, largura: = 2500, altura: = 400)
LBL = appAccess.CreateReportControl (ReportName: = rpt.Nome _
ControlType:=Microsoft.Office.Interop.Access.AcControlType.acLabel _
Section:=Microsoft.Office.Interop.Access.AcSection.acDetail _
Esquerda: = 0, Top: = 1000, largura: = 2500, altura: = 400)
CBO = appAccess.CreateReportControl (ReportName: = rpt.Nome _
ControlType:=Microsoft.Office.Interop.Access.AcControlType.acComboBox _
Section:=Microsoft.Office.Interop.Access.AcSection.acDetail _
Esquerda: = 0, Top: = 2000, largura: = 2500, altura: = 400)
LST = appAccess.CreateReportControl (ReportName: = rpt.Nome _
ControlType:=Microsoft.Office.Interop.Access.AcControlType.acListBox _
Section:=Microsoft.Office.Interop.Access.AcSection.acDetail _
Esquerda: = 0, Top: = 3000, largura: = 2500, altura: = 400)
580
Adicionando mais funcionalidades ao Office
Parte III
22_047026 ch16.qxp 02\/04\/07 22:07 pgina 580
chk = appAccess.CreateReportControl (ReportName: = rpt.Nome _
ControlType:=Microsoft.Office.Interop.Access.AcControlType.acCheckBox _
Section:=Microsoft.Office.Interop.Access.AcSection.acDetail _
Esquerda: = 0, Top: = 4000, largura: = 2500, altura: = 400)
ErrorHandlerExit:
Exit Sub
ErrorHandler:
AddInErr(Err)
Resume ErrorHandlerExit
End Sub
Public Sub AddInErr(ByVal errX As ErrObject)
Exibe uma caixa de mensagem com informaes de erro.
Dim strMsg As String
strMsg = _
_ \"Ocorreu um erro no Extras Adicionar-in\"
& Microsoft.VisualBasic.Constants.vbCrLf _
& Error #: & errX.Number _
& Microsoft.VisualBasic.Constants.vbCrLf _
& Description: & errX.Description
MsgBox (strMsg, MsgBoxStyle.Critical, \"Erro!\")
End Sub
A sintaxe para constantes nomeadas muito mais detalhada no Visual Studio 2005 do que em
Acessar o VBA ou VB 6: em vez de (por exemplo)
acControlType
, voc precisa o enum completo
referncia,
Microsoft.Office.Interop.Access.acControlType
.
Se voc ativar o painel de lista de erros (Ver

Lista de erros), voc ver uma srie de avisos


sobre a converso implcita de uma varivel de controle de acesso a um controle especfico de acesso tipo (Ver
Figura 16,23).
Em geral, voc pode limpar avisos de converso usando uma funo de converso no cdigo, mas
Visual Studio 2005 no tem quaisquer funes de converso para controles de acesso, assim voc s tem que
viva com os avisos (o cdigo ser executado multa).
NOTA NOTA
581
Personalizar a faixa de opes de acesso com um Visual Studio 2005 Shared Add-in
16
22_047026 ch16.qxp 02\/04\/07 22:07 pgina 581
FIGURA 16,23
Avisos de converso implcita na lista de erros.
Se voc muito hbil em escrever cdigo e muita sorte, neste momento voc pode instalar e testar o
cdigo e tudo funcionaria perfeitamente. Mas mais realista esperar que haver algumas
bugs no cdigo que ir impedir o suplemento trabalhando, por isso uma boa idia fazer alguma depurao-
Ging neste ponto, para economizar o tempo que voc gastaria indo atravs da instalao e, em seguida, encontrar-
o que o suplemento no funciona como esperado.
Depurando o Add-in
O painel de lista de erros (mencionado na seo anterior) ajuda voc a localizar erros em seu
cdigo; voc pode clicar duas vezes em um item para ir para a linha de cdigo que causou o erro. Quando se trabalha
com um suplemento, voc pode usar a \"Start Debugging\" seleo no menu Debug para percorrer
o cdigo, mas primeiro voc tem que selecionar o acesso do aplicativo para iniciar quando estiver depurando. Para fazer
Este, selecione \"Propriedades CreateObjects\" da parte inferior do menu Projeto (se voc estiver trabalhando
com um projeto diferente, seu nome exibido em vez de CreateObjects). Clique na guia Debug e selecione
Acesso como a seleo da opo de \"Iniciar programa externo\". (Figura 16,24 mostra a caixa de dilogo Selecionar arquivo
que aparece quando voc clica no boto Procurar direita da opo \"Start external program\".)
Agora voc pode definir pontos de interrupo em seu cdigo (usando a tecla de funo F9), como com Access VBA, e
Quando voc selecionar Start Debugging no menu Depurar, o acesso ser aberto automaticamente. Selecione (ou
criar) um novo banco de dados e, em seguida, clique o Adicionar-in botes para executar e depurar o cdigo; ele vai parar
nos pontos de interrupo que voc definiu assim voc pode percorrer o cdigo com a tecla de funo F8.
582
Adicionando mais funcionalidades ao Office
Parte III
22_047026 ch16.qxp 02\/04\/07 22:07 pgina 582
FIGURA 16,24
Selecionar acesso como o programa para iniciar quando estiver depurando.
Construir e instalar o Add-in
Depois de encontrar e corrigir erros no cdigo do suplemento, voc est pronto para criar o suplemento; Para
fazer isso, clique no boto salvar tudo e, em seguida, selecione Compilar no menu de contexto de criar\"
Item de ObjectsSetup\"no Solution Explorer (o nome do add-in nome mais\"Setup\"), como
mostrado na Figura 16.25.
Quando \"Construir conseguiu\" aparece no canto inferior esquerdo da barra de status, voc pode ento instalar o
soluo, selecionando a instalao no mesmo menu de contexto.
Se a seleo de instalar desabilitada aps uma bem sucedida primeira compilao, selecione reconstruir; Depois disso,
Instalao deve ser habilitada.
DICA DICA
583
Personalizar a faixa de opes de acesso com um Visual Studio 2005 Shared Add-in
16
22_047026 ch16.qxp 02\/04\/07 22:07 pgina 583
FIGURA 16.25
Criando a soluo.
Selecionar instalao inicia o Assistente de configurao de ObjectsSetup criar desajeitadamente nomeado (Ver Figura 16.26).
FIGURA 16.26
A primeira tela do Assistente de instalao.
584
Adicionando mais funcionalidades ao Office
Parte III
22_047026 ch16.qxp 02\/04\/07 22:07 pgina 584
Clicando em Next voc obtm a tela Selecionar pasta de instalao (Ver Figura 16.27), onde voc pode
quer aceitar o local padro ou navegar para outro local e selecione se o suplemento
disponvel para todos os usurios ou apenas voc.
FIGURA 16.27
Selecionando a pasta de instalao para a soluo.
Na tela do Assistente de instalao, mostrado na Figura 16.28 confirmar instalao, clique em Avanar para iniciar
a instalao.
FIGURA 16.28
A tela de confirmar a instalao do Assistente de instalao.
585
Personalizar a faixa de opes de acesso com um Visual Studio 2005 Shared Add-in
16
22_047026 ch16.qxp 02\/04\/07 22:07 pgina 585
A prxima tela, omitida aqui, mostra uma barra de progresso durante a instalao da soluo.
Quando a instalao estiver concluda, voc receber a tela de instalao completa, retratada em
Figura 16.29.
FIGURA 16.29
A tela final do Assistente de instalao.
Em geral, depois de clicar em fechar a ltima tela do assistente, o suplemento instalado automati-
camente; no entanto, se voc no v a faixa de opes personalizada que o suplemento deve criar um Access 2007
banco de dados, voc pode instal-lo manualmente. Abra a caixa de dilogo Opes do Access no menu do Office, e
Selecione a pgina de Add-ins. Na parte inferior da pgina, clique no boto de ir para a direita da OCM
Suplementos suspensa, conforme mostrado na Figura 16.30.
A caixa de dilogo suplementos de COM (mostrada na Figura 16,31) parece o mesmo que em verses anteriores do Access. Se
voc v o suplemento listado, basta verific-lo; caso contrrio, voc pode procur-lo.
586
Adicionando mais funcionalidades ao Office
Parte III
22_047026 ch16.qxp 02\/04\/07 22:07 pgina 586
FIGURA 16.30
Abrir a caixa de dilogo suplementos de COM a partir da pgina de Add-ins da caixa de dilogo Opes do Access.
FIGURA 16,31
Instalar um suplemento de COM na caixa de dilogo suplementos de COM.
587
Personalizar a faixa de opes de acesso com um Visual Studio 2005 Shared Add-in
16
22_047026 ch16.qxp 02\/04\/07 22:07 pgina 587
Usando o Add-in
Para testar o add-in, abra qualquer banco de dados do Access 2007 (ou criar um novo banco de dados). Como na Figura 16.32,
voc ver uma nova aba de suplemento do Visual Studio na faixa de opes com um grupo chamado \"criar acesso
Objetos\"que contm trs botes. No necessrio adicionar manualmente a faixa de opes, ou mesmo para fechar
e reabra o banco de dados; a faixa de opes exibida imediatamente (uma refrescante mudana da luta
voc tem que atravessar para chegar a uma faixa de opes personalizada para aparecer de um suplemento de acesso).
FIGURA 16.32
Uma nova guia e o grupo criado pelo add-in.
Clicando no boto \"Criar nova tabela\" cria uma nova tabela com vrios campos de dados diferentes
tipos, no boto \"Criar novo formulrio\" cria um novo formulrio com a nova tabela como sua fonte de registro
e vrios controles de tipos diferentes e o boto \"Criar novo relatrio\" cria um novo relatrio,
tambm com a nova tabela como sua fonte de registro e de vrios controles de tipos diferentes. Figura 16.33
mostra a nova tabela no modo design.
FIGURA 16.33
Uma nova tabela criada pelo add-in.
588
Adicionando mais funcionalidades ao Office
Parte III
22_047026 ch16.qxp 02\/04\/07 22:07 pgina 588
16.34 a figura mostra o novo formulrio; o novo relatrio semelhante.
FIGURA 16.34
Uma forma criada pelo add-in.
O formulrio chamado Form1 (ou outro nmero); no podem ser renomeada no cdigo, sob a
Visual Studio add-in ou diretamente no Access VBA, porque o
Nome
Propriedade do
Formulrio
objeto somente leitura quando o formulrio criado usando o
CreateForm
mtodo (e da mesma forma para o
CreateReport
mtodo).
Resumo
Depois de trabalhar com todos os trs suplemento tipos (acesso, VB 6 e Visual Studio 2005), minha concluso
que suplementos de acesso tm vantagens sobre o Visual Studio 2005 e VB 6 suplementos, pelo menos se voc
esto executando o Windows XP. Uma das vantagens mais significativas de acesso add-ins que eles so
prprios bancos de dados Access e isso lhe permite copiar objetos de banco de dados de cdigos postais
no banco de dados chamada. Se voc precisar de formulrios em um VB ou Visual Studio add-in, voc tem que cri-los
partir do zero como VB ou Windows forms; relatrios (em algumas verses do VB), s pode ser criado usando
Crystal Reports. Outra vantagem de acesso add-ins que apenas um Adicionar-in Access pode criar um
assistente ou construtor. E finalmente, suplementos usar VBA cdigo de acesso, assim voc no precisa aprender uma nova pro-
dialeto gramming, apenas algumas tcnicas especiais.
No entanto, se voc quer seu acesso add-ins para criar fitas personalizadas, existem alguns obstculos no
presentes. Recebendo a faixa de opes personalizada para exibir e executar o cdigo de suplemento, pode exigir muito tempo
passei em desinstalar e reinstalar o suplemento, descarregar e recarregar a tabela e fechamento
NOTA