Você está na página 1de 722

Acesso 2007


Bíblia VBA
Para aplicativos centrados em dados de Microsoft Office
®
Helen Feddema
01_047026 ffirs.qxp 02\/04\/07 21:39 página iii
01_047026 ffirs.qxp 02\/04\/07 21:39 página ii
Bíblia de VBA do Access 2007

01_047026 ffirs.qxp 02\/04\/07 21:39 página i
01_047026 ffirs.qxp 02\/04\/07 21:39 página ii
Acesso 2007

Bíblia VBA
Para aplicativos centrados em dados de Microsoft Office
®
Helen Feddema
01_047026 ffirs.qxp 02\/04\/07 21:39 página iii
Acesso

Bíblia 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 América
10 9 8 7 6 5 4 3 2 1
Nenhuma parte desta publicação pode ser reproduzida, armazenada em um sistema de recuperação ou transmitida sob qualquer forma ou por qualquer meio,
eletrônica, mecânica, fotocópia, gravação, digitalização ou de outra forma, exceto conforme permitido no seções 107 ou 108 de
Lei de direitos autorais de 1976 Estados Unidos, sem prévia permissão por escrito da editora, ou através de autorização
pagamento da taxa por cópia apropriada para o Copyright Clearance Center, 222 Rosewood Drive, Danvers, MA 01923,
(978) 750-8400, fax (978) 646-8600. Solicitações para a editora para permissão devem ser enviadas para o judiciário
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\/isenção de garantia: A editora e o autor não fazem nenhuma representação ou garantias com
que diz respeito à exatidão ou completude do conteúdo deste trabalho e especificamente excluem todas as garantias, incluindo
sem limitação, garantias de adequação a uma finalidade específica. Nenhuma garantia pode ser criada ou estendida por vendas ou
materiais promocionais. O aconselhamento e estratégias contidas neste documento podem não ser adequadas para cada situação. Este trabalho é vendido
com o entendimento de que a editora não está envolvida no processamento legais, contábeis ou outros serviços profissionais. Se
ajuda profissional é necessária, os serviços de uma pessoa competente e profissional devem ser procurados. Nem a editora
nem o autor será responsável por danos decorrentes. O fato de que uma organização ou site é referido neste
trabalhar como uma citação e\/ou uma fonte potencial de informação complementar não significa que o autor ou a editora apoia
podem fornecer as informações que a organização ou site ou pode fazer recomendações. Além 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 informações gerais sobre nossos outros produtos e serviços ou para obter suporte técnico, 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 catalogação-na-publicação do Congresso:
Feddema, Helen Bell.
Bíblia 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. título.
QA76.9.D3F435 2007
005.75 65 - dc22
2007007061
Marcas comerciais: Wiley, o logotipo Wiley, vestido de comércio relacionados são marcas comerciais ou registradas da John Wiley
Inc. e\/ou suas filiais, nos Estados Unidos e outros países e não podem ser usadas sem permissão por escrito.
Microsoft e acesso são marcas comerciais ou marcas registradas da Microsoft Corporation nos Estados Unidos e\/ou
países. Todas as outras marcas são de propriedade de seus respectivos proprietários. Wiley Publishing, Inc., não está associada com
qualquer produto ou fornecedor mencionado neste livro.
Wiley também publica seus livros em uma variedade de formatos eletrônicos. Algum conteúdo que aparece na impressão pode não estar disponível em
livros eletrônicos.
01_047026 ffirs.qxp 02\/04\/07 21:39 página iv
Sobre o autor
Helen Feddemaé um desenvolvedor independente especializada em aplicativos do Microsoft Office, concentração -
trating (desde 1996) e Access, Word, Outlook. Ela tem escrito ou co-autor de vários 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 relatórios 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 também contribuiu com capítulos de uma série de livros de escritório multi-autor, incluindo Especial
Edição: Usando o Microsoft Outlook 97 (Que, 1997),Escritório aborrecimentos (O ' Reilly, 1997),Outlook
Aborrecimentos (O ' Reilly, 1998),Edição especial: Usando Microsoft Project 98 (Que, 1997),Ensine-se Yourself
Projeto(Sams, 1998), e Edição especial: Outlook 2000 (Que, 2000). Helen foi um regular con-
tributor a Pinnacle Acesso inteligente e Office Developer revistas, informanteMicrosoft Office e
Programação VBA (agoraSoluções do Office ), e Escritório subterrâneo de Woody Boletim e ela é cur-
rently editor do Acesso relógio Ezine (anteriormente Relógio de acesso do Woody ), para que ela escreve a
Coluna de Arconte de acesso.
01_047026 ffirs.qxp 02\/04\/07 21:39 página v
Créditos
Editor Executivo
Bob Elliott
Editor de desenvolvimento
Kelly Talbot
Editor técnico
Mary Hardy
Editor de produção
Eric Charbonneau
Copy Editor
Kim Cofer
Gerente editorial
Mary Beth Wakefield
Gerente de produção
Tim Tate
Vice-Presidente e o grupo executivo
Editora
Richard Swadley
Vice-Presidente e editor executivo
Joseph B. Wikert
Coordenador do projeto
Adrienne Martinez
Gráficos e especialistas de produção
Sean Decker
Jennifer Mayberry
Heather Papa
Amanda Spagnuolo
Técnicos de controle de qualidade
Melanie Hoffman
Robert Springer
Brian paredes
Revisão e indexação
Aptara
Projeto do logotipo do aniversário
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
Capítulo 1: Armazenar e exibir dados no Access.... 3
Uma breve história do intercâmbio de dados do escritório...3
Storing Data in Access ..........................................................................................................4
Exibindo dados em relatórios e formulários de acesso...5
Criar cartas de formulário de acesso...8
Criando relatórios do tipo planilha no acesso...11
Plain Datasheet Reports ..................................................................................11
PivotTables ......................................................................................................19
PivotCharts......................................................................................................22
Summary ............................................................................................................................25
Capítulo 2: Criação de documentos de palavra de acesso. 27
Documentos de preenchimento do Word com dados de acesso, usando o método TypeText...27
Utilizando modelos do Word para criar documentos do Word formatado...30
Bookmarks ................................................................................................................31
Document Properties ................................................................................................39
Form Field Documents........................................................................................................45
Summary ............................................................................................................................48
Capítulo 3: Análise de dados com o Excel... 49
Exportar dados do Access para uma planilha não formatada...50
Usando modelos do Excel para criar formatado planilhas preenchidas com dados de acesso...52
Formatação de planilhas do Excel no VBA código...62
Summary ............................................................................................................................69
Capítulo 4: Organização e comunicando-se com o Outlook. 71
Exportação de compromissos e tarefas para o Outlook...72
Exportar informações 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 página vii
Parte II: Escrevendo código VBA para trocar dados entre
Componentes do Office 87
Capítulo 5: Trabalhando com dados de acesso... 89
Trabalhando com bancos de dados de formato mais velhos no Access 2007...91
Disambiguating referências 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
Conversão código DAO para ADO código...129
Summary ..........................................................................................................................131
Capítulo 6: Trabalhando com modelos e documentos do Word. . 133
Exportação de built-in Word no Office 2007...135
Exportar dados do Access para o Word usando automação código...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 exportação...143
Escolhendo um método 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
Capítulo 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 código...195
Timesheets ........................................................................................................................202
Summary ..........................................................................................................................218
VIII
Conteúdo
02_047026 ftoc.qxp 02\/04\/07 21:40 página viii
Capítulo 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 importação 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 referência a objetos do Outlook...235
Referenciar itens do Outlook no código VBA...240
Trabalhando com compromissos do Outlook...241
Working with Outlook Tasks ............................................................................................247
Trabalhar com contatos do Outlook...254
Summary ..........................................................................................................................262.
Capítulo 9: Trabalhando com arquivos e pastas... 263
Trabalhando com pastas do Windows Explorer...264
O escritório 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
Capítulo 10: Trabalhando com dados externos. 305
Trabalhando com arquivos de texto usando o método TransferText...306
Criando uma especificação de exportação ou importação...306
Importar e exportar dados de arquivo de texto no código 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
Conteúdo
02_047026 ftoc.qxp 02\/04\/07 21:40 página 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
Capítulo 11: Sincronização 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
Capítulo 12: Indo além do básico.. 397
Criar palavra extravagante etiquetas de envio...397
Criando gráficos dinâmicos do Excel de consultas de acesso...415
E-mail de envio e reordenação de relatórios...426
Summary ..........................................................................................................................432
Parte III: Adicionando mais funcionalidades ao Office 427
Capítulo 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 módulo 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
Capítulo 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 código de suplemento...481
Dicas sobre adicionar-em construção...482
x
Conteúdo
02_047026 ftoc.qxp 02\/04\/07 21:40 página 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
Interpretação 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
Capítulo 15: Personalizar a faixa de opções com XML em bancos de dados Access
and Add-ins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515
Ferramentas úteis para criação e edição de código XML...517
XML Notepad 2007 ................................................................................................517
VB 2005 XML Editor ..............................................................................................518
Office 2007 Custom UI Editor...518
Personalizar a faixa de opções em um banco de dados do Access...519
Creating the XML Code ..........................................................................................522
Adicionando uma nova guia, grupo e controles da faixa de opções...527
Remover uma guia ou grupo da faixa de opções...528
VBA Code................................................................................................................542
Form Ribbons..........................................................................................................547
Personalizar a faixa de opções com um suplemento de acesso...549
Summary ..........................................................................................................................558
Capítulo 16: Como personalizar a faixa de opções 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 escritório...559
Modificar o código do módulo 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
Conteúdo
02_047026 ftoc.qxp 02\/04\/07 21:40 xi de página
Capítulo 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
Diferenças entre o código 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
Capítulo 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
Começando pelo Firewall...640
Windows XP..................................................................................................640
Windows Vista ..............................................................................................643
Outros bloqueios de segurança...647
Using the Upsizing Wizard................................................................................................648
Conversão de tabelas do Access para tabelas do SQL Server...649
Criando um aplicativo cliente\/servidor...657
Vinculação de dados em tabelas do SQL Server...662
O Assistente de migração do servidor SQL para acesso...671
Summary ..........................................................................................................................672
Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 673
XII
Conteúdo
02_047026 ftoc.qxp 02\/04\/07 21:40 página xii
M
qualquer graças ao meu editor técnico, Mary Hardy, para capturar erros e fazendo muitos
sugestões valiosas que melhoraram a qualidade do livro (e bancos de dados de amostra), e
para editores Kelly Talbot e Brian Hermann para suas sugestões e apoio.
XIII
03_047026 flast.qxp 02\/04\/07 21:40 página xiii
03_047026 flast.qxp 02\/04\/07 21:40 página xiv
W
elcome para o Bíblia de VBA do Access 2007 . Como todos os livros da série da Bíblia, você pode esperar
encontrar tutoriais práticos e informações de aplicação prática do mundo real, como
bem como informações de referência e o plano de fundo que fornece um contexto para o que você está
aprendizagem. Este livro é um recurso bastante abrangente sobre como escrever código VBA para troca de dados
entre o escritório principal aplicações (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 vários tipos. Quando você tiver concluído o Bíblia de VBA do Access 2007 , você
vai estar bem preparado para escrever código VBA automação que usa seus dados de acesso para produzir a palavra
cartas, etiquetas e outros documentos (sem a sobrecarga de mala direta), de discussão para criar o Excel
planilhas e gráficos dinâmicos e para criar compromissos do Outlook, as mensagens de email, contatos, e
artigos de jornal, com ou sem anexos. Além 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 usuário avançado que está familiarizado com o trabalho
com aplicativos do Office (particularmente acesso) na interface, e tem pelo menos uma familiaridade básica com
escrever código VBA, mas precisa de mais informações sobre como escrever código de automação 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 são sua especialidade, ao armazenar a maioria dos dados em bancos de dados Access.
Como este livro está organizado
O livro começa em parte eu com uma descrição 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 específica.
Na parte II, cobertura mais específica é 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 também inclui um capítulo sobre como trabalhar com arquivos e pastas usando o
FileSystemObject e outro sobre a sincronização 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
também ter a capacidade de referenciar e usar contatos do Outlook, sem ter que fazer dupla entrada ou
manualmente atualizar informações de contato. Finalmente, o último capítulo na parte lida com vários
Tópicos avançados, trabalhando com objetos de Word e Excel.
XV
03_047026 flast.qxp 02\/04\/07 21:40 página xv
Parte III aborda tópicos que adicionam mais funcionalidade ao escritório, incluindo a criação de suplementos COM
com VB 6, Access add-ins e Visual Studio 2005 Shared add-ins. Trata-se também como personalizar o
Office 2007 Ribbon com XML em bancos de dados Access e adicionar-ins de vários tipos. Além disso,
há um capítulo sobre a criação de scripts standalone com Windows Script Host e outro capítulo
em usando o Access como front-end para trabalhar com dados do SQL Server.
Convenções e características
Há muitos recursos organizacionais e tipográficos diferentes ao longo deste livro projetado
para ajudá-lo a obter o máximo de informações.
Sempre que os autores querem trazer algo importante para sua atenção, as informações serão
aparecem em uma ponta, nota ou precaução.
Esta informação é importante e partiu em um parágrafo separado com um ícone especial.
Cuidados fornecem informações sobre coisas a observar, se simplesmente inconve -
amostras ou potencialmente perigosos para seus dados ou sistemas.
Dicas geralmente são usadas para fornecer informações que podem facilitar seu trabalho — especial
atalhos ou métodos para fazer algo mais fácil do que a norma.
Notas fornecem informações adicionais, acessórias que é útil, mas um pouco fora de
a apresentação atual da informação.
Novidades introduzem componentes ou funcionalidades que são novos ou melhorados na
software em comparação comparado versões anteriores.
O que está no Site do companheiro
No site do companheiro você encontrará o código de exemplo. Cada capítulo tem sua própria 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 capítulo.
Requisitos mínimos
Para executar o código 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ê não
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 não tem a etiqueta (embora
provavelmente não o vidro Aero interface, que requer uma placa de vídeo de alta potência).
NOVO RECURSO NOVO RECURSO
NOTA NOTA
DICA DICA
CUIDADO CUIDADO
XVI
Introdução
03_047026 flast.qxp 02\/04\/07 21:40 página 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 mãos. Você também deve levar como escrever código VBA automação para transferir
dados de acesso aos documentos criados com outros componentes do Office e formatar os documentos como
necessários; Isto lhe permitirá criar procedimentos que podem ser executados a partir de eventos de formulário ou botões 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 páginas com artigos de acesso Archon e amostras de código
muitos dos que lidam com troca de vários tipos de dados entre aplicativos do Office. Vê-los
fora — você pode achar que a solução que você está procurando já está lá, pronto para baixar e usar.
XVII
Introdução
03_047026 flast.qxp 02\/04\/07 21:40 página xvii
03_047026 flast.qxp 02\/04\/07 21:40 página xviii
O escritório
Componentes e
O que eles fazem melhor
NESTA PARTE
Capítulo 1
Armazenar e exibir dados em
Acesso
Capítulo 2
Criação de documentos do Word
Acesso
Capítulo 3
Análise de dados com Excel
Capítulo 4
Organização e comunicação
com o Outlook
04_047026 pt01.qxp 02\/04\/07 21:40 página 1
04_047026 pt01.qxp 02\/04\/07 21:40 página 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 próprio
consultas, formulários e relatórios para classificar, filtragem, exibir e imprimir dados. Com
sucessivas versões do Office, movimentação de dados entre os componentes do Office (espe-
cialmente de Word, Excel e Outlook) tornou-se muito mais fácil que é agora
muitas vezes mais eficiente usar um outro componente do Office em vez de um acesso
relatório para uma tarefa, como impressão de cartas ou análise de dados numéricos.
Além disso, usando outros componentes do Office para exibir ou imprimir dados de
Acesso torna os dados armazenados em tabelas do Access mais amplamente acessíveis. Muitos
Os usuários do Office tem uma edição do Office que não inclui acesso — mas eles
todos têm o Word e Excel, e muitos também têm o Outlook, para que eles possam facilmente
trabalhar com documentos do Word, mensagens do Outlook ou nomeações e Excel
planilhas, preenchido com dados de tabelas do Access.
Se você planeja apresentar seus dados como um relatório do Access, gráfico dinâmico, ou
Tabela dinâmica; ou um documento do Word ou planilha do Excel, os dados são armazenados em
Tabelas do Access e entrou e editado em formulários de acesso.
Uma breve história do escritório
Troca de dados
Como o sistema operacional Windows progrediu do Windows 3.0 para
Windows XP e Vista, transferência de dados técnicas melhoraram, de simples
cortar e colar usando o clipboard do Windows 3.0, a troca de dados dinâmica
(DDE) e Open Database Connectivity (ODBC), automação (originalmente
3
NESTE CAPÍTULO
Uma breve história dos dados do escritório
troca
Armazenamento de dados no Access
Exibindo dados de acesso em formas
e relatórios
Trabalhando com texto rico em
Campos de memorando
Nova interatividade de relatório
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 página 3
chamado objeto vinculação e incorporação [OLE], em seguida, automação OLE) e Extensible Markup
Language (XML).
Em versões anteriores do Windows e Office, DDE e ODBC eram difíceis de usar, irritadiço e não confiável
em operação e ODBC em particular muitas vezes necessária instalação elaborada. Eu sei — eu usei ambos DDE
e ODBC, quando eles eram as únicas ferramentas de conectividade disponíveis. Mas deixei-lhes alegremente quando
OLE tornou-se disponível no Windows 95\/Office 95, porque oferecia uma maneira muito mais simples para se conectar
Aplicações de escritório, embora no início apenas de forma limitada.
Antes o Office 97, havia uma distinção entre os componentes do Office que foram servidores OLE, que
poderia ser manipulada pelo código 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 disponíveis para conexão 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 padrão 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 automação tanto como clientes
servidores e, portanto a distinção de cliente\/servidor OLE não é mais significativa.
Você pode escrever código de automação em qualquer aplicativo do Office principal para se conectar a qualquer outro cargo
do aplicação dados e funcionalidade (e também alguns aplicativos de terceiros).
Armazenamento de dados no Access
Acesso foi projetado desde o início para armazenar dados, assim (se você tem uma escolha — que não é 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 razão muito forte para armazená-lo em outro lugar.
Uma exceção válida é 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, não pequeno-
para bancos de dados médios usados por indivíduos ou pequenas empresas, onde o acesso pode facilmente manipular
o número de registros. Ver capítulo 18 para obter mais informações sobre essa opção.
Entrada de dados e edição, também, 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 código VBA
que decorre de eventos de formulário e controle para fins de tratamento de erros e criar funções que
Automatize as operações de processamento de dados repetitivas.
Em meu livro anterior, Um especialista Microsoft Application Development Eu discutida a criação de
Aplicações de acesso, com detalhes sobre como usar consultas, formulários, relatórios e código. Eu não vou duplicar esta
informações aqui, mas em vez neste capítulo concentrar-me recursos novos ou aperfeiçoados no Access
2007, que aumentar a utilidade dos relatórios e formulários de acesso.
REFERÊNCIA CRUZADA REFERÊNCIA CRUZADA
4
Os componentes do Office e o que fazem melhor
Parte I
05_047026 ch01.qxp 02\/04\/07 21:41 página 4
Exibindo dados em formulários do Access e
Relatórios
Às vezes você não precisa ir lá fora para apresentar seus dados de acesso — se você estiver criando um
Pedido de acesso, exibindo dados em formulários e em relatórios da impressão podem ser tudo que você precisa.
Ao longo dos anos, foi significativamente atualizados os relatórios e formulários de acesso. No Access
2007, um longo-solicitado recurso chegou, finalmente, de forma viável (lembro-me uma
precoce e confiável aplicação que fez uma breve aparição no Access 95). Campos MEMO pode
agora armazenar e exibir texto rico, usando a propriedade Text Align, que assume um valor ou texto sem formatação
ou Rich Text. Quando você selecionar Rich Text para essa propriedade, você pode aplicar várias fontes, cores, e
outros atributos de partes selecionadas do texto em um campo de tabela ou um controle vinculado ao campo.
Em versões 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 formatação de recursos. No Access 2007, você
pode produzir relatórios de acesso com formatação variada dentro de blocos de texto, exibindo o texto entrado em
Campos de memorando de acesso em uma caixa de texto em um formulário.
O banco de dados de amostra para esta seção é RichText.accdb.
Para criar um campo que pode armazenar dados em formato Rich Text (nos bastidores, isso é feito usando
Código HTML, mas você não precisa se preocupar sobre como escrever o código), 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 página 5
Se você selecionar um bloco de texto em um campo Memorando de Text–enabled Rich, você verá um flutuante
barra de ferramentas que permite que você aplique alguma formatação, 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 numeração a partir desta ferramenta -
bar, você vai ter os marcadores ou números, mas o texto que corre ao longo de uma linha não 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 são não 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
Indentação incorreta de um item em uma lista numerada em um campo de Rich Text.
Criar um formulário 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 formatação da faixa de opções do formulário está habilitado, com uma variedade de seleções de formatação, como mostrado
na Figura 1.4.
A Figura 1.5 mostra a forma com uma variedade de atributos de formatação 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 página 6
FIGURA 1.4
Selecionar a formatação de uma porção de texto em um textbox Rich Text–enabled em um formulário.
FIGURA 1.5
Uma caixa de texto Rich Text–enabled com uma variedade de formatação aplicada a partes do seu texto.
7
Armazenar e exibir dados no Access
1
05_047026 ch01.qxp 02\/04\/07 21:41 página 7
Depois de ter aplicado formatação ao texto em um formulário, você pode criar um relatório baseado na tabela,
e a formatação será exibido o relatório também (veja figura 1.6).
FIGURA 1.6
Um relatório mostrando Rich Text formatação aplicada em uma caixa de texto em um formulário.
Criar cartas de formulário de acesso
Um exemplo mais realista de Rich Text formatação seria um relatório de letra de forma, com o corpo de
o texto da carta proveniente de um campo de Rich Text–enabled e as informações de nome e endereço do
uma tabela de contatos ou clientes. Eu criei uma tabela chamada tblLetterText no banco de dados exemplo, com
um campo de Rich Text–enabled 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 formatação pode ser
visto diretamente na tabela, embora você vai encontrá-lo mais fácil de criar e editar o texto rico em um textbox
controle em um formulário).
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 formatação será pre-
servido. No entanto, marcadores e listas numeradas não ser alinhadas corretamente, então é melhor desligar aqueles
características antes de copiar o texto para acesso.
Também criei uma tabela de uma linha para manter informações para utilizar o banco de dados; Neste caso, tem
dois campos de memorando de Text–enabled Rich para as informações de cabeçalho e a assinatura da carta. O formulário
fdlgSelectLetter (vinculado à tabela de informações, zstblInfo) permite que você edite o cabeçalho 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 página 8
FIGURA 1.7
Uma tabela com texto de corpo de letra formatada.
FIGURA 1.8
Uma forma de diálogo para editar o cabeçalho e as informações 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 página 9
Clicando no botão criar carta abre um relatório de acesso filtrado exibindo dados nome e endereço
o registro de contato selecionado, e o corpo de letra do tipo de letra selecionada, conforme representado na
Figura 1.9.
Com Rich Text formatação agora oferece suporte acesso formulários e relatórios, talvez você não precise pro-
Duce uma letra da palavra para obter a aparência que você quer em documentos impressos. No entanto, em comparação com a palavra,
Relatórios de acesso usando campos Rich Text–enabled Memo tem uma limitação significativa. No Word, você
pode colocar campos de mesclagem ou DocProperty campos dentro de um bloco de texto, para que a fusão de dados ou dados
armazenados no documento propriedades serão impresso em um determinado ponto no texto, com o texto ao redor
acondicionamento, conforme necessário, dependendo do comprimento do texto nos campos. Isso não é possível com um
Campo memorando em um relatório do Access, então 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 capítulo 2 para obter informações sobre como criar documentos do Word de vários tipos, preenchidos com
Dados de acesso.
FIGURA 1.9
Um relatório com texto formatado.
REFERÊNCIA CRUZADA REFERÊNCIA CRUZADA
10
Os componentes do Office e o que fazem melhor
Parte I
05_047026 ch01.qxp 02\/04\/07 21:41 página 10
Criando relatórios do tipo planilha no acesso
Se você precisa para produzir um relatório formatado em colunas e linhas da planilha-tipo familiar, você pode
fazer isso com um relatório do Access. Relatórios 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 formulário de tabela dinâmica ou de gráfico dinâmico.
Para demonstrar estas características, eu usei uma variação do banco de dados de exemplo Northwind, com objetos
renomeado de acordo com a Convenção de nomenclatura Leszynski.
Relatórios de folha de dados simples
O banco de dados de amostra para esta seção é modificado Northwind.accdb.
A consultaqryNorthwindAll links de todas as tabelas no banco de dados Northwind modificado. Para produzir
um relatório de folha de dados simples, iniciar, selecionando qryNorthwindAll e selecionando Assistente de relatório no
Grupo relatórios na guia criar da faixa de opções, como mostrado na Figura 1.10.
NOTA NOTA
11
Armazenar e exibir dados no Access
1
Usando uma Convenção de nomenclatura
EU
primeiro, percebi que um problema é trabalhar em um banco de dados com nenhuma convenção 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 formulário, um
relatório, uma função e cinco ou seis variáveis (de diferentes tipos de dados) chamaram vendas (isso foi apenas um
de um número de conjuntos de objetos com o mesmo nome). Isto significava que, quando eu encontrei a palavra
\"Vendas\" no código VBA, eu não tinha idéia se era uma referência a uma tabela, formulário, consulta, função, ou
variável, a menos que o contexto deixou claro. Houve inúmeros erros devido à utilização do
mesmo nome para diferentes tipos de objetos, porque (entre outras possíveis fontes de erros), você pode
Defina o valor de um campo com uma variável, ou com uma função — e se diversas variáveis e uma função
são todos chamados de vendas, o código pode usar a pessoa errada.
Você também pode obter erros de referência 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 formulário vinculado a uma tabela usando o
Assistente de formulário. Para evitar esses erros de referência, é uma excelente ideia de usar uma Convenção de nomenclatura para
objetos de banco de dados, controles e variáveis. Usar uma Convenção de nomenclatura também faz com que seu banco de dados auto-
documentação (em certa medida, pelo menos) e evita confusão ao selecionar um objeto de um
na lista suspensa.
Cerca de 10 anos atrás, 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 formulários e relatórios, usando o Leszynski
Convenção de nomenclatura (LNC). Este suplemento foi atualizado para o Access 2000, e que a versão ainda trabalha em
Access 2007; está disponível no código de exemplo #10 (Access 2000 ou mais bancos de dados) do
Página de amostras de código do meu site,
www.helenfeddema.com
.
05_047026 ch01.qxp 02\/04\/07 21:41 página 11
FIGURA 1.10
Selecionando o Assistente de relatório para criar um relatório.
Selecione os campos a serem incluídos no relatório (Ver Figura 1.11) e clique em Avançar.
FIGURA 1.11
Seleção de campos para um relatório.
12
Os componentes do Office e o que fazem melhor
Parte I
05_047026 ch01.qxp 02\/04\/07 21:41 página 12
Na tela seguinte do assistente (veja figura 1.12), selecione o agrupamento de nível superior que você deseja para o
relatório (neste caso, eu aceito a seleção padrão de OrderQuarter, cliente, OrderDate).
FIGURA 1.12
Selecionando um nível de agrupamento principal para um relatório.
A próxima tela permite que você selecione subgrupos, se desejado; Eu aceito o padrão (não mais sub-
Agrupamento, conforme mostrado na Figura 1.13).
FIGURA 1.13
Selecione níveis de subgrupo para um relatório.
13
Armazenar e exibir dados no Access
1
05_047026 ch01.qxp 02\/04\/07 21:41 página 13
Em seguida, selecione Classificar e resumir as opções; Selecionei ProductName para classificação, conforme
Figura 1.14.
FIGURA 1.14
Selecionando as opções de classificação e resumindo para um relatório.
Na tela de layout do relatório, representada na Figura 1.15, selecionei a opção de bloquear.
FIGURA 1.15
Selecionando a opção de layout de relatório 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 próxima tela, mostrado na Figura 1.16 (tenha em mente que alguns dos mais artísticos
estilos não vai olhar boas quando impressa em uma impressora preto e branco). Eu selecionei None para um relatório simples.
FIGURA 1.16
Selecionar um estilo de relatório.
Nomeie o relatório na tela do revestimento (Figura 1.17) — chamei-lhe rptNorthwindSales. Selecione
o design do relatório \"Modificar\" opção para abrir o relatório no modo design e clique em concluir.
FIGURA 1.17
A tela de concluir o Assistente de relatório.
15
Armazenar e exibir dados no Access
1
05_047026 ch01.qxp 02\/04\/07 21:41 página 15
Você vai precisar fazer alguns ajustes ao design do relatório na folha de propriedades; se
é não abrir, clique no botão folha de propriedades no grupo ferramentas na guia Design do
a faixa de opções, como mostrado na Figura 1.18.
FIGURA 1.18
Abrir a folha de propriedades.
Por padrão, no layout do relatório de bloquear apenas as células com valores têm bordas visíveis, então, para criar um
layout geral do tipo planilha, selecionar todos os controles na seção de detalhe do relatório e desligar
exibir valores de dados duplicados, definindo a propriedade de esconder duplica não na guia formato de
a folha de propriedades, como mostrado na Figura 1.19.
FIGURA 1.19
Definindo a propriedade de esconder duplica para não para eliminar dados duplicados em um relatório.
Embora geralmente não é um problema para controles de relatório ter os mesmos nomes que seu limite
campos (porque eles são raramente, se sempre, referenciado no código), 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 relatório criado
pelo Assistente de relatório, rótulos são nomeados com o sufixo não 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 página 16
O Assistente de relatório geralmente aplica-se o alinhamento padrão para cada rótulo de coluna, que
pode resultar em alinhamento inconsistente. Que não parece bom, então (se necessário) ajustar o
alinhamento de títulos de coluna rotula como desejado (geralmente eles devem ser tudo alinhado à esquerda ou
tudo centrado); sobre o relatório de exemplo fiz-lhes tudo centralizado.
Caso você precise ajustar a largura de uma coluna individual, pode ser necessário desativar o agrupamento de controle
(um recurso novo no Access 2007). Para fazer isso, primeiro selecione os controles na seção de detalhe
e clique na âncora do grupo amarelo que deve agora estar visível (embora não muito visível — Microsoft
deve ter selecionado uma cor com mais contraste do que maçante mostarda amarela) no canto superior esquerdo
do grupo, em seguida, botão 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 relatório de planilha-tipo de conclusão.
Interativamente, você pode classificar e filtrar um relatório no modo de exibição de relatório — 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 relatório de acesso do tipo de planilha.
FIGURA 1.22
A filtragem de um relatório 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 página 18
Depois de fazer a seleção, o relatório mostra apenas Gourmet Lanchonetes registros (Figura 1.23).
FIGURA 1.23
Um relatório filtrado por um valor para o cliente.
Tabelas dinâmicas
Se você precisar de mais avançada de interatividade, você pode fazer uma tabela dinâmica com base na mesma
qryNorthwindAll consulta. No Access 2007, o processo de criação de uma tabela dinâmica tem sido implicação-
cados; apenas selecione a tabela ou consulta de fonte de dados, selecione, conforme representado na Figura 1.24, tabela dinâmica
no menu mais formas do grupo na guia criar formulários da faixa de opções.
19
Armazenar e exibir dados no Access
1
05_047026 ch01.qxp 02\/04\/07 21:41 página 19
FIGURA 1.24
Criando uma tabela dinâmica.
Um novo formulário baseado na fonte de dados abre-se na dinâmica exibir (Ver Figura 1.25), com o campo
Lista aberta, assim que você pode arrastar os campos para as zonas de gota da tabela dinâmica, um campo de cada um para a linha
Campos, campos de coluna e (opcionalmente) campos de filtro soltar zonas, que são indicadas em texto cinza no
o canto superior esquerdo do formulário. O campo de dados a ser exibido no corpo da tabela é arrastado
para a zona de gota no centro do formulário; Acesso automaticamente criará um campo de contagem ou soma
se for caso disso.
Consulte o capítulo 5 do meu livro, especialista-em-um desenvolvimento de aplicativos Microsoft, para
obter mais informações sobre como criar e usar tabelas dinâmicas e gráficos dinâmicos.
Figura 1.26 mostra a tabela dinâmica com vendedor selecionado como o campo de linha e NomeDaCategoria como
o campo de coluna, com o preço que o campo totais.
REFERÊNCIA CRUZADA REFERÊNCIA CRUZADA
20
Os componentes do Office e o que fazem melhor
Parte I
05_047026 ch01.qxp 02\/04\/07 21:41 página 20
FIGURA 1.25
Uma dinâmica recém-criado, pronta para selecionar os campos.
FIGURA 1.26
Uma tabela dinâmica concluída.
21
Armazenar e exibir dados no Access
1
05_047026 ch01.qxp 02\/04\/07 21:41 página 21
Gráficos dinâmicos
Fazer um gráfico dinâmico é ainda mais fácil: selecione a tabela ou consulta de fonte de dados e clique em gráfico dinâmico
botão no grupo na guia criar formulários da faixa de opções. Figura 1.27 mostra o novo, em branco
Gráfico dinâmico com zonas de gota na parte superior e lado direito do formulário.
FIGURA 1.27
Um gráfico dinâmico novo e em branco.
Como com uma tabela dinâmica, 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 série
zona de rebaixamento, o CategoryName a zona para soltar filtro e o campo de preço para a zona de queda de dados,
e eu selecionei a categoria de produtos lácteos para filtrar os dados. Figura 1.28 mostra o gráfico dinâmico
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 gráfico dinâmico com campos atribuído às suas zonas de gota.
O próximo passo é dar nomes aos eixos de vertical e horizontal do gráfico. Para citar os eixos, selecione um
Rótulo do título 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 rótulo de eixo.
FIGURA 1.29
Nomeando o eixo vertical de um gráfico dinâmico.
23
Armazenar e exibir dados no Access
1
05_047026 ch01.qxp 02\/04\/07 21:41 Page 23
Para fazer a legenda do gráfico visível (geralmente uma boa idéia), clique no botão de legenda no
Mostrar\/ocultar grupo do guia de Design da faixa de opções, como mostrado na Figura 1.30.
FIGURA 1.30
Legenda do gráfico dinâmico tornando visível.
O gráfico de pivô terminou é mostrado na Figura 1.31.
FIGURA 1.31
Um gráfico dinâmico preenchido.
Acesso 2007 informa ter alguma interatividade e tabelas dinâmicas e gráficos dinâmicos têm quase unlim-
ITED interatividade, mas ambos têm uma limitação séria: a interatividade só está disponível quando você está
trabalhando no banco de dados Access; Quando você envia um relatório de acesso, tabela dinâmica ou gráfico dinâmico para
alguém que não tem acesso, dizer como um arquivo PDF, o destinatário recebe uma imagem somente leitura do
relatório, tabela dinâmica ou gráfico dinâmico, com nenhuma interatividade. Este pode ser o que você quer em alguns casos;
mas se você precisa entregar dados em um formato gráfico ou planilha que os usuários podem interagir com você
necessidade de criar um gráfico ou planilha do Excel a partir de seus dados de acesso, ao invés de um relatório de tabela dinâmica,
ou de gráfico dinâmico.
24
Os componentes do Office e o que fazem melhor
Parte I
05_047026 ch01.qxp 02\/04\/07 21:41 página 24
Consulte o capítulo 3 para obter informações sobre a criação de planilhas Excel e gráficos cheios
Repleta de dados de acesso e o capítulo 12 para obter informações sobre como criar gráficos dinâmicos do Excel
Dados de acesso.
Resumo
Neste capítulo você aprendeu sobre algumas novidades do Access 2007, especialmente aquelas relacionadas
a produção de relatórios 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 relatórios 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 características especiais desses componentes do Office ou para distribuir seus dados em formatos que pode
ser usado por quem tem o Office, você tem duas opções: usar as built-in seleções de exportação em
faixa de opções, ou escrever um código VBA para criar os documentos do Office e enchê-los com dados de acesso. O
próximos três capítulos descrevem como criar documentos do Word, planilhas do Excel ou gráficos, e
Itens do Outlook e enchê-los com dados de acesso.
REFERÊNCIA CRUZADA REFERÊNCIA 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 formatação mais sofisticados
do que está disponível em um relatório do Access, sua melhor opção é 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-
posições, o tipo de dados para exportação e as preferências do usuário. Este capítulo dis-
cusses os vários tipos de documentos do Word que você pode criar e os métodos
você pode usar para preenchê-las com dados, com exemplos básicos.
Para exemplos mais complexos e realistas de exportação
Acessar dados em documentos do Word, consulte os capítulos 6 e 12.
O banco de dados de amostra para este capítulo é o acesso a
Word.accdb.
Documentos do Word enchimento com
Acessar dados usando o TypeText
Método
Você pode criar um documento do Word em branco (baseado no padrão Word tem
placa) com duas linhas de código:
Set appWord = GetObject (, \"Word. Application\")
Conjunto doc = appWord.Documents.Add
NOTA NOTA
REFERÊNCIA CRUZADA REFERÊNCIA CRUZADA
27
NESTE CAPÍTULO
Modelos e documentos do Word
Trabalhando com marcadores de palavra
Trabalhando com o TypeText
método
Trabalhando com documentos do Word
Propriedades
Trabalhando com campos de formulário
Trabalhando com tabelas
Criação de documentos do Word
de acesso
06_047026 ch02.qxp 02\/04\/07 21:41 Page 27
Na maior parte da minha automação de código trabalhando com outros aplicativos do Office (Word, Excel,
e Outlook), eu uso o
GetObject
função no corpo de um procedimento, para definir uma refer-
ENCE a instância em execução do pedido, se houver; manipulador de erro do procedimento é executado
CreateObject
se o aplicativo não estiver em execução (consulte os exemplos de código no final deste capítulo
para obter exemplos). Isso impede que a criação de várias instâncias do Word, Excel ou Outlook.
Se você não precisa de qualquer fantasia formatação, apenas um documento de texto sem formatação, você pode preencher um em branco palavra docu-
mento com texto usando o TypeText método. O FillWithTypeText procedimento listado em seguida
Cria um documento em branco do Word, então entra um título 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 título 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 usuário
Comentários):
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 não 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
Classificação entre em contato com nomes em ordem alfabética:
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 então
Palavra não está em execução; 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 página 29
Se você não conhece a sintaxe do VBA para uma operação, você pode gravar uma macro do Word para
criar um procedimento que contém o código, embora você pode ter que cortar fora o excesso —
macros gravadas geralmente definir cada argumento único de um método, ou não são necessários.
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 método TypeText.
Utilizando modelos do Word para a criação de
Documentos do Word formatado
O TypeText método usado na seção anterior só é adequado para a criação de palavra muito simples
documentos. Se você precisa para produzir documentos de Word totalmente formatados, com cabeçalhos, rodapés, e
seções com margens diferentes, ou se você precisa colocar acessar dados em vários pontos dentro de blocos
do texto, é melhor preparar um ou mais modelos de Word com antecedência, formatá-los conforme necessário.
Em seguida, você pode criar novos documentos a partir de modelos e enchê-los com dados de acesso, conforme necessário,
usando marcadores ou (meu método preferido) Propriedades de documento do Word.
O primeiro passo é criar os modelos do Word, com cabeçalhos, rodapés, logotipo e fontes diferentes, como
necessários. Dependendo do método 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 página 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 cabeçalho e rodapé, fontes diversas e dois seg-
ções, o primeiro para a letra em si e o segundo para uma correspondência COM 10 envelope. Coloquei vários
marcadores na parte da letra do modelo, onde a carta data, nome e endereço e Santos -
tação deve imprimir, e campos de referência cruzada no envelope da parcela, para imprimir o nome e
Endereço lá, bem como um código de barras PostNet ZIP.
Este capítulo 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 gerência de pessoas-
Ning Office 2007, então se você precisa distribuir documentos do Word para pessoas executando versões mais antigas do
Exercício, é 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 informações de usuário do Word
Y
ou pode colocar a palavra UserName e UserAddress campos no cabeçalho do documento para imprimir seu
nome e endereço. Se você já usou esses campos em versões 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 usuário
Guia de informações da caixa de diálogo Opções). No Word 2007, o nome de usuário é inserido no nome do usuário
campo na página Personalizar da caixa de diálogo Opções do Word, que é aberto a partir das opções do Word
botão no menu arquivo.
Inserir o nome de usuário na caixa de diálogo Opções 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 informações de endereço do usuário são inseridas em um local diferente, como \"Endereço\" no
inferior da página avançada da caixa de diálogo Opções do Word.
Digitando o endereço (endereço de usuário) na caixa de diálogo Opções do Word.
Para colocar um campo com o nome de usuário ou endereço de usuário em um modelo, selecione o campo das partes rápidas
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 diálogo de campo (semelhante ao que no Word 2003), onde você pode selecionar o nome de usuário
ou o campo de endereço do usuário para inserção.
Inserir o campo de UserAddress em um modelo.
A figura a seguir mostra as informações de nome e endereço do usuário em um modelo de cabeçalho.
Um modelo de cabeçalho com informações de nome e endereço do usuário de campos de informações de usuário 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 Tabulação, como na Figura 2.2.
É aconselhável desmarcar a caixa de seleção \"Preservar formatação durante as atualizações\" quando
inserindo campos, caso contrário você pode obter diferentes fontes ou tamanhos para o texto exibido no
os campos.
FIGURA 2.2
Abrindo a caixa de diálogo Bookmark.
Digite o nome do marcador na caixa de diálogo marcador e clique em Adicionar (Figura 2.3).
FIGURA 2.3
Criar um indicador.
Por padrão, você não verá os marcadores em forma de i que indicam favoritos em uma palavra docu-
mento; para vê-los, marque a caixa \"Mostrar marcadores\" na página avançada da
Diálogo de opções 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 diálogo Opções do Word.
A Figura 2.5 mostra a segunda página (envelope) do modelo palavra Milano, com informações do usuário
campos, bookmarks e um campo de código 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 código de dados de amostra do capítulo, o pressuposto é que os modelos do Word
estão localizados na pasta padrão, que é c: \/ usuários\/nome\/AppData\/Roaming \/
Modelos\/Microsoft Windows Vista ou c: \/ documentos e configurações do usuário\/nome\/aplicação
Dados \/ \/ modelos de Microsoft para Windows XP. Para um método mais flexível da criação de modelos
pasta, consulte o capítulo 6.
O formulário frmContacts no exemplo de acesso ao banco de dados do Word exibe contatos localizados na
ESTADOS UNIDOS DA AMÉRICA A forma, mostrada na Figura 2.6, tem três botões, cada um deles cria uma carta para o
contato selecionado usando um método diferente.
FIGURA 2.6
O formulário de contatos com botões para criar letras da palavra.
O código 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
REFERÊNCIA CRUZADA REFERÊNCIA 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 usuário padrão na caixa de diálogo Opções do Word (ele ainda está disponível no código,
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 próximo
Tente localizar o modelo na pasta de modelos padrão e colocar uma mensagem se não for encontrado:
Conjunto fil = fso.GetFile(strTemplateNameAndPath)
Se o fil é nada então
strPrompt = \"Não 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 informações 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: = \"Saudação\"
.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á disponível para uso pelo campo de código 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 então
38
Os componentes do Office e o que fazem melhor
Parte I
06_047026 ch02.qxp 02\/04\/07 21:41 Page 38
Palavra não está em execução; 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 invés de marcadores de dados de acesso de gravação para uma palavra
documento, você não 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 endereço do destinatário na carta
e o envelope). Você pode gravar os dados para uma propriedade de documento uma vez e exibi-lo em vários
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 informações 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 informações do documento, com alguns dos mais comuns documento próprio-
laços exibida (Ver Figura 2.8).
FIGURA 2.8
O painel de informações do documento.
Para obter a folha de propriedades, selecione avançado 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 começar a criar propriedades do documento.
FIGURA 2.9
A página personalizada da folha Propriedades do Word.
Para criar uma propriedade de documento, digite seu nome (sem espaços), selecione o tipo, digite um valor (um espaço
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 (adereços 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 (adereços de Doc).
Em seguida, coloque DocProperty campos no modelo onde você deseja que os valores nas propriedades para doc
exiba.
Um indicador é ainda necessária, mesmo se você estiver usando propriedades de doc para exibir dados de
Acesso: O campo de código de barras deve fazer referência a um indicador a fim de criar o PostNet
código 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 opções, selecione DocProperty como o tipo de campo e, em seguida, selecione a propriedade do doc da propriedade
lista (veja a Figura 2.11).
Não 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 página 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 página do modelo de carta de Milano (DocProps), com informações do usuário 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 código 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 usuário padrão na caixa de diálogo Opções do Word:
strTemplatePath = _
appWord.Options.DefaultFilePath(wdUserTemplatesPath) _
& “\”
Debug. Print \"pasta modelos:\"
strTemplateName = \"Carta de Milano (Doc adereços). dotx\"
strTemplateNameAndPath = strTemplatePath
Em erro continuar próximo
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 padrão e colocar uma mensagem se não for encontrado:
Conjunto fil = fso.GetFile(strTemplateNameAndPath)
Se o fil é nada então
strPrompt = \"Não pode encontrar\"
& “ in “ & strTemplatePath & “; canceling”
MsgBox strPrompt, vbCritical + vbOKOnly
GoTo ErrorHandlerExit
End If
No erro GoTo ErrorHandler
Conjunto doc = appWord.Documents.Add(strTemplateNameAndPath)
Gravar informações 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 então
Palavra não está em execução; 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 formulário
Às vezes você precisa criar documentos que exibem alguns dados de acesso e também permitir que os usuários
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 conteúdo do Word (campos de formulário chamado nas versões anteriores do
Palavra) para os dados inserido pelo usuário.
O terceiro botão no frmContacts cria uma carta repleta de dados do Access, usando propriedades de doc;
Além disso, o modelo tem dois campos de formulário, a ser preenchido pelo usuário ao criar o docu-
mento. Naturalmente, os usuários podem apenas digitar texto em um documento, mas campos de formulário permitem que o desenvolvedor
limitar as informações para uma seleção de valores apropriados, talvez em uma seção do documento protegido
que não permite a entrada de forma livre.
Para inserir um controle de conteúdo em um modelo, selecione o tipo de controle do grupo controles sobre a
Guia do desenvolvedor da faixa de opções, como mostrado na Figura 2.13.
FIGURA 2.13
Inserir um controle de conteúdo do tipo dropdown.
Se você não vir a guia desenvolvedor, ligá-lo, verificando o \"Mostrar guia Desenvolvedor na
Fita\"a caixa de seleção na página Personalizar da caixa de diálogo Opções do Word (Figura 2.14).
Para adicionar as opções de uma lista de caixa pendente ou de combinação, alternar para modo Design clicando o
Projetar o botão 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 opções 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 opções de lista drop-down nas propriedades da folha (Ver Figura 2.16). Para adicionar uma escolha,
Clique no botão Adicionar, digite o nome para exibição e valor e clique em OK; Repita para cada seleção você
deseja adicionar à lista.
FIGURA 2.16
Adicionando opções para um controle de conteúdo de lista drop-down.
Não marque a caixa de seleção \"O conteúdo não pode ser editado\"; se o fizer, as seleções não podem ser
feita a partir da lista drop-down.
Quando um novo documento é criado a partir de um modelo com controles de conteúdo, quando você passar o
Passe o mouse sobre um controle de conteúdo, o título 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 conteúdo de lista suspensa.
Resumo
Este capítulo cobriu três métodos que você pode usar para acesso de gravação de dados em documentos do Word
(Propriedades TypeText, marcadores e doc). Com o auxílio destas técnicas 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 formatação 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 relatórios de acesso, conforme descrito no
Capítulo 1 ou você pode apresentar os dados interativamente em tabelas dinâmicas ou
Gráficos dinâmicos. Mas, como mencionado no capítulo 1, estas opções têm alguns
limitações, porque você só pode trabalhar interativamente com tabelas dinâmicas e
Gráficos dinâmicos 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 são uma excelente escolha.
Ao invés de elaboração dos relatórios de acesso, tabelas dinâmicas ou gráficos dinâmicos (ou em
Além deles), você pode exportar dados para Excel e permite aos usuários analisar
os dados com as ferramentas do Excel. Esta opção está disponível para todos que tem
Office instalado, pois as edições as mais básicas do Office incluem Excel,
Considerando que o acesso só é incluído em algumas edições (mais caros).
Você pode exportar os dados do Access para uma planilha não formatada e deixe-o
os usuários trabalham com ele como eles querem (isto funciona bem, se eles só precisam de dados e
não exigem formatação fantasia), ou você pode criar modelos de Excel e exportar
os dados para uma nova planilha, feita a partir de um modelo; Esta técnica permite
você para fazer alguma da formatação com antecedência.
Uma terceira alternativa é exportar os dados de acesso a qualquer um uma planilha padrão
ou uma planilha criada a partir de um modelo e classificar os dados, criar totais, ou
aplica a formatação usando os comandos do Excel no código VBA. As seções a seguir
Descreva usando estes três métodos para exportar dados do Access para o Excel.
O banco de dados de amostra para este capítulo é o acesso a
Excel.accdb.
NOTA NOTA
49
NESTE CAPÍTULO
Exportar dados do Access para Excel
usando um comando de fita
Criando novas planilhas de Excel
a partir de modelos
Formatação de dados do Access exportados
para uma planilha do Excel
Análise de dados com Excel
07_047026 ch03.qxp 02\/04\/07 21:42 Page 49
Exportação de dados de acesso para
uma planilha não formatada
Se você só precisa mover um bloco de dados do Access para o Excel, e você não precisa formatar fantasia-
Ting, você pode usar o comando Excel no grupo de exportação na guia dados externos da faixa de opções
para exportar os dados de acesso para uma planilha simples, sem formatação. 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 exportação de dados, pois ele contém todos os dados que você pode
deseja exportar. (A Figura 3.1 mostra esta consulta selecionada na barra de objeto.)
FIGURA 3.1
Exportação para Excel de um comando de fita.
Clique o comando Excel com um objeto de banco de dados selecionado abre a caixa de diálogo de exportação, onde você
pode navegar para a pasta onde a planilha deve ser salvo e selecione um formato de arquivo de planilha.
Esta caixa de diálogo é mostrada na Figura 3.2. Você pode verificar os \"exportar dados com formatação e layout\"
Seleção se desejado, mas não faz muita diferença ao exportar dados de tabelas ou
consultas e eu não recomendo exportar dados de formulários ou relatórios, porque a formatação você
precisa em Excel não é o mesmo que a formatação que você precisa em um acesso de formulário ou relatório.
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 diálogo de exportação aberta do comando Excel.
Usando qryNorthwindAll como a fonte de dados, você começa 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
Análise 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 várias tabelas e também
para formatar os dados como você deseja que ele apareça na planilha destino, usando dados tipo conver-
funções de Sion, tais como
CDate CCur
, , ou
CStr
.
Com alguns cliques, você pode redimensionar as colunas da planilha, conforme necessário, edite os cabeçalhos de coluna como
necessário e fazer a linha de cabeçalho 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 formatação 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 necessário — por exemplo, adicionando um grande, centrado títulos de coluna e título com adequada
texto, talvez em uma fonte maior ou mais ousada do que a área de dados. Então, em vez de usar o Excel com-
Matos na faixa de opções, usar código 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 diálogo (fdlgArchiveOrders) que permite que o usuário selecione uma data
intervalo para arquivamento de dados de ordens, como mostrado na Figura 3.5.
Observe o ícone do calendário ao lado os controles data (ele aparece quando um controle acoplado a um
Campo de data tem o foco). Clicando no ícone abre um calendário para selecionar uma data válida,
como mostrado na Figura 3.6. O novo calendário pop-up é definitivamente útil, apesar de selecionar uma data em muito o
passado pode ser entediante, porque não 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 diálogo para selecionar dados Northwind Orders para arquivar.
FIGURA 3.6
Selecionar uma data do calendário pop-up.
Uma vez que a data inicial e data final foram inseridos ou selecionados, clique no botão 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 diálogo como
argumentos. Este procedimento é listado como segue, junto com o CreateAndTestQuery proce-
Dure, que ele usa para criar uma consulta por meio de programação e outro procedimento ( TestFileExists ) que
testa se um arquivo existe em uma pasta específica:
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
Análise 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 diálogo:
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 então
Sair se nenhum pedidos encontram-se no intervalo de datas selecionado:
strPrompt não = \"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 não for encontrado:
strTitle = \"Modelo não 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 célula de título:
Set rng = wks.Range(\"a1\")
strSheetTitle = \"Arquivados ordens para\" _
& Format(dteStart, “d-mmm-yyyy”) _
& “ to “ & Format(dteEnd, “d-mmm-yyyy”)
Debug. Print \"título da folha:\"
RNG.Valor = strSheetTitle
Ir para a primeira célula de dados:
Definir rngStart = wks.Range(\"A4\")
Set rng = wks.Range(\"A4\")
Redefina lngCount para o número 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 próxima célula:
55
Análise 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! [NomeDoDestinatário])
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! [PaísDeDestino])
Set rng = rng.Offset(columnoffset:=1)
RNG.Valor = Nz (rst! [Produto])
Set rng = rng.Offset(columnoffset:=1)
RNG.Valor = Nz (rst! [PreçoUnitário])
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 próxima 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 diálogo:
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 página 56
ChDir strDBPath
Em erro continuar próximo
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ê não 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 \"seqüência SQL:\"
StrSQL DoCmd.RunSQL
strSQL = \"excluir tblOrders.* de tblOrders onde\" _
& “[ShippedDate] Between #” & dteStart & “# And #” _
& dteEnd & “#;”
Debug. Print \"seqüência 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
Análise de dados com Excel
3
07_047026 ch03.qxp 02\/04\/07 21:42 Page 57
ErrorHandler:
' Excel não está em execução; Abra o Excel com CreateObject
Se Err. Number = 429 então
Set appExcel = CreateObject(\"Excel.Application\")
Retomar em seguida
Outra coisa
MsgBox \"erro nenhum:\"
Resume ErrorHandlerExit
End If
End Sub
Público função CreateAndTestQuery(strTestQuery As String, _
strTestSQL As String) como longo
Essa função é chamada de outros procedimentos para criar uma consulta filtrada, usando uma seqüência de caracteres SQL em sua
strTestSQL argumento:
Em erro continuar próximo
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
Função pública TestFileExists(strFile As String) As Boolean
Em erro continuar próximo
TestFileExists = não (Dir(strFile) = \"\")
End Function
O código do banco de dados de amostra requer uma referência à biblioteca de objeto do Excel;
A Figura 3.7 mostra essa referência marcada na caixa de diálogo referências, que é aberto
no menu ferramentas na janela do Visual Basic.
FIGURA 3.7
Definir uma referência para o modelo de objeto do Excel.
Após 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 após os registros são arquivados.
NOTA NOTA
59
Análise de dados com Excel
3
07_047026 ch03.qxp 02\/04\/07 21:42 Page 59
Consulte o capítulo 7 para uma forma mais flexível de especificar uma pasta de modelos e documentos
pasta.
Após o código 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 recém criada com o xlWorkbookDefault valor para oFileFormat
argumento salva-o como uma planilha do Excel padrão. Se você precisa salvar a planilha em outro para-
esteira, talvez para uso por alguém executando uma versão anterior do Excel, você pode usar um dos outros
valores na XlFileFormat enum, que são mostradas no navegador de objeto na Figura 3.11. O
xlExcel9795 constante nomeada criará uma planilha em um formato utilizável por pessoas correndo
Excel 95 ou 97. (As opções de formato de planilha disponíveis no código VBA são muito mais numerosos
do que aqueles disponíveis 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 opções de formato de arquivo para salvar uma pasta de trabalho do Excel.
Se você criar uma planilha no novo formato xlsx, apenas usuários do Office 2007 poderão
para abri-lo. Para criar uma planilha que pode ser aberta e editada por usuários com mais cedo
versões do Office, selecione um dos outros formatos. O formato de pasta de trabalho (. xls) do Excel 97–Excel 2003
(mostrado sendo selecionado na Figura 3.12) é utilizável 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
Análise de dados com Excel
3
07_047026 ch03.qxp 02\/04\/07 21:42 Page 61
Para abrir o navegador de objeto pela análise de componentes de um modelo de objeto, abra a
Janela do Visual Basic e selecione objeto navegador do menu Exibir, ou pressione F2.
Formatação de planilhas de Excel no código VBA
Se você precisar classificar, grupo, travessão ou caso contrário formato exportados dados em uma planilha do Excel ou cre-
comeu um total sob a última linha de dados, você pode escrever código VBA para usar comandos do Excel para fazer o
trabalha no código. Você pode aplicar formatação a uma planilha criada pelo TransferirPlanilha
método, ou um criado a partir do comando de fita ou uma planilha criada programaticamente a partir
um modelo.
Consulte o capítulo 7 para obter exemplos de criação de planilhas utilizando o
TransferirPlanilha
método.
Nesta seção, os dados de qryOrdersAndDetails são exportados para uma nova planilha, feita a partir de uma tem-
placa e, em seguida, formatado no código. Para sua conveniência, 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 cabeçalhos de coluna.
Em seguida, a área de dados da planilha é classificada pelas duas primeiras colunas (país e categoria) e o
valores extras são removidos (o efeito é semelhante ao ligar esconder duplica em um relatório 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
REFERÊNCIA CRUZADA REFERÊNCIA 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 não for encontrado:
strTitle = \"Modelo não 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 célula de dados na planilha:
Definir rngStart = wks.Range(\"A4\")
Set rng = wks.Range(\"A4\")
63
Análise de dados com Excel
3
07_047026 ch03.qxp 02\/04\/07 21:42 Page 63
Redefina lngCount para o número de registros na consulta:
RST.MoveLast
RST.MoveFirst
lngCount = rst.RecordCount
Para n = 1 para lngCount
Gravar dados do conjunto de registros para as células na linha atual da planilha, usando o columnoff-
conjunto argumento para mover para a próxima célula:
RNG.Valor = Nz (rst! [PaísDeDestino])
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! [PreçoUnitário])
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 próxima linha da planilha, usando o RowOffset argumento:
RST.MoveNext
Set rng = rngStart.Offset(rowoffset:=n)
Seguinte n
Determinar o número de linhas de dados na planilha com o UsedRange Propriedade:
lngRows = wks.UsedRange.Rows.Count
Debug. Print \"o número 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 cabeçalhos 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 país e por categoria:
strDataRange = \"A3: eu\"
strKey1Range = \"A4:A\"
strKey2Range = \"B4:B\"
Debug. Print \"intervalo de dados:\"
65
Análise 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.Classificação
.SetRange Range(strDataRange)
.Cabeçalho = xlYes
.MatchCase = False
.Orientação = xlTopToBottom
.SortMethod = xlPinYin
.Aplicar
Terminar com
Remova os países duplicados:
Set rng = wks.Range(\"A:A\")
Para i = 4 para lngRows
Debug. Print rng.Células (i, 1).Endereço
& rng.Cells(i, 1).Value
Se rng.Células (i, 1) = rng.Cells (i - 1, 1), em seguida
RNG.Células (i, 1).Font.ColorIndex = 2
ElseIf rng.Células (i, 1).Valor <>strCountry, em seguida
Debug. Print \"Diferentes dados em\" _
& rng.Cells(i, 1).Address
strCountry = rng.Células (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.Células (i, 1).Endereço
& rng.Cells(i, 1).Value
Se rng.Células (i, 1).Valor = rng.Cells (i - 1, 1), em seguida
RNG.Células (i, 1).Font.ColorIndex = 2
ElseIf rng.Células (i, 1).Valor <>strCategory, em seguida
Debug. Print \"Diferentes dados em\" _
& rng.Cells(i, 1).Address
strCategory = rng.Células (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 \"fórmula:\"
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
Análise 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 título 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 próximo
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 não está em execução; 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 então
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 código do VBA.
Resumo
Quando você precisa exportar dados de acesso a planilhas do Excel para que todo aquele que tem o escritório pode
trabalhar com eles, você pode usar as técnicas discutidas neste capítulo para exportar dados do Access na
interface ou usando código do VBA, para uma planilha padrão simples, ou uma planilha formatada criada
de um modelo do Excel.
69
Análise 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 comunicação via
e-mail, mantendo um calendário e armazenar contatos e tarefa infor-
ção. Para e-mail e compromissos (um conjunto de compromissos em uma pasta
é chamado um calendário), a interface do Outlook é tão superior que eu recomendo
não 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 necessário.
Caminho de volta no Access 2.0, eu criei um banco de dados para gerenciar tarefas, permitindo-me
para lhes atribuir prioridades, início 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á não era necessária, porque Outlook
inclui a sua própria lista de tarefas (ou para fazer a lista, como ele é rotulado como no Office 2007). Todos os
as características que eu queria foram construídas para a lista de tarefas do Outlook, então 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, não é necessário para armazenar dados de tarefa
no Access, embora em algumas circunstâncias especiais talvez você precise fazer isso,
e, em seguida, talvez, exportar os dados para o Outlook.
Outlook raramente usado componente diário, que registra a criação de
itens selecionados do Outlook, bem como itens inserido pelo usuário, também 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 vários tipos de itens do Outlook e adicionar manual
entradas para o jornal, conforme necessário. No entanto (como com tarefas), lá pode justificar-
aliado ser circunstâncias em que você precisa exportar dados do Access para
Itens de diário do Outlook e eu descrever um no final deste capítulo.
71
NESTE CAPÍTULO
Criar compromissos do Outlook
e tarefas de dados de acesso
Gravar os dados de acesso para o
Diário 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 endereços de e-mail em uma tabela de contatos, clientes ou clientes, você pode usar código do VBA para cre-
comeu e-mails para eles de uma forma de acesso, tanto para um único destinatário ou de um grupo de destinatários, sem
ter que mudar para o Outlook.
Contatos são outra questão — 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 são deficientes em um muito impor -
tante recurso em relação ao acesso: Outlook todos os dados são armazenados em uma tabela MAPI de arquivos simples, assim você
não é possível definir relacionamentos um-para-muitos entre (por exemplo) e contatos ou contatos
e números de telefone. Se uma empresa se move para outro local ou muda de nome, você tem que fazer
a alteração manualmente em cada contato que a empresa; se um contato tiver mais de três endereços,
ou um número de telefone que não se encaixa em uma das categorias disponíveis, 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 capítulo 11 para uma discussão sobre o banco de dados de sincronização de contatos. Capítulo 8
lida com exportadores e importadores contatos sem sincronização.
Este capítulo 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 capítulo é o acesso ao Outlook.accdb.
Compromissos de exportação
e tarefas para o Outlook
Se você tiver uma tabela de acesso de funcionários, contato ou informação do cliente, talvez você precise criar
Compromissos do Outlook ou tarefas com base nas informações os registros da tabela. A tabela de tblEmployees
no exemplo banco de dados tem empregado dois campos de data de revisão: LastReviewDate e NextReviewDate.
A Figura 4.1 mostra o formulário frmEmployees, que está vinculado a esta tabela.
A próxima revisão do empregado pode ser agendada, digitando uma data no campo data de revisão próxima e então
clicando no botão de cronograma de nomeação. Código sobre a BeforeUpdate evento de txtNextReviewDate
(listados em seguida) verifica que a data inscrita (selecionadas usando o pop-up calendário) é uma terça-feira ou
Quinta-feira (a suposição é que funcionário comentários só são feitos naqueles dias):
Private Sub txtNextReviewDate_BeforeUpdate (Cancel As Integer)
No erro GoTo ErrorHandler
Dim strWeekday As String
Dim intWeekday As Integer
NOTA NOTA
REFERÊNCIA CRUZADA REFERÊNCIA 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 formulário de funcionários com campos de data de revisão.
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 = _
\"Comentários não 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 = \"Comentários 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 página 73
strTitle
Cancelar = True
GoTo ErrorHandlerExit
Caso vbTuesday, vbThursday
Data é uma terça 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 código, você precisará definir uma referência para o objeto do Outlook
biblioteca (selecione Ferramentas

Referências na janela do Visual Basic, como mostrado na Figura 4.2). Para
evitar a criação de múltiplas instâncias do Outlook, eu gosto de usar um manipulador de erro que vai abrir uma nova instância
de usar o Outlook
CreateObject
se o
GetObject
função falhará porque o Outlook não estiver sendo executado.
FIGURA 4.2
Definir uma referência à 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 terça ou quinta-feira foi selecionada ou entrou, clicando em agenda
Botão de nomeação cria três 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 botãoClique 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 variáveis para obter informações exportar para o Outlook:
strTitle = \"Falta informação\"
Se IsDate (Me! [txtNextReviewDate].Valor) = True Then
dteNextReviewDate = CDate (Me! [txtNextReviewDate].Valor)
Outra coisa
strPrompt = _
\"Nenhuma data próxima de revisão; não é possível criar a nomeação\"
MsgBox strPrompt, vbOKOnly + vbExclamation, strTitle
GoTo ErrorHandlerExit
End If
strEmployeeName = Me![FirstNameFirst]
strSupervisorName = Nz (Me! [cboReportsTo].Column(1))
Se strSupervisorName = \"\", em seguida,
strPrompt não = \"nenhum supervisor selecionado; não é possível agendar revisão\"
strTitle não = \"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 referência (ou criar) o calendário do contato:
Em erro continuar próximo
Definir fldTopCalendar = _
appOutlook.Session.GetDefaultFolder(olFolderCalendar)
Definir fldContactCalendar = _
fldTopCalendar.Folders(strEmployeeName)
Se fldContactCalendar não é nada então
Definir fldContactCalendar = _
fldTopCalendar.Folders.Add(strEmployeeName)
End If
Como referência (ou criar) calendário do supervisor:
Definir fldSupervisorCalendar = _
fldTopCalendar.Folders(strSupervisorName)
Se fldSupervisorCalendar não é nada então
Definir fldSupervisorCalendar = _
fldTopCalendar.Folders.Add(strSupervisorName)
End If
No erro GoTo ErrorHandler
Crie compromisso no calendário do contato:
Conjunto appt = fldContactCalendar.Items.Add
Com o appt
.Iniciar = CStr(dteNextReviewDate)
.AllDayEvent = False
.Localização = \"Pequena sala de conferências\"
.ReminderMinutesBeforeStart = 30
.ReminderSet = True
.ReminderPlaySound = True
.Assunto = \"Rever com\"
.Fechar (olSave)
Terminar com
Crie compromisso no calendário do supervisor:
Conjunto appt = fldSupervisorCalendar.Items.Add
Com o appt
.Iniciar = CStr(dteNextReviewDate)
.AllDayEvent = False
.Localização = \"Pequena sala de conferências\"
.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 nomeação):
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 código primeiro tenta definir referências do supervisor e do funcionário pastas sob o padrão
Pasta de calendário. Se não houver nenhuma pasta do empregado (ou supervisor), ele cria uma nova pasta
para o funcionário ou um supervisor, usando o Adicionar método da coleção de pastas na pasta calendário.
Em seguida, a coleção de itens da pasta do supervisor é usada para criar um novo item do item padrão
Digite nessa pasta e da mesma forma para a pasta do empregado. Você também pode criar um novo item usando o
CreateItem método para o objeto de aplicativo do Outlook, mas que cria o item no padrão
pasta; Se você deseja criar um item em uma pasta personalizada, você precisa usar o Adicionar método em vez disso.
Você não pode usar o
Adicionar
método diretamente com uma pasta do Outlook; Esse método funciona com
coleções, como a coleção de itens ou a coleção de pastas.
Finalmente, você vai receber uma mensagem \"Done\" (Figura 4.3), relatórios sobre as nomeações e de tarefas que
foram programadas.
A Figura 4.4 mostra várias pastas de funcionário e gerente sob a pasta de calendário padrão e uma
nomeação de supervisor no calendário diário.
Se você não vê as pastas de funcionário e gerente, você provavelmente está em outro ponto de vista;
alternar para modo de exibição de pasta para ver as pastas de calendário.
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 código.
Você pode clicar duas vezes a nomeação 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 informações de jornal para Outlook
Se você link para importar a transação de mainframe ou lote de processamento de dados em um banco de dados do Access
tabela, pode ser conveniente exportar dados para itens de diário do Outlook, para referência rápida 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 diário do Outlook.
A função que exporta os dados de mainframe para itens de diário do Outlook é listada como segue (para con-
venience, essa função é executada a partir do mcrExportTransactions de macro):
Função pública 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 não 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 vários campos de tabela, para gravação em campo de corpo do item diário:
strBody = IIf (rst! [Débito] > 0, _ \"Débito de\"
& Format(rst![Debit], “$###,##0.00”) _
& “ for “, “”) & IIf(rst![Credit] > 0, _
\"Crédito de\"
# # \"$ #, ##0.00\")
& “Account No. “ & rst![Account]
Debug. Print \"seqüência de caracteres do corpo:\"
JNL.Corpo = strBody
JNL.Fechar (olSave)
RST.MoveNext
Loop
strTitle = \"Feito\"
strPrompt = \"todas as transações exportados para Outlook\" _
& “journal items”
MsgBox strPrompt, vbOKOnly + vbInformation, strTitle
ErrorHandler:
' Não está executando o outlook; Abra o Outlook com CreateObject
Se Err. Number = 429 então
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 diário criadas pelo procedimento anterior.
Essa função primeiro configura um conjunto de registros DAO baseado em loops através dele, creat - e tblMainframeData
ing um novo item de jornal na pasta de diário padrão 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 diário criado a partir de um registro de transação.
Para evitar ter que criar um formulário personalizado do jornal, o código grava os dados de departamento para as empresas
Campo (empresa interface) de um item padrão de jornal. Dados de vários campos são concate-
NAT em uma variável de seqüência 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 transações de mainframe.
Criação de E-mails a partir de uma tabela do Access
Se você tem uma tabela do Access (por exemplo, do cliente, cliente ou informações de contato) com endereços de e-mail,
você pode criar e-mails para pessoas na tabela diretamente de um formulário do Access, assim você não 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 endereço 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 seleção múltipla.
FIGURA 4.7
Um formulário para selecionar contatos como destinatários de e-mail.
81
Organizar e comunicar-se com o Outlook
4
08_047026 ch04.qxp 02\/04\/07 21:42 Page 81
Dois botões permitem que você rapidamente marque (ou desmarque) todos os contatos; uma vez selecionado o e-mail
destinatários 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 revisão 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 formulário do Access.
O código que cria as mensagens de e-mail (e também o código 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 obrigatórios 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 endereço de e-mail:
strEMailRecipient = Nz (lst.Coluna (1, varItem))
Debug. Print \"endereço 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
.Exposição
Terminar com
NextContact:
Próxima varItem
ErrorHandlerExit:
Conjunto appOutlook = Nothing
Exit Sub
ErrorHandler:
Outlook não está em execução; Abra o Outlook com CreateObject :
Se Err. Number = 429 então
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 próxima
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 próxima
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
.Exposição
linha no código com
.Enviar
.
Resumo
Com as técnicas apresentadas neste capítulo, 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 são mais amplamente acessível
para os usuários.
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 código VBA para
Dados do Exchange
entre o escritório
Componentes
NESTA PARTE
Capítulo 5
Trabalhando com dados de acesso
Capítulo 6
Trabalhando com documentos do Word
e modelos
Capítulo 7
Trabalhando com planilhas do Excel
Capítulo 8
Trabalhando com itens do Outlook
Capítulo 9
Trabalhando com arquivos e pastas
Capítulo 10
Trabalhando com dados externos
Capítulo 11
Sincronizando o Outlook e acesso
Contatos
Capítulo 12
Indo além do básico
09_047026 pt02.qxp 02\/04\/07 21:43 Page 87
09_047026 pt02.qxp 02\/04\/07 21:43 Page 88
EU
n versões mais antigas do Microsoft Office, havia duas opções 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 formulário) e trabalhar com tabela
estrutura usando as tabelas (e campos subsidiários) coleções. Por causa de
Estas personalizado recursos, DAO foi o melhor modelo de objeto para trabalhar com
Dados de acesso.
A outra opção para trabalhar com dados de acesso foi (e é) o objeto ADO
modelo, introduzido com o Visual Studio 97 e disponível 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 características que o tornam tão bem adequado para acessar dados, código em ADO do DAO
funciona bem para manipulação de dados básicos, onde você não precisa trabalhar com
Acessar conjuntos de registros do formulário ou criar tabelas e campos (em outras palavras, você está apenas
trabalhando com dados em tabelas do Access, não com sua estrutura).
Antes do lançamento do 2007 Office, palavra foi que a Microsoft estava caindo
suporte para o modelo de objeto DAO (e na verdade você pode ver as instruções para
Este efeito em vários documentos on-line da Microsoft). Eu queria saber se ADO
seria atualizado para trabalhar com conjuntos de registros do formulário e as tabelas (e sub-
subsidiária campos) coleção (ou algum método alternativo para a criação de tabelas e
seus campos programaticamente), porque existem situações em que você precisa
Estas características do DAO, enquanto trabalha em um banco de dados do Access, ou a criação de um
Acesso Adicionar-in.
89
NESTE CAPÍTULO
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
Conversão de código DAO para
Código ADO
Trabalhando com dados de acesso
10_047026 ch05.qxp 02\/04\/07 21:43 Page 89
Referências de biblioteca DAO mais de 3.6 não são suportadas no Access 2007. Isto significa
que se você tem referências a versões mais antigas do DAO em qualquer formato mais velho databases você
quer trabalhar no Access 2007, você precisará redefinir essas referências para DAO 3.6. Bases de dados que
foram criados no formato do Access 2000 com uma referência do DAO 3.6, quando aberto no Access 2007, ainda
uma referência definida para o DAO 3.6 modelo de objeto (como mostrado na Figura 5.1) e seu DAO código 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 referência 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 mudanças. 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 padrão
Ele tem uma referência 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 referência adiante como Access 2007
DAO) tem a mesma funcionalidade de núcleo que DAO 3.6 (com algumas diferenças, que são discutidos em
a seção de \"Novos objetos em the 2007 DAO objeto modelo de acesso\") e o mesmo modelo de objeto
abreviatura (DAO) para uso em declarações, Microsoft assim realmente não tem puxado DAO afinal — em vez disso,
eles rebatizou, acrescentou um novo objeto e alguns novos atributos e escondeu-se alguns dos componentes que
não estão relacionadas diretamente ao trabalho com dados de acesso.
Isso significa que todo o seu velho DAO código será executado o mesmo de antes, assim você não 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 capítulo é DAO e ADO amostra Code.accdb. Além disso
parte do código faz referência 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 código 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 referência de acesso 2007 DAO padrão 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\/gravação, e talvez você precise fazer isso — por exemplo,
Se você estiver trabalhando em um banco de dados para um cliente que esteja executando uma versão anterior do Office. Tanto tempo como você
não precisa usar nenhum dos novos recursos introduzidos no Access 2007 (tais como a pesquisa de valores múltiplos
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 referências 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 não havia necessidade para indicar qual modelo de objeto objetos pertenciam a — você
só pode declarar uma variável de conjunto de registros como o conjunto de registros, ou uma variável de campo como campo (como no seguinte
declarações), e seu código iria funcionar bem:
Dim rst como conjunto de registros
Dim fld como campo
Mas desde a introdução do modelo de objeto do ADO, você pode executar em problemas com tal decla-
rações, porque certos nomes de objeto são 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 parâmetro e o campo
objetos em ambos.
Quando seu código é compilado, se as declarações não incluem o modelo de objeto, a primeira referência
na lista de referências que contém esse objeto é usado o nome, e não pode ser um direito. Em
Access 2000 e XP (talvez prematuramente), novos bancos de dados tinham uma referência padrão apenas para o ADO
modelo de objeto, o que levou a muitos problemas para usuários 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 padrão ele terá referências conjunto para ambos o DAO e
Modelos de objeto do ADO, nessa ordem, como mostrado na Figura 5.4.
FIGURA 5.3
As referências padrão para um novo banco de dados do Access 2002 (XP).
Isso significa que todas as variáveis do conjunto de registros, o campo e o parâmetro declararam sem um objeto modelo ref-
ERÊNCIA será interpretada como pertencentes ao modelo de objeto DAO, que pode não ser correto.
Se seu banco de dados foi criado no Access 2000 ou XP, e você não definir uma referência para o DAO
modelo de objeto, você terá o problema oposto — variáveis Recordset, o campo e o parâmetro serão
ser interpretado como pertencentes ao modelo de objeto do ADO, que pode causar problemas quando se trabalha
com métodos e propriedades do objeto DAO.
92
Escrever código 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 referências padrão para um novo banco de dados do Access 2003.
Ao usar um o
Find *
(métodos de pesquisa
FindFirst FindNext
, e assim por diante),
salvar a seqüência de caracteres de Pesquisar a uma variável e exibi-lo na janela Immediate usando um
Debug. Print
instrução; isso será muito útil na depuração de problemas porque ele mostra
exatamente o que a expressão está sendo usado para a pesquisa.
Se você estiver trabalhando em um banco de dados criado originalmente várias versões de acesso atrás, poderia ter
declarações ambíguas, tais como:
Dim dbs como banco de dados
Dim rst como o conjunto de registros
Como uma demonstração de possíveis 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 referência definida apenas para o modelo de objeto do ADO, esse código não vai mesmo compilar e você
receberá um erro de \"tipo definido pelo usuário não definido\". Se você tem referências conjunto para ambos modelos de objeto,
e a referência ADO é o primeira, você obterá um erro diferente, desta vez na linha com o
FindFirst método de referência: \"método ou membro de dados não encontrado.\" Se você tiver apenas um DAO se referem-
ENCE, ou a referência do DAO é posicionado acima da referência de ADO, o código será compilado e executado.
Se você receber um \"tipo definido pelo usuário não definido\" ou \"método ou membro de dados não encontrado\"
mensagem de erro ao compilar o código, isto é, quase sempre, uma indicação de uma falta ou
referência de versão do modelo de objeto incorreto.
Um problema mais sutil pode resultar de uma declaração ambígua do objeto campo. Há um
Objeto de campo de modelos de objeto do ADO e DAO, mas possui métodos e propriedades diferentes
em cada objeto modelo (ver as figuras 5.5 e 5.6), para que pudesse de uma linha de código para referenciar uma propriedade de campo
levar a um erro se essa propriedade não 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 através de acesso
2003, a janela do Visual Basic (módulos) é alterada, exceto que a roda do mouse agora funciona
(sobre o tempo!).
NOTA NOTA
DICA DICA
94
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
Usando o pesquisador de objetos
T
Object Browser é uma ferramenta muito útil para análise 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 disponível
bibliotecas (correspondente às referências 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 botão binóculos inicia a pesquisa e os resultados são 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, métodos e eventos) do selecionado
componente modelo de objeto.
Se você clicar no botão de ponto de interrogação amarelo, você geralmente terá um tópico da ajuda para o objeto selecionado
ou atributo, mas você não pode depender isso — às vezes, tudo que você tem é uma janela de ajuda em branco. Na
caso de ADO, em versões anteriores do Access, se você definir uma referência para a versão mais recente deste
biblioteca (2.8 naquele tempo), você iria ficar em branco páginas de ajuda; Se você definir uma referência ao ADO 2.5, como -
nunca, você obteria o tópico da ajuda apropriado. Em 2007, acessar, se você definir uma referência para o mais alto
versão do ADO (6.0), você receberá um \"não é possível exibir a ajuda\" mensagem de erro ao clicar a ajuda
botão. Se você definir uma referência ao ADO 2.5, clicando no botão de ajuda abre o \"Browse acesso
Tela de ajuda do desenvolvedor\", ao invés do tópico de ajuda específica para o modelo de objeto selecionado compo-
mações 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 específicas do campo de acesso; as propriedades do campo de ADO são mais genéricas, porque
ADO suporta dados em muitas aplicações diferentes.
A solução para os problemas de referência ambígua discutido anteriormente é simples: incluir o objeto
nome do modelo em declarações de variáveis DAO e ADO, como as seguintes declarações para o DAO
variáveis (3.6 DAO ou DAO acesso a 2007). Isso é chamado de disambiguating as declarações:
Dim rst como DAO.Conjunto de registros
Dim fld como DAO.Campo
Aqui está a versão do ADO (note que o nome do modelo de objeto não é 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 declarações, mesmo se o objeto em questão
só aparece no modelo de um objeto, para a consistência e no caso de que o objeto de nome pode ser usado em
algum outro modelo de objeto que eu poderia precisar para referência 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 (não 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 usuários que ainda não 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 referência — 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 freqüentemente 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 código 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á três novos objetos no novo modelo: ComplexType campo2 , , e
Recordset2 . Esses objetos são descritos nas seções a seguir.
ComplexType
O ComplexType objeto representa um campo de valores múltiplos e tem sua própria coleção 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 comparação com a propriedade de campo, que representa um campo em um Access 2000 ou Access
banco de dados de 2002\/2003.
DBEngine
Erros
Espaços de trabalho
Erro
Espaço de trabalho
Bancos de dados Banco de dados
Recipientes Recipiente
Documentos Documento
Conjuntos de registros Conjunto de registros
Campos Campo
Relações Relação
Campos Campo
Grupos Grupo
Usuários Usuário
Usuários Usuário
Grupos Grupo
TableDefs TableDef
Campos Campo
Índices Índice
Campos Campo
QueryDefs QueryDef
Campos Campo
Parâmetros Parâmetro
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 Obtém ou define um valor booleano que indica se o especificado
campo é definido como acrescentar novos valores o conteúdo existente do campo
como eles são adicionados (leitura\/gravação).
Propriedade ComplexType Representa um campo de valores múltiplos (somente leitura).
Propriedade IsComplex Retorna um valor booleano que indica se o campo especificado
um tipo de dados com valores múltiplos (somente leitura).
Método LoadFromFile Carrega o arquivo especificado do disco.
Método SaveToFile Salva um anexo para o disco.
Recordset2
O Recordset2 objeto representa um conjunto de registros com base em dados do Access 2007. Em comparação 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 métodos listados na tabela 5.2 são escondidos no novo objeto DAO de acesso 2007
modelo. Os objetos de recipiente, DBEngine e espaço de trabalho são visíveis; somente as propriedades listadas e
métodos para esses objetos são invisíveis. Os objetos de usuário e de grupo e os grupos e usuários col-
explanador é totalmente invisíveis.
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 coleção Propriedades Métodos Constantes
Recipiente AllPermissions
Herdar
Proprietário
Permissões
Nome de usuário
DBEngine SystemDB
98
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
10_047026 ch05.qxp 02\/04\/07 21:43 Page 98
Objeto ou coleção Propriedades Métodos Constantes
Grupo\/grupos
Usuário\/usuários
Espaço de trabalho Grupos CreateGroup
Nome de usuário CreateUser
Usuários
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 referência
banco de dados, você pode usar o CurrentDb método do objeto aplicativo Access, depois de declarar a
variável apropriada de banco de dados DAO, como no código a seguir:
Dim dbs como DAO.Banco de dados
Conjunto dbs = CurrentDb
Se você precisar fazer referência a um banco de dados externo, usar o OpenDatabase método, com o nome de
um banco de dados aberto como seu argumento, como no código 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
Coleções de TableDefs.
Conjuntos de registros
Conjuntos de registros são 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 seções 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 código 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 numérico
equivalentes). Estas constantes nomeadas são usadas no código 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), não suportam constantes nomeadas, então você precisará usar os valores numéricos em vez disso, para
exemplo, quando escrever código VBS Outlook ou Windows Script Host (WSH).
Consulte o capítulo 17 para obter exemplos de código WSH.
TABELA 5.3
Tipo de conjunto de registros DAO argumentos nomeados
Tipo de conjunto de registros Constante nomeada Valor numérico
Tabela dbOpenTable1
Dynaset dbOpenDynaset 2
Instantâneo dbOpenSnapshot 4
Forward-only dbOpenForwardOnly 8
Dinâmica dbOpenDynamic 16
Se você não 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 é impossível, então um dynaset, um instantâneo, em seguida um conjunto de registros Avançar-only.
Os conjuntos de registros do tipo dynaset e tabela são 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 código está sendo executado, em oposição 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 não suportam o Encontrar métodos ( FindFirst ,
FindLast FindNext FindPrevious , , ); em vez disso, eles apóiam o Procurar método.
Para executar um dos procedimentos do banco de dados DAO e ADO código de exemplo, coloque seu
cursor dentro do procedimento e pressione F5 ou selecione executar Sub\/UserForm da execução
menu na janela do Visual Basic.
Se você não receber uma resposta ao pressionar uma tecla de função, teclas de função podem ser desativadas;
alguns teclados mais recentes desativar teclas de função padrão. Para ativar as teclas de função, pressione
a tecla F Lock.
O seguinte código de segmento procura o registro com um valor específico (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
REFERÊNCIA CRUZADA REFERÊNCIA CRUZADA
100
Escrever código 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\", _
Título: = \"ID da empresa\", padrão: = \"TEAC\")
RST.Buscar comparação: = \"=\", key1: = strValue
Se rst.NoMatch = True, em seguida,
strPrompt = \"Não foi possível localizar\"
“; por favor, tente novamente\"
strTitle = \"Pesquisar falhado\"
MsgBox prompt: = strPrompt, botões: = _ vbCritical
+ vbOKOnly, título: = strTitle
GoTo EnterID
Outra coisa
strPrompt = \"O ID do primeiro para\"
& “ is “ & rst![ID/AccountNumber]
strTitle = \"Pesquisar sucedido\"
MsgBox prompt: = strPrompt, botões: = vbOKOnly _
+ vbInformation, título: = 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 atualizáveis, 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 flexível Encontrar métodos ( FindFirst FindLast , ,
101
Trabalhando com dados de acesso
5
10_047026 ch05.qxp 02\/04\/07 21:43 Page 101
FindNext FindPrevious , ); ao contrário do Procurar método para o tipo de tabela dynasets, você não 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 código procura o último registro com um valor correspondente no campo IDLabel e exibe
a identificação 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 rótulo de identificação\", _
Título: = \"Etiqueta de identificação\", padrão: = \"Endereço 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 = \"Não foi possível localizar\"
“; por favor, tente novamente\"
strTitle = \"Pesquisar falhado\"
MsgBox prompt: = strPrompt, botões: = _ vbCritical
+ vbOKOnly, título: = strTitle
GoTo EnterID
Outra coisa
102
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
Estilos de argumento
W
galinha escrever código VBA, você tem duas opções de estilo: usando nomes de argumento (como eu faço 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 número certo de vírgulas entre os argumentos, com espaços entre vírgulas representa-
ing os argumentos que você não está usando. Eu prefiro usar nomes de argumento para maior clareza, mesmo que ele faz
meu código um pouco mais.
Se você usar um nome de argumento, você deve usar nomes de argumento para todos os argumentos de uma função ou
o método utilizado — não é 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, botões: = vbOKOnly _
+ vbInformation, título: = strTitle
End If
End Sub
Instantâneo
Um conjunto de registros do tipo snapshot é uma cópia somente leitura de um conjunto de registros, útil apenas para exibir dados ou
geração de relatórios. O procedimento a seguir se move através de um conjunto de registros com base em uma tabela, escrita
os valores em vários 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 não 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 execução deste procedimento para que dois registros são 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: Endereço de email
ID\/Conta n º: Rfisher@RickWorld.com
Ao contrário de conjuntos de registros do tipo table e tipo dynaset, você pode trabalhar com um mesmo conjunto de registros do tipo instantâneo
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
Avançar-only de conjuntos de registros são semelhantes aos conjuntos de registros do tipo instantâneo, exceto que você apenas move
através dos registros no sentido progressivo.
Dinâmica
Conjuntos de registros dinâmicos representam os resultados de consultas atualizáveis, 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 usuários.
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 código do VBA (por exemplo, para filtrar por um valor
entrou ou selecionado em um formulário) 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 código e executá-lo para criar uma tabela, para as circunstâncias
onde você precisa de uma tabela para trabalhar com. Isso elimina a necessidade de inúmeras consultas filtradas, e
também permite que você trabalhe em torno de vários problemas com a criação de conjuntos de registros com base em consultas de parâmetro.
O procedimento a seguir cria um QueryDef programaticamente, usando uma seqüência de caracteres SQL de dados
fonte e retorna o número de registros; é útil para determinar se há algum
registros em uma consulta filtrada, antes de tomar uma ação. Eu chamo este procedimento com freqüência no código na
bancos de dados de amostra para este livro:
Público função CreateAndTestQuery(strTestQuery As String, _
strTestSQL As String) como longo
Em erro continuar próximo
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 código 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 código típico usando a função 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 então
strPrompt não = \"nenhum registro encontrado; cancelamento\"
strTitle = \"Cancelamento\"
MsgBox strPrompt, vbOKOnly + vbCritical, strTitle
GoTo ErrorHandlerExit
Outra coisa
' Mais código aqui para trabalhar com a recém-criado consulta
End If
O código cria uma seqüência 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 função. Essa função retorna num-
ber de registros; se não há registros (a função retorna zero), o código é fechado; caso contrário, ele pode
continuar a executar alguma ação sobre a consulta criada pelo CreateAndTestQuery função.
Você também pode criar um QueryDef e usá-lo diretamente para criar um conjunto de registros, como na linha seguinte
de código:
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 são capitalizados no código VBA. Independentemente de como você digita
em, quando o cursor sai da linha de código, algum argumento nomes são capitalizados
(como \"nome\") e alguns não são (como \"sqltext\"). A capitalização não coincide com o capital-
réégal dos argumentos em seus tópicos de ajuda, onde eles geralmente são representados como em minúsculas.
Você também pode criar um QueryDef correspondente a uma consulta de ação e executá-lo diretamente do código, a
criar uma tabela para uso em outro lugar no código em vez de uma consulta de parâmetro, para evitar erros que vai
ocorra se um critério de consulta está à procura de um valor em um formulário que é fechado quando o código é executado:
strFilter = \"[DataDaFatura] = #\"
strSQL = \"SELECT [InvoiceNo], InvoiceDate, _
Cliente, empregado \"_
& “INTO tmakMatchingRecords “ _
& “FROM tblInvoices “ _
& “ WHERE “ & strFilter & “;”
Debug. Print \"seqüência 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 código:
Definir qdfTemp = dbs.CreateQueryDef (nome: = \"\", _
SQLTEXT: = strSQL)
No entanto, geralmente prefiro criar uma consulta nomeada, para que eu possa examiná-lo na interface de depuração-
Ging efeitos, se necessário.
TableDefs e campos
TableDefs correspondem às tabelas na interface. Embora seja muito mais comum a necessidade de cre-
comeu uma consulta por meio de programação, às vezes, talvez você precise criar uma tabela no código. Quando você cria
uma nova tabela, você também precisará criar campos para ele. O código a seguir cria uma nova tabela em um exter-
nal database, com vários campos de tipos de dados diferentes. Cada campo é criado (e seu valor padrão
definir, para dois deles) e, em seguida, é acrescentado à nova tabela. Um manipulador de erro retorna ao usuário
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 estão listados para a janela imediata, com o
nova tabela como a última entrada na lista:
Private Sub NewTable()
Em erro continuar próximo
Dim dbsNorthwind como DAO.Banco de dados
Dim tdfNew como DAO.TableDef
Dim fld como DAO.Campo
DICA DICA
NOTA NOTA
106
Escrever código 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 não for encontrado.
Conjunto fil = fso.GetFile(strDBNameAndPath)
Se o fil é nada então
strPrompt = \"Não 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, título: = strTitle, _
Padrão: = \"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 à coleção 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
Próxima tdf
dbsNorthwind.Close
ErrorHandlerExit:
Exit Sub
ErrorHandler:
Se Err. Number = 3010 então
strPrompt = \"Tabela nome já usado;\" _
& “please enter another name”
strTitle = \"Duplicar nome de tabela\"
MsgBox prompt: = strPrompt, _
Botões: = vbExclamation + vbOKOnly, título: = strTitle
GoTo NameNewTable
Outra coisa
MsgBox \"erro nenhum:\"
& Err.Description
Resume ErrorHandlerExit
End If
End Sub
108
Escrever código 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\/não, valores, você terá que selecionar o formato
de sua escolha manualmente; o
CreateField
método não tem um argumento para a criação 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 programação
EU
adição de n para o
CreateTableDef
método, existem três outras maneiras de criar tabelas de acesso em
Código VBA:
O
CopyObject
método 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
método do DoCmd
objeto, ou a
Executar
método de objeto QueryDef, cria uma nova tabela como a saída de
a consulta.
Uma instrução de Jet SQL CREATE TABLE, como no código a seguir, pode ser usada para criar um
tabela:
strSQL = \"CREATE TABLE\"
\"(Nomedoformulário texto (100), usar YESNO);\"
StrSQL DoCmd.RunSQL
Comparado com estas técnicas, o
CreateTableDef
método dá a você o máximo controle
sobre campos a nova tabela e suas propriedades. No entanto, criar uma tabela, serão anexada ao
a coleção 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, então não é personalizado para acessar os dados, como o DAO modelo de objeto é.
No entanto, com algumas exceções (trabalhando com conjuntos de registros do formulário e criando tabelas programmati-
camente), você pode manipular dados do Access com o ADO da mesma forma com DAO.
Conexão
Embora o modelo de objeto do ADO não é hierárquico (ao contrário do modelo de objeto DAO), a
Objeto de conexão é o objeto da Fundação, porque as conexões são a ligação de dados em bancos de dados.
No conjunto de registros DAO, o
BOF
Propriedade representa o início do conjunto de registros
(Início 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 não uma busca bem-sucedida examinando onde o cursor está. Por exemplo, em fazer
um achado, a partir do início do recordset (BOF) e avançar, se o cursor termina
se no final do conjunto de registros (EOF), a busca foi infrutífera. Aqui está algum código de amostra para
ilustrar esta técnica; 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 não teve êxito, e o novo registro pode ser criado usando o novo nome de categoria no
strSearch variável (o segmento de código é parte do TestKeysetOptimistic procedimento,
que é listado mais adiante neste capítulo):
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, _
Botões: = vbExclamation + vbOKOnly, _
Título: = strTitle
GoTo CategoryName
Os tabelas coleção e a forma de conjuntos de registros não são 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ê não fechar e conjunto para objetos de banco de dados ou conjunto de registros DAO nada, é extremamente
improvável que você terá problemas; no entanto, se você deixar conexões ADO e
abrir conjuntos de registros, na próxima vez que você executa o código, 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 código
trabalhando novamente: \"o banco de dados foi colocado em um Estado pelo usuário 'Admin' na máquina
\"DELL_DIMEN_8300' que impede que ele seja aberto ou fechado.\" Os procedimentos de ADO da amostra ter
código para fechar qualquer conexão aberta ou conjunto de registros em seus manipuladores de erro.
DICA DICA
NOTA NOTA
110
Escrever código 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 conexão com o banco de dados atual é simples:
Dim cnn como ADODB.Conexão
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 seqüência de caracteres SQL para criar um conjunto de registros:
Private Sub OpenRecordsetSQL()
Em erro continuar próximo
Dim cnn como ADODB.Conexão
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 conexão 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 não for encontrado.
Conjunto fil = fso.GetFile(strDBNameAndPath)
Se o fil é nada então
strPrompt = \"Não 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.Conexão
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 seqüência 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 não.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 conexão.
Rst é nada então se não
Se rst.Estado = adStateOpen Then
RST.Fechar
Set rst = Nothing
End If
End If
112
Escrever código 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 não é nada, então
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ê não precisa usar esse objeto para consulta ou fil-
dados de ter acesso; Isso pode ser feito usando uma instrução SQL (como o segmento de código 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 código, ou se você precisar passar
informações detalhadas sobre parâmetro com o comando.
O procedimento usa um objeto de comando para criar um conjunto de registros, que pode ser usado mais tarde no código:
Private Sub OpenRecordsetCommand()
Em erro continuar próximo
Dim cnn como ADODB.Conexão
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 conexão 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 não for encontrado.
Conjunto fil = fso.GetFile(strDBNameAndPath)
Se o fil é nada então
strPrompt = \"Não 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.Conexão
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 seqüência 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
Seleção tipo de cursor e o bloqueio do conjunto de registros.
strCursorType = interruptor (rst.CursorType = _
adOpenDynamic _
\"Dinâmica (\"
RST.CursorType = adOpenForwardOnly, _
\"Forward-only (\"_
& adOpenForwardOnly & “)”, _
RST.CursorType = adOpenKeyset, \"conjunto de chaves (\"_
& adOpenKeyset & “)”, _
RST.CursorType = adOpenStatic, \"Static (\"_
& adOpenStatic & “)”)
114
Escrever código 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 não.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 conexão.
Rst é nada então se não
Se rst.Estado = adStateOpen Then
RST.Fechar
Set rst = Nothing
End If
End If
Se a cnn não é nada, então
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 página 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 são mais genéricos. Um conjunto de registros ADO pode ser baseado em uma tabela, consulta, instrução de SQL, ou
Objeto de comando. OTestForwardReadOnly procedimento listado aqui usa uma consulta de seleção salva
como a fonte de conjunto de registros:
Private Sub TestForwardReadOnly()
No erro GoTo ErrorHandler
Dim cnn como ADODB.Conexão
Dim rst como ADODB.Conjunto de registros
Crie uma conexão 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 não 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 código 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 conexão.
Rst é nada então se não
Se rst.Estado = adStateOpen Then
RST.Fechar
Set rst = Nothing
End If
End If
Se a cnn não é nada, então
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 são aproximadamente equivalentes para o DAO
tipos de conjunto de registros), conforme descrito nas duas tabelas a seguir. Cada tipo de cursor suporta diferentes
métodos dependendo da configuração do LockType argumento. Os dois mais usados bloqueio
os tipos são a read-only (chamado constante: adLockReadOnly ) e otimista (chamado constante:
adLockOptimistic ) tipo. 5.4 Tabela lista os tipos de cursor ADO, com seus equivalentes numéricos,
e as combinações 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 numérico
Dinâmica adOpenDynamic 2
Conjunto de chaves adOpenKeyset 1
Estática 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 numérico
Somente leitura adLockReadOnly 1
Otimista adLockOptimistic 3
Lote otimista adLockBatchOptimistic 4
Pessimista adLockPessimistic 2
Às vezes o conjunto de registros ADO é criado não é 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 instrução (Ver tabela 5.4 converter o numérico
tipo de correspondência de seu chamado constante):
Debug. Print \"tipo de cursor de conjunto de registros:\" _
& rst.CursorType
Para uma determinação mais avançada do tipo de cursor real e tipo de bloqueio de um recém-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 próximo
Dim cnn como ADODB.Conexão
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 conexão com um banco de dados externo.
strCurrentPath = Application.CurrentProject.Path
strDBName = \"Adamastor\"
strDBNameAndPath = strCurrentPath
NOTA NOTA
118
Escrever código 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 não for encontrado.
Conjunto fil = fso.GetFile(strDBNameAndPath)
Se o fil é nada então
strPrompt = \"Não 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.Conexão
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 seqüência 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 _
\"Dinâmica (\"
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 \"Atualização suportada?\" _
& rst.Supports(adUpdate)
ErrorHandlerExit:
Feche os objetos Recordset e conexão.
Rst é nada então se não
Se rst.Estado = adStateOpen Then
RST.Fechar
Set rst = Nothing
End If
End If
Se a cnn não é nada, então
Se cnn.Estado = adStateOpen Then
CNN.Fechar
Set cnn = Nothing
End If
End If
Exit Sub
120
Escrever código 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 são convertidos em conjuntos de chaves quando você usar bloqueio otimista para um ADO
conjunto de registros, você pode também 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
Combinações de tipos de Lock\/Cursor de conjunto de registros ADO
Tipo de cursor chamado constante Tipo de bloqueio chamado constante Métodos disponíveis
adOpenDynamic AdLockOptimistic AddNew
(converte adOpenKeyset) Excluir
Encontrar
MoveFirst
MovePrevious
MoveNext
MoveLast
Atualização
adOpenDynamic adLockReadOnly Encontrar
(converte adOpenStatic) MoveFirst
MovePrevious
MoveNext
MoveLast
adOpenKeyset AdLockOptimistic AddNew
Excluir
Encontrar
MoveFirst
MovePrevious
MoveNext
MoveLast
Atualização
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 (continuação)
Tipo de cursor chamado constante Tipo de bloqueio chamado constante Métodos disponíveis
adOpenStatic AdLockOptimistic AddNew
(converte adOpenKeyset) Excluir
Encontrar
MoveFirst
MovePrevious
MoveNext
MoveLast
Atualização
adOpenStatic AdLockReadOnly Encontrar
MoveFirst
MovePrevious
MoveNext
MoveLast
adOpenForwardOnly AdLockOptimistic AddNew
(converte adOpenKeyset) Excluir
Encontrar
MoveFirst
MovePrevious
MoveNext
MoveLast
Atualização
adOpenForwardOnly AdLockReadOnly Encontrar
MoveFirst
MoveNext
MoveLast
Dinâmica
Um cursor dinâmico (equivalente DAO: dbOpenDynaset ) permite que você exibir acréscimos, alterações, ou
exclusões feitas por outros usuários. São permitidos todos os tipos de movimento com o recordset.
Conjunto de chaves
Em um conjunto de registros com um cursor de conjunto de chaves (não há nenhum tipo de conjunto de registros DAO equivalente), você pode adicionar,
alterar e excluir dados em registros, mas você não consegue ver registros que outros usuários adicionar ou excluir.
No entanto, você pode ver as alterações feitas por outros usuários. Com um otimista ( adLockOptimistic )
Bloquear tipo, você pode modificar os dados; Se você não precisa modificar os dados, use um tipo de bloqueio somente leitura
(adLockReadOnly ) para acesso de dados mais rápido.
A seguir TestKeysetOptimistic procedimento adiciona um novo registro para o tlkpCategories
tabela e define o valor de um campo de entrada fornecida pelo usuário, depois de verificar se a cate -
Gory nome fornecido pelo usuário já foi usado:
122
Escrever código 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.Conexão
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 conexão 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 usuário.
strPrompt = \"Por favor insira o novo nome de categoria\"
strTitle = \"Nova categoria\"
strCategory = Nz (InputBox (prompt: = strPrompt, _
Título: = 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, _
Botões: = vbExclamation + vbOKOnly, _
Título: = strTitle
GoTo CategoryName
Outra coisa
.AddNew
![Categoria] = strCategory
.Atualização
strPrompt = Chr$(39)
& Chr$(39) & “ added to table”
strTitle = \"Categoria adicionada\"
MsgBox prompt: = strPrompt, _
Botões: = vbInformation + vbOKOnly, _
Título: = strTitle
Debug. Print.RecordCount _
& “ records in recordset after adding”
End If
Terminar com
End If
ErrorHandlerExit:
Feche os objetos Recordset e conexão.
Rst é nada então se não
Se rst.Estado = adStateOpen Then
RST.Fechar
Set rst = Nothing
End If
End If
Se a cnn não é nada, então
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 código VBA para trocar dados entre os componentes do Office
Parte II
10_047026 ch05.qxp 02\/04\/07 21:43 Page 124
O código imprime a string de pesquisa (sempre útil para depuração) e o número de registros no
conjunto de registros, antes e depois de adicionar o novo registro, a janela Verificação imediata:
String de busca: [categoria] = 'Firmware'
29 registros inicialmente no conjunto de registros
30 registros no conjunto de registros após a adição de
Estática
O tipo de cursor estático (equivalente DAO: dbOpenSnapshot ) fornece uma cópia estática de um conjunto de
registros, para visualização ou impressão de dados. São permitidos todos os tipos de movimento com o recordset.
Adições, alterações ou exclusões feitas por outros usuários não são mostradas. Para acesso rápido aos dados que
você não precisa modificar, onde você não precisa exibir alterações de outros usuários e é necessário
para ser capaz de se mover tanto para frente e para trás no conjunto de registros, usar um cursor estático e o
adLockReadOnly tipo de bloqueio, como o seguinte TestStaticReadOnly procedimento. Se você fizer
preciso modificar os dados, mas preciso ver as alterações de outros usuários, 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 conexão para o banco de dados Northwind, abre um
filtrados recordset baseado em uma tabela no banco de dados e, em seguida, percorre o recordset, impressão
informações de seus campos para a janela imediata. Observe que, depois de um ADO recordset tem sido
criado, muitos dos mesmos métodos podem ser usados para trabalhar com ele quanto um (de banco de dados DAO BOF EOF , ,
Find * movimento * , ):
Private Sub TestStaticReadOnly()
Em erro continuar próximo
Dim cnn como ADODB.Conexão
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 conexão 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 não for encontrado.
Conjunto fil = fso.GetFile(strDBNameAndPath)
Se o fil é nada então
strPrompt = \"Não 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.Conexão
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 seqüência 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 não.EOF
Debug. Print \"nome da empresa australiana:\" _
& ![CompanyName] _
& vbCrLf & vbTab & “Contact name: “ _
& ![ContactName] _
126
Escrever código 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 conexão.
Rst é nada então se não
Se rst.Estado = adStateOpen Then
RST.Fechar
Set rst = Nothing
End If
End If
Se a cnn não é nada, então
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 informação é impressa a janela Verificação 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 Avançar-only (equivalente DAO: dbOpenForwardOnly ) permite apenas para a frente, move -
mento por meio de um conjunto de registros e não mostrar adições, alterações ou exclusões feitas por outros usuários.
127
Trabalhando com dados de acesso
5
10_047026 ch05.qxp 02\/04\/07 21:43 Page 127
É o tipo de cursor padrão. Para o acesso mais rápido aos dados que você não 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.Conexão
Dim rst como ADODB.Conjunto de registros
Crie uma conexão 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 não 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 conexão.
Rst é nada então se não
Se rst.Estado = adStateOpen Then
RST.Fechar
Set rst = Nothing
End If
End If
Se a cnn não é nada, então
Se cnn.Estado = adStateOpen Then
CNN.Fechar
128
Escrever código 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 estão listados aqui:
Empresa ID: Yclept Yarbro
Categoria: livros
Nome da empresa: Yclept Yarbro
Identificação 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 não-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 não-Access (no
em especial, para trabalhar com dados hierárquicos e exibi-lo no TreeView controles), mas quando
não trabalhando com dados de acesso no VBA código lá é nenhum motivo para usar o objeto de registro, porque você pode
campos de referência conforme necessário 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 página da web. Porque
Este objeto não funciona com dados de acesso, ele é tratado nos capítulos sobre como trabalhar com arquivos de texto,
especificamente capítulos 9 e 17.
Conversão de código DAO para ADO código
Se você deseja converter seu código DAO antigo para o novo código ADO — talvez para consistência com o ADO
código para trabalhar com outros tipos de dados, ou com a preocupação de que DAO deixarão de ser apoiado em
versões futuras do Access — você pode usar a tabela 5.7 como uma diretriz. Tenha em mente que alguns tipos de
Código DAO não pode ser convertido em ADO, porque eles não têm 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ê não pode trocar dados entre conjuntos de registros ADO e DAO, mesmo quando trabalhando
bancos de dados com referências conjunto para ambos modelos de objeto.
TABELA 5.7
ADO equivalentes de objetos DAO
Objeto DAO Objeto ADO Notas
DBEngine Não há equivalente Não é necessário
Espaço de trabalho Não há equivalente Não é necessário
Banco de dados Conexão
Conjunto de registros Conjunto de registros
Tipo dynaset Cursor de conjunto de chaves
Tipo instantâneo Cursor estático
Tipo de tabela Cursor de conjunto de chaves, com opção 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 Não há equivalente
Ao usar o modelo de objeto DAO para trabalhar com dados de acesso, o seguinte código 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 código ADO abre um recordset equivalente:
Dim cnn como ADODB.Conexão
Dim rst como ADODB.Conjunto de registros
Dim strDBName As String
Dim strConnectString As String
Dim strQuery As String
DICA DICA
130
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
10_047026 ch05.qxp 02\/04\/07 21:43 Page 130
Crie uma conexão com um banco de dados externo.
strDBName = \"D:\/Documents\/Northwind.mdb\"
Set cnn = New ADODB.Conexão
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 diferenças, consulte as seções sobre ADO recordset cursor e o bloqueio de tipos para obter detalhes sobre
as diferenças.
Para mais informações sobre conversão de código DAO para ADO código veja Alyssa Henry arti-
cle \"Portar DAO para ADO com o Microsoft Jet provedor de código,\" que está disponível
on-line na biblioteca MSDN, procurando seu título 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 versões 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-
recomendação é 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 limitações em comparação 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-
mação sobre a conversão de código DAO para ADO para estas situações.
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 relatório interativos recursos discutidos
na barra lateral \"Exibição de Layout de relatório\", para o controle total sobre o
aparência e o conteúdo dos documentos preenchidos com dados do Access, VBA
Código de automação, trabalhando com documentos do Word é a melhor escolha. Este
Capítulo discute produzindo documentos do Word usando um comando de fita
para criar documentos simples, ou escrevendo código de automação VBA para criar a palavra
documentos e enchê-los com dados, usando quatro métodos diferentes.
Em contraste com os relatórios de acesso (mesmo no modo de exibição Layout novo), palavra docu-
mentos tem extensas opções de formatação, incluindo tabelas, campos de formulário, e
outros controles especializados não disponíveis nos relatórios de acesso, mesmo em Layout
modo de exibição. Gerar documentos do Word a partir de código VBA de acesso permite que você use toda a
Opções de formatação de palavra e (se desejar) para criar um documento separado para
cada registro de acesso, em vez de um documento de várias páginas de mala direta. E o
Documentos do Word que contém os dados mesclados de acesso podem ser editados, o que não é
uma opção mesmo para relatórios do Access 2007.
133
NESTE CAPÍTULO
Built-in exportação de Word Office 2007
Componentes do objeto Word
modelo usado no código de automação
Criação de documentos do Word cheio
com dados de acesso, através de quatro
diferentes métodos
Trabalhando com palavra
Documentos e modelos
11_047026 ch06.qxp 02\/04\/07 21:44 Page 133
134
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
Exibição de Layout de relatório
Relatórios de acesso 2007 tem uma nova seleção de modo de exibição, exibição de Layout. Access 2003
tinha a visualização de impressão, visualização do Layout (somente leitura, sem dados) e visualização de Design,
e você poderia apenas modificar o layout do relatório, filtragem, ou classificação no modo Design. Em
Access 2007, a nova exibição de Layout substitui a visualização do Layout, e há um novo relatório
Ver os além de Visualizar impressão. A figura a seguir mostra o selector de vista sobre o
Relatório de acesso à faixa de opções.
Pontos de vista de relatório do Access 2007.
A nova exibição de Layout de relatórios de acesso tem muito mais funcionalidade do que a visualização do Layout antigo,
permitindo que os usuários classificar e filtrar um menu de atalhos, como mostrado na seguinte captura de tela e até mesmo redimensionar
colunas de relatório observando os dados (um recurso muito solicitado).
A nova exibição de Layout de um relatório do Access.
NOVO RECURSO NOVO RECURSO
11_047026 ch06.qxp 02\/04\/07 21:44 página 134
Exportação de built-in Word no Office 2007
Para várias versões do Office, tem sido possível exportar dados de acesso a documentos do Word dos
Barra de ferramentas de acesso. O nome do local de controle e barra de ferramentas têm mudado ao longo de versões do Office; em
Access 2003 era o controle de lista suspensa de OfficeLinks na barra de ferramentas de banco de dados, oferecendo opções para
Mesclar a palavra (mala direta), publicar para o Word (RTF), ou analisar com o Excel (XLS). No Access 2007,
na nova faixa de opções que substitui o antigas barras de ferramentas e menus, na guia dados externos (mostrada na
Figura 6.1) tem um grupo de exportação com uma variedade de opções de exportação, incluindo Excel, SharePoint,
Word (RTF), arquivo de texto e muito mais. No menu drop-down mais, há um número de exportação
seleções, incluindo mesclá-lo com o Microsoft Office Word.
Você verá diferentes selecções no menu mais (ou seleções 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 seleções do documento HTML (essas seleções estão habilitadas) e uma seleção de deficiente, mesclá-la com
Microsoft Office Word; a seleção do Snapshot Viewer é habilitada apenas quando um relatório é 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 relatório interativo ainda fica muito aquém a funcionalidade de um documento do Word, espe-
cialmente se você precisa distribuir documentos contendo os dados de acesso para as pessoas que não 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
Versões do Office. Se você seleciona uma tabela do Access, consulta ou outro objeto e, em seguida, selecione a palavra (RTF)
opção, todos os dados de todo o objeto selecionado é automaticamente exportada para uma nova palavra docu-
mento, com nenhuma opção para selecionar os registros.
O documento RTF criado a partir de uma tabela, consulta ou formulário é 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 formulário. Relatórios são criados como texto
documentos, não de tabelas (mesmo se eles são relatórios tabulares), com rodapés como texto no corpo do doc -
cumento e sem a maior parte de sua formatação; Esse documento é pouco utilizável. (Isso é alterado
para várias versões do Office agora.)
A opção de exportação RTF pode ser útil para criar um documento do Word rápida e sujo que pode enviar
para alguém que não tem acesso, mas ele não é útil para a criação 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 diálogo, com duas opções habilitadas e desabilitado um (porque o objeto que está sendo exportado é um
tabela, não há nenhuma formatação para exportação).
A Figura 6.4 mostra a tabela do Word criada pela exportação RTF. Ele basicamente tem a mesma aparência
como o acesso tabela, mas falta o sombreamento alternativo-linha, mesmo que o Word 2007 oferece suporte a isso
característica.
FIGURA 6.2
Uma tabela do Access para ser exportado para o Word.
136
Escrever código 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 diálogo de exportação 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 opção Word (RTF).
137
Trabalhando com documentos do Word e modelos
6
11_047026 ch06.qxp 02\/04\/07 21:44 Page 137
A opção mala direta do Word executa um assistente, que é geralmente semelhante dos dois últimos
Versões 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 destinatários de uma
Tabela do Access ou consulta — mas não pode ser mais fácil de percorrer as seis etapas do assistente,
em comparação com apenas a criação de um simples relatório de carta de acesso com base em uma consulta filtrada.
Minha conclusão, depois de analisar os novos recursos de exportação de dados no Access 2007, é que (assim como com
versões anteriores do Access) se você quer ser capaz de selecionar os registros para a exportação de dados de acesso
a palavra e produzir grandes documentos com um aspecto que podem ser abertos e possivelmente editados por todos
Os usuários do Office, você é ainda melhor fora escrever código VBA para mesclar os dados de acesso a documentos do Word.
O banco de dados de exemplo Export.accdb palavra contém tabelas, consultas, formulários e código
usado neste capítulo.
Exportar dados Access para Word
Usando código de automação
Código de automação é a ferramenta que você precisa para usar ao criar ou trabalhando com documentos do Word em
Acesso VBA. Código de automação não é uma linguagem de programação especial, apenas um conjunto de funções usadas
no código do VBA para trabalhar com os modelos de objetos de outros aplicativos.
Todo código de automação começa com uma das duas funções descritas da seguinte forma, de que conjuntos
uma referência a um objeto de alto nível de automação. 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
Instância da palavra; ele funciona ou não palavra já está aberta. O GetObject função com
\"Word. Application\" como o Classe argumento tenta definir uma referência a uma instância existente
da palavra. GetObject consegue definir uma referência somente se a palavra já está em execução.
Para evitar a criação de várias instâncias do Word, eu uso o GetObject função no corpo de um pro-
procedimento, o que define uma referência a um objeto de aplicativo do Word existente, se a palavra estiver em execução, 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 não pode criar objeto\":
Set appWord = GetObject(Class:=\"Word.Application\")
[corpo de procedimento aqui]
ErrorHandlerExit:
Set appWord = Nothing
Exit Sub
NOTA NOTA
138
Escrever código 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 então
' Palavra não está em execução; 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 código anterior, o objeto de aplicativo appWord
variável é definida como Nothing. Se você quiser encerrar a palavra quando seu código foi executado, isso
é conveniente; mas se você quiser preservar o objeto de aplicativo do Word para uso futuro (geralmente um
boa idéia), 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 referência para a aplicação
objeto, ou algum outro objeto que pode ser usado com o CreateObject ouGetObject função.
Apesar de você usar CreateObject ouGetObject para definir uma referência diretamente para um documento do Word
objeto, geralmente é melhor criar (ou definir uma referência para) um objeto de aplicativo do Word e use
o appWord variável para obter em outros objetos da palavra abaixo do objeto de aplicativo, porque muitos dos
as propriedades e métodos que você precisa para usar no código de automação pertencem ao objeto aplicativo,
e você pode acessar todos os outros objetos através do objeto de aplicativo...
O modelo de objeto do Word
Um modelo é uma representação de componentes de aplicativos disponíveis para o controle por
Código de automação. Normalmente, a maioria (mas não 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 não 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, coleção de documentos objeto de documento, tabelas recolha e tabela
objeto e a coleção de Bookmarks e objeto indicador. Estes componentes do modelo de objeto são
os usados em procedimentos descritos nas seções a seguir.
Você pode usar o pesquisador de objetos para examinar as propriedades e métodos 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 métodos.
Os procedimentos de exemplo a seguir usam automação código 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 NewDocfunção cria um documento novo e em branco do Word baseado no modelo padrão do Word:
Função pública 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 código VBA para trocar dados entre os componentes do Office
Parte II
11_047026 ch06.qxp 02\/04\/07 21:44 página 140
ErrorHandler:
Se errar = 429 então
' Palavra não está em execução; 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 funções nesta seção (e seções 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 botão de comando e uma
Caixa de texto vinculada a um campo em tblInfo; clicando no botão de comando abre uma caixa de diálogo 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 exportação sample database.
Se você clicar no botão de contato documentos via ou caminho de modelos de contato, abre uma caixa de diálogo Procurar,
onde você pode selecionar a pasta para armazenar modelos ou documentos (Ver Figura 6.7).
Os procedimentos que surgem essas caixas de diálogo de procura são discutidos no capítulo 9.
FIGURA 6.7
REFERÊNCIA CRUZADA REFERÊNCIA CRUZADA
141
Trabalhando com documentos do Word e modelos
6
11_047026 ch06.qxp 02\/04\/07 21:44 página 141
FIGURA 6.7
Selecionando uma pasta como a pasta de documentos do contato.
O NewDocFromTemplate função 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
método de propriedades do documento é a técnica 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 são impressos para a janela imediata.
Como com versões anteriores do Word, embora haja uma coleção CustomProperties em
o modelo de objeto do Word 2007 e um
CustomProperty
objeto, esta coleção e
objeto realmente pertencem as marcas inteligentes, por isso, se você declarar variáveis desses tipos de dados, você receberá um
erro de compilação; Portanto, eles devem ser declarados como objeto.
Função pública 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 código VBA para trocar dados entre os componentes do Office
Parte II
11_047026 ch06.qxp 02\/04\/07 21:44 página 142
Deve declarar essa variável como Object porque declará-la como Word.CustomProperties não funciona:
Dim prps como objeto
Deve declarar essa variável como Object porque declará-la como Word.CustomProperty não funciona:
Dim prp como objeto
Set appWord = GetObject(Class:=\"Word.Application\")
strTemplateDir = GetContactsTemplatesPath()
Debug. Print \"diretório 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 próxima
ErrorHandlerExit:
Exit Function
ErrorHandler:
Se errar = 429 então
' Palavra não está em execução; 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 exportação
Eu gostaria de criar uma consulta seleção para usar como a fonte de dados para a mesclagem de dados do Access para o Word, concate-
envolvia dados de diversas áreas, conforme necessário para obter melhores resultados quando se trabalha com documentos do Word.
Um campo concatena o nome, cargo e informações de nome da empresa, usando o IIf função para
evitar a criação de linhas em branco, e outro cria um campo único com informações de endereço. Esta tecnologia-
nique garante que você não verá linhas em branco no bloco de endereço em uma carta, ou um rótulo, mesmo que
143
Trabalhando com documentos do Word e modelos
6
11_047026 ch06.qxp 02\/04\/07 21:44 página 143
a falta de alguns campos de dados. Eu, também, criar um campo ZipCode separado para uso na criação de barra de PostNet EUA
códigos em envelopes ou etiquetas.
O banco de dados da amostra, esta consulta é qryContactsForMerge . As expressões de campo calculado eu
usado para concatenar dados do simples tblContacts de arquivo simples são listados em seguida. Dependendo da
campos em sua tabela (s), essas expressões precisará ser personalizado — por exemplo, para lidar com
endereços de vários 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 ([país] = \"EUA\" ou Nz([Country])=\"\",[PostalCode],\"\")
LastNameFirst
[Sobrenome]
No código do VBA, você pode usar o VB chamado constante
vbCrLf
para indicar um CR + LF (car-
Carre retorno além de avanço de linha) iniciar uma nova linha em uma seqüência de caracteres de texto, mas constantes nomeadas não pode
ser usado em expressões de consulta campo, então eu uso o Chr
valores dos caracteres CR e LF.
Usar uma consulta para fazer a concatenação (em vez de criar expressões no código VBA) torna
muito mais fácil para verificar que as expressões estão retornando os dados corretos e para corrigir quaisquer problemas
antes de realizar a mesclagem. Depois de criar as expressões, basta mudar para o modo folha de dados para inspecionar o
resultados e, em seguida, alternar de volta para criar modo de exibição para corrigir quaisquer problemas que você vê.
DICA DICA
144
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
11_047026 ch06.qxp 02\/04\/07 21:44 página 144
Escolhendo um método para mesclar o acesso
Dados para o Word
O NewDocFromTemplate procedimento listado na seção anterior lista palavra documento prop-
erties que pode ser preenchido com os dados de acesso. Este é meu método preferido para exportação de dados de acesso para
Documentos do Word, mas não é o único método. Você também pode exportar os dados de acesso ao livro de palavra-
marcas, ou simplesmente inserir dados em um documento do Word usando o método TypeText. E depois há
mala direta, que é mais adequada para mesclar dados de um grande número de registros. Tabela 6.1
compara as vantagens e desvantagens destes métodos.
TABELA 6.1
Comparação de quatro maneiras para mesclar os dados de acesso ao Word
Método Vantagens Desvantagens
Marcadores Não é necessário para abrir as propriedades Você não pode inserir o mesmo indicador duas vezes
folha; indicadores são inseridos diretamente em um modelo; para exibir as mesmas infor-
para o modelo. mação em dois ou mais lugares, você quer
precisa criar outro marcador ou usar
Marcadores são mais familiares a palavra um campo de referência cruzada que referencia o
usuários do que propriedades do documento. primeiro indicador.
Cria um documento separado para cada Os usuários podem inadvertidamente digitam na
registro, que permite a fácil personalização texto dentro de um indicador, substituindo o
de documentos específicos. valor exportado.
Não 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 criação de propriedades de documento
exibido em vários locais, usando no modelo, na guia personalizado de
campos. a folha de propriedades.
Cria um documento separado para cada
registro, que permite a fácil personalização
de registros específicos.
Não 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 página 145
TABELA 6.1 (continuação)
Método Vantagens Desvantagens
TypeText Nenhuma preparação antecipada de qualquer tipoApropriado somente para documentos muito simples,
é necessário; Esse método funciona com um tais como etiquetas de endereçamento ou listas tabulares.
documento criado a partir do padrão Word
modelo, ou um documento de etiquetas padrão.
Não 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 número de mesclagemPersonalização de registros individuais é
de registros, muito grandes para criar um difícil, porque todos os dados são mesclados para um
documento individual para cada registro. documento único.
A criação de um documento de etiquetas de mala direta é
mais complexo do que criar um Etiquetas
documento para uso com o método 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ê não 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
Exportação de banco de dados estão no formato do Word 2007, e outros estão em formato Word 97\/2003. As extensões
são diferentes para esses dois formatos; novos documentos têm a extensão. docx, e novos modelos têm o
extensão. dotx, Considerando que os mais velhos têm as extensões. doc ou. dot, como mostrado na Figura 6.8. Quando
você abre um documento ou modelo no formato mais velho, a barra de título diz \"(modo de compatibilidade)\" após
o nome do arquivo.
A nova coluna do tipo no Windows Vista Explorer mostra o conteúdo de uma Word 2007
campo de palavras-chave do documento, então você pode usar esta propriedade interna do Word para exibir rele-
informações de vant no Explorer.
Trabalhar com propriedades de documento do Word
Em versões anteriores do Word, propriedades de documento foram acessadas de uma maneira simples,
através da caixa de diálogo Propriedades, abrir no menu arquivo. O processo é agora mais complicado;
no Word 2007, você clique no botão Office, selecione preparar e Propriedades (Ver Figura 6.9).
DICA DICA
NOTA NOTA
146
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
11_047026 ch06.qxp 02\/04\/07 21:44 página 146
FIGURA 6.8
Modelos do Word e documentos em formatos Word 2002\/2003 e Word 2007.
FIGURA 6.9
A seleção 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 informações do documento (Ver Figura 6.10), onde você pode modificar algumas das mais
Propriedades internas do documento comum.
FIGURA 6.10
O painel de informações de documento do Word 2007.
Em seguida, clique no botão de propriedades de lista suspensa na barra de título (a seleção inicial é padrão) e
selecione Propriedades avançadas. 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 código VBA para trocar dados entre os componentes do Office
Parte II
11_047026 ch06.qxp 02\/04\/07 21:44 página 148
Clique em Custom para ver as propriedades do documento personalizado; Estes são os que são 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 várias propriedades de documento personalizadas que são úteis para criar deixe-
ters e outros documentos preenchidos com dados de uma consulta de seleção de acesso.
FIGURA 6.12
O guia Personalizar da folha de propriedades do Word.
Você também 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 espaços e você
deve evitar usando o mesmo nome como uma propriedade interna, embora a palavra permite isso), selecione o
tipo de dados (texto, numérico, data ou sim\/não), insira um valor padrão se desejado e clique o Adicionar mas -
ton. Ao longo de anos de trabalho com propriedades de documento do Word, eu descobri algumas limitações de
Propriedades de documento do Word e desenvolvidas algumas soluções para lidar com eles:
Se você não especificar um valor padrão para uma propriedade de texto, Word não vai deixar você salvá-lo; em vez disso,
Use um espaço (o que é permitido) como o valor padrão.
Campos de data geralmente devem ser evitados, exceto raros casos onde você realmente precisa
um padrão de data valor, porque não há nenhuma maneira de lhes dar um valor padrão em branco. É possível
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 código VBA para trocar dados entre os componentes do Office
Parte II
Campos numéricos também devem ser evitados, porque você não pode fazê-los em branco (você
não pode querer que um zero aparece no documento quando o campo não possui dados de
Acesso) e, mais importante, porque todos os números são truncados para números 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 numéricos para uma propriedade de documento de texto (texto valores não são
truncado) e, em seguida, formatá-los com o formato numérico apropriado no Word.
Sim\/não Propriedades exigem que você selecione Sim ou não como o valor padrão; Se isto é
inaceitável, usar um campo de texto, possivelmente, convertendo os valores True ou False em um acesso
Sim\/não campos como \"Sim\", \"Não\", ou uma seqüência 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 níveis da nova faixa de opções, você
verá uma caixa de diálogo Word 2003 familiar. Se você vê uma seta diagonal minúscula no baixo-
neste canto de um grupo em uma faixa de opções, clique na seta e, em seguida, a imagem da caixa de diálogo, para abrir a famil-
caixa de diálogo IAR Word 2003 para que recurso (veja Figura 6.14).
Enviando uma carta de palavra para um único acesso contato
Você pode ter um formulário de contatos ou clientes em um banco de dados do Access, e seria conveniente
tem uma maneira rápida de criar uma carta para o contato atual, usando um botão de comando no formulário.
O banco de dados de exportação de palavra amostra tem um formulário para contatos, frmContacts, mostrados a navegação
Figura 6.15.
Se você clicar na palavra no cabeçalho deste formulário, é 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 página 150
151
Trabalhando com documentos do Word e modelos
6
FIGURA 6.14
Abrindo a caixa de diálogo parágrafo antiga da nova faixa de opções.
FIGURA 6.15
Um formulário para contatos, com um botão para a criação de uma carta de palavra a navegação.
11_047026 ch06.qxp 02\/04\/07 21:44 página 151
152
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
Usando a palavra campo opções 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 são exibidas no documento do Word em DocProperty
campos. Você pode usar o campo opções para formatar os dados exibidos no campo DocProperty em uma variedade de
maneiras, que vão ser necessário se você seguir o meu Conselho e use principalmente (se não exclusivamente) texto
Propriedades do documento. Os interruptores de campo necessários para produzir alguns formatos comumente usados estão listados
na tabela a seguir.
Dados de acesso RAW Formato Word desejado Interruptores de código 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 cinqüenta e 50\/100 DollarText
150250.25 CENTO CINQUENTA MIL DOCPROPERTY \"DollarAmount\" \/ *
DOIS CEM CINQÜENTA E 25\/100 DollarText \/ * superior
150250.50 cento cinquenta mil DOCPROPERTY \"EntryAmount\" \/ *
duzentos cinquenta CardText
13\/11\/2005 Décimo terceiro DOCPROPERTY \"StartDate\" \/ @ \"d\" \/ *
OrdText \/ * FirstCap
13\/11\/2005 Novembro de DOCPROPERTY \"StartDate\" \/ @
\"MMMM\"
Você pode criar códigos 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 código de fecho de correr (ou o código postal, dependendo
no país), você deve fazer o campo ZipCode DocProperty invisível. Para fazer isso, selecione o
campo, abra a caixa de diálogo fonte clicando na pequena seta no canto inferior direito do grupo fonte sobre o
Faixa de opções do Word e marcar a opção oculto. Em seguida, posicione o cursor acima do bloco de endereço,
Selecione Inserir

Partes rápidas

Campo, selecione o campo de código de barras e, em seguida, o indicador de CEP;
Deixe a caixa de verificação de código de barras POSTNET marcada e clique em OK para inserir o campo de código de barras (consulte o
próxima figura).
DICA DICA
11_047026 ch06.qxp 02\/04\/07 21:44 página 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 atualizações de\"caixa de seleção não 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 experiência) uma fonte diferente ou o tamanho do que as outras palavras.
Um envelope com um código de barras PostNet E.U. acima o endereço.
Consulte a tabela anterior para obter uma listagem dos interruptores de campo de palavra usada para formatar valores em
DocProperty campos.
REFERÊNCIA CRUZADA REFERÊNCIA CRUZADA
DICA DICA
11_047026 ch06.qxp 02\/04\/07 21:44 página 153
O cmdWord_Click() procedimento de evento primeiro salva as informações de variáveis, para uso mais tarde na
código 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 referência para o
Word CustomDocumentProperties coleção do documento recém-criado e define cada docu -
Propriedade de mento para uma variável ou o valor em um campo do registro atual. O segmento de
nome de código que cria um save para o documento (utilizado na maioria dos meus procedimentos de exportação) usa um
Fazer...Loop instrução para criar um save o nome para o documento que contém os dados mesclados, pick-
ing o nome do contato de um campo no formulário, adicionar a data de hoje, em um formato que usa traços
para criar um nome de arquivo aceitável:
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 informações de endereço necessárias:
strTest = Nz (Me! [StreetAddress])
Se strTest = \"\", em seguida,
MsgBox \"não pode enviar carta - nenhum endereço!\"
GoTo ErrorHandlerExit
End If
strContactName = _
NZ (Me! [NomeDoContato])
strCompanyName = _
NZ (Me! [CompanyName])
strWordTemplate = \"Contato carta Doc Props.dotx\"
154
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
11_047026 ch06.qxp 02\/04\/07 21:44 página 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 não for encontrado:
strTestFile = Nz(Dir(strWordTemplate))
Debug. Print \"o arquivo de teste:\"
Se strTestFile = \"\", em seguida,
MsgBox strWordTemplate _
& “ template not found; can’t create letter”
GoTo ErrorHandlerExit
End If
Defina a variável de aplicativo do Word; se a palavra não está em execução, o manipulador de erro padrão
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 não podem ter todas as propriedades de doc:
Em erro continuar próximo
PRPs.Item(\"NameTitleCompany\").Valor = _
NZ (Me! [NameTitleCompany])
PRPs.Item(\"WholeAddress\").Valor = _
NZ (Me! [WholeAddress])
PRPs.Item(\"Salutation\").Valor = _
NZ (Me! [Saudação])
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 página 155
Verifique se há uma carta previamente salva na pasta documentos e acrescentar um número incrementado
para salvar o nome se encontra:
i = 2
intSaveNameFail = True
Enquanto intSaveNameFail
strSaveNamePath = strDocsPath
Debug. Print \"propõe-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 número 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 não é usado:\"
intSaveNameFail = False
End If
Loop
Com appWord
.Visível = 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 então
' Palavra não está em execução; Palavra aberta com CreateObject
Set appWord = CreateObject(Class:=\"Word.Application\")
Retomar em seguida
156
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
11_047026 ch06.qxp 02\/04\/07 21:44 página 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 código VBA, salvar a data atual para o TodayDate
Propriedade de documento, o código de exportação, ao invés de inserir um código 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 código faz um loop para trás e adiciona um número ao final do salvar
nome e continua tentando até que seja atingido um número não utilizado. Esta técnica significa que você não vai
substituir documentos criados no mesmo dia, mas em vez disso, criará uma série de documentos com incre-
números 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 página 157
Se você não quiser criar vários documentos, você pode eliminar a Fazer...Loop instrução e
Substitua um arquivo existente com o mesmo nome, se houver.
Enviando uma carta de palavra para vários contatos de acesso
Quando você precisa selecionar um grupo de destinatários para uma letra da palavra, conjunto de etiquetas, ou outro documento,
você precisa de uma interface diferente. O frmMergeToWord de formulário tem uma caixa de combinação para selecionar uma palavra
modelo e uma caixa de listagem seleção múltipla para selecionar um ou mais contatos como destinatários (Ver Figura 6.17).
FIGURA 6.17
Um formulário para a seleção de um documento e destinatários para a criação de documentos do Word preenchido com os dados de acesso do
vários registros de contatos.
A lista de caixa de combinação selecione documento mostra o tipo de mesclagem na segunda coluna (Ver Figura 6.18).
O procedimento de evento Click do botão 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 método merge é captado da terceira coluna da
lista de caixa de combinação (primeira coluna não é exibida, ele contém o nome do arquivo selecionado docu-
mento, para uso no código).
Porque alguns dos documentos de mesclagem são documentos do Word e alguns são modelos, e alguns são
no formato do Word 2007 e outros em formato Word 97\/2003, há uma Se...Em seguida declaração em
o procedimento que examina a extensão do documento original e cria o save apropriado
extensão de documento para ser usado como um argumento para os procedimentos de chamada.
158
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
11_047026 ch06.qxp 02\/04\/07 21:44 página 158
FIGURA 6.18
Uma caixa de combinação 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
extensão 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 página 159
Verifique o modelo na pasta de modelo selecionado e sair se não for encontrado:
strTestFile = Nz(Dir(strWordTemplate))
Debug. Print \"o arquivo de teste:\"
Se strTestFile = \"\", em seguida,
MsgBox strWordTemplate
& “can’t 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\", então
strExtension = \". docx\"
Outra coisa
strExtension = \". doc\"
End If
Selecione o caso strMergeType
Caso \"Adereços 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 adereços é selecionado, o procedimento de MergeDocProps é chamado.
Este procedimento define primeiro uma referência à coleção ItemsSelected acessível do ListBox (esta col-
lectora inclui apenas as linhas selecionadas na ListBox), então itera através da coleção, creat -
ing um novo documento do Word para cada registro de contato.
160
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
11_047026 ch06.qxp 02\/04\/07 21:44 página 160
O código define uma referência à coleção de Word CustomDocumentProperties a recém
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 título 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 informações de endereço necessárias:
strTest = Nz (lst.Coluna (5, varItem))
Debug. Print \"Endereço:\"
Se strTest = \"\", em seguida,
Debug. Print \"Ignorando este registro - nenhum endereço!\"
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 página 161
Abra um novo documento baseado no modelo seleccionado:
Set appWord = GetObject(Class:=\"Word.Application\")
appWord.Documents.Add strWordTemplate
Gravar informações de propriedades do documento personalizado do Word:
Conjunto prps = _
appWord.ActiveDocument.CustomDocumentProperties
Desativar o manipulador de erro porque alguns modelos não têm todas as propriedades de doc:
Em erro continuar próximo
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
número 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 \"propõe-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 código VBA para trocar dados entre os componentes do Office
Parte II
11_047026 ch06.qxp 02\/04\/07 21:44 página 162
Crie um novo salve o nome com o número 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 não é 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
Próxima varItem
Com appWord
.ActiveWindow.WindowState = wdWindowStateNormal
.Visível = True
.Ativar
Terminar com
ErrorHandlerExit:
Exit Sub
ErrorHandler:
Se errar = 429 então
' Palavra não está em execução; 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 página 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 métodos, ou definir como os valores das propriedades, procure o apropriado enumera -
ção (enum) no Pesquisador de objetos. Enums palavra começar com a Wd e estão 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 botão de comando clara todas as seleções,
desmarca todas as linhas na caixa de listagem, mesmo aqueles que você não pode ver, então você pode começar de novo:
Private Sub cmdDeselectAll_Click()
No erro GoTo ErrorHandler
Conjunto lst = Me![lstSelectContacts]
intRows = lst.ListCount - 1
DICA DICA
164
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
11_047026 ch06.qxp 02\/04\/07 21:44 página 164
Para intIndex = 0 para intRows
LST.Selected(intIndex) = False
Próxima intIndex
ErrorHandlerExit:
Exit Sub
ErrorHandler:
MsgBox \"erro nenhum:\"
& “; Description: “ & Err.Description
Resume ErrorHandlerExit
End Sub
O cmdSelectAll_Click procedimento, executar a partir do botão de comando selecionar todos os nomes, seleciona
Todas as linhas no listbox; seu código é similar, definindo o Selecionado valor para Verdadeiro Em vez de
Falso .
Clicando no botão de comando de limpar todas as selecções limpa todas as seleções que você fez na lista-
caixa; clicando no botão 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 combinação 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 visíveis, assim você pode ver suas localizações; Note que o eu-barras cinza).
O MergeBookmarks procedimento (listado em seguida) é basicamente semelhante a MergeDocProps
código listado em uma seção anterior; a diferença é que em vez de trabalhar com o
CustomDocumentProperties coleção, ele funciona com a coleção de Bookmarks, escrevendo
informações de variáveis ou listbox denominado favoritos no recém-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 página 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 código VBA para trocar dados entre os componentes do Office
Parte II
11_047026 ch06.qxp 02\/04\/07 21:44 página 166
Verificar informações de endereço necessárias:
strTest = Nz (lst.Coluna (5, varItem))
Debug. Print \"Endereço:\"
Se strTest = \"\", em seguida,
Debug. Print \"Ignorando este registro - nenhum endereço!\"
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 informações de favoritos de palavra, primeiro desligar o manipulador de erro, porque alguns modelos
não tenho todos estes indicadores:
Em erro continuar próximo
Com appWord.Selection
.GoTo que: = wdGoToBookmark, _
Nome: = \"NameTitleCompany\"
.TypeText Text: = strNameTitleCompany
.GoTo que: = wdGoToBookmark, _
Nome: = \"WholeAddress\"
.TypeText Text: = strWholeAddress
.GoTo que: = wdGoToBookmark, nome: = \"Saudação\"
.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 página 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
número 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 \"propõe-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 código VBA para trocar dados entre os componentes do Office
Parte II
11_047026 ch06.qxp 02\/04\/07 21:44 página 168
Crie um novo salve o nome com o número 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 não é 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
Próxima varItem
Com appWord
.ActiveWindow.WindowState = wdWindowStateNormal
.Visível = True
.Ativar
Terminar com
ErrorHandlerExit:
Exit Sub
ErrorHandler:
Se errar = 429 então
' Palavra não está em execução; 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 página 169
O método TypeText
Para documentos simples, como mandar etiquetas, onde você só precisam inserir um bloco de texto de
Acesso, sem formatação de fantasia, o TypeTextMétodo do objeto Selection Word pode ser útil.
Se você selecionar a seleção de Avery 5160 (TypeText) da caixa de combinação selecione documento em
frmMergeToWord, você terá um documento do Word em forma de uma tabela com células 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ê também pode criar um documento do tipo de lista usando o método 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 variáveis diretamente para as células em um
tabela, movendo-se para a próxima célula usando o MoveRight método:
Private Sub MergeTypeText(strWordTemplate As String, _
strExtension As String)
No erro GoTo ErrorHandler
NOVO RECURSO NOVO RECURSO
170
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
11_047026 ch06.qxp 02\/04\/07 21:44 página 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 rótulos 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 formatação.
171
Trabalhando com documentos do Word e modelos
6
11_047026 ch06.qxp 02\/04\/07 21:44 página 171
Determinar se o modelo é para rótulos ou lista e mover para a primeira célula de dados na tabela se
necessário:
Se Nz (InStr (strWordTemplate, \"Lista\")) > 0 então
appWord.Selection.GoTo o que: = wdGoToTable, _
que: = wdGoToFirst, _
Contagem: = 1
unidade appWord.Selection.MoveDown: = wdLine, _
Contagem: = 1
End If
Definir ointMod valor dependendo do número de células 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 informações necessárias:
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 código VBA para trocar dados entre os componentes do Office
Parte II
11_047026 ch06.qxp 02\/04\/07 21:44 página 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 rótulos ou de uma lista:
Se Nz (InStr (strWordTemplate, \"Lista\")) > 0 então
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, \"Rótulos\")) > 0 então
lngCount = lngCount + 1
Inserir dados em etiquetas, saltando de colunas estreitas espaçador:
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
células válido:
lngSkip = lngCount Mod intMod
Se lngSkip <>0 então
.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 página 173
NextContact:
Próxima varItem
Se Nz (InStr (strWordTemplate, \"Lista\")) > 0 então
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
número 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 \"propõe-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 número 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 não é usado:\"
intSaveNameFail = False
End If
Loop
174
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
11_047026 ch06.qxp 02\/04\/07 21:44 página 174
Salve documento do Word:
appWord.ActiveDocument.SaveAs strSaveNamePath
Com appWord
.ActiveWindow.WindowState = wdWindowStateNormal
.Visível = True
.Ativar
Terminar com
ErrorHandlerExit:
Exit Sub
ErrorHandler:
Se errar = 429 então
Palavra não está em execução; 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 método. O documento de mala direta não vai abrir, a menos que o banco de dados do Access está disponível
e é no mesmo local quando a fonte de dados de mesclagem foi selecionada. Devido a essa limitação,
ao usar a mala direta que eu prefiro para exportar os dados de acesso para um arquivo de texto e atribuir o recém-criado
arquivo de texto como fonte de dados do documento de mala direta. Isso significa que o documento pode ser aberto com-
acesso sendo disponível e sem a necessidade de estabelecer um link para um banco de dados.
Etiquetas de endereçamento
Folhas de etiquetas de endereçamento são muito apropriadas para mala direta; você pode selecionar três tipos de Avery de discussão
rótulos (tipo mala) da caixa de combinação 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 método, por isso eu prefiro usar o TypeText método, 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 rótulos-
tipo de documento no Word, Considerando que a criação 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 página 175
FIGURA 6.23
Uma discussão de 5161 Avery etiquetas documento de mala direta, preenchido com os dados de acesso.
Listas
A mesclagem de catálogo do tipo Word é muito útil para a produção 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 página exibe dados de um con-
registro de tato. Eu prefiro usar o método 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 não é prático. Seleção no documento selecione contato letras (mala direta)
caixa de combinação cria um documento de mala direta com uma letra em cada página; Figura 6.25 mostra uma página
deste documento de mesclagem.
176
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
11_047026 ch06.qxp 02\/04\/07 21:44 página 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ê não será capaz de continuar. Para evitar isso de
acontecendo, o código da mala fecha o documento original de mesclagem após a fusão de dados para um novo
documento.
O MailMergeTextFile procedimento é listado como segue. Esse procedimento primeiro preenche uma tabela do Access
com os dados da coleção 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 título do modelo e o
data, formatada com traços 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 página 177
FIGURA 6.25
A terceira página 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 código 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 não adianta fazer um mail
Mesclar para apenas um contato:
Conjunto lst = Me![lstSelectContacts]
Se lst.ItemsSelected.Count < 0 então
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 informações de endereço necessárias:
strTest = Nz (lst.Coluna (5, varItem))
Debug. Print \"Endereço:\"
Se strTest = \"\", em seguida,
Debug. Print \"Ignorando este registro - nenhum endereço!\"
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 página 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
![Saudação] = strSalutation
![TodayDate] = strLongDate
![CompanyName] = strCompanyName
![JobTitle] = strJobTitle
![CEP] = strZipCode
![NomeDoContato] = strContactName
.Atualização
Terminar com
NextContact:
Próxima 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 código VBA para trocar dados entre os componentes do Office
Parte II
11_047026 ch06.qxp 02\/04\/07 21:44 página 180
Verificar se um documento salvo anteriormente na pasta documentos e acrescentar um incrementado
número 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 \"propõe-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 número 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 não é 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 página 181
Salve o documento de mesclagem recém-criado:
.ActiveDocument.SaveAs strSaveNamePath
Feche o documento de mesclagem mestra:
.Documents(strDocName)._ Close
SaveChanges: = wdDoNotSaveChanges
Terminar com
ErrorHandlerExit:
Exit Sub
ErrorHandler:
Se errar = 429 então
Palavra não está em execução; 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 vários tipos de documentos do Word, ambos na inter-
enfrentar e no código do VBA, você pode produzir documentos de palavra altamente formatados preenchidos com dados de acesso.
Microsoft promove a mala, mas na minha opinião é melhor evitar esse método (especialmente em
Office 2007 e Windows Vista), devido a problemas com recursos de segurança. Com o
três outras técnicas abordadas nesse capítulo, você vai saber como produzir quase qualquer tipo de
documento usando outros métodos e evitar os problemas com bancos de dados bloqueados ou indisponíveis
ao usar a mala direta quando for necessário.
182
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
11_047026 ch06.qxp 02\/04\/07 21:44 página 182
J
Ust como você pôde querer exportar dados de acesso a documentos do Word para
Aproveite sua formatação superior e transportabilidade, você
maio também quer (ou necessidade) para exportar dados de acesso a planilhas do Excel, assim
os usuários podem rever, editar, adicionar dados ou executar vários numérica c-
ções, em um formato familiar e amplamente utilizado (todos os usuários do Office que o Excel,
Considerando que só alguns têm acesso). Planilhas do Excel são frequentemente utilizadas para enter-
ção e análise numérica (e o texto) dados, tais como quadros de horários, applica -
ções e outras formas. Ou você pode querer exportar dados do Access para um simples
linhas e colunas de planilha, para que os usuários podem manipular os dados em vari -
UOs maneiras e produzir gráficos com base nos dados, usando as ferramentas no Excel.
Este capítulo 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 opções, ou usar o TransferirPlanilha método em um único
linha de código para fazer uma exportação de básica de todos os dados em uma tabela ou consulta para um simples
planilha, ou escrever o código mais complexo de automação 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 contém um ou mais
planilhas. No entanto, em geral jargão você vai ouvir (e ler) planilha
usado para fazer referência a um arquivo. xls, uma prática transitadas desde os primeiros dias de
Excel, antes de pastas de trabalho foram adicionadas à interface. Vou seguir esse uso
exceto quando é necessário distinguir entre uma pasta de trabalho e trabalho-
folha, como descrever como funciona um procedimento.
NOTA NOTA
183
NESTE CAPÍTULO
O modelo de objeto do Excel
Criação de planilhas de
a faixa de opções
Criação de planilhas de
modelos
Formatação de planilhas
Código VBA
Preenchimento de planilhas de Excel com
Quadro de horários de acesso a dados
Trabalhando com o Excel
Planilhas
12_047026 ch07.qxp 02\/04\/07 21:44 página 183
Simplesmente exportar dados do Access para Excel
Assim como em versões anteriores do Office, o Access oferece duas maneiras de fazer uma exportação rápida e suja de tabela ou
consultar dados de uma planilha do Excel. Você pode usar o botão do Excel no grupo de exportação do externo
Dados guia da faixa de opções para exportar dados do Access sem se preocupar com a formatação, para um escritório
2007 usuário que só quer os dados. Se você precisa criar planilhas que podem ser abertas e editadas
por usuários executando versões anteriores do Office, ou usando um dispositivo portátil como um BlackBerry, você pode
Use o TransferirPlanilha método para exportar dados, selecionando a planilha desejada de saída
formato. Isso pode ser útil quando você trabalha para uma organização que tem atualizado seu software e
você precisa enviar uma planilha com informações de contato do cliente para um representante de vendas que não tem
atualizado seu laptop ainda.
Para uma exportação rápida para o novo formato de planilha xlsx, use o botão do Excel no grupo de exportação
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 opções.
Clicando no botão Excel abre uma caixa de diálogo onde você pode procurar o local para salvar o
planilha. Este diálogo tem uma opção para preservar o layout e formatação do original
Objeto do Access, que (curiosamente) está disponível somente se uma tabela ou consulta é selecionado (Ver Figura 7.2).
Tabelas e consultas não têm muito em termos de formatação e layout, mas se você verificar o
Caixa de seleção \"Exportar dados com formatação e layout\" sua planilha de Excel usará a mesma fonte como
a tabela ou consulta (embora não o sombreamento de linha alternativo), e ele vai mostrar dados de uma tabela vinculada
em vez do campo ID da ligação. 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 código VBA para trocar dados entre os componentes do Office
Parte II
12_047026 ch07.qxp 02\/04\/07 21:44 página 184
FIGURA 7.2
As opções ao exportar uma tabela para uma planilha do Excel.
FIGURA 7.3
Planilhas Excel exportou com e sem verificar a opção \"Exportar dados com formatação e layout\"
na caixa de diálogo Exportar.
185
Trabalhando com planilhas do Excel
7
12_047026 ch07.qxp 02\/04\/07 21:44 página 185
O botão do Excel na faixa de opções (com ou sem o layout e a formatação preservada) é um útil
opção quando você precisa criar uma planilha de Excel rápida e suja no formato do Excel 2007 (o novo
a extensão é. xlsx). Se você precisa exportar para um formato anterior do Excel, mas você não precisa de fantasia formato-
Ting, você pode fazer uma exportação com uma única linha de VBA código, usando o TransferirPlanilha
método, que está disponível desde os primeiros dias de acesso.
O TransferirPlanilha método permite que você selecione a versão do Excel para a criação de seu
planilha preenchida com dados de acesso, assim você pode criar planilhas que será utilizável por destinatários
quem tem versões mais antigas do Office. O procedimento listado a seguir exporta tblContacts para Excel
97-2003 planilha chamada Contacts.xls (é o constante nomeada para esta versão da planilha
acSpreadsheetTypeExcel7 ):
Função pública 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 não formatada exportada da faixa de opções
seleção, mas é o formato mais velho, como você pode ver o \"(modo de compatibilidade)\" após o
nome da planilha na sua barra de título (Ver Figura 7.4).
186
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
12_047026 ch07.qxp 02\/04\/07 21:44 página 186
FIGURA 7.4
Uma tabela do Access exportados para uma planilha do Excel 97-2003.
O modelo de objeto do Excel
As opções de exportação de dois descritas na seção anterior são muito bem para criar um simples, minimamente
formatado ou não 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 horários, relatórios de vendas, fábrica
relatórios de dados de produção e assim por diante, você precisará trabalhar com o modelo de objeto do Excel para criar
planilhas usando código de automação, preenchê-los com dados de acesso e, em seguida, aplicar a formatação, usando
componentes do modelo de objeto do Excel.
O banco de dados de exemplo Export.accdb do Excel contém tabelas, consultas, formulários e código
usado neste capítulo.
O CreateObject e GetObject funções são usadas para criar um novo objeto do Excel, ou
Defina uma referência a uma instância existente do Excel. Usando GetObject para recuperar uma referência a um
pasta de trabalho existente evita a criação de instâncias adicionais do Excel, que utiliza recursos do sistema. Para
abrir uma planilha dentro de uma pasta de trabalho, primeiro definir uma referência para o objeto de pasta de trabalho, em seguida, adicionar um novo
pasta de trabalho para a coleção de pastas de trabalho. Por padrão, a nova pasta de trabalho terá três planilhas.
O CreateNewWorkbook procedimento cria uma pasta de trabalho nova e em branco do Excel padrão
modelo, com três 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 página 187
Criar e abrir um livro novo e em branco:
bks.Adicionar
Tornar a pasta visível:
appExcel.Application.Visible = True
ErrorHandlerExit:
Exit Sub
ErrorHandler:
Se errar = 429 então
Excel não está em execução; 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 seção podem ser executados a partir de macros; cada procedimento tem uma macro
cujo nome é
MCR
Além disso, o nome do procedimento.
O manipulador de erro no procedimento anterior é semelhante ao usado na automação do Word
código no capítulo 6; define uma referência à instância atual do Excel, se o Excel está em execução e caso contrário
Cria um novo aplicativo do Excel instância usando o CreateObject função de uma linha na
manipulador de erro do procedimento. Se você executar o CreateNewWorkbook procedimento várias 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 código VBA para trocar dados entre os componentes do Office
Parte II
12_047026 ch07.qxp 02\/04\/07 21:44 página 188
FIGURA 7.5
Três pastas de trabalho na janela do Excel.
Para abrir uma pasta de trabalho salva específica, use um procedimento como esse listado a seguir, que abre um salvo
pasta de trabalho usando a coleção de planilhas Abertométodo e o nome do arquivo e o caminho:
Função pública 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 título da pasta de trabalho\"
strTitle = \"Nome da pasta de trabalho\"
strDefault = \"D:\/Documents\/tblContacts2.xls\"
strWorkbook = InputBox (prompt: = strPrompt, _
Título: = strTitle, padrão: = 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 página 189
SHTAtivar
appExcel.Application.Visible = True
ErrorHandlerExit:
Exit Sub
ErrorHandler:
Se errar = 429 então
Excel não está em execução; 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 código VBA para trocar dados entre os componentes do Office
Parte II
12_047026 ch07.qxp 02\/04\/07 21:44 página 190
Se o Excel não está em execução, a pasta de trabalho será aberto em uma nova janela do Excel.
Tal como acontece com a exportação de dados de acesso à palavra, ao escrever o código de automação 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 são usados nos procedimentos mais complexos de automação do Excel em
as seções a seguir.
Planilhas minimamente formatadas
Se você precisa criar uma planilha simples de tabular listando os contatos em qryContacts, com mínima
formatação, você pode criar uma nova pasta de trabalho no código VBA, a partir de um modelo de pasta de trabalho salvo com uma
título, 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
exportações selecionado campos de cada registro em que consulta a uma pasta de trabalho criada a partir de um modelo, com
um título, títulos de coluna e alguma formatação mínima:
Função pública 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 página 191
Verifique o modelo na pasta de modelo seleccionado e sair se não for encontrado:
strTestFile = Nz(Dir(strTemplateFileAndPath))
Debug. Print \"o arquivo de teste:\"
Se strTestFile = \"\", em seguida,
MsgBox strTemplateFileAndPath _
& “ template not found; “ _
& “can’t create worksheet”
GoTo ErrorHandlerExit
End If
strWorksheetPath = GetWorksheetsPath
Debug. Print \"modelo de planilha e o caminho:\" _
& strTemplateFileAndPath
Definir uma referência 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 referência para a consulta:
Conjunto dbs = CurrentDb
Set rst = dbs.OpenRecordset (\"qryContacts\" _
dbOpenDynaset)
RST.MoveLast
RST.MoveFirst
lngCount = rst.RecordCount
Se lngCount = 0 então
MsgBox \"Não há contatos para exportação\"
GoTo ErrorHandlerExit
Outra coisa
strPrompt = \"Exportar\"
& “ contacts to Excel”
strTitle = \"Exportar\"
MsgBox strPrompt, vbInformation + vbOKOnly, strTitle
End If
Ir para a primeira célula de dados:
Definir rngStart = wks.Range(\"A4\")
rngStart.Activate
Percorra o conjunto de registros, cada registro a importação para uma célula na planilha:
Com rst
Faço até.EOF
192
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
12_047026 ch07.qxp 02\/04\/07 21:44 página 192
Gravar dados de acesso de um registro diretamente as células 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(![Saudação])
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(![País])
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 página 193
Get a salvar o nome da Propriedade do título da pasta de trabalho:
Conjunto prps = _
appExcel.ActiveWorkbook.BuiltinDocumentProperties
strSaveName = strWorksheetPath
& “ - “ & Format(Date, “d-mmm-yyyy”)
Debug. Print \"planilha salvar nome:\"
Em erro continuar próximo
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, _
Título: = strTitle, padrão: = strDefault)
WKB.SaveAs FileName: = strSaveName, _
FileFormat: = xlWorkbookDefault
appExcel.Visible = True
ErrorHandlerExit:
Exit Sub
ErrorHandler:
Se errar = 429 então
Excel não está em execução; 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 célula de dados na planilha, e
começa Iterando através de registros no conjunto de registros, usando o Deslocamento método da célula ativa para
coloca os dados de cada campo na coluna correta.
194
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
12_047026 ch07.qxp 02\/04\/07 21:44 página 194
Quando todos os contatos foram exportados para a planilha, um salvar nome é construído a partir da
Propriedade do título 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 visível.
O
ExportContactsToExcel
procedimento nesta seção 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 código
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 análise ou distribuição. Por exemplo, uma companhia de seguros
talvez seja necessário exportar dados sobre as empresas que ele segura, incluindo o número de conta, conta
tipo de tomador do seguro e executivo de contas para utilização 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
formatação e dimensionamento é aplicado diretamente em código do VBA, para uma planilha do Excel 9 preenchida com acesso
dados peloTransferirPlanilha método:
Função pública 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 página 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 exportação:
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 próximo
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 recém-criada e introduza o material do título:
Set appExcel = GetObject (, \"Application\")
appExcel.Workbooks.Open (strSaveName)
Set wkb = appExcel.ActiveWorkbook
Conjunto sht = appExcel.ActiveSheet
SHTAtivar
Com sht
196
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
12_047026 ch07.qxp 02\/04\/07 21:44 página 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 página 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 cabeçalhos 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 título:
.Range(\"a1:F1\").HorizontalAlignment = xlCenter
.Range(\"a1:F1\").VerticalAlignment = xlBottom
.Range(\"a1:F1\").WrapText = False
.Range(\"a1:F1\").Orientação = 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 código VBA para trocar dados entre os componentes do Office
Parte II
12_047026 ch07.qxp 02\/04\/07 21:44 página 198
.Range(\"a2:F2\").VerticalAlignment = xlBottom
.Range(\"a2:F2\").WrapText = False
.Range(\"a2:F2\").Orientação = 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\").Orientação = 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 = \"Serviços da conta\"
.Range(\"a1\").Valor = \"Resumo de toda a nação de\"
199
Trabalhando com planilhas do Excel
7
12_047026 ch07.qxp 02\/04\/07 21:44 página 199
Ajuste as margens e a configuração de impressão de planilha:
.PageSetup.PrintTitleRows = \"$ 5:$ 5\"
.PageSetup.LeftFooter = \"
.PageSetup.CenterFooter = \"\"
.PageSetup.CenterHeader = \"\"
.PageSetup.RightFooter = \"página
.PageSetup.Orientation = xlLandscape
.PageSetup.PrintGridlines = False
.PageSetup.Zoom = 90
Terminar com
Fazer a planilha visível 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, _
Título: = strTitle, padrão: = strDefault)
WKB.SaveAs FileName: = strSaveName, _
FileFormat: = xlWorkbookDefault
appExcel.Visible = True
ErrorHandlerExit:
Exit Function
ErrorHandler:
Se errar = 429 então
Excel não está em execução; 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 código VBA para trocar dados entre os componentes do Office
Parte II
12_047026 ch07.qxp 02\/04\/07 21:44 página 200
Porque a pasta de trabalho foi criada em um formato antigo, você verá \"(compatibilidade
Modo) \"na sua barra de título.
O procedimento começa 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 método. A nova planilha é aberta e ativada e vários
intervalos na planilha são formatados, aplicando a fonte Calibri, bordas de linha fina e necessário
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, não a tabela.
Em seguida, o procedimento insere linhas em branco na parte superior da planilha e texto de título é inserido na parte superior;
Estas linhas de cabeçalho, em seguida, são formatadas com um fundo cinza e linhas superiores e inferiores. Vários
configurações de configuração e margem de impressão são 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 código VBA.
DICA DICA
NOTA NOTA
201
Trabalhando com planilhas do Excel
7
12_047026 ch07.qxp 02\/04\/07 21:44 página 201
Como uma maneira rápida de descobrir a sintaxe para vários comandos do Excel, abrir um trabalho de Excel-
folha, ligar o gravador de macro, executar as ações e, em seguida, salvar a macro. Aberto
o macro salva e copiar o código para o procedimento de acesso; com um corte pequeno de redundante
argumentos e edição para inserir seus nomes de variáveis, ele deve funcionar bem.
Quadros de horários
Quase qualquer tipo de negócio (que não seja uma operação one-person) precisa de um formulário para gravação
dos funcionários trabalham horas e uma maneira de imprimir ou distribuir eletronicamente os dados do quadro de horários. Muitas vezes um
empresa usou um formulário de papel para gravar horas de trabalho por muitos anos e o formulário eletrônico
precisa replicar o formulário de papel. Em alguns casos, há determinado governo ou indústria 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 horários no formato exato que você precisa e enchê-los com dados de acesso.
Um exemplo do uso de quadros de horários em tal forma é uma empresa de engenharia, cujos funcionários trabalham
em vários projetos para clientes da empresa. Porque as horas de trabalho dos trabalhadores (exceto aqueles
projetos atribuídos ao interno) serão cobrados para os clientes, neste caso uma planilha separada é
necessário para o trabalho de cada funcionário em um projeto específico por semana, assim um único empregado pode ter
vários quadros de horários em uma semana. No caso (por exemplo) é um estabelecimento de pesquisa científica, onde
horas não são tarifadas fora aos clientes, um quadro de horários por funcionário, listando vários projetos em uma semana,
seria mais adequado.
A forma frmWeeklyTimesheet (mostrada na Figura 7.9) é um acesso para entrar o quadro de horários
dados que serão exportados para o Excel os quadros de horários. Este formulário permite que você selecione um funcionário, cliente, e
projeto e preenchimento em um quadro de horários para que o empregado. A suposição é que um quadro de horários separado é feito
para cada combinação de projeto\/cliente, assim um empregado pode ter vários quadros de horários para uma determinada semana.
Fonte de na cboEmployeeID caixa de combinação linha é uma consulta União que combina dados de dois
consultas: qryThisWeeksTimesheets , que lista os quadros de horários que foram preenchidos até agora
Esta semana, e qryNeedTimesheets , que relaciona os funcionários que não tenham ainda preenchido um
quadro de horários para esta semana. A lista resultante exibe todos os funcionários, mostrando os quadros de horários que
ter sido preenchido até agora, como ilustrado na Figura 7.10.
DICA DICA
202
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
12_047026 ch07.qxp 02\/04\/07 21:44 página 202
FIGURA 7.9
Um formulário do Access para inserir dados de quadro de horários para exportação para Excel.
FIGURA 7.10
Uma lista de caixa de combinação apresentando quadros de horários para os funcionários.
Depois de selecionar um funcionário, o CurrentWeekEnding procedimento calcula o fim de semana
Data (hoje, se for domingo, caso contrário no domingo passado) e preenche as legendas dos sete data rótulos sobre
a forma com que o dia correto da semana; o nome do gerente também é exibido no Gerenciador de domínio
(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 oposição a um fundo branco para
controles editáveis) para dar aos usuários uma indicação visual de que eles não é possível digitar ou editar texto nestes
controles.
NOTA NOTA
203
Trabalhando com planilhas do Excel
7
12_047026 ch07.qxp 02\/04\/07 21:44 página 203
FIGURA 7.11
Informações de data automaticamente preenchido após selecionar um funcionário.
O CurrentWeekEnding e FillDateControls procedimentos são listados a seguir:
CurrentWeekEnding() função pública 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 código VBA para trocar dados entre os componentes do Office
Parte II
12_047026 ch07.qxp 02\/04\/07 21:44 página 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
Além disso, o código 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 combinação estiver em branco,
porque caso contrário, a consulta não poderia ser executada. A consulta de fonte de linha é uma consulta de FindUnmatched
criado com o Assistente de consulta que exclui combinações de cliente\/projeto para planilhas que têm
já foi preenchido para o funcionário selecionado, então você não pode acidentalmente selecionar o mesmo duas vezes.
205
Trabalhando com planilhas do Excel
7
12_047026 ch07.qxp 02\/04\/07 21:44 página 205
FIGURA 7.12
Selecionar um cliente e um projeto para um quadro de horários.
Se você precisar modificar os dados em um quadro de horários existente, você pode fazer isso mais tarde, na fase de revisão,
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 horários.
206
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
12_047026 ch07.qxp 02\/04\/07 21:44 página 206
No rodapé existem três botões de comando: o primeiro (\"claro este horários\") limpa a
quadro de horários para que você possa começar o segundo (\"salvar este horários\") salva o atual quadro de horários
e começa um novo registro para inserir um outro quadro de horários; e a terceira (\"enviar horários para Excel\")
abre um formulário de diálogo listando os quadros de horários que foram concluídos para esta semana, para
revisão. Os procedimentos de evento do botão de três comando são listados a seguir:
Private Sub cmdClearTimesheet_Click()
Em erro continuar próximo
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 nomedoformulário: = \"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 não salvos em tabela regular (tblWeeklyTimesheet) até que o usuário optar por salvá-lo, e
campos obrigatórios foram preenchidos:
Private Sub cmdSaveTimesheet_Click()
No erro GoTo ErrorHandler
Verifique se campos obrigatórios possuem valores e sair se não:
strTitle = \"Valor exigido\"
Se Nz (Me! [cboEmployeeID].Valor) = \"\", em seguida,
strPrompt = \"Favor selecionar um funcionário\"
207
Trabalhando com planilhas do Excel
7
12_047026 ch07.qxp 02\/04\/07 21:44 página 207
MsgBox prompt: = strPrompt, botões: = _ vbExclamation
+ vbOKOnly, título: = 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, botões: = _ vbExclamation
+ vbOKOnly, título: = 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)
.Atualização
.Fechar
Terminar com
Exclua o registro na tabela temp:
DoCmd.SetWarnings False
Chamada acCmdSelectRecord
208
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
12_047026 ch07.qxp 02\/04\/07 21:44 página 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 diálogo aberta a partir das tabelas de tempos de enviar para botão Excel é mostrada na Figura 7.14.
FIGURA 7.14
Uma forma de diálogo para rever timesheets desta semana.
TxtEmployeeID caixa de texto no subformulário folha de dados do formulário de diálogo tem um DblClick evento
procedimento, então você pode clicar duas vezes o nome de um funcionário para abrir esse quadro de horários para edição, se
necessário:
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 página 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 formulário:
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 \"seqüência SQL:\"
DoCmd.SetWarnings False
StrSQL DoCmd.RunSQL
Formulário aberto para edição selecionado de quadro de horários:
DoCmd. OpenForm nomedoformulário: = strForm
Conjunto frm = formulários![frmSelectedTimesheet]
frm.Caption = \"Quadro de horários semanal para\" _
& Me![EmployeeName]
DoCmd.Close acForm, Parent.Name
ErrorHandlerExit:
Exit Sub
210
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
12_047026 ch07.qxp 02\/04\/07 21:45 página 210
ErrorHandler:
MsgBox \"erro nenhum:\"
& “; Description: “ & Err.Description
Resume ErrorHandlerExit
End Sub
A forma de frmSelectedTimesheet é uma versão simplificada da frmWeeklyTimesheet (Ver Figura 7.15).
FIGURA 7.15
Um formulário para edição de um quadro de horários selecionado.
As horas podem ser editadas neste formulário, e quando tiver terminado, você pode tanto excluir este quadro de horários
Registre-se clicando no botão \"Clear este quadro de horários\", ou guardar o registo para o regular
tabela de tblWeeklyTimesheets. Clicando no botão \"Enviar quadros de horários para Excel\" reabre o
fdlgTimesheets de diálogo, com dados atualizados.
Clique no botão OK na fdlgTimesheets executa o CreateExcelTimesheets procedimento,
que cria uma planilha do Excel para cada quadro de horários listado na caixa de diálogo; Dentre estes quadros de horários
é mostrado na Figura 7.16.
211
Trabalhando com planilhas do Excel
7
12_047026 ch07.qxp 02\/04\/07 21:45 página 211
FIGURA 7.16
Um quadro de horários do Excel preenchido com dados de acesso.
O CreateExcelTimesheets procedimento listado como segue primeiro configura um conjunto de registros DAO do
quadros de horários na semana atual e outro conjunto de registros de horas na que o empregado. O funcionário informa-
ção é inserida na planilha primeiro e, em seguida, o código 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 próximo registro de funcionário:
Função CreateExcelTimeSheets()
No erro GoTo ErrorHandler
212
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
12_047026 ch07.qxp 02\/04\/07 21:45 página 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 então
MsgBox \"Nenhum registro de folha de tempo atual para exportação\"
GoTo ErrorHandlerExit
Outra coisa
Conjunto lbl = _
Formulários![fdlgTimesheets]![lblCreatingWorksheets]
Debug. Print lngCount _
& “ current time sheet records to transfer to Excel”
LBL.Visível = True
End If
213
Trabalhando com planilhas do Excel
7
12_047026 ch07.qxp 02\/04\/07 21:45 página 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 não 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 referência ao objeto Application do Excel para uso na criação de pastas de trabalho:
Set appExcel = GetObject (, \"Application\")
Fazer enquanto não 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 então
MsgBox \"nenhum item encontrado; cancelamento\"
GoTo ErrorHandlerExit
End If
Conjunto rstOne = dbs.OpenRecordset (strQuery _
dbOpenDynaset)
Com rstOne
214
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
12_047026 ch07.qxp 02\/04\/07 21:45 página 214
Conte o número 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 então
Processos horas para o primeiro projeto.
Em que horas trabalhadas na segunda-feira:
Se Nz(![_ MondayHours])
+ Nz(![MondayOTHours]) > 0 então
appExcel.GoTo _
Referência: = 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
[Código semelhante para o processamento de terça a domingo horas omitido].
ElseIf n > 1 então
215
Trabalhando com planilhas do Excel
7
12_047026 ch07.qxp 02\/04\/07 21:45 página 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 então
Determine se qualquer horas foram adicionadas para este dia:
appExcel.GoTo _
Referência: = wks.Range(\"Monday\")
Definir rngCC = _
appExcel.ActiveCell.Offset(columnoffset:=2)
Se rngCC.Value <>\"\" então
Vá para o próximo dia e inserir uma nova linha acima:
appExcel.GoTo _
Referência: = 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 Fórmula Total da célula acima:
appExcel.Selection.Copy
rngTotal.Select
WKS.Colar
appExcel.CutCopyMode = False
Outra coisa
216
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
12_047026 ch07.qxp 02\/04\/07 21:45 página 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
[Código semelhante para o processamento de terça a domingo horas omitido].
.MoveNext
Seguinte n
Salve e feche a planilha preenchida.
Crie pasta de trabalho salve o nome do nome do funcionário 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 próximo
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 página 217
Set appExcel = Nothing
MsgBox \"São criados em todos os livros de folha de tempo\" _
& strDocsPath
ErrorHandlerExit:
Exit Function
ErrorHandler:
Excel não está em execução; Abra o Excel com CreateObject :
Se Err. Number = 429 então
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 padrão, cores e outras características; tudo que precisa é ter os dados do quadro de horários
preenchido no registro de acesso.
Resumo
Com as técnicas descritas neste capítulo, você pode exportar os dados em tabelas do Access para o Excel
planilhas em uma variedade de formatos, para compatibilidade com versões anteriores do Office ou portátil
dispositivos. Você pode usar o botão do Excel na faixa de opções para fazer uma exportação rápida 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 método. E finalmente, quando você precisa de saída de seus dados para um
Planilha do Excel em um formato específico, você pode usar um pré-formatado modelo de planilha ou formato de um
planilha simples usando código do VBA automação para obter os resultados exatos que você quer.
218
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
12_047026 ch07.qxp 02\/04\/07 21:45 página 218
Ó
utlook tem uma ótima interface para trabalhar com calendários, contatos,
e tarefas, bem como para enviar mensagens de e-mail. Mas o Outlook é um
parente recém-chegado ao escritório (ele foi introduzido no Office 97),
o que significa que se você estiver usando acesso por mais do que isso, você
provavelmente tem calendário, contato ou tarefa dados armazenados nas tabelas de acesso de dados-
bases que foram criadas há muitas versões do Office. (Eu tenho alguns que foram
Originalmente criado em Access 1.0!)
No caso de informações de contato, há uma outra razão que muitos usuários
Prefiro guardar dados de acesso: Access é um banco de dados relacional, permitindo-lhe
configurar ligações de um-para-muitos entre empresas e contatos, contatos e
telefones, contatos e endereços e assim por diante. Outlook, por outro lado, não é 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 três endereços em um contato do Outlook e um grande
(mas finita) seleção de vagas telefone e ID. Se você precisa digitar quatro
endereços para um contato, você está sem sorte. Se você precisar inserir um tipo de
número de telefone ou ID que não é um dos itens disponíveis, você não pode fazê-lo.
Mas se você armazenar seus dados de contacto no Access, você pode criar tabelas vinculadas do
endereços, números de telefone e IDs, deixá-lo entrar como muitos telefones e
Identificações 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 endereço ou número de telefone principal de uma empresa, uma vez e o
informações alteradas serão apanhadas através 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 endereço da empresa ou alterações de números de telefone principal, você tem
para fazer a mudança separadamente em todos os 10 contatos.
219
NESTE CAPÍTULO
Links para pastas do Outlook
Aprendendo sobre o Outlook
modelo de objeto
Trabalhando com o Outlook
nomeações
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 página 219
Por exemplo, o registro de Microsoft em meu banco de dados de contatos de acesso pessoal tem 30 de telefone-
Bers, muitos com descrições não-padrão — eu não 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 número ou endereço de e-mail (ou pelo menos aqueles que
correspondem aos slots padrão do Outlook). E se você tiver tarefas ou itens de calendário 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 capítulo 11 para um tratamento detalhado de sincronizar um conjunto de tabelas vinculadas do Access
com correspondência de contatos do Outlook.
Exportação de dados de acesso aos itens do Outlook
Além de exportar todo contato, tarefa ou registros de nomeação para o Outlook, talvez você precise
criar novos itens do Outlook na mosca, como os dados de suas alterações de tabelas do Access, usando o código em execução
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 nomeações desencadeadas por alterações 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 formulários importados dos novos Microsoft sample databases discutidos posteriormente
sobre o capítulo), mas EnviarObjeto apenas permite que você defina algumas propriedades de um padrão Outlook
mensagem de email e assim não 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 não são argumentos do EnviarObjeto comando.
Como alternativa, o grupo de exportação na guia dados externos da nova faixa de opções oferece muitas opções para
exportar dados do Access, mas curiosamente, como você pode ver na Figura 8.1, não há nenhuma seleção para exportação-
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 botões, 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).
REFERÊNCIA CRUZADA REFERÊNCIA CRUZADA
220
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
13_047026 ch08.qxp 02\/04\/07 21:45 página 220
FIGURA 8.1
Opções de fita para exportação de dados de acesso.
FIGURA 8.2
O grupo de coletar dados sobre a faixa de opções de acesso.
Usando o grupo de importação para importar ou
Link para dados do Outlook
Há também uma opção familiar para vincular tabelas do Access para Outlook, agora atualizado para uma seleção em
o menu mais do grupo Import na faixa de opções. Você pode ver esta selecção na Figura 8.3.
221
Trabalhando com itens do Outlook
8
13_047026 ch08.qxp 02\/04\/07 21:45 página 221
FIGURA 8.3
A seleção de pasta do Outlook no grupo importar na faixa de opções.
Selecionar a seleção de pasta do Outlook, no menu mais abre uma caixa de diálogo oferecendo-lhe três
escolhas (mostradas na Figura 8.4): importação 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 recém-criado.
FIGURA 8.4
As seleções de importar\/vincular para pastas do Outlook.
222
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
13_047026 ch08.qxp 02\/04\/07 21:45 página 222
Depois de selecionar a opção \"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 calendário e nomeado como tal). A Figura 8.6 mostra três 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 versões anteriores do Office, a opção de Link tem sérias limitações. 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 inútil.
223
Trabalhando com itens do Outlook
8
13_047026 ch08.qxp 02\/04\/07 21:45 página 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 não tem o crucial
Início e fim datas e horas, por isso também é inútil.
FIGURA 8.8
Um calendário do Outlook vinculado.
Dos três, a tabela vinculada olContacts fornece a melhor correspondência para contatos do Outlook: ele tem
a maioria (mas não todos) dos campos de item de contato padrão (embora não o campo de identificação do cliente, que
poderia ser útil na vinculação de registros). No entanto, a promessa de ligar acesso tabelas para Outlook —
especificamente, que as alterações feitas no acesso serão salvo para o Outlook e vice-versa — não é com -
completamente preenchida. Por exemplo, embora eu fiz mudanças para a empresa e nome do contato
nome de um contato recorde no acesso, apenas a mudança de empresa reflectiu-se volta para o Outlook.
No entanto, reflectiram-se alterações de nome de contato e empresa no Outlook para acesso. Figura 8.9
mostra a tabela vinculada olContacts.
224
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
13_047026 ch08.qxp 02\/04\/07 21:45 página 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 página 225
226
Escrever código 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 não for mostrado, você pode procurá-lo (ou basta dar uma olhada no que está
disponível), clicando no link de modelos na parte inferior da tela.
13_047026 ch08.qxp 02\/04\/07 21:45 página 226
227
Trabalhando com itens do Outlook
8
Abrindo a página de modelos no site do Microsoft Office.
A página de bancos de dados, você tem uma escolha de Access 2007 ou no Access 2003.
A escolha da versão de acesso para modelos de banco de dados.
continuou
13_047026 ch08.qxp 02\/04\/07 21:45 página 227
228
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
continuou
O grupo de Access 2007, você verá várias categorias.
Categorias de modelos de banco de dados do Access 2007.
Selecionar a categoria de negócio, você verá os modelos que eu usei neste capítulo.
Modelos de banco de dados na categoria empresarial.
13_047026 ch08.qxp 02\/04\/07 21:45 página 228
229
Trabalhando com itens do Outlook
8
Clique no modelo que você deseja usar para abrir uma página com um link para Download.
Download link para o modelo de banco de dados de tarefas.
Clique no botão baixar agora para prosseguir (você pode receber uma mensagem sobre como instalar um ActiveX
controle para escritório Online). Depois de instalar o controle ActiveX (se necessário), 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 página 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 capítulo, o Outlook Export.accdb, e
então renomeado os objetos e controles com prefixos apropriados.
A Microsoft criou vários 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 calendário 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 calendário 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 seção formulários no menu principal do Outlook
Exportação de dados, como mostrado na Figura 8.10 (final formas importadas com \"Lista\").
FIGURA 8.10
Selecionando um formulário no menu principal.
Figura 8.11 mostra a forma de lista de tarefas, e Figura 8.12 mostra o formulário lista de evento.
NOVO RECURSO NOVO RECURSO
230
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
13_047026 ch08.qxp 02\/04\/07 21:45 página 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 formulário 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 contém as tabelas, consultas, formulários, e
código usado neste capítulo.
Há também um formulário de lista de contatos (no banco de tarefas amostra dados), mostrado na Figura 8.13. Este formulário
só é adequado para manter uma simples lista de contatos de arquivos simples e não tem maioria da fea especial-
Tures Outlook fornece para trabalhar com contatos, mas novamente existem circunstâncias onde você
pode querer (ou precisar) para manter as informações de contato em uma única tabela de acesso, como quando você precisa
regularmente exportar dados básicos de contato para um arquivo de texto ou planilha para distribuição 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 página 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 têm botões com macros incorporadas. A adicionar a partir do Outlook
botão, que usa um argumento de comando novo, acCmdAddFromOutlook , abre um selecionar nomes
na caixa de diálogo para selecionar um contato do Outlook, como mostrado na Figura 8.14.
FIGURA 8.14
Selecionando um contato do Outlook.
232
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
13_047026 ch08.qxp 02\/04\/07 21:45 página 232
Todas essas formas dos novos modelos de banco de dados usam as macros incorporadas novas
em vez de código do VBA para diversos fins. Usando macros em vez do código que me parece
ser um passo para trás para os primeiros dias de acesso, mas têm a vantagem de evitar macros incorporadas
problemas de segurança que podem ocorrer se você tentar executar o código que não está assinado com uma assinatura digital (ou
mesmo quando você executa assinado código, no Windows Vista). Para tarefas simples, como fechar um formulário ou a execução
Ning um comando ou dois, incorporado macros funcionam bem, mas para tarefas mais complexas, não vai fazer o
Emprego; você ainda precisa escrever código VBA para realizar tarefas complexas, como iterar através de um conjunto de registros
ou criação de novos objetos em outros aplicativos do Office.
Importei também relatórios dos bancos de dados eventos e tarefas, que você pode ver, selecionando o
nome do relatório na seção relatórios do menu principal do exemplo do banco de dados, mostrado na Figura 8.15.
FIGURA 8.15
Selecionando um relatório no menu principal.
Dependendo de que tipo de impressora que você tem, talvez você precise ajustar as margens no
alguns destes relatórios 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 página 233
O modelo de objeto do Outlook
Por causa das opções limitadas para exportar dados do Access para Outlook, eu prefiro usar VBA
Código de automação 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 série de novos componentes; eles são 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 não 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, através da coleção de itens de um objeto de pasta, usando específicas constantes nomeadas para
referência ou criar os tipos de item específico. Pastas são acessadas através de curiosamente nomeado
Espaço para nome objeto (representando os dados armazenados nas pastas do Outlook), o que faz para alguns muito
código unintuitive.
Explorer, Inspetor e outros objetos do Outlook
Ao trabalhar com objetos do Outlook no código VBA, você estará trabalhando principalmente com pastas e
itens; Ocasionalmente você também 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 são usados para trabalhar com o cur-
rently Abra o item ou pasta; Se você só precisa criar e salvar itens, você não precisa usar esses
objetos no seu código.
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 instância ou recuperar uma referência para o
instância atual do Outlook, se estiver executando o Outlook. Com o Outlook, usando o Novopalavra-chave quando
declarar um aplicativo Outlook variável é também um método útil, especialmente se você quer trabalhar
com uma instância do Outlook diferente daquele atualmente em uso na interface.
Se seu código 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 variável de Nada no final do
o procedimento, porque o usuário pode estar abrindo e fechando várias pastas e janelas, que
pode causar erros de código, se você estiver trabalhando com a instância de execução do Outlook.
234
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
13_047026 ch08.qxp 02\/04\/07 21:45 página 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, são
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 referência para o objeto de aplicativo Outlook,
em seguida, o objeto NameSpace e, em seguida, você pode recuperar uma das pastas padrão local usando o
GetDefaultFolder método, ou uma pasta personalizada por fazer referência a ele como um membro de nível superior
Coleção 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 confusão.)
Embora o objeto MAPIFolder foi substituído 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 compilação. Isso significa que você não precisa passar por todo o código antigo do Outlook e
Altere MAPIFolder declarações para pasta.
Sintaxe para fazer referência a objetos do Outlook
A coleção de itens para uma pasta representa todos os itens do Outlook separados nessa pasta, que
podem ser de diferentes tipos. Não 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ê também precisa declarar uma variável como Object. Isso ocorre porque uma variável de objeto
tipo pode representar itens de diferentes tipos; cada item pode ser inspecionado, e se ele for o público -
comeu o tipo, mais medidas a tomar, como nos meus exemplos de código a seguir.
Para criar um item de um tipo específico, use o Adicionar método com a coleção de itens de uma pasta (este cre-
ates um item padrão da pasta padrão item tipo), ou usar o objeto de aplicativo CreateItem
método 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 formulário personalizado do Outlook salvo. O código de amostras nas seções a seguir ilustram usa de
esses métodos.
Os fragmentos de código a seguir mostram como definir uma referência para uma pasta do Outlook ou item, com um
número de variações. Você pode declarar a variável de aplicativo usando o Novopalavra-chave, em que
caso que você não precisa definir a variável. Ou você pode declará-lo sem o Novopalavra-chave e então
Defina a variável mais tarde com GetObject ouCreateObject , como eu geralmente faço em meu completo pro -
contratação.
Um procedimento geralmente começa com declarar diversas variáveis de tipos diferentes; a seguir
lista de declarações de cobre o mais comumente usado alto nível 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 variável como Objeto então ele pode ser usado para qualquer tipo de item. Isso é necessário se você precisa
para fazer referência o item atual em uma pasta que pode conter itens de diferentes tipos:
Dim itm As Object
Declarar variáveis de tipos de item tão específicos, para uso quando você estiver criando ou trabalhando com itens de
tipos específicos:
Dim msg As Outlook.MailItem
Dim con como Outlook.ContactItem
Conjunto nms = appOutlook.GetNamespace(\"MAPI\")
O flds variável faz referência as pastas sob a pasta de nível superior:
Conjunto flds = nms.Pastas (\"pastas pessoais\").Pastas
Criar um item usando oAdicionar método para a coleção de itens de uma pasta. O item será da
tipo de item na pasta padrão:
Conjunto appt = fldCalendar.Items.Add
236
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
13_047026 ch08.qxp 02\/04\/07 21:45 página 236
Criar um padrão de item usando o CreateItem método 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 versões 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 não funciona mais, por causa de mais
rigorosas medidas de segurança do Microsoft. No Office 2007 em execução 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.
Após clicar em OK, o arquivo abrirá, em seguida, como um item padrão, não seu formulário personalizado. Para contornar esse problema
recurso de segurança chato, selecione Ferramentas

Formulários

Escolha o formulário na janela principal do Outlook, como
mostrado na Figura 8.18.
FIGURA 8.18
Selecionando um formulário personalizado na interface do Outlook.
DICA DICA
237
Trabalhando com itens do Outlook
8
13_047026 ch08.qxp 02\/04\/07 21:45 página 237
Na caixa de diálogo escolher formulário, selecione \"Modelos de usuário no sistema de arquivos\" na lista drop-down \"Olhar\",
como mostrado na Figura 8.19.
FIGURA 8.19
Selecionando a opção \"Modelos em arquivo sistema usuário\" para abrir um arquivo de modelo salvo.
O caminho de modelo padrão para o local de modelo padrão do Office 2007\/Windows Vista,
C: \/ usuários\/seu nome\/App\/Roaming\/Microsoft\/modelos de dados, mas há um Browse botão que
permite que você selecione um modelo de outro local. Depois de selecionar o modelo, você pode abri-lo com
o botão abrir e você verá o formulário personalizado no último (embora suas cores podem ter mudado,
devido às alterações na paleta de cores do Windows Vista e Office 2007).
Defina uma referência para a pasta de contatos padrão local:
Set fld = nms.GetDefaultFolder(olFolderContacts)
Definir uma referência para a coleção de pastas de uma pasta chamada \"Custom contatos\" sob o nível superior
Pasta de pastas pessoal (via definida anteriormente flds variável):
Set fld = flds \"(contatos Custom\")
Defina uma referência para uma pasta pública personalizada:
Conjunto flds = nms.Pastas (\"pastas públicas\").Pastas
Set fld = _
flds (\"todas as pastas públicas\").Pastas (\"pasta personalizada\")
Defina uma referência para a pasta atualmente aberta, através do explorador ativo:
Definir exp = appOutlook.ActiveExplorer
Set fld = exp.CurrentFolder
238
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
13_047026 ch08.qxp 02\/04\/07 21:45 página 238
Teste se a atual pasta é uma pasta de contatos:
Se FLD.DefaultItemType <>olContactItem, em seguida
MsgBox _
\"Esta pasta não é uma pasta de contatos; cancelamento\"
GoTo ErrorHandlerExit
End If
Defina uma referência para o item atualmente aberto, através do Inspetor ativo:
Conjunto de ins = appOutlook.ActiveInspector
Conjunto itm = ins.CurrentItem
Testar se o item aberto é uma mensagem de email e definir uma variável de mensagem de email para ele se assim:
Se itm.Classe = olMail então
Set msg = itm
End If
Defina uma referência para o contato cujo nome é \"Helen Feddema\":
Set fld = nms.GetDefaultFolder(olFolderContacts)
Conjunto con = FLD.Itens (\"Helen Feddema\")
Defina uma referência a uma propriedade de item built-in do Outlook:
strFullName = con.FullName
Definir uma referência a uma propriedade de item do Outlook personalizada da sim\/não há dados tipo:
blnCustomer = con.UserProperties(\"Customer\")
Padrão GetObject linha e erro manipulador padrão para CreateObject Outlook não for
executando:
Dim appOutlook como Outlook. Application
Conjunto appOutlook = GetObject (, \"Outlook. Application\")
[Seu código aqui]
ErrorHandlerExit:
Exit Sub
ErrorHandler:
' Não está executando o outlook; Abra o Outlook com CreateObject
Se Err. Number = 429 então
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 código VBA
Microsoft optou por usar a mesma palavra (por exemplo, nota) para os tipos de itens diferentes de referência
(classe de mensagem de uma mensagem correio e um item de nota na interface), e para dar itens confusamente dife -
diferentes nomes em código que eles têm na interface do usuário (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 situação.
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
Nomeação AppointmentItem IPM.Nomeação olAppointment olAppointmentItem
Entrada de diário 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 específico, ou para determinar qual o tipo de
objeto que você está lidando com (por exemplo, no Inspetor de ativo). Ele também pode ser visto na
\"Publicar formulário como\" caixa de diálogo 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 formulário anexado para o padrão do objeto
classe de mensagem, com um período de separação. O OlObjectClass constantes nomeadas são 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 são utilizados para definir ou determinar o tipo de item do padrão de um
pasta, usando uma pasta DefaultItemType Propriedade. Consulte os procedimentos de amostra na próxima seg-
ções para exemplos que usam essas constantes.
240
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
13_047026 ch08.qxp 02\/04\/07 21:45 página 240
FIGURA 8.20
O Outlook \"Publicar o formulário como\" caixa de diálogo, mostrando a classe de mensagem de um formulário personalizado do Outlook.
Trabalhando com compromissos do Outlook
Você pode ter dados de calendário (marcação) 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
calendários de acesso, eu recomendo a exportar os dados de calendário de acesso ao Outlook e trabalhando
com ele em calendários 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 função listado próximo (pode também ser executado
a macro de mcrExportAppointments):
Função pública 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 página 241
Conjunto dbs = CurrentDb
Set rst = dbs.OpenRecordset(\"tblEvents\")
Com rst
Enquanto não.EOF
Verifique que há um assunto de nomeação.
strApptName = Nz(![Título])
Debug. Print \"nome de nomeação:\"
Se strApptName = \"\", em seguida,
GoTo NextAppt
End If
Verifique datas válidas e converter datas em branco em 1\/1\/4501 (que é uma data em branco no Outlook).
Se IsNull(![Hora de início]) = True Then
dteStartTime = #1\/1\/4501 #
Outra coisa
dteStartTime = Nz(![Hora de início])
End If
Se IsNull(![Horário de término]) = True Then
dteEndTime = #1\/1\/4501 #
Outra coisa
dteEndTime = Nz(![Tempo final])
End If
Crie um novo compromisso item na pasta calendário local.
Conjunto appt = fldCalendar.Items.Add
appt.Assunto = strApptName
appt.Iniciar = dteStartTime
appt.Final = dteEndTime
appt.Localização = Nz(![Localização])
appt.Corpo = Nz(![Descrição])
appt.Fechar (olSave)
NextAppt:
.MoveNext
Loop
Terminar com
MsgBox \"Compromissos exportados para Outlook\"
ErrorHandlerExit:
Exit Function
ErrorHandler:
242
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
13_047026 ch08.qxp 02\/04\/07 21:45 página 242
Outlook não está em execução; Abra Outlook com CreateObject.
Se Err. Number = 429 então
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 nomeações exportadas no calendário do Outlook.
FIGURA 8.21
Compromissos no calendário do Outlook exportados do acesso.
Para importar os compromissos de seu calendário do Outlook local para uma tabela do Access (tblImportedCalendar),
Use a seguinte função (pode também ser executado de macro mcrImportCalendar):
Função pública 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 página 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 através as nomeações na pasta calendário 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 (.Localização)
strDescription = Nz (.Corpo)
Terminar com
Com rst
RST.AddNew
![Assunto] = strApptName
Se dteStartTime <>#1\/1\/4501 #, em seguida,
![Início] = dteStartTime
End If
Se dteEndTime <>#1\/1\/4501 #, em seguida,
![Horário de término] = dteEndTime
End If
![Localização] = strLocation
![Descrição] = strDescription
.Atualização
Terminar com
End If
Itm próximo
RST.Fechar
DoCmd.OpenTable \"tblImportedCalendar\"
ErrorHandlerExit:
Exit Function
ErrorHandler:
244
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
13_047026 ch08.qxp 02\/04\/07 21:45 página 244
Outlook não está em execução; Abra Outlook com CreateObject.
Se Err. Number = 429 então
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 nomeações importadas, que é aberta automaticamente no final
do procedimento.
FIGURA 8.22
Uma tabela de nomeações importados de uma pasta de calendário do Outlook.
Para um cenário mais realista, no qual você deseja criar compromissos com base nos dados em um acesso
tabela de dados do projeto, uso o CreateProjectAppts função (ele também pode ser executado a partir do
mcrCreateProjectAppts macro). Essa função seleciona registros em tblContactsWithProjects que têm
uma última reunião data de mais de um mês atrás e cria um compromisso do Outlook para um projeto
reunião dos seguintes segunda-feira para cada um desses registros, gravar dados de vários campos da
Registro de acesso para o item de compromisso:
Função pública 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 página 245
Definir fldCalendar = nms.GetDefaultFolder(olFolderCalendar)
Conjunto dbs = CurrentDb
Set rst = dbs.OpenRecordset(\"tblContactsWithProjects\")
dteMonthAgo = DateAdd (\"m\", -1, data)
dteNextMonday = NextMondayTime()
Com rst
Enquanto não.EOF
Verifique se a última data de reunião é mais de um mês atrás.
dteLastMeeting = Nz(![LastMeetingDate])
strProject = Nz(![CurrentProject])
Se dteLastMeeting < dteMonthAgo então
Crie um novo compromisso item na pasta calendário local.
Conjunto appt = fldCalendar.Items.Add
appt.Assunto = strProject
appt.Iniciar = dteNextMonday
appt.Duração = \"60\"
appt.ReminderSet = True
appt.Corpo = \"Reunião mensal do projeto\"
appt.Fechar (olSave)
End If
.MoveNext
Loop
Terminar com
MsgBox \"Outlook projeto reunião nomeações criadas\"
ErrorHandlerExit:
Exit Function
ErrorHandler:
Outlook não está em execução; Abra Outlook com CreateObject.
Se Err. Number = 429 então
Conjunto appOutlook = CreateObject
Retomar em seguida
Outra coisa
MsgBox \"erro nenhum:\"
& “; Description: “ & Err.Description
Resume ErrorHandlerExit
End If
End Function
246
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
13_047026 ch08.qxp 02\/04\/07 21:45 página 246
A Figura 8.23 mostra dentre as nomeações criadas pelo procedimento.
FIGURA 8.23
Um compromisso de reunião de projeto criado a partir de dados em uma tabela do Access.
Trabalhando com tarefas do Outlook
Como com nomeações, se você tem uma tabela do Access de tarefas criadas várias versões do Office atrás, 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 função faz o
exportação (pode também ser executado de macro mcrExportTasksToOutlook):
Função pública 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 página 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 não.EOF
Verifique que há um assunto da tarefa.
strTaskName = Nz(![Título])
Debug. Print \"tarefa:\"
Se strTaskName = \"\", em seguida,
GoTo NextTask
End If
Verifique datas válidas e converter datas em branco em 1\/1\/4501 (que é uma data em branco no Outlook).
Se IsNull(![Data de início]) = True Then
dteStartDate = #1\/1\/4501 #
Outra coisa
dteStartDate = Nz(![Data de início])
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 número para o Outlook.
strStatus = Nz(![Status])
lngStatus = interruptor (strStatus = \"Não iniciado\", _
0, strStatus = \"em andamento\", 1, _
strStatus = \"Concluído\", 2, _
strStatus = \"Aguardando outra pessoa\", 3, _
strStatus = \"Diferidos\", 4, _
“”, 0)
248
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
13_047026 ch08.qxp 02\/04\/07 21:45 página 248
Converta o valor de prioridade do texto para um número para o Outlook.
strPriority = Nz(![Prioridade])
lngPriority = interruptor (strPriority = \"(1) alta\", _
1, strPriority = \"(2) Normal\", 2, _
strPriority = \"(3) baixa\", 3, _
“”, 0)
strDescription = Nz(![Descrição])
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 \"Funções exportadas para o Outlook\"
ErrorHandlerExit:
Exit Function
ErrorHandler:
Outlook não está em execução; Abra Outlook com CreateObject.
Se Err. Number = 429 então
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 página 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 função seguinte (pode também ser executado de macro mcrImportTasksFromOutlook):
Função pública 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 código VBA para trocar dados entre os componentes do Office
Parte II
13_047026 ch08.qxp 02\/04\/07 21:45 página 250
Com tsk
strTaskName = Nz (.Assunto)
dteStartDate = Nz (.StartDate)
dteDueDate = Nz (.DueDate)
lngStatus = Nz (.Status)
lngPriority = Nz (.Importância)
strDescription = Nz (.Corpo)
lngPercentComplete = Nz (.PercentComplete)
Terminar com
Com rst
RST.AddNew
![Assunto] = strTaskName
Se dteStartDate <>#1\/1\/4501 #, em seguida,
![Data de início] = dteStartDate
End If
Se dteDueDate <>#1\/1\/4501 #, em seguida,
![Data] = dteDueDate
End If
' Converte um número 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 numérico do Status em texto para acesso.
strStatus = interruptor (lngStatus = 0, _
\"Não iniciado\" _
lngStatus = 1, \"em andamento\", _
lngStatus = 2, \"Concluído\", _
lngStatus = 3, _
\"Esperando alguém\" _
lngStatus = 4, \"Diferidos\", _
0, “”)
![Status] = strStatus
Se lngPercentComplete > 0 então
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 página 251
.Atualização
Terminar com
End If
Itm próximo
RST.Fechar
DoCmd.OpenTable \"tblImportedTasks\"
ErrorHandlerExit:
Exit Function
ErrorHandler:
Outlook não está em execução; Abra Outlook com CreateObject.
Se Err. Number = 429 então
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 código VBA para trocar dados entre os componentes do Office
Parte II
13_047026 ch08.qxp 02\/04\/07 21:45 página 252
Para um cenário mais realista, no qual você deseja criar tarefas baseadas em dados em uma tabela do Outlook,
consulte o CreateProjectTasks função (que pode ser executado a partir da macro mcrCreateProjectTasks).
Essa função cria uma tarefa do Outlook para cada registro em tblContactsWithProjects que não tenha tido
suprimentos alimentada por um mês ou mais e grava dados de vários campos no Access
Registre-se para o item de tarefa:
Função pública 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 não.EOF
Verifique se a suprimentos última foram reabastecidos há mais de um mês.
dteReplenished = Nz(![SuppliesReplenished])
strProject = Nz(![CurrentProject])
Se dteReplenished < dteMonthAgo então
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.Importância = 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 página 253
ErrorHandlerExit:
Exit Function
ErrorHandler:
Outlook não está em execução; Abra Outlook com CreateObject.
Se Err. Number = 429 então
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 início deste capítulo, não 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 necessário. Por isso, se você tem uma tabela única de contatos de acesso, você pode desejar
exportar os dados para o Outlook, então você pode abrir um item de contato rapidamente sem ter que primeiro abrir um
Banco de dados do Access.
254
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
13_047026 ch08.qxp 02\/04\/07 21:45 página 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 correspondência de itens de contato do Outlook, você precisa de mais de um
exportação simples. Consulte o capítulo 11 para uma discussão de sincronização 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 função listada a seguir
(pode também ser executado de macro mcrExportFlatFileContactsToOutlook):
Função pública 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 padrão local:
' Definir fldContacts = nms.GetDefaultFolder(olFolderTasks)
Em erro continuar próximo
Use as seguintes linhas para exportar para uma pasta de contatos personalizada, criá-la se necessário. Se a criação de um
falha de referência para a pasta, a pasta será criada.
REFERÊNCIA CRUZADA REFERÊNCIA CRUZADA
255
Trabalhando com itens do Outlook
8
13_047026 ch08.qxp 02\/04\/07 21:45 página 255
Set fld = nms.Pastas (\"pastas particulares\")
Definir fldContacts = FLD.Pastas (\"contactos de acesso\")
Se fldContacts não é nada então
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 não.EOF
Verificar informações 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 próximo
Concurso conjunto = fldContacts.Items(strFullName)
Se conTest.FullName <>strFullName então
Nenhum contato correspondente encontrado.
StrFullName Debug. Print
ElseIf conTest.FullName = strFullName então
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(![Saudação])
strEMail = Nz(![EmailName])
strJobTitle = Nz(![JobTitle])
strBusinessPhone = Nz(![_ WorkPhone])
256
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
13_047026 ch08.qxp 02\/04\/07 21:45 página 256
& IIf(Nz(![WorkExtension]) <> “”, “ x “ _
& ![WorkExtension], “”)
strMobilePhone = Nz(![Telemóvel])
strFaxNumber = Nz(![Númerofax])
strNotes = Nz(![Notas])
strStreetAddress = Nz(![StreetAddress])
strCity = Nz(![Cidade])
strStateProv = Nz(![StateOrProvince])
strPostalCode = Nz(![CEP])
strCountry = Nz(![País])
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 página 257
Outlook não está em execução; Abra Outlook com CreateObject.
Se Err. Number = 429 então
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 exibição de cartão de visita.
258
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
13_047026 ch08.qxp 02\/04\/07 21:45 página 258
Importar contatos de sua pasta de contatos do Outlook local em uma tabela do Access
(tblImportedContacts), use a seguinte função (ele também pode ser executado a partir do
macro de mcrImportContactsFromOutlook):
Função pública 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 padrão local:
' Definir fldContacts = nms.GetDefaultFolder(olFolderTasks)
Em erro continuar próximo
259
Trabalhando com itens do Outlook
8
13_047026 ch08.qxp 02\/04\/07 21:45 página 259
Use as seguintes linhas para definir uma referência a uma pasta de contatos personalizada, criá-la se necessário. Se set -
falha de Ting uma referência para a pasta, a pasta será criada.
Set fld = nms.Pastas (\"pastas particulares\")
Definir fldContacts = FLD.Pastas (\"contatos para exportação\")
Se fldContacts não é nada então
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 através 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 Zelândia (.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 Zelândia (.BusinessTelephoneNumber)
strFaxNumber = Nz (.BusinessFaxNumber)
strMobilePhone = Nz (.MobileTelephoneNumber)
strSalutation = Nz (.Apelido)
260
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
13_047026 ch08.qxp 02\/04\/07 21:45 página 260
strWebSite = Nz (.Página da Web)
strNotes = Nz (.Corpo)
.Fechar (olSave)
Terminar com
Com rst
RST.AddNew
![CompanyName] = strCompanyName
![Nome] = strFirstName
![Sobrenome] = strLastName
![Saudação] = strSalutation
![EmailName] = strEMail
![JobTitle] = strJobTitle
![WorkPhone] = strBusinessPhone
![Celular] = strMobilePhone
![Númerofax] = 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
.Atualização
Terminar com
lngContactCount = lngContactCount + 1
End If
Itm próximo
RST.Fechar
Se lngContactCount = 0 Then
MsgBox \"Não há contatos para importar do Outlook\"
Outra coisa
MsgBox lngContactCount _
& “ contact(s) imported from Outlook”
End If
ErrorHandlerExit:
Exit Function
Se Err. Number = 429 então
Conjunto appOutlook = CreateObject
Retomar em seguida
261
Trabalhando com itens do Outlook
8
13_047026 ch08.qxp 02\/04\/07 21:45 página 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 situação ideal manter sua maioria com-
concluído um conjunto de informações ligadas tabelas do Access e sincronizá-las com o Outlook
contatos que exibem a maioria das informações em uma interface fácil de usar. Capítulo 11 abrange
Sincronizando lig mesas contatos de acesso com uma pasta de contatos do Outlook.
Resumo
Este capítulo descreve os componentes do modelo de objeto do Outlook que você precisa entender
para trabalhar com objetos do Outlook e você deu exemplos de exportação 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 alterações 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ê: conveniência e atraente interface de
Contatos do Outlook, ou mais sofisticado interface de acesso do banco de dados relacional, permitindo-lhe
Configure ligações de um-para-muitos entre empresas e contatos, ou contatos e telefones ou identificações.
REFERÊNCIA CRUZADA REFERÊNCIA CRUZADA
262.
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
13_047026 ch08.qxp 02\/04\/07 21:45 página 262
EU
n os capítulos anteriores abordei a criação de documentos, Excel do Word
planilhas e vários tipos de itens do Outlook usando a automação do VBA
código. Mas estes não são os únicos tipos de documentos que você precisa para trabalhar
com — às vezes você precisa criar um documento de texto sem formatação 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 capítulo compreende escrever código
que trabalha com pastas do Windows Explorer e arquivos de texto, usando vários
métodos diferentes.
Como acesso versões progrediram, as ferramentas disponíveis para trabalhar com arquivos
ou pastas têm avançado. Acesso 1.0, o retorno de chamada notoriamente críptico
função era a única maneira de obter uma lista de arquivos a serem exibidos em uma caixa de combinação ou
ListBox. Pelo Windows 95, o CommonDialog controle era uma possibilidade, no
pelo menos se você teve a edição de desenvolvedor do Office. Mas o CommonDialog
controle foi flagelada com problemas de versão — se você colocar uma versão
um formulário e enviado o banco de dados para outra pessoa que tinha uma versão diferente
do controle, a outra pessoa apenas recebo a mensagem misteriosa
\"Lá não é nenhum objeto nesse controle\" na abertura do formulário com o
CommonDialog controle.
Consulte o capítulo 8 para obter informações sobre como trabalhar com o Outlook
pastas.
Outro avanço veio com a biblioteca de tempo de execução de script, que forneceu um
FileSystemObject objeto (sim, isso é dois objetos!) que é muito útil para
encontrando, trabalhando com ou criando arquivos e pastas no código. No entanto, ele
não oferece uma interface de diálogo-tipo para selecionar arquivos ou pastas.
O avanço seguinte veio com o Office XP, que introduziu uma nova ferramenta para
trabalhando com arquivos e pastas. O FileDialog objeto (a parte do escritório
REFERÊNCIA CRUZADA REFERÊNCIA CRUZADA
263
NESTE CAPÍTULO
Criação de pastas do Windows
Criando FolderPicker e
FilePicker caixas de diálogo usando o
Objeto FileDialog de escritório
Gravar dados em arquivos de texto usando
o FileSystemObject, legado do VB
instruções e ADO
Lendo dados de arquivos texto
usando o FileSystemObject,
legado demonstrações 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 página 263
modelo de objeto) permite-lhe aparecer uma caixa de diálogo para selecionar um arquivo ou uma pasta, com vários tipo de diálogo
Opções. Esta caixa de diálogo permite que os usuários facilmente selecionar um arquivo ou pasta, cujo nome pode ser usado no código de
mais operações.
Não há qualquer razão para usar um Retorno de chamada função ou a CommonDialog controle para
trabalhando com arquivos e pastas, então este capítulo 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 rígido do seu computador, você precisará especificar o
pasta (caso contrário tudo vai acabar em sua pasta de documentos de raiz ou a corrente
pasta, tornando muito difícil encontrar documentos específicos). Se você trabalha com Word, Excel ou Outlook
modelos, você também precisa especificar uma pasta de modelos, assim seu código vai olhar no lugar certo para
seus modelos. Você pode obter a pasta de modelos do usuário padrão na caixa de diálogo opções de arquivo do Word,
mas, novamente, você provavelmente não 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 botões de comando com
código para selecionar os caminhos de documentos e modelos.
Para trabalhar com pastas do Windows, você tem duas opções: o escritório FileDialog objeto, ou a
FileSystemObject . Esses dois métodos são discutidos nas seções a seguir.
O banco de dados de amostra para este capítulo é arquivos e Folders.accdb.
O objeto FileDialog Office
Para permitir o máximo de escolha do usuário, combinada com a sua conveniência, eu gostaria de colocar um ou
dois botões de comando de seleção de pasta no menu principal do banco de dados, para selecionar as pastas que serão
usado em todo o banco de dados. Do banco de dados de amostra para este capítulo, arquivos e Folders.accdb, para
exemplo, o menu principal tem uma seção com dois conjuntos de controles para selecionar uma pasta; um tem um
botão de comando que aparece em uma caixa de diálogo selecionador de pasta para selecionar a pasta de documentos de entrada
(usado para armazenar documentos para ser carregado em campos de fixação ou caixas de texto em formas) e o
outra abre um seletor de pasta de documentos de saída 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 botão de comando. A Figura 9.1 mostra um menu principal com essas opções.
NOTA NOTA
REFERÊNCIA CRUZADA REFERÊNCIA CRUZADA
264
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
14_047026 ch09.qxp 02\/04\/07 21:50 página 264
FIGURA 9.1
Um menu principal com um Backup botão e botão\/textbox controles para selecionar um caminho de documentos de entrada
e um caminho de saída de documentos para uso no banco de dados.
Os caminho de documentos de entrada e saída de documentos via botões 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
diálogo, para torná-lo uma caixa de diálogo selecionador de pasta:
Private Sub cmdInputDocsPath_Click()
No erro GoTo ErrorHandler
Crie um objeto FileDialog como uma caixa de diálogo 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 então
txt.Valor = CStr (fd.SelectedItems.Item(1))
265
Trabalhando com arquivos e pastas
9
14_047026 ch09.qxp 02\/04\/07 21:50 página 265
Outra coisa
Debug. Print \"usuário pressionado cancelar\"
End If
Terminar com
Em erro continuar próximo
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 diálogo 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 então
txt.Valor = CStr (fd.SelectedItems.Item(1))
Outra coisa
Debug. Print \"usuário pressionado cancelar\"
End If
Terminar com
Em erro continuar próximo
Chamada acCmdSaveRecord
ErrorHandlerExit:
Exit Sub
266
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
14_047026 ch09.qxp 02\/04\/07 21:50 página 266
ErrorHandler:
MsgBox \"erro nenhum:\"
& “; Description: “ & Err.Description
Resume ErrorHandlerExit
End Sub
Na cmdInputDocsPath_Click procedimento de evento, o GetInputDocsPath() função é
usado para obter o valor de caminho salvo documentos de entrada do tblInfo (se houver); caso contrário o
pasta de documentos do padrão é aberta. O usuário pode selecionar um outro caminho, ou aceitar o caminho padrão;
o valor selecionado na caixa de diálogo é salvo em txtInputDocsPath caixa de texto no formulário, 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 são necessários em toda a
banco de dados, como informações de caminho. Embora você possa usar variáveis globais para este pur-
pose, eles não persistem de uma sessão para outra, e não é fácil examinar seus valores, então eu
preferir armazenar esses valores em uma tabela.
Os caminhos de entrada e saída de documentos personalizados armazenados no tblInfo são captados, sempre que necessário
no banco de dados, usando o GetInputDocsPath() e GetOutputDocsPath() funções,
listados em seguida:
GetInputDocsPath() função pública como String
No erro GoTo ErrorHandler
Conjunto dbs = CurrentDb
Set rst = dbs.OpenRecordset(\"tblInfo\")
RST.MoveFirst
strPath = Nz (rst! [InputDocsPath])
Adicione uma barra invertida terminação, se o caminho não tem um.
Se Len(strPath) > 1 Right(strPath, 1) e <>\"\/\" então
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 página 267
End Function
GetOutputDocsPath() função pública como String
No erro GoTo ErrorHandler
Conjunto dbs = CurrentDb
Set rst = dbs.OpenRecordset(\"tblInfo\")
RST.MoveFirst
strPath = Nz (rst! [OutputDocsPath])
Adicione uma barra invertida terminação, se o caminho não tem um.
Se Len(strPath) > 1 Right(strPath, 1) e <>\"\/\" então
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 diálogo selecionador de pasta para selecionar um caminho de saída de documentos personalizado.
Para usar oFileDialog objeto em seu código, você precisa definir uma referência para o objeto do Office
biblioteca; essa referência não é definida por padrão em um banco de dados Access 2007 recém-criado. Figura 9.3
mostra a referência do Office 12.0 sendo verificada na caixa de diálogo referências para os arquivos e pastas
banco de dados.
268
Escrever código 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 referência à biblioteca de objeto do Office 12.0.
269
Trabalhando com arquivos e pastas
9
14_047026 ch09.qxp 02\/04\/07 21:50 página 269
O FileDialog objeto tem várias propriedades e métodos úteis:
Filters.Add — Permite especificar o filtro (s) para a exibição de arquivos, tais como
FD.Filters.Add \"Documentos do Word\", \"*. doc\"
InitialFileName — O nome de arquivo padrão, para uma caixa de diálogo Seletor de arquivo; o caminho padrão
para uma caixa de diálogo selecionador de pasta
ButtonName — O botão de legenda (no caso você quer algo diferente de \"Select\").
DialogType — A seleção do tipo de diálogo 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 exibição da caixa de diálogo (detalhes, ícones grandes, visualização e assim
sobre). Olhar para o MsoFileDialogView enum no Pesquisador de objetos para a seleção completa.
AllowMultiSelect — Se definido como True, permite que os usuários selecionar vários arquivos na caixa de diálogo (para
Arquivo caixas de diálogo selecionador somente).
Figura 9.4 mostra oMsoFileDialogView enum, com todas as opções para definir o modo de exibição para
a caixa de diálogo.
FIGURA 9.4
Exibindo o
MsoFileDialogView
enum no Pesquisador de objetos.
270
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
14_047026 ch09.qxp 02\/04\/07 21:50 página 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 referência, neste caso
para a biblioteca de tempo de execução de scripts, como mostrado na Figura 9.5.
Se você não vir a Microsoft Scripting Runtime seleção na caixa de diálogo referências, você pode obter este
biblioteca baixando o Microsoft Windows Script 5.6 (ou o que é a versão atual), além de
os documentação do Microsoft Windows Script 5.6 arquivos a partir do Microsoft Windows Script
Downloads página no http:\/\/www.Microsoft.com\/downloads\/details.aspx?
FamilyID = 01592C48-207 D-4BE1-8A76-1C4099D7BBB9 .
FIGURA 9.5
Definir uma referência para a biblioteca de tempo de execução 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 informações completas sobre os componentes do
FileSystemObject , além de exemplos de código útil.
271
Trabalhando com arquivos e pastas
9
14_047026 ch09.qxp 02\/04\/07 21:50 página 271
272
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
Uma digressão com a ajuda de acesso
EU
n minha opinião, 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 versão atual do
Acessar e estava disponível sem uma conexão de Internet. Em sucessivas versões do Access, ajuda
mudou-se para o formato HTML, que introduziu a possibilidade de recuperar os tópicos de ajuda que não foram
relevantes para o acesso (por exemplo da biblioteca MSDN que acompanha o VB 6.0), como propriedades, métodos,
controles e outros objetos podem ocorrer em muitas aplicações diferentes da Microsoft, embora eles podem
não (geralmente não) funcionam exatamente da mesma forma. Se você está tentando determinar quais propriedades de uma guia
controle funcionará em um formulário do Access, ele não ajuda muito se você encontrar o tópico da ajuda para um controle guia
em um UserForm de escritório ou um formulário do VB.
Ajuda do Access 2007 é ainda menos útil; ele pesquisa tudo do Office online (pelo menos, se você está conectado à
a Internet; caso contrário, não 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 tópicos
mostrado na figura a seguir. Nem um único deles é relevante. Pode-se pensar que o acesso
não suporta controles guia, mas é claro que é não é o caso.
FIGURA 9.6
O arquivo de ajuda do FileSystemObject.
14_047026 ch09.qxp 02\/04\/07 21:50 página 272
273
Trabalhando com arquivos e pastas
9
Uma lista de tópicos de ajuda inadequada em busca de \"Controle de guia\".
Há uma opção de índice na ajuda do Access, mas ele é muito escasso em relação à tabela do con-
tendas de ajuda em versões anteriores do Access e (curiosamente) é bastante diferente dependendo se
ou não, você está conectado à Internet. Ao invés de dar uma cobertura completa de todos os controles que você pode
Coloque em uma forma de acesso, os controles a seguir (a versão online da tabela de conteúdo 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 código VBA para trocar dados entre os componentes do Office
Parte II
continuou
O livro de controles de acesso ajuda índice.
A versão offline do índice tem uma seção de referência do VBA, com uma seção sobre controles,
e ele apontar para um tópico da ajuda para o controle guia — mas o tópico não está disponível off-line! E em
qualquer caso, a pesquisa não vai encontrá-lo.
Isso significa que não há nenhuma ajuda disponível para o controle de guia? De modo algum. Entrei \"controle de guia no
Formas de acesso\"no Google e tem uma página de tópicos relevantes, começando com um tutorial muito útil na
usando o controle guia de acesso. Não é específico para o Access 2007, mas isso não importa porque guia
controles não foram alterados nesta versão. Note que alguns dos sucessos são do site da Microsoft,
assim ajuda do Access não pode mesmo encontrar tópicos de ajuda apropriados em arquivos de suporte da Microsoft! Minha conclusão-
Sion: se precisar de ajuda para Access 2007, tente o Google.
14_047026 ch09.qxp 02\/04\/07 21:50 página 274
275
Trabalhando com arquivos e pastas
9
Usando o Google para obter ajuda para o acesso.
Não há outra opção para obter ajuda, pelo menos quando você está escrevendo código 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 versões anteriores do Access, clique
o botão de ponto de interrogação amarelo normalmente abriria um tópico 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 botão 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 página 275
276
Escrever código 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 botão de ajuda para o controle de guia no Pesquisador abriu um apro-
tópico de ajuda do Quad.
14_047026 ch09.qxp 02\/04\/07 21:50 página 276
Backup de seu banco de dados
Todo mundo sabe que dados devem ser armazenados com freqüência, e eu gostaria de torná-lo tão conveniente como
possível fazer backup de um banco de dados. Meu menu principal de banco de dados padrão possui um Backup o botão que
chamadas a BackupDB procedimento listado em seguida. Eu criei o botão de menu e o código de Backup em uma orelha-
versão de Lier de acesso, quando não 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 não exige o encerramento do
banco de dados, embora ainda não é tão conveniente como meu backup de um clique. O Access 2007 backup com-
Matos estão disponível através do botão gerenciar no menu arquivo (mostrado na Figura 9.7). Selecionando
a opção de \"Back Up Database\" abre a janela Salvar como mostrada na Figura 9.8.
277
Trabalhando com arquivos e pastas
9
Um tópico da ajuda Access 2003 para o controle guia.
14_047026 ch09.qxp 02\/04\/07 21:50 página 277
FIGURA 9.7
A seleção de banco de dados do Access 2007 Back Up.
FIGURA 9.8
O banco de dados interno salvar caixa de diálogo.
Se você estiver executando o código de backup no Windows Vista, você pode ser incapaz de fazer o backup
bancos de dados em determinadas pastas, devido às restrições de segurança do Vista. Este é um problema de Vista,
não é 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 segurança.
NOTA NOTA
278
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
14_047026 ch09.qxp 02\/04\/07 21:50 página 278
Embora seja muito mais fácil fazer backup de um banco de dados de acesso no Access 2007 do que em versões anteriores,
a nova seleção de \"Back Up Database\" sobre os padrões do menu de gerenciar para salvar a cópia do banco de dados em
a mesma pasta que o próprio banco de dados. Se você deseja salvar os backups para outra pasta (que i
prefiro, para evitar confusão entre bancos de dados e seus backups), você tem que procurar que
pasta. O BackupDB função no módulo seguinte basBackup salva backups para uma pasta
chamado Backups sob a pasta de banco de dados; você pode modificar o caminho de disco rígido-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 diária na unidade E, por exemplo, você poderia substituir as linhas de código
strBackupPath = _ Application.CurrentProject.Path
& “\Backups\”
com
strBackupPath = \"Backups diários e: \/\"
Consulte o capítulo 14 para uma discussão de um suplemento com opções de backup selecionável pelo usuário,
incluindo a seleção da pasta de backup de uma caixa de diálogo selecionador de pasta.
O banco de dados do Access 2007 Backup.accdb contém a tabela, módulo e macros que são 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 função pode executar a macro mcrBackup, ou de um botão na principal
no menu. O módulo basBackup é listado como segue:
Opção explícita
Opção 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
Função pública BackupDB()
REFERÊNCIA CRUZADA REFERÊNCIA CRUZADA
279
Trabalhando com arquivos e pastas
9
14_047026 ch09.qxp 02\/04\/07 21:50 página 279
Requer uma referência à 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 referência 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 cópia de banco de dados\"
strDefault = strSaveName
strFinalSaveName = InputBox (prompt: = strPrompt, _
Título: = strTitle, padrão: = strDefault)
Conjunto dbs = CurrentDb
Set rst = dbs.OpenRecordset(\"tblBackupInfo\")
Com rst
.AddNew
![SaveDate] = Format (data, \"d-mmm-aaaa\")
![SaveNumber] = SaveNo
.Atualização
.Fechar
Terminar com
FSO.CopyFile strCurrentDB, strFinalSaveName
ErrorHandlerExit:
Exit Function
ErrorHandler:
Se Err. Number = 76, em seguida,
Se a pasta de backup não foi encontrada, criá-lo.
FSO.CreateFolder strBackupPath
Retomar em seguida
Outra coisa
280
Escrever código 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() função pública como String
No erro GoTo ErrorHandler
Dim intDayNo As Integer
Dim strNextNo As String
Crie um único salvar número para hoje.
intDayNo = Nz (DMax (\"[SaveNumber]\", \"tblBackupInfo\", _
\"[SaveDate] = Date()\"))
Debug. Print \"dia nenhum.\"
strNextNo = CStr(intDayNo + 1)
Debug. Print \"próximo n.\"
SaveNo = strNextNo
ErrorHandlerExit:
Exit Function
ErrorHandler:
MsgBox \"erro nenhum:\"
& “; Description: “ & Err.Description
Resume ErrorHandlerExit
End Function
O SaveNo() função cria um número de incremento para o backup atual, pegando
o último número 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), além da SaveNo() valor e a data de hoje, formatado com traços. (Você pode alterar a data
Formatar como desejar, contanto que você não use barras ou outros caracteres que não são permitidos no arquivo
nomes.) O proposto salvar nome é apresentado em um InputBox, onde ele pode ser editado como desejado, tal
como adicionar informações sobre alterações específicas feitas no banco de dados; Ele é salvo em uma pasta chamada Backups
sob a pasta de banco de dados atual.
O GetFolder método para aFileSystemObject é usado para fazer referência a pasta de Backups; se
a pasta não for encontrada, o manipulador de erro da função cria a pasta usando a CreateFolder
método. Um registro é adicionado ao tblBackupInfo com a data e a salvar número e finalmente o
281
Trabalhando com arquivos e pastas
9
14_047026 ch09.qxp 02\/04\/07 21:50 página 281
CopyFile método 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 números de incremento para os nomes de backup. A volta-
ups que você faz em um dia terá um número (começando com 1) e a data, então eles não 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 função; você pode aceitar o proposto salvar nome
ou editá-lo como desejado.
FIGURA 9.9
Salvar uma cópia do banco de dados usando a função BackupDB.
Trabalhando com arquivos de texto
Para fins de trabalhar com arquivos de texto no código VBA, existem três tipos de arquivos de texto: vírgula -
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 método de acesso e arquivos delimitados por vírgula pode
ser tratados com o TransferirPlanilha método. Se você só precisa ler dados a partir de (ou
escrever dados para) um arquivo de texto, mas não importar para uma tabela, você pode trabalhar com arquivos de texto usando o
FileSystemObject , os métodos herdados de VB, ou ADO.
Para (e importada de) arquivos de texto delimitado por vírgulas e largura fixa é coberto
no capítulo 10.
Gravar dados em arquivos de texto
Se seu código itera através de um conjunto de registros, fazer (ou não fazer) alguma ação para cada registro, um texto
arquivo é uma maneira prática de documento quais registros foram transformados, ou talvez apenas para documentar
registros que foram ignorados por causa da falta de informação. Você pode gravar dados informativos para um
arquivo de texto usando três métodos: as declarações de VB legadas (aberto Nome do arquivo Para entrada\/saída 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 formulário 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 opções para selecionar o método para criar um arquivo de texto contendo infor-
ção sobre os registros ignorados.
REFERÊNCIA CRUZADA REFERÊNCIA CRUZADA
282
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
14_047026 ch09.qxp 02\/04\/07 21:50 página 282
FIGURA 9.10
Um formulário com opções para criar um arquivo de texto com informações sobre saltados registros usando três métodos diferentes.
O completo cmdCreateEMails_Click procedimento de evento é listado em seguida; o código primeiro verifica
que o texto de assunto e corpo da mensagem foram inserido no formulário e define uma referência 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 opção foi selecionada, o tipo de texto
Grupo de opções:
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 página 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, botões: = _ vbExclamation
+ vbOKOnly, título: = strTitle
LST.SetFocus
GoTo ErrorHandlerExit
End If
Teste para campos de mensagem necessária.
strSubject = Nz (Me! [txtMessageSubject].Valor)
Se strSubject = \"\", em seguida,
strTitle não = \"Nenhum assunto que entrou\"
strPrompt = \"Digite um assunto\"
MsgBox prompt: = strPrompt, botões: = _ vbExclamation
+ vbOKOnly, título: = strTitle
Me![txtMessageSubject].SetFocus
GoTo ErrorHandlerExit
End If
strBody = Nz (Me! [txtMessageBody].Valor)
Se strBody = \"\", em seguida,
strTitle não = \"Nenhuma mensagem corpo entrado\"
strPrompt = \"Digite o corpo da mensagem\"
MsgBox prompt: = strPrompt, botões: = _ vbExclamation
+ vbOKOnly, título: = strTitle
Me![txtMessageBody].SetFocus
GoTo ErrorHandlerExit
End If
Cheques passados; proceda para criar uma mensagem usando o método de saída do texto selecionado.
Conjunto appOutlook = GetObject (, \"Outlook. Application\")
strFile = strDocsPath
Debug. Print \"o arquivo de texto:\"
Em erro continuar próximo
284
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
14_047026 ch09.qxp 02\/04\/07 21:50 página 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 = \"Informações sobre a criação de progresso\" _
& “Outlook mail messages”
TSTR.WriteText dados: = strText, opções: = adWriteLine
TSTR.WriteText dados: = vbCrLf
blnSomeSkipped = False
Para cada varItem no lst.ItemsSelected
Obter o ID de contato e nome para referência.
lngContactID = Nz (lst.Coluna (0, varItem))
Debug. Print \"ID do contato:\"
strFullName = Nz (lst.Coluna (1, varItem))
Verificar endereço de e-mail.
strEMailRecipient = Nz (lst.Coluna (2, varItem))
strTest = strEMailRecipient
Debug. Print \"endereço 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, _
Opções: = 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 página 285
Se strTest = \"\", em seguida,
blnSomeSkipped = True
strText = \"Contato no.\"
& “ (“ & strFullName _
& “) skipped; no company name”
TSTR.WriteText dados: = vbCrLf
TSTR.WriteText dados: = strText, _
Opções: = adWriteLine
GoTo NextContactADO
End If
É necessário informação; 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:
Próxima 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, _
Opções: = adSaveCreateNotExist
End If
Caso 2
FSO
Set fso = CreateObject(\"Scripting.FileSystemObject\")
Conjunto txt = fso.CreateTextFile (FileName: = strFile, _
substituir: = True)
strText = \"Informações sobre a criação de progresso\" _
& “Outlook mail messages”
txt.WriteLine Text: = strText
txt.WriteBlankLines linhas: = 2
blnSomeSkipped = False
Para cada varItem no lst.ItemsSelected
286
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
14_047026 ch09.qxp 02\/04\/07 21:50 página 286
Obter o ID de contato e nome para referência.
lngContactID = Nz (lst.Coluna (0, varItem))
Debug. Print \"ID do contato:\"
strFullName = Nz (lst.Coluna (1, varItem))
Verificar endereço de e-mail.
strEMailRecipient = Nz (lst.Coluna (2, varItem))
strTest = strEMailRecipient
Debug. Print \"endereço 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
É necessário informação; 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:
Próxima varItem
287.
Trabalhando com arquivos e pastas
9
14_047026 ch09.qxp 02\/04\/07 21:50 página 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 informações sobre o progresso de exportação.
StrFile aberto para saída como #1
strText = \"Informações sobre a criação de progresso\" _
& “Outlook mail messages”
Impressão #1, strText
Imprimir #1,
Imprimir #1,
blnSomeSkipped = False
Para cada varItem no lst.ItemsSelected
Obter o ID de contato e nome para referência.
lngContactID = Nz (lst.Coluna (0, varItem))
Debug. Print \"ID do contato:\"
strFullName = Nz (lst.Coluna (1, varItem))
Verificar endereço de e-mail.
strEMailRecipient = Nz (lst.Coluna (2, varItem))
strTest = strEMailRecipient
Debug. Print \"endereço de E-mail:\"
Se strTest = \"\", em seguida,
blnSomeSkipped = True
strText = \"Contato no.\"
& “ (“ & strFullName _
& “) skipped; no email address”
Imprimir #1,
Impressão #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 código VBA para trocar dados entre os componentes do Office
Parte II
14_047026 ch09.qxp 02\/04\/07 21:50 página 288
Se strTest = \"\", em seguida,
blnSomeSkipped = True
strText = \"Contato no.\"
& “ (“ & strFullName _
& “) skipped; no company name”
Imprimir #1,
Impressão #1, strText
GoTo NextContactVB
End If
É necessário informação; 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:
Próxima varItem
Se blnSomeSkipped = True Then
Escreva texto fechar arquivo e linha final.
strText = \"End of file\"
Imprimir #1,
Impressão #1, strText
#1 Fechar
End If
End Select
Arquivo de texto aberto no bloco de notas.
Shell \"Notepad\"
ErrorHandlerExit:
Exit Sub
ErrorHandler:
Outlook não está em execução; Abra Outlook com CreateObject.
Se Err. Number = 429 então
Conjunto appOutlook = CreateObject
Retomar em seguida
ElseIf Err. Number = 55 então
289
Trabalhando com arquivos e pastas
9
14_047026 ch09.qxp 02\/04\/07 21:50 página 289
Arquivo já está aberto; fechá-lo.
#1 Fechar
Currículo
Outra coisa
MsgBox \"erro nenhum:\"
& “; Description: “ & Err.Description
Resume ErrorHandlerExit
End If
End Sub
Figura 9.11 mostra um arquivo de texto típico criado pelo cmdCreateEMails_Click procedimento de evento
código (o arquivo de texto é o mesmo independentemente do método usado para criá-lo).
FIGURA 9.11
Um arquivo de texto com informações sobre registros saltados.
A Figura 9.12 mostra uma das mensagens de e-mail criadas pelo código anterior.
Como tantas vezes acontece com acesso, você tem uma escolha de várias técnicas para usar quando estiver trabalhando
com arquivos de texto no código VBA. Qualquer um dos três métodos discutidos nas próximas seções podem criar um
arquivo de texto e escreva para ela; qual método você usar depende de fatores como sua familiaridade com o
técnica, ou a necessidade de referências extras no banco de dados para o código de suporte. Eu geralmente uso o
FileSystemObject método, em parte porque eu costumo ter uma referência de conjunto para a criação de scripts
Biblioteca de tempo de execução para outros fins e em parte porque sua sintaxe é o mais intuitivo. Se seus dados -
base tem uma referência para a biblioteca do ADO, mas não a biblioteca de tempo de execução de script, você pode usar o
Método de ADO para evitar a necessidade de definir uma referência extra; Se você não tiver uma referência definida
o ADO ou Scripting Runtime bibliotecas, você pode usar o método VB para evitar a configuração de um
referência extra.
290
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
14_047026 ch09.qxp 02\/04\/07 21:50 página 290
FIGURA 9.12
Uma mensagem de e-mail, criada a partir de código.
ADO
O modelo de ActiveX Data Objects (ADO) não é o melhor método para trabalhar com dados de acesso, mas
oferecer alguns recursos extras que são muito úteis para trabalhar com arquivos de texto, em especial o
Fluxo objeto. O caso do ADO nocmdCreateEMails_Click o procedimento de evento começa por set-
Ting uma variável para um Fluxo objeto no modelo de objeto do ADO (note que o prefixo do modelo de objeto é
ADODB), usando oNovopalavra-chave. A próxima linha abre o novo Fluxo objeto (você não pode escrever para
ele menos que seja aberto). Uma seqüência de caracteres de texto introdutório a serem gravados para o arquivo é salvo para o strText
variável e, em seguida, escrito para uma linha de fluxo usando a WriteText método. 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 além de avanço de linha — terminologia antiga remonta aos dias de
máquinas de escrever manuais).
Você precisa de uma referência para a biblioteca de objetos ActiveX Data Objects para oferecer suporte a esse código.
O código itera através da coleção ItemsSelected do listbox lstSelectContacts, verificando
cada registro para campos necessários (Email e CompanyName). Para cada registro que carece de dados em um
ou de ambos os campos obrigatórios (e assim não vai receber uma mensagem de e-mail), uma Se... Em seguidainstrução
grava uma linha contendo informações que record tem sido ignorada, e por isso, além 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 método com o adSaveCreateNotExist opção, que cria o arquivo se ele
não existe.
NOTA NOTA
291
Trabalhando com arquivos e pastas
9
14_047026 ch09.qxp 02\/04\/07 21:50 página 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
começa criando um FileSystemObject variável e, em seguida, criando uma TextStream variável
usando oCreateTextFile método. É uma seqüência de caracteres de texto introdutório a serem gravados para o arquivo.
salvo para ostrText variável e, em seguida, escrito para uma linha no arquivo texto usando o WriteLine
método. Criar duas linhas em branco no arquivo de texto, o WriteBlankLines método é usado
com o Linhas argumento definido como 2.
Você precisa de uma referência para a biblioteca de objetos do Microsoft Scripting Runtime para oferecer suporte a
Esse código.
O código itera através da coleção ItemsSelected do listbox lstSelectContacts, verificando
cada registro para campos necessários (Email e CompanyName). Para cada registro que carece de dados em um
ou de ambos os campos obrigatórios (e assim não vai receber uma mensagem de e-mail), uma Se... Em seguidainstrução
grava uma linha contendo informações que record tem sido ignorada, e por isso, além 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 instruções desde os primeiros dias de acesso; nenhum modelo de objeto se referem-
ENCE é necessária. O StrFile aberto para saída como #1 Declaração cria e abre o arquivo de texto
para a saída. Uma seqüência de caracteres de texto introdutório a serem gravados para o arquivo é salvo para o strText variável
e, em seguida, escrito para uma linha no arquivo de texto usando o bastante intuitiva Impressão #1 método. Para criar
dois em branco linhas no arquivo de texto, dois Impressão #1 linhas com nenhum argumento são usadas.
O código itera através da coleção ItemsSelected do listbox lstSelectContacts, verificando
cada registro para campos necessários (Email e CompanyName). Para cada registro que carece de dados em um
ou de ambos os campos obrigatórios (e assim não vai receber uma mensagem de e-mail), uma Se... Em seguidainstrução
escreve uma outra linha em branco e uma linha que contém informações sobre que registro tem sido ignorado.
Escrito no final do processo, uma linha final, e o arquivo é fechado usando o #1 Fechar declaração.
Isso não 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 instruções legadas do VB, FileSystemObject código,
ou código ADO para ler dados de arquivos texto. Importar dados de formulário de arquivo de texto (frmTextImport) tem um
botão de comando para selecionar um arquivo de texto para importar (Figura 9.13 apresenta o formulário e Figura 9.14
mostra a caixa de diálogo Seletor de arquivo aberta por este botão) e um grupo de opção com uma escolha de ADO, FSO
(FileSystemObject) e as importações de texto VB-tipo; os dados importados são gravados o texto importado grande
caixa de texto quando você clicar no botão \"Load do arquivo de dados\". Um botão \"Limpar dados importados\" limpa o
Importados texto caixa de texto, então você pode começar de novo.
NOTA NOTA
292
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
14_047026 ch09.qxp 02\/04\/07 21:50 página 292
FIGURA 9.13
Um formulário com opção de carregamento de dados de um arquivo de texto usando três métodos 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 página 293
O cmdLoadData_Click procedimento de evento que lê dados de um arquivo de texto é mais simples do que o
código que grava dados, porque dois dos três métodos (em sua própria maneira) podem importar todos os dados
de um arquivo de texto sem a necessidade de processar cada linha separadamente. O cmdLoadData_Click proce-
dure começa definindo uma referência à caixa de texto que contém 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 variável e então
umSelect Case instrução está configurada para processar a importação separadamente, dependendo se o
usuário seleciona ADO, FSO ou VB em um grupo de opções:
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 não = \"Nenhum arquivo de texto selecionado\"
strPrompt = \"Favor selecionar um arquivo de texto\"
MsgBox prompt: = strPrompt, botões: = _ vbExclamation
+ vbOKOnly, título: = 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 código VBA para trocar dados entre os componentes do Office
Parte II
14_047026 ch09.qxp 02\/04\/07 21:50 página 294
.Aberto
.LoadFromFile strTextFile
.Posição = 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 não EOF(2)
Salve dados de uma linha no arquivo de texto a uma variável.
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 página 295
Gravar dados de caixa de texto no formulário.
Me![txtImportedText].Valor = strData
ErrorHandlerExit:
Exit Sub
ErrorHandler:
MsgBox \"erro nenhum:\"
& “; Description: “ & Err.Description
Resume ErrorHandlerExit
End Sub
As próximas seções descrevem as técnicas específicas usadas no código para o ADO, FOE e VB
métodos para carregar dados de um arquivo de texto selecionado.
ADO
Para a opção do ADO, é definida uma variável de fluxo, usando o Novopalavra-chave, o Fluxo o objeto é
aberto e o selecionado texto arquivo é carregado, utilizando o LoadFromFile método. O ReadText
método é 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 variável. Finalmente, o Fluxo objeto
está fechado.
FSO
Para a opção de FSO (FileSystemObject), primeiro, uma variável é definida como a FileSystemObject ,
e, em seguida, o arquivo de texto é aberto com o OpenTextFile método para aFileSystemObject ,
com o ForReading valor para oIOMode argumento. Todos os dados do arquivo de texto é
ler usando o ReadAll método e ele é salvo para ostrData variável. Finalmente, o arquivo de texto
está fechado.
VB
O último método, VB, usa oStrTextFileForInput aberto como #2 instrução 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 variável, 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 variável é escrito para o
txtImportedText caixa de texto, como mostrado na Figura 9.15.
296
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
14_047026 ch09.qxp 02\/04\/07 21:50 página 296
FIGURA 9.15
Um formulário com os dados carregados de um arquivo de texto, usando o método de FileSystemObject.
Trabalhando com campos de anexo
O tipo de dados anexo discutido nesta seção é novo no Access 2007.
Versões 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 (não mencionar causando inchaço terrível de banco de dados). Por
contraste, no Access 2007, é muito fácil armazenar arquivos de qualquer tipo em um campo de anexo novo
tipo de dados, e os anexos são automaticamente compactados para economizar espaço de banco de dados. Os contatos
forma, frmContactsWithAttachments (aberto a partir do botão 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
acessório.
Os ícones de ligação diferem de acordo com a versão 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 também tem ícones diferentes, dependendo da sua versão.
NOTA NOTA
NOVO RECURSO NOVO RECURSO
297
Trabalhando com arquivos e pastas
9
14_047026 ch09.qxp 02\/04\/07 21:50 página 297
Discutido usando oFileSystemObject (Scripting Runtime library) para trabalhar com pastas
em uma seção anterior deste capítulo; Você também pode usar o FileSystemObject para trabalhar com arquivos
em uma pasta, ou criar arquivos. Um possível uso é para selecionar um arquivo de uma pasta para armazenar em um novo
Acessório campo de tipo de dados em uma tabela do Access.
FIGURA 9.16
Um formulário 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 diálogo anexos (mostrada na
Figura 9.17), onde você pode visualizar anexos existentes (vários anexos podem ser armazenados em um
Campo do anexo), ou adicionar um novo, clicando no botão Adicionar.
FIGURA 9.17
O diálogo de apego, mostrando um documento do Word 2007 armazenado.
O botão Adicionar na caixa de diálogo anexos (mostrado na Figura 9.17) abre uma caixa de diálogo Escolher arquivo
(mostrado na Figura 9.18) onde você pode selecionar um arquivo para armazenar o campo de anexo.
298
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
14_047026 ch09.qxp 02\/04\/07 21:50 página 298
FIGURA 9.18
Selecionando um arquivo TIF na caixa de diálogo Escolher arquivo.
Se você armazenar vários arquivos em um campo de anexo, apenas o primeiro ícone do arquivo será exibido
o controle de formulário.
Embora seja fácil 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 fácil usar código VBA para armazenar o
anexos, ou para extrair anexos e salvá-los em uma pasta. Como exemplo, suponha que você tenha
uma pasta contendo vários documentos do Word e planilhas do Excel (ambos no Office 2007 e
contatos relacionados com formatos anteriores). Cada nome de documento começa com \"Contact ID\" e um número,
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 acessório.
O LoadAttachments procedimento listado em seguida percorre os documentos na pasta
selecionado pelo botão 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 vários anexos e a coleção
de anexos é representado no código 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 acessórios
permite que você use o novo LoadFromFile e SaveToFile métodos para trabalhar com os acessórios.
Figura 9.19 mostra uma pasta com documentos de identificação do contato de vários 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 página 299
FIGURA 9.19
Uma pasta com alguns documentos de ID de contato, para a criação de anexos.
Na LoadAttachments função listados a seguir, declarando a rstAttachments variável como
umRecordset2 objeto (em vez de um objeto Recordset) permite o uso do novo LoadFromFile e
SaveToFile métodos que eu uso para carregar arquivos em campos de fixação, ou salvar arquivos de
Campos de anexo:
Função pública 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 começa com 'ID de contato'
Se deixou (strFile, 10) = \"Contact ID\", em seguida,
300
Escrever código 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 funções para começar no início do
número e final antes o espaço após o número, se houver.
strTest = Mid (String: = strFile, início: = 12, comprimento: = 3)
intSpace = InStr (strTest, \"\")
Se intSpace > 0 então
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 correspondência na tabela.
rstTable.MoveFirst
rstTable.FindFirst strSearch
Se rstTable.NoMatch = True Then
strTitle = \"Não pode encontrar o contato\"
strPrompt = \"Contact ID\"
& “ not found in table; can’t 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 código tenta adicionar o mesmo arquivo duas vezes; no presente
caso que o conjunto de registros anexos não vai ser atualizado.
Em erro continuar próximo
Com rstAttachments
.AddNew
.Fields(\"FileData\").LoadFromFile _
(strFileAndPath)
.Atualização
.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 página 301
End If
NextDoc:
Próximo fil
Abra o formulário de contatos para Ver os anexos que foram carregados.
DoCmd. OpenForm nomedoformulário: = \"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
Opção de anexos seleccionada; Esta selecção chama a LoadAttachments função.
FIGURA 9.20
O menu principal, com um botão de anexos com duas opções, para carregar ou salvar anexos.
Salvar anexos de arquivos
O SaveAttachments procedimento executa a função 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 código VBA para trocar dados entre os componentes do Office
Parte II
14_047026 ch09.qxp 02\/04\/07 21:50 Page 302
coleção de um registro e salva cada um em um arquivo na pasta de documentos de saída selecionado sobre o
menu principal:
Função pública 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 saída:\"
Set fso = CreateObject(\"Scripting.FileSystemObject\")
Set fld = fso.GetFolder(strDocsPath)
Conjunto dbs = CurrentDb
Definir rstTable = dbs.OpenRecordset(\"tblContacts\")
Fazer enquanto não rstTable.EOF
Crie registros de anexos para este registro.
Definir rstAttachments = _
rstTable.Fields(\"File\").Valor
Com rstAttachments
Enquanto não.EOF
strFileAndPath = _ strDocsPath
& .Fields(“FileName”)
Salve este anexo para um arquivo na pasta de documentos de saída.
Debug. Print \"poupança\"
& “ to “ & strDocsPath & “ folder”
Desligue o manipulador de erro para evitar erros, se o arquivo já existir na pasta.
Em erro continuar próximo
.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 página 303
ErrorHandlerExit:
Exit Function
ErrorHandler:
MsgBox \"erro nenhum:\"
& “; Description: “ & Err.Description
Resume ErrorHandlerExit
End Function
No Access 2007, é muito mais fácil salvar um banco de dados para um formato anterior, bem como da economia
uma cópia do banco de dados no formato atual (o tão esperado \"Banco de dados salvar como\"); o
três opções são 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 capítulo você aprendeu a usar o OfficeFileDialog objeto para permitir facilitar a seleção de um
pasta para carregar ou salvar documentos. Além disso, você aprendeu como usar uma variedade de técnicas
para criar arquivos de texto, salvando dados a eles e carregando dados para tabelas do Access, usando
ADO, a FileSystemObject , legadas declarações de VB e também como salvar anexos
de arquivos para o novo anexo de campo (ou extrair anexos de campos e salvá-los como
arquivos), usando o código do VBA. Estas técnicas permitirá que você trabalhe com arquivos de texto em uma variedade de maneiras,
para adicionar funcionalidades extras para seus bancos de dados, para além de trabalhar com documentos do Office.
NOVO RECURSO NOVO RECURSO
304
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
14_047026 ch09.qxp 02\/04\/07 21:50 página 304
EU
n o capítulo anterior, você aprendeu como trabalhar com arquivos de texto, usando um
método antigo e duas novas. Para alguns tipos de arquivos de texto, você também pode
usar métodos do objeto Application do acesso para importação e exportação
arquivos de texto ao trabalhar com dados em código VBA. O TransferText método
tem sido usado para importar dados do (ou exportar dados para) delimitado por vírgula 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 método foi atualizado para também exportar para e importar de
Arquivos HTML.
Tipicamente, delimitado por vírgulas ou fixo-largura arquivos são 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 vírgula ou de largura fixa para
importar para aplicativos de mainframe. Além disso, você pode usar esses formatos
exportar dados para ou importar dados de outros aplicativos cujos formatos não são
diretamente suportado pelo acesso.
Se você tiver dados em planilhas Excel ou Lotus, você pode usar o
TransferirPlanilha método para importar dados de-los ou exportar dados
para planilhas. E o TransferirBancoDeDadosmétodo pode ser usado para
transferir dados entre tabelas do Access e bancos de dados legados ou planilhas.
Estes três métodos não têm o poder ou a flexibilidade de código de automação,
que pode iterar por meio de registros em uma tabela, talvez usando um filtrado
conjunto de registros e dados de gravação de campos específicos 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 métodos vêm a calhar.
305
NESTE CAPÍTULO
Importação e exportação
delimitado por vírgulas e fixa-
arquivos de texto de largura
Importação e exportação de dBASE,
Paradoxo e arquivos do Lotus 1-2-3
Importação e exportação de XML
e arquivos HTML
Enviando arquivos de texto exportado
Trabalhando com
Dados externos
15_047026 ch10.qxp 02\/04\/07 21:52 página 305
Nos dias de hoje, não é provável que você iria querer exportar dados do Access para uma planilha do Lotus ou um
banco de dados dBASE, mas ainda é necessário para exportar arquivos de texto delimitado por vírgula ou de largura fixa, portanto, a
TransferText método também é útil para exportar dados do Access para arquivos de texto.
Trabalhando com texto arquivos usando o
Método TransferText
Quando você usa o TransferText método no código VBA, você pode fornecer um nome de especificação. A
especificação de importação ou exportação é criada quando você executa a exportar ou importa manualmente. O
processo de criação de uma especificação (e reutilizando-interface) foi racionalizadas no Access
2007; Eu cubro a criação de uma especificação de exportação na próxima seção. As especificações são úteis
Quando você precisa definir um número de opções personalizadas para uma exportação ou importação, especialmente se você planeja
Execute novamente a exportação ou importação na interface; no entanto, eles não são necessários.
Criando uma especificação de exportação ou importação
O processo de criação de uma especificação de importação para importar um arquivo de texto de largura fixa é descrito a seguir;
você criar especificações para importar um arquivo de texto delimitado por vírgula ou exportar qualquer um desses arquivos
tipos, de forma semelhante, com opções diferentes, dependendo do tipo de arquivo. Você pode querer usar
baixei de uma especificação de importação, por exemplo, se você receber um arquivo de texto de dados delimitados por vírgulas
de um mainframe toda semana e você precisará importar os dados semanais para uma tabela do Access.
1. Primeiro, clique no botão arquivo de texto no menu de dados externa, como mostrado na Figura 10.1.
FIGURA 10.1
A partir de uma importação de um arquivo de texto.
2. Em seguida, em obter dados externos - caixa de diálogo de arquivo de texto (mostrado na Figura 10.2), use o
Procure o botão para selecionar o arquivo de texto para importar (empregos 02-Jul-2006.txt no exemplo).
306
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
15_047026 ch10.qxp 02\/04\/07 21:52 página 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 diálogo de arquivo de texto abre
o Assistente de texto de importação (Figura 10.3), com uma seleção de delimitado ou largura fixa; Gen-
erally acesso pre-selects a opção correta.
FIGURA 10.3
A caixa de diálogo do Assistente de importação de texto.
307
Trabalhando com dados externos
10
15_047026 ch10.qxp 02\/04\/07 21:52 página 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 próxima tela, mostrada na Figura 10.5, permite que você especifique nomes de campo, se eles estão 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 padrão de
Campo1 pelo Assistente) sendo rebatizado com o nome original. Você também pode alterar os dados
tipo do campo, se necessário; por exemplo, fazendo um campo de texto que contém dados numéricos 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 não especificar uma chave primária; Neste caso,
porque os dados serão anexados a uma tabela que tem um campo AutoNumeração, o \"não pri-
opção 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 código VBA para trocar dados entre os componentes do Office
Parte II
15_047026 ch10.qxp 02\/04\/07 21:52 página 308
FIGURA 10.5
Especificando nomes de campo para um arquivo de texto importado.
FIGURA 10.6
Opções de chaves primárias para um arquivo de texto importado.
309
Trabalhando com dados externos
10
15_047026 ch10.qxp 02\/04\/07 21:52 página 309
Você agora forneceu todas as informações necessárias para configurar a especificação; as próximas etapas, onde
você salvar a especificação, são novos para o Access 2007.
Clicando no botão Concluir abre uma nova tela de salvar etapas de importação (mostrada na Figura 10.7).
Se você marcar a caixa de seleção \"salvar etapas de importação\", mais controles aparecem na caixa de diálogo,
onde pode introduzir o nome e a descrição da especificação de importação salvo e até mesmo criar uma
Tarefa do Outlook para executá-lo automaticamente em um intervalo especificado.
FIGURA 10.7
Salvando uma especificação de importação.
Clicando no botão Salvar importar salva a especificação de importação. Isso permite que você selecione os salvos
especificação e execução-lo no futuro de importações salvas botão 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 importação.
Infelizmente, o Access 2007 VBA código não reconhece salvo especificações. Fea-
ture trabalhou para várias versões anteriores, mas neste momento ele está quebrado, então temos de esperar
para um pacote de patch ou serviço para corrigi-lo. Por agora, apenas o código que evita o uso de especificações vai funcionar.
(Você pode importar ou exportar para um arquivo delimitado por vírgula sem uma especificação, mas não um fixo-
arquivo de largura).
A tela de gerenciar tarefas de dados é mostrada na Figura 10.8. Ele tem duas guias, uma para importações salvas e
o outro para exportações salvas. Em cada guia, você pode selecionar uma salva especificação para executar.
CUIDADO CUIDADO
NOVO RECURSO NOVO RECURSO
310
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
15_047026 ch10.qxp 02\/04\/07 21:52 página 310
FIGURA 10.8
A caixa de diálogo gerenciar tarefas de dados, onde você pode selecionar um salvo importar ou exportar a especificação.
Às vezes, o assistente não reconhece que a primeira linha de um arquivo de texto contém 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, após a conclusão da importação (você provavelmente terá algum tipo
Erros de conversão na tabela de erros de importação para essa linha). Figura 10.9 mostra a tabela de importados
dados de postos de trabalho e a tabela de erros de importação com erros na primeira linha que contém 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 importação.
NOTA NOTA
311
Trabalhando com dados externos
10
15_047026 ch10.qxp 02\/04\/07 21:52 página 311
Importar e exportar dados de arquivo de texto no código VBA
O menu principal do aplicativo de exemplo, Data.accdb externos (mostrado na Figura 10.10), tem mas-
toneladas para a abertura de vários formulários que importar e exportar os dados em uma variedade de formatos de arquivo. Escrita VBA
código para fazer as importações e exportações dá-lhe um clique conveniência, particularmente útil se você tem
para fazer uma importação ou exportação de tarefa com freqüência, 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 vírgulas.
FIGURA 10.10
O menu principal do banco de dados de amostra de dados externos.
Importação 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
código de execução de controles em um formulário do Access (frmImportTextData, ilustrado na Figura 10.11):
1. Selecionando a opção \"Importar dados de arquivos de texto\" e clicando no botão à sua esquerda abre
o trabalho de importar dados de formulário 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 botão 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\" botão, que abre uma caixa de diálogo Seletor de arquivo. A caixa de diálogo Seletor de arquivo
caixa é filtrada para exibir delimitado por vírgula (. csv) ou arquivos de largura fixa (. txt), acordo-
ing para a opção selecionada no grupo de opção de tipo de texto de importação. Na Figura 10.12, que eu
selecionado um arquivo de texto delimitado por vírgulas para importação.
312
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
15_047026 ch10.qxp 02\/04\/07 21:52 página 312
FIGURA 10.11
O trabalho de importar dados de formulário em arquivo de texto, como inicialmente aberto.
FIGURA 10.12
Selecionando um arquivo de texto delimitado por vírgulas para importação.
313
Trabalhando com dados externos
10
15_047026 ch10.qxp 02\/04\/07 21:52 página 313
3. Depois de selecionar um arquivo de texto, clique no botão de \"Inspecionar novos postos de trabalho do arquivo de texto\" para importar
dados do arquivo de texto para uma tabela temporária, tblNewJobs.
O código em execução a partir deste botão define a tabela como o objeto de fonte de empregos para
Inspecionar o subformulário, 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 vírgula.
4. Após inspecionar os novos dados, você pode descartar os dados ou importá-lo para o
tabela de tblJobs.
Clicando no botão \"Clear importado empregos dados\" descartará os dados (que não é adicionado à
tblJobs).
Clique no botão de \"Salvar novos postos de trabalho em mesa\" executa uma consulta de acréscimo que adiciona o novo
Dados de postos de trabalho para tblJobs. O código faz algum tipo de conversão de dados (como mostrado na Figura
10.14), porque todos os campos no arquivo de texto são campos de texto.
314
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
15_047026 ch10.qxp 02\/04\/07 21:52 página 314
FIGURA 10.14
Uma consulta acréscimo que faz alguns dados digite conversão antes de acrescentar o recém
empregos importados para a tabela principal tblJobs.
Se você clicou no botão \"Salvar novos postos de trabalho em mesa\", os novos registros que foram exibidos no
forma foram adicionados ao tblJobs.
Os procedimentos relevantes do módulo de código do formulário estão listados em seguida. Os \"empregos importados claros\"
procedimento de evento do botão 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 próximo
Me![subNewJobs].SourceObject = \"\"
Chame SaveTextFile(\"\")
Me![txtSelectedTextFile].Valor = \"\"
End Sub
Importar dados de arquivos de texto de largura fixa tornou-se muito mais difícil no acesso
2007 do que em versões anteriores do Access. Loja de especificações agora o nome do arquivo inter-
nalmente e, portanto, você deve criar uma especificação separada para cada arquivo de texto que você deseja criar. Este
significa que o método flexível que eu uso, onde você pode selecionar o arquivo a importar, não vai funcionar. Eu recom -
emendar adere a importação de arquivo delimitado por vírgula, se possível.
NOTA NOTA
315
Trabalhando com dados externos
10
15_047026 ch10.qxp 02\/04\/07 21:52 página 315
Procedimento de evento do botão de comando \"Inspecionar novos postos de trabalho do arquivo de texto\" primeiro verifica que um texto
arquivo foi selecionado e, em seguida, define variáveis com o nome da tabela de destino para a importação e a
tipo de importação. Próximo, um Select Case declaração lida com os dois tipos de importação (delimitado por vírgula
e largura fixa) separadamente, usando o TransferText declaração 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 não = \"Nenhum arquivo de texto selecionado\"
strPrompt = \"Favor selecionar um arquivo de texto\"
MsgBox prompt: = strPrompt, botões: = _ vbExclamation
+ vbOKOnly, título: = 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 vírgula:
DoCmd.TransferText transfertype: = acImportDelim, _
TableName: = strTable, _
FileName: = strTextFile, _
hasfieldnames: = True
Caso 2
Largura fixa
strSpec = \"importação-empregos 13 de agosto de 2006\"
' Nova sintaxe de estilo
316
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
15_047026 ch10.qxp 02\/04\/07 21:52 página 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 subformulário.
Me![subNewJobs].SourceObject = \"fsubNewJobs\"
ErrorHandlerExit:
Exit Sub
ErrorHandler:
MsgBox \"erro nenhum:\"
& “; Description: “ & Err.Description
Resume ErrorHandlerExit
End Sub
Procedimento de evento do botão \"Salvar novos postos de trabalho em mesa\" comando executa uma consulta de acréscimo 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 página 317
Procedimento de evento do botão de comando \"Arquivo de texto de origem\" abre uma caixa de diálogo de arquivo seletor para selecionar um
arquivo de texto para importar, para texto ou arquivos delimitados por vírgula, dependendo da opção de filtragem
selecionado no formulário:
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 diálogo 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 então
.Filters.Add \"arquivos delimitados por vírgula\", \"*. csv\"
ElseIf intTextType = 2 então
.Filters.Add \"arquivos de largura fixa\", \"*. txt\"
End If
.InitialView = msoFileDialogViewDetails
.InitialFileName = strPath
Se for.Mostrar = -1 então
strTextFile = CStr (fd.SelectedItems.Item(1))
Outra coisa
Debug. Print \"usuário 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 código VBA para trocar dados entre os componentes do Office
Parte II
15_047026 ch10.qxp 02\/04\/07 21:52 página 318
ErrorHandler:
MsgBox \"erro nenhum:\"
& “; Description: “ & Err.Description
Resume ErrorHandlerExit
End Sub
Procedimento de evento do grupo de opção de \"Importar texto tipo\" primeiro verifica se o arquivo de texto selecionado é o
certo tipo e limpa, se não, então estabelece uma Select Case instrução ao processo delimitado por vírgula
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 seleção de arquivo, se não.
intTextType = Nz (Me! [fraTextType].Valor, 1)
strTextFile = GetTextFile()
Se Len(strTextFile) > 4 então
strExt = Right (strTextFile, 3)
End If
Selecione o caso intTextType
Caso 1
Delimitado por vírgula
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 página 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 vírgula 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 formulário do Access 2007 tem um recurso muito aguardado
mostrado na Figura 10.15: um calendário pop-up para tornar mais fácil 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 código VBA para trocar dados entre os componentes do Office
Parte II
15_047026 ch10.qxp 02\/04\/07 21:52 página 320
1. Para abrir o \"exportar dados de emprego a forma de arquivo texto (frmExportTextData), selecione\"Export
Dados de arquivos texto\"opção no menu principal e clique no botão à sua esquerda. Este formulário permite
você exportar uma variedade de registros filtrados por data ou uma vírgula-delimited ou de largura fixa
arquivo de texto.
2. Após você selecionar o de data e a data, digitá-los no ou usando a data
seletor de pop-up, clique no botão \"Inspecionar novos empregos para exportação\" para mostrar os trabalhos em
o intervalo de datas selecionado em empregos para inspecionar o subformulário (fsubNewJobs), como mostrado na
Figura 10.16.
3. Se você não quiser ir em frente com a exportação, use o botão \"Clear empregos para exportação\"
Limpe os trabalhos selecionados.
4. Para prosseguir com a exportação, use o botão \"Exportar empregos para arquivo de texto\" para executar o código usando
o TransferText método para exportar o intervalo de datas selecionado de postos de trabalho para um arquivo de texto do
tipo selecionado no grupo de opção de \"Exportar texto tipo\". Figura 10.17 mostra um exportado
arquivo delimitado por vírgula aberto no Excel (que é o aplicativo padrão 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 página 321
FIGURA 10.17
Um arquivo de texto delimitado por vírgulas exportado aberto no Excel.
O novo método de lidar com especificações funciona bem com as exportações de largura fixa, pelo menos assim
contanto que você sempre deseja exportar para salvar arquivo nome, como eu faço no código de exemplo.
Os procedimentos relevantes do módulo de formulário são listados em seguida. O botão \"Clear empregos para exportação\"
procedimento de evento limpa o subformulário de folha de dados de empregos:
Private Sub cmdClearData_Click()
Em erro continuar próximo
Me![subFilteredJobs].SourceObject = \"\"
End Sub
NOTA NOTA
322
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
15_047026 ch10.qxp 02\/04\/07 21:52 página 322
Procedimento de evento do botão \"Exportar empregos para arquivo de texto\" configura um Select Case instrução para
exportar os trabalhos selecionados, usando o TransferText declaração 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 vírgula
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 página 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 botão \"Inspecionar novos empregos para exportar\" define o objeto de origem na folha de dados de formulário
para o subformulário vinculado a qryFilteredJobs , para exibir os trabalhos selecionados:
Private Sub cmdInspectNewJobs_Click()
Em erro continuar próximo
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 forças 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 estão usando esses programas, ou pelo menos tem arquivos antigos cre-
ated por eles no ano passado, então você ainda pode precisar de importar dados de um dBASE, Paradox ou Lotus
arquivo ou (embora seja muito menos provável) exportar para um desses formatos. Acesso ainda suporta a importação de
estes formatos herdados, e você também pode exportar para eles, tanto na interface e no código VBA.
Importação de arquivos de banco de dados
Formato para importar dados de arquivos de aplicativo herdado é semelhante ao formulário de importação de
arquivos de texto; ele difere em oferecer uma seleção de três tipos de aplicativos legados: dBASE, Paradox, e
Lotus. As etapas a seguir descrevem a importação de dados de empregos de um arquivo do dBASE:
324
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
15_047026 ch10.qxp 02\/04\/07 21:52 página 324
1. Para abrir o trabalho de importar dados de formulário de arquivo de aplicativo (frmImportAppData), selecione o
\"Importar dados de arquivos App\" opção no menu principal e clique no botão à 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 botão do arquivo de origem para selecionar um arquivo do tipo selecionado em \"Tipo de arquivo de importação\"
Grupo de opção de uma caixa de diálogo Seletor de arquivo, como mostrado na Figura 10.19.
3. Tal como acontece com arquivos de texto, clique no botão de \"Inspecionar novos postos de trabalho do arquivo de App\" para importar dados do
o arquivo selecionado para uma tabela temporária. O código define essa tabela como o objeto de origem da
Empregos para inspecionar subformulário, 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 página 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 código VBA para trocar dados entre os componentes do Office
Parte II
15_047026 ch10.qxp 02\/04\/07 21:52 página 326
Quando o importador de (ou exportadores para) dBASE ou Paradox formatos usando o
TransferirBancoDeDados
método, o
DatabaseName
argumento leva o caminho, não 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 então ele irá causar um erro.
4. Use o botão \"Limpar dados de empregos importados\" para limpar os dados importados sem adicioná-lo
para tblJobs.
5. Use o botão \"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, não há um enum de constantes nomeadas para os valores usados para definir o DatabaseTypecomplexType
argumento do TransferirBancoDeDadosmétodo; você tem que digitar os valores. 10.1 Tabela lista o
valores que você precisa usar para diferentes versões do dBASE e Paradox.
NOTA NOTA
327
Trabalhando com dados externos
10
15_047026 ch10.qxp 02\/04\/07 21:52 página 327
TABELA 10.1
Valores de argumento DatabaseTypecomplexType para dBASE e Paradox
Versão 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 necessário.
Importação 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 método, que funciona muito parecido com o TransferText
método, importar todos os dados de uma planilha. Ao contrário dos arquivos de banco de dados, você pode usar o nome
os valores de argumento o Seguintes enum para planilhas de várias versões;
esses valores estão listados na tabela 10.2.
TABELA 10.2
SpreadsheetType constantes nomeada para Lotus 1-2-3
Versão do Lotus SpreadsheetType constantes nomeada
Lotus WK1 acSpreadsheetTypeLotusWK1
Lotus WK3 acSpreadsheetTypeLotusWK3
WK4 Lotus acSpreadsheetTypeLotusWK4
WJ2 Lotus acSpreadsheetTypeLotusWJ2
328
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
15_047026 ch10.qxp 02\/04\/07 21:52 página 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 número. No entanto,
Quando você clicar os postos de trabalho salvar botão de tabela, o CDate) função na qappNewJobs
acrescentar consulta converte o valor numérico de data no formato correto antes de acrescentar os dados para
tblJobs. Este tipo de ajustes de dados importados é muitas vezes necessário, para garantir que os dados que chegam em
a tabela de destino do Access é o tipo de dados correto.
FIGURA 10.22
Valores numéricos 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 importação do módulo de formulário de aplicativo arquivo estão listados
próxima. Procedimento de evento do botão \"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 temporárias de
novos postos de trabalho:
Private Sub cmdClearData_Click()
Em erro continuar próximo
Me![subNewJobs].SourceObject = \"\"
Chame SaveAppFile(\"\")
Me![txtSelectedAppFile].Valor = \"\"
329
Trabalhando com dados externos
10
15_047026 ch10.qxp 02\/04\/07 21:52 página 329
Excluir tabelas de empregos novos
AcTable, DoCmd.DeleteObject \"tblNewJobs\"
AcTable, DoCmd.DeleteObject \"tblNewJobsDB\"
End Sub
Procedimento de evento do botão \"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
TransferirBancoDeDadosdeclaração, configura-se então um Select Case instrução para fazer a importação
diferentes para os tipos de aplicação de três:
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 não = \"Nenhum arquivo de aplicativo selecionado\"
strPrompt = \"Favor selecionar um arquivo do aplicativo\"
MsgBox prompt: = strPrompt, botões: = _ vbExclamation
+ vbOKOnly, título: = 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 código VBA para trocar dados entre os componentes do Office
Parte II
15_047026 ch10.qxp 02\/04\/07 21:52 página 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 formulário apropriado como o objeto de origem do subformulário.
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 formulário apropriado como o objeto de origem do subformulário.
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 página 331
Atribua o formulário apropriado como o objeto de origem do subformulário.
Me![subNewJobs].SourceObject = \"fsubNewJobs\"
End Select
ErrorHandlerExit:
Exit Sub
ErrorHandler:
MsgBox \"erro nenhum:\"
& “; Description: “ & Err.Description
Resume ErrorHandlerExit
End Sub
Procedimento de evento do botão \"Salvar novos postos de trabalho em mesa\" configura um Select Case instrução para executar
um dos três 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 código VBA para trocar dados entre os componentes do Office
Parte II
15_047026 ch10.qxp 02\/04\/07 21:52 página 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 botão fonte arquivo abre uma caixa de diálogo de arquivo seletor para selecionar um arquivo de aplicativo para
importando, filtragem para dBASE, Paradox ou Lotus arquivos dependendo da opção selecionada no formulário:
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 diálogo 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 página 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 então
strAppFile = CStr (fd.SelectedItems.Item(1))
Outra coisa
Debug. Print \"usuário 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 opção de \"Tipo de arquivo de importação\" After_Update procedimento primeiro verifica que o selecionado
arquivo do aplicativo é o tipo certo e limpa-lo se não, então configura um Select Case instrução para
processar os três 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 seleção de arquivo, se não.
intFileType = Nz (Me! [fraFileType].Valor, 1)
Se Len(GetTextFile()) > 4 então
strExt = Right (strAppFile, 3)
End If
334
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
15_047026 ch10.qxp 02\/04\/07 21:52 página 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 página 335
Exportando arquivos de planilha e banco de dados
Não nos dias de hoje, é muito provável que você precisa exportar dados do Access para um dBASE, Paradox,
ou o arquivo de Lotus (e em todo o caso, conforme discutido na seção \"Exportando arquivos de texto\", você pode exportar para um
delimitado por vírgulas arquivo de texto que pode ser importado para as aplicações). No entanto, ainda oferece acesso
a opção de fazer as exportações para esses aplicativos herdados, como discutido nesta seção.
Se você selecionar a opção \"Exportar dados para arquivos de App\" no menu principal e clique no botão à 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 exportação para o formato de arquivo de texto) permitem exportar uma série 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 botão \"Clear empregos para exportar\" limpa os registros selecionados e o \"exportar empregos para aplicação
Arquivo\"botão faz a exportação de um arquivo de formato selecionado; Este procedimento encontra-se em seguida. Semelhante ao
os outros procedimentos de exportação, esse procedimento configura uma Select Case instrução para fazer a exportação
Diferentemente de acordo com o tipo de aplicativo selecionado; o TransferirBancoDeDadosdeclaração com
vários argumentos:
Private Sub cmdExportJobs_Click()
No erro GoTo ErrorHandler
Dim intFileType As Integer
Dim strQuery As String
336
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
15_047026 ch10.qxp 02\/04\/07 21:52 página 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 página 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, porém muito útil para o desenvolvimento de web sites, até à data não têm utilidade como veículos
para exportar ou importar os dados de acesso. XML, em particular, parece ser uma nova tecnologia (não que
novo; foi introduzida no Office XP) que como de ainda não ter muita utilidade para importação de dados de acesso
e exportação, 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 métodos, tais como
os formatos de planilha ou delimitado por vírgulas.
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, estão 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 opções) você pode usar o formulário HTML de importação ou dados de emprego de XML (frmImportHTMLXMLData),
que abre, se você selecionar importação HTML ou XML dados opção no menu principal e clique o
botão à sua esquerda (Ver Figura 10.11).
Clicando no botão \"Inspecionar novos postos de trabalho de arquivo de HTML\" exibe os registros importados na sub-
formulário, conforme mostrado na Figura 10,24.
338
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
15_047026 ch10.qxp 02\/04\/07 21:52 página 338
FIGURA 10,24
Inspecionar dados importados de um arquivo HTML.
Se você selecionar a opção XML, dados do arquivo XML são exibidos no subformulário, 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 página 339
Quando você importar dados de um arquivo XML, não há nenhuma opção 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 número.
O código para o botão 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 não = \"Nenhum arquivo de aplicativo selecionado\"
strPrompt = \"Favor selecionar um arquivo do aplicativo\"
MsgBox prompt: = strPrompt, botões: = _ vbExclamation
+ vbOKOnly, título: = strTitle
GoTo ErrorHandlerExit
Outra coisa
Analisar o nome do arquivo; é necessário mais tarde no processo.
strHTMLXMLFile = SplitDBName(strHTMLXMLFileAndPath)
Guarnição fora a extensão 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 código VBA para trocar dados entre os componentes do Office
Parte II
15_047026 ch10.qxp 02\/04\/07 21:52 página 340
Caso 1
HTML
DoCmd.TransferText transfertype: = acImportHTML, _
TableName: = strTable, _
FileName: = strHTMLXMLFileAndPath, _
hasfieldnames: = True
Atribua o formulário apropriado como o objeto de origem do subformulário.
Me![subNewJobs].SourceObject = \"fsubNewJobs\"
Caso 2
XML
ImportXML DataSource: = strHTMLXMLFileAndPath, _
ImportOptions: = acStructureAndData
DoCmd.SetWarnings False
Não 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 número adicionado em.
DoCmd.Rename newname: = strTable, objecttype: = _ acTable,
OldName: = strHTMLXMLFile
Atribua o formulário apropriado como o objeto de origem do subformulário.
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 exportação de dados de acesso para arquivos HTML ou XML, tente o trabalho de exportação
Dados de formulário HTML ou arquivo XML. Se você selecionar a opção \"Exportar HTML ou XML dados\" sobre a
menu principal (Ver Figura 10.10) e clique no botão à 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 página 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 subformulário 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 botão \"Exportar empregos para HTML File\" (ou \"Exportar empregos para arquivo de XML\"; as mudanças de legenda
com a seleção do grupo de opção de \"Tipo de arquivo de exportação\") começa a exportação. A exportação HTML é feita
com o TransferText método com o acExportHTML valor para oTransferType argumen-
mento; a exportação XML é feita com o ExportXML método de acesso Aplicativo objeto.
Figura 10.27 mostra um arquivo HTML exportado aberto no Internet Explorer 7. Infelizmente, é com-
pletamente não formatado e, assim, provavelmente não muito útil.
342
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
15_047026 ch10.qxp 02\/04\/07 21:52 página 342
FIGURA 10.27
Um arquivo HTML exportado aberto no Internet Explorer.
O código de limpeza de dados antigos e inspecionar os postos de trabalho para exportar é semelhante ao código para outro
tipos de exportação; somente o procedimento de evento para o botão \"Exportar empregos para HTML\/XML File\" é listado como
Segue-se; Ele usa um Select Case instrução para exportar os dados para um arquivo de HTML (usando o
TransferText método) ou um XML arquivo, usando o ExportXML método 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 página 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 segurança
aviso. Se você clicar na barra você pode selecionar para permitir o conteúdo bloqueado, como mostrado na Figura 10.28.
344
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
15_047026 ch10.qxp 02\/04\/07 21:52 página 344
FIGURA 10.28
Um aviso de segurança ao abrir um arquivo XML no Windows Vista.
Se você selecionar permitir conteúdo bloqueado, você terá um outro aviso de segurança, mostrada na Figura 10.29.
Finalmente, o XML do arquivo exibe (Ver Figura 10.30), mas como código-fonte, não um corretamente formatado doc -
cumento, então (como o arquivo HTML) não é muito útil.
FIGURA 10.29
Outro aviso de segurança do Vista.
345
Trabalhando com dados externos
10
15_047026 ch10.qxp 02\/04\/07 21:52 página 345
FIGURA 10.30
Um arquivo XML aberto no Internet Explorer.
Você também pode abrir um arquivo XML no Excel. Depois de selecioná-lo, você recebe uma caixa de diálogo Open XML com três
opções, como mostrado na Figura 10,31. Para ver o que se parece com os dados XML formatados, selecione \"como
opção de uma tabela XML\".
FIGURA 10,31
Três opções para abrir um arquivo XML no Excel.
346
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
15_047026 ch10.qxp 02\/04\/07 21:52 página 346
Se você aceitar a opção padrão 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 vírgula em vez de XML; eles são muito mais fáceis de trabalhar, e
suporte a versões anteriores do Excel que não é possível abrir arquivos XML.
Você também pode usar o método 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 método também abre como código-fonte.
NOTA NOTA
NOTA NOTA
347
Trabalhando com dados externos
10
15_047026 ch10.qxp 02\/04\/07 21:52 página 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 botão de \"Enviar trabalho listas de contatos\" abre um formulário
(mostrado na Figura 10-34) onde você pode selecionar vários contatos e um arquivo de trabalho (. csv ou. txt)
para enviar como um anexo para os contatos selecionados. A figura também mostra três mensagens de e-mail com
o anexo de arquivo de trabalho selecionado.
FIGURA 10.34
Um formulário para seleção de contatos e um arquivo de trabalho para email a eles, com três mensagens de e-mail, criado a partir de
o formulário.
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 código VBA para trocar dados entre os componentes do Office
Parte II
15_047026 ch10.qxp 02\/04\/07 21:52 página 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 obrigatórios.
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 endereço de e-mail.
strEMailRecipient = Nz (lst.Coluna (1, varItem))
Debug. Print \"endereço 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 <>\"\" então
.Attachments.Add strJobFile
End If
.Exposição
Terminar com
349
Trabalhando com dados externos
10
15_047026 ch10.qxp 02\/04\/07 21:52 página 349
NextContact:
Próxima varItem
ErrorHandlerExit:
Conjunto appOutlook = Nothing
Exit Sub
ErrorHandler:
Outlook não está em execução; Abra Outlook com CreateObject.
Se Err. Number = 429 então
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 têm apenas um endereço de e-mail, ou uma frase como \"Assistência técnica\"
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. Importação de tais contatos pode causar
problemas, como a criação de vários registros de empresa com variações de um nome de empresa.
Estou planejando atualizar o banco de dados de sincronização de contatos para lidar com vários tipos de problema
dados e adicionar alguns novos recursos; Procure uma versão atualizada do banco de dados no meu site,
http:\/\/www.helenfeddema.com
.
Resumo
Este capítulo tratou de exportar para e importar de, uma variedade de arquivo formatos, que vão desde o
formatos mais antigos para aqueles tão novos que são pouco úteis ainda. Arquivos de texto, ambos comma-delimited
e largura fixa (colunar), têm sido utilizados para dados de exportação e importação desde os primeiros dias de
computadores e eles ainda são muito úteis, especialmente o formato de arquivo delimitado por vírgula. Arquivos
exportados para esse formato, que pode ser importado por um grande muitas aplicações, que o torna muito útil
para exportar os dados para ser importado por um aplicativo que não é diretamente suportado como um acesso
tipo de exportação. O inverso também é verdadeiro: muitos aplicativos podem exportar seus dados para uma largura fixa ou
arquivo delimitado por vírgula, da qual eles podem ser importados para tabelas do Access.
Se você tiver dados no antigo dBASE, Paradox, ou arquivos do Lotus, acesso oferece opções para a importação de
esses arquivos, assim você pode obter seus dados antigos em tabelas do Access. Embora não seja provável que seja necessário
nos dias de hoje, você também pode exportar dados de tabelas do Access para esses formatos legados.
E finalmente, os novos formatos HTML e XML são suportados, mas não muito bem. Estes importação e
tipos de exportação ainda tem pouca utilidade para importar dados em tabelas do Access, ou porque eles simplesmente
não funcionam ou porque eles não são realmente relevantes. Felizmente, esses formatos de arquivo será melhor sup-
portado para acesso importação e exportação em futuras versões do Office.
NOTA NOTA
350
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
15_047026 ch10.qxp 02\/04\/07 21:52 página 350
F
ou muito tempo — realmente, desde o Office 97, quando foi introduzido o Outlook
— Eu queria escrever código VBA para sincronizar contatos de acesso
com contatos do Outlook. Meu contatos são armazenados em um conjunto de acesso ligados
tabelas, com empresas ligadas a contatos e contatos ligados aos endereços,
números de telefone e identificações de vários tipos, que permite a máxima flexibilidade
para entrada de dados e, ao mesmo tempo evita a necessidade de inserir os mesmos dados
em vários 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 número limitado de campos para
endereços, números de telefone e IDs.
Embora não seja difícil escrever código 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 são um conjunto de tabelas vinculadas, como deveriam ser, a tarefa é
muito mais difícil, mas não impossível. Vinculação ao vivo está fora o ques-
ção, por causa da diferença 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 intermediária preenchido com dados do acesso vinculado
tabelas. Este capítulo descreve a técnica que eu uso para desnormalizar primeiro acesso
dados para comparação 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 seção \"Trabalhando com contatos do Outlook\"
Capítulo 8 para obter informações sobre o intercâmbio de dados entre um
tabela de contatos de acesso única e contatos do Outlook.
REFERÊNCIA CRUZADA REFERÊNCIA CRUZADA
351
NESTE CAPÍTULO
Atualização 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 página 351
Criando uma tabela desnormalizada de
um conjunto de tabelas vinculadas
Há situações onde você precisa criar uma única tabela preenchida com dados de um conjunto de vinculado
Tabelas do Access (desnormalizar as tabelas). Uma tal situação é a preparação de um arquivo de dados para
importar um mainframe, ou um banco de dados legado ou aplicativo de planilha eletrônica; outra é para uso em
Acessar o código do VBA ou por uma consulta.
Denomina-se o processo de criação de uma única tabela de arquivo simples de dados em um conjunto de tabelas vinculadas
desnormalização; 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 várias tabelas (este é um problema agora do que com versões 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 técnicas que eu uso no presente capítulo 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 capítulo é Contacts.accdb de sincronização.
No acesso, meus dados de contato são armazenados em um conjunto de tabelas vinculadas, conforme as relações
diagrama (Figura 11.1).
As tabelas são normalizadas, o que significa que eles são projetados para que os dados de um determinado tipo
armazenados em uma única tabela, e apenas os campos de identificação ligando têm valores correspondentes. O tblCompanyInfo
tabela é um-para-muitos vinculado com duas tabelas: tblCompanyIDsPhones e tblContactInfo, porque um
empresa pode ter vários números de telefone e IDs e também vários contatos. tblContactInfo é
também ligada a um-para-muitos com duas tabelas: tblContactIDsPhones, contendo números de telefone e
Identificações para contatos e tblContactAddresses, que contém endereços.
NOTA NOTA
NOTA NOTA
352
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
16_047026 ch11.qxp 02\/04\/07 21:52 página 352
FIGURA 11.1
O diagrama de relacionamentos do banco de dados de sincronização de contatos.
Porque o Outlook só suporta um número fixo de endereços e e-mails (três de cada) e um
maior (17) mas ainda fixa o número de números de telefone, para fins de sincronização de dados de contato
entre o Outlook e acesso, serão apenas os endereços de correspondência, e-mails e números de telefone
sincronizado. Na prática, isso não é susceptível de deixar muito dados sincronizados, exceto no caso
números de telefone.
Para obter melhores resultados quando a sincronização de dados, ao entrar um número de telefone ou ID em um
de subformulários no frmContactInfo, selecione dentre as seleções padrão para endereços,
e-mails e números de telefone na lista suspensa; eles são as únicas seleções que synchro-
galvanizado com itens de contato do Outlook.
A Figura 11.2 mostra um número de telefone selecionado no formulário de informações de contato (frmContactInfo).
DICA DICA
353
Sincronizando contatos do Outlook e acesso
11
16_047026 ch11.qxp 02\/04\/07 21:52 página 353
FIGURA 11.2
Selecionando um tipo de número de telefone do padrão do formulário de informações de contato.
É claro, às vezes precisará inserir números de telefone que não estão nesta lista de padrão
opções de números de telefone (como mostrado na Figura 11.4 número da linha de colheita de café); É possível
Insira um telefone personalizado ou descrição ID manualmente conforme necessário, mas esses números de telefone e IDs
não vai ser sincronizado com o Outlook.
354
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
16_047026 ch11.qxp 02\/04\/07 21:52 página 354
Figura 11.3 mostra o guia de endereços de contato de forma a obter informações de contato; a menos que você precise
inserir dados para pessoas muito ricas que têm mais de três endereços, as três opções padrão
deve ser o suficiente.
FIGURA 11.3
Selecionando um tipo de endereço para um novo endereço de contato.
A empresa e informações de contato (frmCompanyInfo) formam a empresa exibe e contato
informações para que você facilmente pode igualar-se contatos com suas empresas. Figura 11.4 mostra o
Guia de informações, desta forma, com um subformulário empresa IDs e telefones da empresa.
355
Sincronizando contatos do Outlook e acesso
11
16_047026 ch11.qxp 02\/04\/07 21:52 página 355
FIGURA 11.4
A guia de informação da empresa da forma empresa e informações de contato.
Figura 11.5 mostra a guia informações de contato, com um subformulário IDs de contato e telefones.
356
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
16_047026 ch11.qxp 02\/04\/07 21:52 página 356
FIGURA 11.5
Guia informações de contato da empresa e informações de contato de forma.
Menu principal da amostra do banco de dados (mostrado na Figura 11.6) tem um botão de comando para selecionar o
Caminho da pasta de anexos; seu procedimento de evento usa a mesma técnica quanto ao comando semelhante mas-
toneladas nos capítulos anteriores, abrindo uma caixa de diálogo selecionador de pasta Office para que você selecione uma pasta. No presente
Capítulo 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 página 357
FIGURA 11.6
O menu principal do banco de dados sincronização de contatos.
O código para o botão do caminho da pasta de anexos (listado em seguida) inicia, aparecendo um selecionador de pasta
na caixa de diálogo para selecionar a pasta onde são armazenados os arquivos a serem usados como anexos. O caminho selecionado é
salvo para a caixa de texto sob o botão de comando:
Private Sub cmdAttachmentsFolderPath_Click()
No erro GoTo ErrorHandler
Crie um objeto FileDialog como uma caixa de diálogo 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 código VBA para trocar dados entre os componentes do Office
Parte II
16_047026 ch11.qxp 02\/04\/07 21:52 página 358
Se for.Mostrar = -1 então
txt.Valor = CStr (fd.SelectedItems.Item(1))
Outra coisa
Debug. Print \"usuário pressionado cancelar\"
End If
Terminar com
Em erro continuar próximo
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 combinação do formulário selecione no menu principal (Figura 11.7) permite-lhe seleccionar três formas, duas das
que comparar dados do Access e Outlook. Dentre as formas de comparação de dados é classificada por contato
ID e o outro pelo nome do contato (classificação por nome é útil para correspondência Access e Outlook
contatos quando o contato do Outlook não tem um valor na propriedade CustomerID).
Itens de contato do Outlook tem um número de internos muito útil campos de ID, que para alguns
razão inexplicável não são exibidos no item padrão 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 número de Segurança Social (para os Estados Unidos) ou o ID de governo equivalente
número de outros países. Há também outro campo útil para armazenar um ID empresa:
OrganizationalIDNumber, correspondente a CompanyID em tblCompanyInfo.
Para testar a sincronização de dados de contactos, faça uma nova pasta de contatos e copiar alguns (ou todos)
contactos-lo da pasta de contactos regular; dessa forma, você pode experimentar
com fazer várias mudanças sem bagunçar 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 página 359
FIGURA 11.7
Selecionar uma forma de comparação 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 comparação.
Você receberá várias outras mensagens como as tabelas de dados do Access e Outlook são criadas, incluindo
uma caixa de diálogo 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 diálogo é mostrada na Figura 11.9.
360
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
16_047026 ch11.qxp 02\/04\/07 21:52 página 360
FIGURA 11.9
Uma caixa de diálogo Selecionar pasta de Outlook para selecionar a pasta de contatos para a sincronização.
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 serão 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:
Função pública 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 variável para a pasta de contatos para usar durante a sincronização:
Use as seguintes linhas para importar a pasta de contatos padrão 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 página 361
Use a seção de código a seguir para permitir a seleção de uma pasta de contatos personalizada da pasta
Caixa de diálogo selecionador.
SelectContactFolder:
Definir fldContacts = nms.PickFolder
Se fldContacts não é nada então
strTitle = \"Selecionar pasta\"
strPrompt = \"Por favor, selecione uma pasta de contatos\"
MsgBox strPrompt, vbExclamation + vbOKOnly, strTitle
GoTo SelectContactFolder
End If
Debug. Print \"padrão 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 através de contatos na pasta contatos selecionada e importá-los para a tabela de acesso, configuração
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![CódigoDoCliente] = Nz (.CustomerID)
rstTarget![Título] = Nz (.Título)
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 código VBA para trocar dados entre os componentes do Office
Parte II
16_047026 ch11.qxp 02\/04\/07 21:52 página 362
rstTarget![BusinessAddressStreet] = _
Nova Zelândia (.BusinessAddressStreet)
rstTarget![BusinessAddressPostOfficeBox] = _
Nova Zelândia (.BusinessAddressPostOfficeBox)
rstTarget![BusinessAddressCity] = _
Nova Zelândia (.BusinessAddressCity)
rstTarget![BusinessAddressState] = _
Nova Zelândia (.BusinessAddressState)
rstTarget![BusinessAddressPostalCode] = _
Nova Zelândia (.BusinessAddressPostalCode)
rstTarget![BusinessAddressCountry] = _
Nova Zelândia (.BusinessAddressCountry)
rstTarget![BusinessHomePage] = _
Nova Zelândia (.BusinessHomePage)
rstTarget![SiteFTP] = Nz (.SiteFTP)
rstTarget![HomeAddressStreet] = _
Nova Zelândia (.HomeAddressStreet)
rstTarget![HomeAddressPostOfficeBox] = _
Nova Zelândia (.HomeAddressPostOfficeBox)
rstTarget![HomeAddressCity] = _
Nova Zelândia (.HomeAddressCity)
rstTarget![HomeAddressState] = _
Nova Zelândia (.HomeAddressState)
rstTarget![HomeAddressPostalCode] = _
Nova Zelândia (.HomeAddressPostalCode)
rstTarget![HomeAddressCountry] = _
Nova Zelândia (.HomeAddressCountry)
rstTarget![OtherAddressStreet] = _
Nova Zelândia (.OtherAddressStreet)
rstTarget![OtherAddressPostOfficeBox] = _
Nova Zelândia (.OtherAddressPostOfficeBox)
rstTarget![OtherAddressCity] = _
Nova Zelândia (.OtherAddressCity)
rstTarget![OtherAddressState] = _
Nova Zelândia (.OtherAddressState)
rstTarget![OtherAddressPostalCode] = _
Nova Zelândia (.OtherAddressPostalCode)
rstTarget![OtherAddressCountry] = _
Nova Zelândia (.OtherAddressCountry)
rstTarget![AssistantTelephoneNumber] = _
Nova Zelândia (.AssistantTelephoneNumber)
rstTarget![BusinessFaxNumber] = _
Nova Zelândia (.BusinessFaxNumber)
rstTarget![BusinessTelephoneNumber] = _
Nova Zelândia (.BusinessTelephoneNumber)
rstTarget![Business2TelephoneNumber] = _
Nova Zelândia (.Business2TelephoneNumber)
rstTarget![CallbackTelephoneNumber] = _
Nova Zelândia (.CallbackTelephoneNumber)
rstTarget![CarTelephoneNumber] = _
Nova Zelândia (.CarTelephoneNumber)
363
Sincronizando contatos do Outlook e acesso
11
16_047026 ch11.qxp 02\/04\/07 21:52 página 363
rstTarget![CompanyMainTelephoneNumber] = _
Nova Zelândia (.CompanyMainTelephoneNumber)
rstTarget![HomeFaxNumber] = _
Nova Zelândia (.HomeFaxNumber)
rstTarget![HomeTelephoneNumber] = _
Nova Zelândia (.HomeTelephoneNumber)
rstTarget![Home2TelephoneNumber] = _
Nova Zelândia (.Home2TelephoneNumber)
rstTarget![ISDNNumber] = Nz (.ISDNNumber)
rstTarget![MobileTelephoneNumber] = _
Nova Zelândia (.MobileTelephoneNumber)
rstTarget![OtherFaxNumber] = _
Nova Zelândia (.OtherFaxNumber)
rstTarget![OtherTelephoneNumber] = _
Nova Zelândia (.OtherTelephoneNumber)
rstTarget![PagerNumber] = Nz (.PagerNumber)
rstTarget![PrimaryTelephoneNumber] = _
Nova Zelândia (.PrimaryTelephoneNumber)
rstTarget![RadioTelephoneNumber] = _
Nova Zelândia (.RadioTelephoneNumber)
rstTarget![TTYTDDTelephoneNumber] = _
Nova Zelândia (.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.Aniversário <>#1\/1\/4501 #, em seguida,
rstTarget![Aniversário] =.Aniversário
End If
Se for.Aniversário <>#1\/1\/4501 #, em seguida,
rstTarget![Aniversário] =.Aniversário
End If
Se for.LastModificationTime <>#1\/1\/4501 #, em seguida,
rstTarget![LastUpdated] = _
.LastModificationTime
End If
rstTarget![Categorias] = Nz (.Categorias)
rstTarget![Crianças] = Nz (.Crianças)
rstTarget![PersonalHomePage] = _
Nova Zelândia (.PersonalHomePage)
rstTarget![Email1Address] = Nz (.Email1Address)
rstTarget![Email1DisplayName] = _
Nova Zelândia (.Email1DisplayName)
rstTarget![Email2Address] = Nz (.Email2Address)
rstTarget![Email2DisplayName] = _
Nova Zelândia (.Email2DisplayName)
rstTarget![Email3Address] = Nz (.Email3Address)
rstTarget![Email3DisplayName] = _
364
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
16_047026 ch11.qxp 02\/04\/07 21:52 página 364
Nova Zelândia (.Email3DisplayName)
rstTarget![GovernmentIDNumber] = _
Nova Zelândia (.GovernmentIDNumber)
rstTarget![Hobby] = Nz (.Hobby)
rstTarget![ManagerName] = Nz (.ManagerName)
rstTarget![OrganizationalIDNumber] = _
Nova Zelândia (.OrganizationalIDNumber)
rstTarget![Profissão] = Nz (.Profissão)
rstTarget![Cônjuge] = Nz (.Cônjuge)
rstTarget![Página Web] = Nz (.Página da Web)
rstTarget![IMAddress] = Nz (.IMAddress)
Use um tratamento especial para anexos, chamar outro procedimento:
Se for.Attachments.Count > 0 então
Definir rstTargetAttachments = _
rstTarget![Anexos].Valor
Chamar CopyOutlookAttsToAccess (con _
rstTargetAttachments)
End If
rstTarget.Update
.Fechar (olSave)
Terminar com
End If
Itm próximo
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:
' Não está executando o outlook; Abra o Outlook com CreateObject
Se Err. Number = 429 então
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 página 365
Se você sempre sincronizar seus contatos de acesso para a mesma pasta do Outlook, você pode
Comente o
SelectContactFolder
segmento de código e inserir um disco rígido-codificado
caminho da pasta em vez disso; Se você quiser usar a pasta de contatos padrão local, basta remover o apóstrofo
na linha de
' Definir fldContacts = nms.GetDefaultFolder(olFolderContacts)
e qualquer
Comente ou excluir o
SelectContactFolder
segmento de código.
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:
Função pública 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. Informações
desta tabela é escrito para correspondência de campos na tabela de destino, com tratamento especial para anexar-
mentos (consulte a seção sobre anexos para obter mais informações sobre esse tópico):
Definir rstSource = dbs.OpenRecordset (strQueryContacts _
dbOpenDynaset)
Definir rstTarget = dbs.OpenRecordset (strTable _
dbOpenDynaset)
Fazer enquanto não rstSource.EOF
Criar um registro na tabela de destino, por contacto e escrever a empresa e entre em contato com dados também
Crie um registro na tabela de correspondência por contacto, para uso em comparar os contatos:
DICA DICA
366
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
16_047026 ch11.qxp 02\/04\/07 21:52 página 366
rstTarget.AddNew
rstTarget![CódigoDoCliente] = Nz (rstSource!CustomerID)
strTargetCustomerID = rstTarget![CódigoDoCliente]
rstTarget![CompanyName] = _
NZ (rstSource!CompanyName)
rstTarget![Conta] = Nz (rstSource!Conta)
rstTarget![Categorias] = Nz (rstSource!Categorias)
rstTarget![OrganizationalIDNumber] = _
NZ (rstSource!OrganizationalIDNumber)
rstTarget![Página Web] = Nz (rstSource!Página da Web)
rstTarget![SiteFTP] = Nz (rstSource!SiteFTP)
rstTarget![Título] = Nz (rstSource!Título)
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![Aniversário] = Nz (rstSource!Aniversário)
rstTarget![Aniversário] = Nz (rstSource!Aniversário)
rstTarget![Crianças] = Nz (rstSource!Crianças)
rstTarget![GovernmentIDNumber] = _
NZ (rstSource!GovernmentIDNumber)
rstTarget![Hobby] = Nz (rstSource!Hobby)
rstTarget![ManagerName] = Nz (rstSource!ManagerName)
rstTarget![Profissão] = Nz (rstSource!Profissão)
rstTarget![Cônjuge] = Nz (rstSource!Cônjuge)
Use um tratamento especial para anexos, chamar outro procedimento:
Definir rstSourceAttachments = _
rstSource![Anexos].Valor
Se rstSourceAttachments.RecordCount > 0 então
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 página 367
O próximo 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 número de telefone no tblContactIDsPhones em um valor a ser gravada
tblAccessContacts.
Cada calculado campo retorna um valor para um número de telefone ou ID dentre o padrão de correspondência
Telefone do Outlook e ID seleções; uma parte do código que funciona com essa consulta está listada abaixo:
Definir rstSource = dbs.OpenRecordset (strQueryContactIDs _
dbOpenDynaset)
Fazer enquanto não rstSource.EOF
Procurar destino registro e atualizar os campos ID de contato e telefone:
strTargetCustomerID = rstSource![CódigoDoCliente]
strSearch = \"[CódigoDoCliente] =\"
& strTargetCustomerID & Chr$(39)
Descomente a linha seguinte para inspecionar a seqüência de caracteres de pesquisa na janela Verificação 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 código VBA para trocar dados entre os componentes do Office
Parte II
16_047026 ch11.qxp 02\/04\/07 21:52 página 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 página 369
NextSourceRecord1:
rstSource.MoveNext
Loop
rstSource.Close
Telefones de empresa e IDs são tratados da mesma forma; é apenas um valor possível (telefone de empresa) syn-
chronized, porque esse é o único que corresponde a um campo no Outlook:
Definir rstSource = dbs.OpenRecordset (strQueryCompanyIDs _
dbOpenDynaset)
Fazer enquanto não rstSource.EOF
Procurar destino registro e atualizar o campo telefone da empresa.
strTargetCustomerID = rstSource![CódigoDoCliente]
strSearch = \"[CódigoDoCliente] =\"
& 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, endereços de contato estão em tratamento, usando uma consulta que converte cada campo de endereço para o
adequado campo de endereço comercial, casa ou outros na tabela de destino. Figura 11.11 mostra um dos
os campos calculados nesta consulta.
370
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
16_047026 ch11.qxp 02\/04\/07 21:52 página 370
FIGURA 11.11
Um campo calculado consulta que converte StreetAddress para BusinessAddressStreet.
O conjunto de registros de rstSource é então selecionado, baseado em uma consulta que seleciona entre em contato endereços; o código parece
para um registro de destino correspondente, e se ele for encontrado, ele é atualizado com informações do conjunto de registros:
Definir rstSource = _
DBS.OpenRecordset (strQueryContactAddresses _
dbOpenDynaset)
Fazer enquanto não rstSource.EOF
strTargetCustomerID = rstSource![CódigoDoCliente]
strSearch = \"[CódigoDoCliente] =\"
& 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 página 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 código VBA para trocar dados entre os componentes do Office
Parte II
16_047026 ch11.qxp 02\/04\/07 21:52 página 372
As duas tabelas (tblOutlookContacts e tblAccessContacts) têm correspondência de campos; elas são exibidas
em subformulários sobre as duas formas usadas para comparar o Access e o Outlook dados de contato. Figura 11.12
mostra o formulário 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 formulário 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 página 373
FIGURA 11.13
Um formulário que compara os contatos do Outlook e acesso por nome.
Copiando dados de contato do Access para Outlook
(ou vice-versa)
A caixa de combinação selecione contato no canto superior esquerdo permite que você selecione um contato, classificados por ID de contato.
Figura 11.14 mostra a caixa de combinação com a sua lista, caiu para baixo.
Caixa de combinação selecione a ação no lado direito do cabeçalho do formulário mostrado na Figura 11.11
oferece um conjunto diferente de opções, dependendo se os contatos do Outlook e acesso são identi-
cal, diferente, ou um está faltando, como mostrado na tabela 11.1.
374
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
16_047026 ch11.qxp 02\/04\/07 21:52 página 374
FIGURA 11.14
Selecionando um contato por contato ID.
TABELA 11.1
Entre em contato com Status de partida e ações para selecionar
Entre em contato com a Status Ações disponíveis
Contatos do Outlook e acesso são idênticos Ir para em seguida entrar em contato com a record
Contato de marca para exclusão
Copie todos os contatos do Access para Outlook
Copie todos os contatos do Outlook para acesso
Contatos do Outlook e acesso são 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 exclusão
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 exclusão
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 exclusão
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 página 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 combinação no centro da seção copiar dados de campo da
formulário, conforme mostrado na Figura 11.15, onde o valor \"Vice-presidente\" no registro de contato de acesso é
sendo substituído por \"vice-presidente sênior\" no registro do Outlook. Você também pode digitar novos dados,
ou editar os dados existentes, conforme necessário, 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 exclusão\" e ele serão excluídos
Quando os contatos estão atualizados. Quando tiver terminado a cópia, edição e marcação registros para
exclusão, o botão de \"Atualizar informações 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 necessário. 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 código VBA para trocar dados entre os componentes do Office
Parte II
16_047026 ch11.qxp 02\/04\/07 21:52 página 376
Você pode usar as seguintes linhas para exportar para a pasta de contatos padrão local ou um disco rígido-codificado
pasta de sua escolha. Para usar a pasta de contatos padrão, basta remover o apóstrofo no início-
Ning da próxima linha (isto é chamado eliminar o comentário uma linha de código, porque o apóstrofo na frente do
a linha transforma-lo em um comentário); para usar uma pasta personalizada embutido, digite seu nome.
' Definir fldContacts = nms.GetDefaultFolder(olFolderContacts)
' GoTo UpdateContacts
Use a seção de código a seguir para permitir a seleção de uma pasta de contatos personalizada da pasta
Caixa de diálogo selecionador:
SelectContactFolder:
Em erro continuar próximo
Definir fldContacts = nms.PickFolder
Se fldContacts não é nada então
strTitle = \"Selecionar pasta\"
strPrompt = \"Por favor, selecione uma pasta de contatos\"
MsgBox strPrompt, vbExclamation + vbOKOnly, strTitle
GoTo SelectContactFolder
End If
Debug. Print \"padrão item tipo:\" _
& fldContacts.DefaultItemType
Se fldContacts.DefaultItemType olContactItem de <>, em seguida,
MsgBox strPrompt, vbExclamation + vbOKOnly _
strTitle
GoTo SelectContactFolder
End If
UpdateContacts:
Fazer enquanto não rstSource.EOF
Procurar cada contato na pasta contatos selecionada no caso ele já existe e definir uma referência a ele,
Pesquisar primeiro por CustomerID e, em seguida, por nome e sobrenome (contatos do Outlook podem não ter um
valor da propriedade de CustomerID):
strCustomerID = Nz (rstSource! [CustomerID])
strSearch = \"[CódigoDoCliente] =\"
& 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 página 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 subformulário Outlook:
No erro GoTo ErrorHandler
con.CustomerID = Nz (rstSource! [CustomerID])
con.Título = Nz (rstSource! [Título])
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 código VBA para trocar dados entre os componentes do Office
Parte II
16_047026 ch11.qxp 02\/04\/07 21:52 página 378
con.CompanyName = Nz (rstSource! [CompanyName])
con.Departamento = Nz (rstSource! [Departamento])
con.JobTitle = Nz (rstSource! [JobTitle])
con.BusinessAddressStreet = _
Nova Zelândia (rstSource! [BusinessAddressStreet])
con.BusinessAddressPostOfficeBox = _
Nova Zelândia (rstSource! [BusinessAddressPostOfficeBox])
con.BusinessAddressCity = _
Nova Zelândia (rstSource! [BusinessAddressCity])
con.BusinessAddressState = _
Nova Zelândia (rstSource! [BusinessAddressState])
con.BusinessAddressPostalCode = _
Nova Zelândia (rstSource! [BusinessAddressPostalCode])
con.BusinessAddressCountry = _
Nova Zelândia (rstSource! [BusinessAddressCountry])
con.BusinessHomePage = _
Nova Zelândia (rstSource! [BusinessHomePage])
con.SiteFTP = Nz (rstSource! [SiteFTP])
con.HomeAddressStreet = _
Nova Zelândia (rstSource! [HomeAddressStreet])
con.HomeAddressPostOfficeBox = _
Nova Zelândia (rstSource! [HomeAddressPostOfficeBox])
con.HomeAddressCity = _
Nova Zelândia (rstSource! [HomeAddressCity])
con.HomeAddressState = _
Nova Zelândia (rstSource! [HomeAddressState])
con.HomeAddressPostalCode = _
Nova Zelândia (rstSource! [HomeAddressPostalCode])
con.HomeAddressCountry = _
Nova Zelândia (rstSource! [HomeAddressCountry])
con.OtherAddressStreet = _
Nova Zelândia (rstSource! [OtherAddressStreet])
con.OtherAddressPostOfficeBox = _
Nova Zelândia (rstSource! [OtherAddressPostOfficeBox])
con.OtherAddressCity = _
Nova Zelândia (rstSource! [OtherAddressCity])
con.OtherAddressState = _
Nova Zelândia (rstSource! [OtherAddressState])
con.OtherAddressPostalCode = _
Nova Zelândia (rstSource! [OtherAddressPostalCode])
con.OtherAddressCountry = _
Nova Zelândia (rstSource! [OtherAddressCountry])
con.AssistantTelephoneNumber = _
Nova Zelândia (rstSource! [AssistantTelephoneNumber])
con.BusinessFaxNumber = _
Nova Zelândia (rstSource! [BusinessFaxNumber])
con.BusinessTelephoneNumber = _
Nova Zelândia (rstSource! [BusinessTelephoneNumber])
con.Business2TelephoneNumber = _
Nova Zelândia (rstSource! [Business2TelephoneNumber])
379
Sincronizando contatos do Outlook e acesso
11
16_047026 ch11.qxp 02\/04\/07 21:52 página 379
con.CallbackTelephoneNumber = _
Nova Zelândia (rstSource! [CallbackTelephoneNumber])
con.CarTelephoneNumber = _
Nova Zelândia (rstSource! [CarTelephoneNumber])
con.CompanyMainTelephoneNumber = _
Nova Zelândia (rstSource! [CompanyMainTelephoneNumber])
con.HomeFaxNumber = Nz (rstSource! [HomeFaxNumber])
con.HomeTelephoneNumber = _
Nova Zelândia (rstSource! [HomeTelephoneNumber])
con.Home2TelephoneNumber = _
Nova Zelândia (rstSource! [Home2TelephoneNumber])
con.ISDNNumber = Nz (rstSource! [ISDNNumber])
con.MobileTelephoneNumber = _
Nova Zelândia (rstSource! [MobileTelephoneNumber])
con.OtherFaxNumber = Nz (rstSource! [OtherFaxNumber])
con.OtherTelephoneNumber = _
Nova Zelândia (rstSource! [OtherTelephoneNumber])
con.PagerNumber = Nz (rstSource! [PagerNumber])
con.PrimaryTelephoneNumber = _
Nova Zelândia (rstSource! [PrimaryTelephoneNumber])
con.RadioTelephoneNumber = _
Nova Zelândia (rstSource! [RadioTelephoneNumber])
con.TTYTDDTelephoneNumber = _
Nova Zelândia (rstSource! [TTYTDDTelephoneNumber])
con.TelexNumber = Nz (rstSource! [TelexNumber])
con.Conta = Nz (rstSource! [Conta])
con.AssistantName = Nz (rstSource! [AssistantName])
con.Categorias = Nz (rstSource! [Categorias])
con.Crianças = Nz (rstSource! [Crianças])
con.PersonalHomePage = _
Nova Zelândia (rstSource! [PersonalHomePage])
con.Email1Address = Nz (rstSource! [Email1Address])
con.Email1DisplayName = _
Nova Zelândia (rstSource! [Email1DisplayName])
con.Email2Address = Nz (rstSource! [Email2Address])
con.Email2DisplayName = _
Nova Zelândia (rstSource! [Email2DisplayName])
con.Email3Address = Nz (rstSource! [Email3Address])
con.Email3DisplayName = _
Nova Zelândia (rstSource! [Email3DisplayName])
con.GovernmentIDNumber = _
Nova Zelândia (rstSource! [GovernmentIDNumber])
con.Passatempo = Nz (rstSource! [Passatempo])
con.ManagerName = Nz (rstSource! [ManagerName])
con.OrganizationalIDNumber = _
Nova Zelândia (rstSource! [OrganizationalIDNumber])
con.Profissão = Nz (rstSource! [Profissão])
con.Cônjuge = Nz (rstSource! [Cônjuge])
con.Web page = Nz (rstSource! [Web page])
con.IMAddress = Nz (rstSource! [IMAddress])
380
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
16_047026 ch11.qxp 02\/04\/07 21:52 página 380
Use a manipulação de data especial (uma data em branco no Outlook é realmente uma data de 1\/1\/4501):
Se Nz (rstSource! [Aniversário]) <>\"\" então
con.Aniversário = Nz (rstSource! [Aniversário])
Outra coisa
con.Aniversário = #1\/1\/4501 #
End If
Se Nz (rstSource! [Aniversário]) <>\"\" então
con.Aniversário = Nz (rstSource! [Aniversário])
Outra coisa
con.Aniversário = #1\/1\/4501 #
End If
Use um tratamento especial para anexos, chamar outro procedimento:
Definir rstSourceAttachments = _
rstSource![Anexos].Valor
Se rstSourceAttachments.RecordCount > 0 então
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:
' Não está executando o outlook; Abra o Outlook com CreateObject
Se Err. Number = 429 então
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 página 381
& “; Description: “ & Err.Description
Resume ErrorHandlerExit
End If
End Sub
O UpdateAllAccessContacts procedimento tem a tarefa mais complexa da cópia 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 necessário:
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 não rstSource.EOF
Debug. Print \"ID de destino de processamento:\" _
& rstSource![TargetID]
Procure o registro da empresa na tabela de destino de correspondência e atualizá-lo se encontrado; caso contrário, 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 exclusão de registros em uma tabela no lado \"um\" de uma relação um-para-muitos,
antes de atualizar as tabelas, o procedimento é executado que três excluir consultas para excluir registros ligados ao con-
Tatos marcados para exclusão:
382
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
16_047026 ch11.qxp 02\/04\/07 21:52 página 382
Em erro continuar próximo
DoCmd.SetWarnings False
DoCmd.OpenQuery \"qdelContactIDs\"
DoCmd.OpenQuery \"qdelContactAddresses\"
DoCmd.OpenQuery \"qdelContacts\"
GoTo NextSourceRecord
End If
Em seguida, os registros em tblCompanyInfo são atualizados conforme necessário:
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!Página da Web)
rstTarget![SiteFTP] = Nz (rstSource!SiteFTP)
rstTarget![LastUpdated] = agora
rstTarget.Update
rstTarget.Close
Em seguida, os registros em tblContactInfo são atualizados conforme necessário:
UpdateContactInfo:
Procure o registro de contato na tabela de destino de correspondência e atualizá-lo se encontrado; caso contrário, 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![CódigoDoCliente]
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 página 383
Crie um novo contato registro na tabela de destino.
rstTarget.AddNew
rstTarget![CódigoDoCliente] = strCustomerID
rstTarget![ContactID] = CLng(strCustomerID)
Outra coisa
rstTarget.Edit
End If
rstTarget![Prefixo] = Nz (rstSource!Título)
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![Aniversário] = Nz (rstSource!Aniversário)
rstTarget![Aniversário] = Nz (rstSource!Aniversário)
rstTarget![Crianças] = Nz (rstSource!Crianças)
rstTarget![GovernmentID] = _
NZ (rstSource!GovernmentIDNumber)
rstTarget![Hobby] = Nz (rstSource!Hobby)
rstTarget![ManagerName] = _
NZ (rstSource!ManagerName)
rstTarget![Profissão] = Nz (rstSource!Profissão)
rstTarget![Cônjuge] = Nz (rstSource!Cônjuge)
rstTarget![LastUpdated] = agora
Tratamento especial para anexos.
Definir rstSourceAttachments = _
rstSource![Anexos].Valor
Se rstSourceAttachments.RecordCount > 0 então
Definir rstTargetAttachments = _
rstTarget![Anexos].Valor
Chamar CopyAccessAttsToAccess (rstSourceAttachments _
rstTargetAttachments)
Outra coisa
rstSourceAttachments.Close
End If
rstTarget.Update
rstTarget.Close
UpdateContactAddresses:
384
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
16_047026 ch11.qxp 02\/04\/07 21:52 página 384
Para atualizar os dados em tblContactAddresses, se houver dados em qualquer um dos campos de endereço de negócios, o
strAddressType variável é definida para o negócio, e o código procura correspondentes registros no
tblContactAddresses. Se nenhum for encontrado, é criado um novo registro de endereço; se um registro for encontrado, seu
campos são atualizados de campos apropriados na tblAccessContacts. A casa e o outro endereço
campos são tratados da mesma forma:
strTarget = \"tblContactAddresses\"
Definir rstTarget = dbs.OpenRecordset (strTarget _
dbOpenDynaset)
Atualize informações de endereço de negócios.
Se Nz (rstSource!BusinessAddressStreet) <>\"\" ou _
NZ (rstSource!BusinessAddressPostOfficeBox) <>\"\" _
Ou Nz (rstSource!BusinessAddressCity) <>\"\" _
Ou Nz (rstSource!BusinessAddressState) <>\"\" _
Ou Nz (rstSource!BusinessAddressPostalCode) <>\"\" _
Ou Nz (rstSource!BusinessAddressCountry) <>\"\" então
strAddressType = \"Negócio\"
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 endereço 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![País] = _
NZ (rstSource!BusinessAddressCountry)
rstTarget.Update
End If
385
Sincronizando contatos do Outlook e acesso
11
16_047026 ch11.qxp 02\/04\/07 21:52 página 385
Informação de endereço de casa de atualização.
Se Nz (rstSource!HomeAddressStreet) <>\"\" _
Ou Nz (rstSource!HomeAddressPostOfficeBox) <>\"\" _
Ou Nz (rstSource!HomeAddressCity) <>\"\" _
Ou Nz (rstSource!HomeAddressState) <>\"\" _
Ou Nz (rstSource!HomeAddressPostalCode) <>\"\" _
Ou Nz (rstSource!HomeAddressCountry) <>\"\" então
strAddressType = \"Página 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 endereço 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![País] = _
NZ (rstSource!HomeAddressCountry)
rstTarget.Update
End If
Atualize outras informações de endereço.
Se Nz (rstSource!OtherAddressStreet) <>\"\" _
Ou Nz (rstSource!OtherAddressPostOfficeBox) <>\"\" _
Ou Nz (rstSource!OtherAddressCity) <>\"\" _
Ou Nz (rstSource!OtherAddressState) <>\"\" _
Ou Nz (rstSource!OtherAddressPostalCode) <>\"\" _
Ou Nz (rstSource!OtherAddressCountry) <>\"\" então
strAddressType = \"Outros\"
386
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
16_047026 ch11.qxp 02\/04\/07 21:52 página 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 endereço 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![País] = _
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 número 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 número 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 página 387
Crie um novo registro de telefone da empresa na tabela de destino.
rstTarget.AddNew
rstTarget![CompanyID] = lngCompanyID
rstTarget![Descrição] = \"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 são atualizados de forma semelhante: primeiro o
código procura um valor em um desses campos, e se ele for encontrado, o strDescription variável
encontra-se com o telefone ou a descrição do ID, e um registro é requerido usando ContactID e strDescription.
Se um registro for encontrado, ele é atualizado; caso contrário, um novo registro é criado em tblContactIDsAndPhones
e o número 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 contrário, 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]) <>\"\" então
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![Descrição] = strDescription
Outra coisa
rstTarget.Edit
End If
rstTarget![IDOrPhone] = _
Nova Zelândia (rstSource! [AssistantTelephoneNumber])
rstTarget.Update
End If
388
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
16_047026 ch11.qxp 02\/04\/07 21:52 página 388
Se Nz (rstSource! [<>Do BusinessFaxNumber]) \"\", em seguida,
strDescription = \"Fax de negócios\"
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![Descrição] = strDescription
Outra coisa
rstTarget.Edit
End If
rstTarget![IDOrPhone] = _
Nova Zelândia (rstSource! [BusinessFaxNumber])
rstTarget.Update
End If
[Eu sou não listar um grande número de segmentos semelhantes, cada uma delas atualiza um telefone diferente
número 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![Descrição] = strDescription
Outra coisa
rstTarget.Edit
End If
rstTarget![IDOrPhone] = _
Nova Zelândia (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 página 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 próximo
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 seleções
na lista da caixa de combinação selecione a ação que vai deixar você fazer isso. A \"cópia todos acessem contatos para
Outlook\"seleção corre o CopyAccessContactsToOutlook procedimento, que primeiro coloca-se um
mensagem de confirmação para assegurar que o usuário quer acabar com os contatos do Outlook existentes, e
substituí-los com contatos copiados do acesso. Se o usuário clica em Sim, o procedimento primeiro chama o
CreateDenormalizedContactsTable procedimento para gravar dados para tblAccessContacts, e
em seguida, executa o código que é semelhante ao código na UpdateAllOutlookContacts procedimento,
exceto que ele ignora a busca e apenas cria todos os novos itens de contactos Outlook.
Da mesma forma, as execuções de seleção \"Copy Outlook contatos todos para acesso\" o CopyAllOutlook
ContactsToAccess procedimento, que pede confirmação, então corre o ImportOutlook
Contatos procedimento para gravar dados de contatos do Outlook para tblOutlookContacts, em seguida, executa o código
que é semelhante ao código aUpdateAllAccessContacts procedimento, exceto que ele não
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 não combinam. Isso ocorre porque o ContactID de campo em
tblContactInfo é um campo AutoNumeração, então ele não pode ser definido como um valor específico. Existem duas maneiras de
lidar com essa discrepância: usar o Compare pelo formulário do nome, se você não se importa se o cliente
ID é o mesmo no Access e no Outlook; ou selecione a seleção de \"Cópia acesso contatos todos para Outlook\"
para salvar o valor de acesso ContactID AutoNumeração volta para os registros correspondentes do Outlook.
NOTA NOTA
390
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
16_047026 ch11.qxp 02\/04\/07 21:52 página 390
Trabalhando com anexos
Outlook teve anexos para muitas versões agora; Access 2007 introduziu os dados do anexo
tipo para tabelas do Access. No Outlook, os acessórios são uma coleção pertencentes a vários tipos de item,
principalmente as mensagens de correio; Acesso 2007 anexos são 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 cópia 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 três subcampos,
que você pode ver no diagrama de relacionamentos (Ver Figura 11.1). O acessório 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 situação com anexos do Outlook é mais simples: você apenas salvar o nome de arquivo do anexo e
caminho para a coleção de anexos de um item, usando o Adicionar método para essa coleção.
Provavelmente, você terá alguns anexos, em contatos do Outlook, ou no acesso entre em contato
registros, para que o meu código de sincronização 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 botão do caminho da pasta de anexos no menu principal, que corre um evento proce-
dure que aparece em uma caixa de diálogo selecionador de pasta. Os procedimentos listados em seguida são chamados de mais tempo
procedimentos que fazem a cópia de dados entre o acesso a dois comparam tabelas, como visto nos dois
entre em contato com formas de comparação, 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 não.EOF
strDocsPath = GetOutputDocsPath
Preciso extrair o nome do arquivo do campo nome do arquivo, usando a função SplitFileName, porque ele
às vezes contém o caminho (às vezes várias 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 página 391
strFile = _
SplitFileName(rstSourceAttachments.Fields(\"FileName\"))
Debug. Print \"nome do arquivo:\"
strFileAndPath = strDocsPath
Debug. Print \"arquivo e o caminho:\"
Em erro continuar próximo
Verifique se esse arquivo já existe na pasta e salve-o para a pasta se não.
Conjunto fil = fso.GetFile(strFileAndPath)
Se o fil é nada então
Salve este anexo para um arquivo na pasta de documentos de saída.
.Fields(\"FileData\").SaveToFile strFileAndPath
Debug. Print \"poupança\"
& “ to “ & strDocsPath & “ folder”
End If
Adicione este acessório para a coleção 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 código VBA para trocar dados entre os componentes do Office
Parte II
16_047026 ch11.qxp 02\/04\/07 21:52 página 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 próximo
Verifique se esse arquivo já existe na pasta e salve-o para a pasta se não
Conjunto fil = fso.GetFile(strFileAndPath)
Se o fil é nada então
Salve este anexo para um arquivo na pasta de documentos de saída.
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)
.Atualização
Terminar com
Matar strFileAndPath
Próxima 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 página 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 não rstSourceAttachments.EOF
Preciso extrair o nome do arquivo do campo nome do arquivo, usando a função SplitFileName, porque ele
às vezes contém o caminho (às vezes várias 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 próximo
Verifique se esse arquivo já existe na pasta e salve-o para a pasta se não.
Conjunto fil = fso.GetFile(strFileAndPath)
Se o fil é nada então
Salve este anexo para um arquivo na pasta de documentos de saída.
rstSourceAttachments.Fields(\"FileData\").SaveToFile _
strFileAndPath
Debug. Print \"poupança\"
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 código VBA para trocar dados entre os componentes do Office
Parte II
16_047026 ch11.qxp 02\/04\/07 21:52 página 394
Loop
rstSourceAttachments.Close
rstTargetAttachments.Close
ErrorHandlerExit:
Exit Sub
ErrorHandler:
Se Err. Number = 3839 então
' O arquivo já existe; excluí-lo
Matar strFileAndPath
Currículo
Outra coisa
MsgBox \"erro nenhum:\"
& “; Description: “ & Err.Description
Resume ErrorHandlerExit
End If
End Sub
SplitFileName(strFileAndPath) de função como String
No erro GoTo ErrorHandler
Dim strFullPath() As String
Dim intUBound As Integer
Extrair o nome da variável 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 acessório 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 página 395
FIGURA 11,16
Um contato do Outlook com um acessório criado a partir de um registro de contato do acesso.
Resumo
As técnicas de sincronização neste capítulo permitirá que você mantenha seus dados de contacto de um conjunto
de tabelas vinculadas do Access, adicionar qualquer número de números de telefone personalizada identificações conforme necessário e syn-
chronize em contato com seus dados de acesso ao Outlook, para que possa trabalhar com as propriedades padrão 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.
Além disso, você pode usar as técnicas de denormalizing e renormalizing que costumava trabalhar com con-
Tatos para qualquer situação que requer a conversão de um conjunto de tabelas vinculadas do Access para uma única tabela de arquivos simples,
ou o contrário — algo que poderá surgir durante a troca de dados com programas antigos ou
bancos de dados do mainframe.
396
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
16_047026 ch11.qxp 02\/04\/07 21:52 página 396
E
arlier capítulos neste livro descreveram como trabalhar com Word, Excel,
e Outlook, usando o código do VBA para criar documentos do Word, Excel trabalho-
folhas e itens do Outlook e encha-os com dados de acesso. Este
capítulo descreve algumas técnicas mais avançadas 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 informações.
Criando a palavra extravagante
Etiquetas de envio
No capítulo 6, você aprendeu como criar etiquetas de endereçamento básicas, com nome e
informações de endereço extraídas de uma tabela ou consulta, usando tanto o TypeText
método ou mala direta. Um nome e o endereço é tudo que você precisa para imprimir um conjunto de
rótulos 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 exigências mais complexas para impressão de etiquetas. Antes de
envio de um produto, talvez também seja necessário verificar o inventário para um prod-
Registe o seu produto, a data em que o produto é necessário e a disponibilidade de transporte sup-
Plies, veículos e pessoal para fazer o transporte.
O banco de dados de amostra para este capítulo é Northwind
Plus.accdb.
Talvez você também precise imprimir mais informações em suas etiquetas de envio em
Além do endereço, como o n º de encomenda, produto n º, nome do produto,
Categoria, o número do processo em uma seqüência de casos, ou outros dados. Para
imprimir etiquetas com informações extras, ou para tomar decisões sobre se um conjunto de
etiquetas devem ser impressas, você mais precisa elaborar o código do VBA.
NOTA NOTA
397
NESTE CAPÍTULO
Criar etiquetas de envio de palavra
com informações sobre
embarques
Criar gráficos dinâmicos do Excel preenchido
com os dados de acesso
Enviando relatórios de acesso de
transporte e reordenação
informações
Indo além
o básico
17_047026 ch12.qxp 02\/04\/07 21:53 página 397
O exemplo de banco de dados do Northwind Plus contém tabelas do banco de dados Northwind. mdb, com sev-
Eral campos extras em algumas tabelas, consultas, (usadas na próxima seção) e três novas formas — dois principais
formas (um para selecionar registros para transporte e outro para reordenação inventário empobrecido) Além de um
formulário suplementar para edição de quantidades de produto.
Ao abrir o Northwind Plus no Vista, você pode receber o alerta de segurança mostrado na Figura 12.1.
Para ativar temporariamente o código do banco de dados, clique no botão \"Permitir conteúdo\" e selecione o
Opção \"Habilitar este conteúdo\" na caixa de diálogo. Para impedir que este alerta de segurança que aparecem a cada vez você
Abra o banco de dados, Cadastre o código VBA com uma assinatura digital, conforme descrito na barra lateral.
FIGURA 12.1
Um alerta de segurança Vista ao abrir um banco de dados com código VBA não assinado.
NOTA NOTA
398
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
Criar uma assinatura Digital de
Assinar seu código 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 página 398
399
Indo além do básico
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 página 399
400
Escrever código 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 botão Office, selecione o comando publicar e, em seguida, o pacote e
Sinal de comando.
8. Selecione o certificado a ser usado na caixa de diálogo Selecionar certificado:
17_047026 ch12.qxp 02\/04\/07 21:53 página 400
anos 60
Indo além do básico
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 segurança de acesso do Microsoft Office
Abre a caixa de diálogo de aviso:
continuou
17_047026 ch12.qxp 02\/04\/07 21:53 página 401
402
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
continuou
11. Você pode clicar em Mostrar detalhes de assinatura para exibir as informações disponíveis sobre o
certificado selecionado:
12. Após clicar no botão de \"Confiar em todos da editora\" sobre a segurança de acesso do Microsoft Office
Caixa de diálogo de aviso, você pode trabalhar em banco de dados.
13. No futuro, se você abrir o arquivo de pacote, você obterá uma caixa de diálogo oferecendo para extrair o banco de dados:
14. Clicar em OK, o banco de dados extraído abre como um banco de dados Access 2007 normal.
17_047026 ch12.qxp 02\/04\/07 21:53 página 402
403
Indo além do básico
12
Figura 12.2 mostra o menu principal da Northwind Plus banco de dados de amostra, com botões para abrir-
ing as duas principais formas e botões para selecionar as pastas de documentos e modelos. A pasta
função de botões de seleção como os controles semelhantes em vários outros capítulos, usando um seletor de pasta
caixa de diálogo 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-
inventário capaz e a data da ordem é necessário, mas no mundo real não são o
apenas os fatores a considerar-se não há pessoas suficientes para fazer o transporte, ou todos os caminhões estão fora
na estrada, não podemos enviar o produto, mesmo se houver suficiente inventário.
Figura 12.3 mostra a forma de seleção de ordem.
NOTA NOTA
17_047026 ch12.qxp 02\/04\/07 21:53 página 403
FIGURA 12.3
O formulário utilizado para fiscalizar ordens e marcando-os para a expedição.
As ordens de selecionar para o envio de formulário (frmSelectOrdersForShipping) é um formulário principal com uma folha de dados
subformulário. Ele é usado para inspecionar as ordens que estão no intervalo de tempo correto para o transporte e marcá-los
para agora o transporte. O formulário principal exibe campos das ordens, e o subformulário de folha de dados listas
os produtos na ordem selecionada. No formulário principal, a caixa de seleção \"Parcial\" navio\"é verificada se a
ordem parcial pode ser enviado, caso haja suficiente inventário para enviar pelo menos um produto sobre o
ordem. A caixa de seleção \"Pronto para enviar\" indica que a ordem está pronta para enviar, tendo em conta
fatores além do estoque disponível.
Para imprimir etiquetas de transporte com informações extras, fiz uma consulta
(qryNorthwindShippingLabels ), com base em qryNorthwindAll (uma consulta que inclui todas as
as Northwind dados tabelas vinculadas), contendo todas as informações para imprimir nas etiquetas. Para além da
o envio de nome e endereço, a consulta também inclui os seguintes campos:
OrderDate
DataDeEntrega (com um critério de > Date) ) E < DateAdd(\"d\",30,Date()) Para
incluir apenas ordens necessárias 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 código VBA para trocar dados entre os componentes do Office
Parte II
17_047026 ch12.qxp 02\/04\/07 21:53 página 404
CategoryName
ReadyToShip, um campo booleano com um critério de Verdadeiro para selecionar as ordens que estão prontas para enviar
O cmdCreateLabels procedimento de evento listado aqui, com explicação 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 além do básico
12
17_047026 ch12.qxp 02\/04\/07 21:53 página 405
Defina a variável de aplicativo do Word:
Set appWord = GetObject (, \"Word. Application\")
appWord.Visible = True
Obter caminhos de modelos do usuário e documentos das seleções do usuário no menu principal, utilizando dois
funções 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 próximo
Procure o modelo na pasta modelos, tentando definir uma variável de arquivo FileSystemObject
para ele:
Conjunto fil = fso.GetFile(strTemplateNameAndPath)
Se o fil é nada então
strPrompt = \"Não pode encontrar\"
& strTemplatePath & “; canceling”
MsgBox strPrompt, vbCritical + vbOKOnly
GoTo ErrorHandlerExit
End If
No erro GoTo ErrorHandler
Calcule o número 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 = \"Não é possível imprimir etiquetas\"
strPrompt não = \"nenhum pedidos selecionados; por favor, marque alguns \"_
& “orders for shipping”
MsgBox strPrompt, vbExclamation + vbOKOnly, strTitle
GoTo ErrorHandlerExit
End If
406
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
17_047026 ch12.qxp 02\/04\/07 21:53 página 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 número 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![CódigoDoPedido]
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 não 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 além do básico
12
17_047026 ch12.qxp 02\/04\/07 21:53 página 407
Para encomendas com ShipPartial desmarcado, não podemos enviar a ordem porque um produto inadequado
inventário:
strTitle = \"Inadequado inventário\"
strPrompt = \"Apenas\"
& “ cases in inventory; can’t fill Order ID “ _
& lngOrderID & “ for “ & strProductName
MsgBox strPrompt, vbExclamation, strTitle
GoTo NextOrder
ElseIf blnShipPartial = True Then
Para encomendas com ShipPartial marcada, não podemos enviar este produto na ordem:
strTitle = \"Inadequado inventário\"
strPrompt = \"Apenas\"
& “ cases in inventory; can’t fill “ _
& strProductName & “ item on “ _
& “Order ID “ & lngOrderID
MsgBox strPrompt, vbExclamation, strTitle
Figura 12.4 mostra uma mensagem típica \"inventário inadequado\" quando não há estoque suficiente
Encha um item de linha de produto em uma ordem com ShipPartial marcada.
FIGURA 12.4
Uma mensagem indicando que não há estoque inadequado para enviar um item de produto em uma ordem.
Confira o próximo produto da ordem de:
GoTo NextProduct
End If
Outra coisa
Há suficiente inventário para enviar este produto; Crie um novo documento de etiquetas para este conjunto de rótulos
com base no modelo:
Conjunto doc = _
appWord.Documents.Add (modelo: = _
strTemplateNameAndPath _
DocumentType: = wdNewBlankDocument, _
Visível: = True)
doc.Ativar
408
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
17_047026 ch12.qxp 02\/04\/07 21:53 página 408
Definir variáveis com informações para imprimir em todos os rótulos por esta ordem:
strCategory = rstOrder![NomeDaCategoria]
strOrderDate = CStr (rstOrder! [DataDoPedido])
strShipName = rstOrder![NomeDoDestinatário]
strShipAddress = rstOrder![ShipAddress]
strShipCityStatePC = rstOrder![ShipCityStatePC]
strShipCountry = rstOrder![PaísDeDestino]
strSupplier = rstOrder![Fornecedor]
strShipDate = Format (data, \"dd-mmm-aaaa\")
Configurar um loop para imprimir um conjunto de etiquetas para este fim, enviado um rótulo por caixa:
Para lngCaseNo = 1 para lngNoCases
Com appWord.Selection
Colocar dados em um rótulo (uma célula 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 configuração de tabulação, para que o endereço fique alinhada com o nome.
Em vez de procurar palavra métodos, propriedades e outros componentes de modelo de objeto de
o pesquisador de objetos, você pode capturar a sintaxe para uma ação de palavra gravando uma macro
em palavra, em seguida, copiando e colando o código do VBA em seu procedimento VBA do Access. Basta inserir o seu
Aplicação da palavra variável onde necessário e guarnição os argumentos que você não precisa preparar o código
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 além do básico
12
17_047026 ch12.qxp 02\/04\/07 21:53 página 409
.Unidade teclaterminar: = wdLine
.Bold = False
.TypeText strShipName
.TypeParagraph
Recuo da margem esquerda para coincidir com a configuração de tabulação, para que o endereço 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 informação 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
Próxima lngCaseNo
Salve o documento de etiquetas do Word para este conjunto de rótulos:
strSaveName = _ \"Transporte rótulos para identificação de ordem\"
& lngOrderID & “ (“ & strProductName _
& “) shipped on “ & strShipDate & “.doc”
410
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
17_047026 ch12.qxp 02\/04\/07 21:53 página 410
strSaveNameAndPath = strDocsPath
Debug. Print \"Salve o nome:\"
Em erro continuar próximo
Verificar a existência de um arquivo com esse nome e se encontrado:
Conjunto fil = fso.GetFile(strSaveNameAndPath)
Fil é nada então se não
Matar strSaveNameAndPath
End If
No erro GoTo ErrorHandler
doc.SaveAs FileName: = strSaveNameAndPath
O medidor de progresso de atualização:
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 \"seqüência 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 \"seqüência 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 \"seqüência SQL:\"
StrSQL DoCmd.RunSQL
411
Indo além do básico
12
17_047026 ch12.qxp 02\/04\/07 21:53 página 411
strTitle = \"Conjunto de rótulos criado.\"
strPrompt = _
_ \"Um conjunto de rótulos 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 rótulos, 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 rótulos de uma ordem.
End If
NextProduct:
rstOrder.MoveNext
Loop
NextOrder:
rstShip.MoveNext
Recalcule o número de conjuntos de etiquetas para imprimir:
lngSelected = Nz (DCount (\"*\", _
\"qrySelectedNorthwindShippingLabels\"))
Me![lblSetsToPrint].Legenda = _ lngSelected
& “ sets of shipping labels to print”
Próxima lngSet
DoCmd.Close acForm, Me.Name
Terminado:
strTitle = \"Acabou!\"
strPrompt = _
\"Um conjunto de transporte rótulos criado para cada\" _
412
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
17_047026 ch12.qxp 02\/04\/07 21:53 página 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 rótulos foram criados.
FIGURA 12.6
A mensagem de sucesso depois que todos os rótulos foram impressos.
Limpe o medidor de progresso:
Application.SysCmd acSysCmdClearStatus
Exit Sub
ErrorHandler:
Se errar = 429 então
Palavra não está em execução; 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 função que recupera o caminho de documentos de tblInfo é listada em seguida;
o GetTemplatesPath função é semelhante:
GetDocumentsPath() função pública como String
No erro GoTo ErrorHandler
Conjunto dbs = CurrentDb
Set rst = dbs.OpenRecordset(\"tblInfo\")
413
Indo além do básico
12
17_047026 ch12.qxp 02\/04\/07 21:53 página 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 página de etiquetas de envio.
FIGURA 12.7
Um conjunto de palavra etiquetas de envio preenchido com dados de acesso.
414
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
17_047026 ch12.qxp 02\/04\/07 21:53 página 414
Cada projeto de desenvolvimento tem requisitos exclusivos; ao usar o Access para criar etiquetas de endereçamento
(ou qualquer outro tipo de documentos do Word), você tem a liberdade para criar tabelas e formulários que
exatamente suas necessidades, armazenando todos (e apenas) as informações que você precisa para selecionar e imprimir o
dados que você precisa em documentos do Word. O código usado para criar as etiquetas de envio descritas neste
seção inclui várias técnicas que são úteis para a produção de documentos de Word, de vários tipos,
como criar conjuntos de registros filtrados para trabalhar com registros de detalhes, cálculo de números de \"x y\"
Quando estiver trabalhando com conjuntos de registros, exibindo um medidor de progresso na barra de status e de atualização
tabelas de código.
Criação de gráficos dinâmicos do Excel
Consultas de acesso
Você pode criar gráficos interactivos grandes e tabelas usando as ferramentas do próprio acesso (gráficos dinâmicos e
Tabelas dinâmicas), como observado no capítulo 1. No entanto, há um inconveniente a usar gráficos dinâmicos de acesso
e tabelas dinâmicas — eles só são interativos enquanto trabalhava no acesso. Se você salvar um gráfico dinâmico
ou tabela dinâmica como um PDF (se você tiver instalado o salvar como utilitário PDF) ou instantâneo de arquivos e enviá-lo
a outra pessoa, é apenas uma imagem, não um interativo gráfico ou tabela. Se você precisa colocar os dados de acesso
em um gráfico interativo ou tabela para outros para trabalhar com (mesmo se eles não têm 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 gráfico dinâmico ou tabela dinâmica que usuários podem manipular como quiserem.
Quando você criar uma tabela dinâmica do Excel, automaticamente é criado com um vinculado
Tabela dinâmica.
O primeiro passo na criação de uma tabela dinâmica do Excel é criar uma consulta do Access com os dados a serem
cartografado. Gráficos dinâmicos do Excel não são exatamente o mesmo que acesso gráficos dinâmicos; em particular, eles não têm
o recurso de agrupamento de data que automaticamente cria uma variedade de data classifica-se de um campo de data (ano,
No mês, trimestre, semana). Se você quiser analisar dados em uma tabela dinâmica do Excel por mês, trimestre, ou
ano, você precisa fazer a repartição 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 dinâmica do Excel manualmente, seguindo estes passos:
1. Criar uma consulta do Access com os dados a ser cartografado;
qryQuarterlySalesByCategory tem apenas três campos: OrderQuarter, categoria, e
Preço. O campo OrderQuarter extrai o ano e trimestre o campo DataDoPedido,
usando esta expressão:
OrderQuarter: Year([OrderDate])
DatePart(\"q\",[OrderDate])
2. Esta consulta de exportação para o Excel usando o comando Excel no grupo de exportação do externo
Dados guia da faixa de opções, como mostrado na Figura 12.8.
NOTA NOTA
415
Indo além do básico
12
17_047026 ch12.qxp 02\/04\/07 21:53 página 415
FIGURA 12.8
Exportar uma consulta para o Excel usando o comando da faixa de opções.
3. Na caixa de diálogo Exportar, edite o nome da planilha conforme desejado e navegue para um suplente
local, se você não quiser armazenar a planilha na pasta de documentos do padrão (em
Figura 12.9, eu editei o nome da planilha e deixou a pasta com a configuração padrão).
FIGURA 12.9
Edição da planilha, salve o nome na caixa de diálogo Exportar.
416
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
17_047026 ch12.qxp 02\/04\/07 21:53 página 416
4. Abra a planilha recém criada no Excel.
5. Clique em qualquer lugar no intervalo de dados, selecione o guia Inserir da faixa de opções e selecione
Gráfico dinâmico no menu drop-down no grupo tabelas, como mostrado na Figura 12.10.
FIGURA 12.10
Criando um gráfico dinâmico de dados em uma planilha do Excel.
6. Criar tabela dinâmica com gráfico dinâmico diálogo abre, como mostrado na Figura 12.11, com o
gama pré-selecionados; Basta clicar em OK para criar o gráfico dinâmico na outra planilha em que o
mesma pasta de trabalho.
417
Indo além do básico
12
17_047026 ch12.qxp 02\/04\/07 21:53 página 417
FIGURA 12.11
Tabela a criar dinâmica com diálogo gráfico dinâmico.
7. O gráfico dinâmico novo e em branco aparece, conforme mostrado na Figura 12.12.
FIGURA 12.12
Um gráfico de Excel recém-criado dinâmico.
418
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
17_047026 ch12.qxp 02\/04\/07 21:53 página 418
8. O layout de um gráfico dinâmico é diferente no Excel do que no acesso (uma discrepância Microsoft
deve esclarecer, mas isso é outro assunto). Os campos da consulta constam a
Lista de campos da tabela dinâmica no painel à direita da planilha; Eu arrastei OrderQuarter
para os campos de eixo drop zone, CategoryName ao soltar do campos de legenda e o preço para
os valores de drop zone (Excel automaticamente faz uma soma de preço). Figura 12.13 mostra
o gráfico claramente formatado dinâmico neste ponto.
FIGURA 12.13
Um gráfico de Excel dinâmico com campos atribuídos a soltar zonas.
9. Para formatar o número de eixo esquerdo, botão direito do mouse qualquer valor de categoria em um gráfico dinâmico e selecione
\"Formatar eixo\" no menu de contexto, como mostrado na Figura 12.14.
419
Indo além do básico
12
17_047026 ch12.qxp 02\/04\/07 21:53 página 419
FIGURA 12.14
A formatação de número do eixo.
10. Abre a caixa de diálogo Formatar eixo; Eu formatei o número de eixo esquerdo para E.U. moeda por
selecionando o número para a opção de eixo, moeda para a categoria, 0 casas decimais,
e Inglês (US) para o símbolo, conforme mostrado na Figura 12.15.
FIGURA 12.15
Formatando o eixo esquerdo para moeda dos EUA.
420
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
17_047026 ch12.qxp 02\/04\/07 21:53 página 420
Quando o gráfico dinâmico (ou um de seus componentes) é seleccionado, você deve ver especial
Gráfico dinâmico comandos nos grupos de Design e o Layout da faixa de opções; Se você não vê
-los, clique em gráfico dinâmico para dar-lhe o foco.
11. Para dar o gráfico de um título (geralmente uma boa idéia), selecionei o Layout 1 no quadro
Grupo de layouts na guia Design da faixa de opções (no modo de gráfico dinâmico ferramentas), como mostrado na
Figura 12.16.
FIGURA 12.16
As ferramentas de gráfico dinâmico.
12. Esta selecção adiciona um controle do título do gráfico para o gráfico; Clique sobre ela e selecione Editar texto para
editar o nome do gráfico como desejado; Eu fiz isso \"Vendas trimestrais por categoria.\"
13. A etapa final é selecionar um estilo de gráfico. É o estilo padrão (barras de cor contrastantes) gener-
aliar-se muito bem, mas há muitas mais opções disponíveis. Para selecionar um estilo gráfico diferente, soltar
a tecla mais no canto inferior direito do grupo estilos de gráfico, como mostrado na
Figura 12.17.
FIGURA 12.17
Abrir a paleta de estilos de gráfico.
14. Uma paleta de 54 estilos abre como mostrado na Figura 12.18.
15. O gráfico dinâmico formatado é mostrado na Figura 12,19.
NOTA NOTA
421
Indo além do básico
12
17_047026 ch12.qxp 02\/04\/07 21:53 página 421
FIGURA 12.18
Selecionando um estilo gráfico da paleta.
FIGURA 12,19
Um gráfico dinâmico com barras de cores contrastantes e um fundo claro.
422
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
17_047026 ch12.qxp 02\/04\/07 21:53 página 422
16. Para uma apresentação de computador, um fundo escuro pode ser preferível; Figura 12.20 mostra
o gráfico dinâmico com um estilo de fundo escuro selecionado.
FIGURA 12.20
Um gráfico dinâmico com barras de cores contrastantes e um fundo escuro.
Os quatro estilos que mais recentemente selecionado aparecem na linha superior dos estilos de gráfico
Grupo, assim eles estão sempre disponíveis para a seleção de um clique.
Excel 2007 tem um novo recurso: modelos de gráfico. No entanto, estes modelos apenas trabalho
com gráficos padrão, não gráficos dinâmicos, então infelizmente são sem uso quando
Criando gráficos dinâmicos.
Os gráficos de barras produzidos nesta seção são apenas uma pequena seleção dos tipos de gráfico dinâmico, que você pode
produzi em Excel, com base em dados de acesso. Os seis mais populares tipos de gráfico são mostrados nos gráficos
Grupo da aba inserir na faixa de opções, mostrada na Figura 12.21.
FIGURA 12.21
Os seis tipos de gráfico do Excel mais populares.
NOVO RECURSO NOVO RECURSO
NOTA NOTA
423
Indo além do básico
12
17_047026 ch12.qxp 02\/04\/07 21:53 página 423
Para ver todos os tipos de gráfico disponíveis, clique no comando de outros gráficos, então a todos os tipos de gráfico com-
Matos na parte inferior da paleta de gráfico de soltar-para baixo, conforme mostrado na Figura 12.22.
FIGURA 12.22
Selecionando o comando de todos os gráficos para ver todos os tipos de gráfico do Excel.
A caixa de diálogo Criar gráfico aberta pelo comando todos os gráficos é mostrada na Figura 12,23.
424
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
17_047026 ch12.qxp 02\/04\/07 21:53 página 424
FIGURA 12,23
A caixa de diálogo Criar tabela.
Embora a maioria dos tipos de gráficos estão disponíveis em Access e Excel, existem algumas diferenças: O
Tipo de gráfico polar está disponível somente no acesso, e o tipo de gráfico de superfície só está disponível no Excel.
Figura 12.24 mostra os tipos de gráficos de acesso à esquerda e os tipos de gráfico do Excel à direita, para
torná-lo mais fácil de identificar o tipo de gráfico que você deseja usar.
425
Indo além do básico
12
17_047026 ch12.qxp 02\/04\/07 21:53 página 425
FIGURA 12.24
Tipos de gráfico de Access e Excel.
E-mail de envio e relatórios de reordenação
Depois que você enviar ordens, usando as etiquetas de envio descritas em uma seção anterior, você pode precisar
para produzir relatórios detalhando as quantidades de produtos diferentes que foram enviados e os montantes
que precisam ser solicitados para repor o estoque e então enviar estes relatórios para todas as pessoas. O
Relatórios de envio e reordenação de formar, mostrado na Figura 12.25, permite que você veja o inventário para todos
Quando a quantidade em estoque, mais a quantia em ordem seja na ou sob a reordenar nível para
esse produto. O campo de ReorderAmount (inicialmente definido como zero para todos os produtos) indica o número
dos casos que você deseja reordenar.
Uma vez que este formulário só tem dados, se pelo menos um produto abaixo a reposição de inventário nível, quando você
Clique no botão \"E-mail de envio e reordenação de relatórios\" no menu principal, se não houver suficiente
inventário de todos os produtos, você receberá a mensagem mostrada na Figura 12,26.
426
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
17_047026 ch12.qxp 02\/04\/07 21:53 página 426
FIGURA 12.25
Um formulário para reabastecer o estoque.
FIGURA 12,26
Uma mensagem quando todos os produtos têm suficiente inventário.
Se você clicar no botão Sim este diálogo, os montantes de Editar formulário será aberto, como mostrado na Figura 12.27,
onde você pode editar a quantidade de produto conforme necessário.
427
Indo além do básico
12
17_047026 ch12.qxp 02\/04\/07 21:53 página 427
FIGURA 12.27
Um formulário para edição de quantidades de produto.
No formulário de envio de relatórios e reordenação, o \"2 x reordenar\" botão define a quantidade de reordenar
duas vezes o nível reordenar para todos os registros; o botão \"Zero reordenar\" define a quantidade de reordenar
zero para todos os registros. Você pode também 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 relatórios de envio\" mas-
tonelada para salvar o relatório de envio (rptShipping) como um arquivo PDF, atualizar valores de campo em tblProducts como
necessário e criar uma nova mensagem de e-mail com o arquivo de relatório anexado a ele, pronto para o e-mail para o
endereço apropriado (se o relatório é sempre enviado para a mesma pessoa ou departamento, o e-mail
Endereço poderia ser embutidos). Figura 12,28 mostra o relatório de envio.
Embora o formato PDF não torná-lo para a versão de lançamento do Access 2007,
A Microsoft forneceu um utilitário para download que adiciona suporte a PDF para acesso. Este
utilitário pode ser baixado em http:\/\/www.microsoft.com\/downloads\/details.aspx?familyid=
F1FC413C-6D89-4F15-991B-63B07BA5F2E5
página para \"Salvar em PDF\"). Depois de ter baixado e instalado, você verá um novo \"Salve
Seleção 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
SaídaPara
método para criar um arquivo PDF, como no exemplo de código abaixo.
NOVO RECURSO NOVO RECURSO
428
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
17_047026 ch12.qxp 02\/04\/07 21:53 página 428
FIGURA 12,28
Um relatório de envio lista os produtos lançados hoje.
FIGURA 12,29
A nova seleção PDF para salvar um objeto de banco de dados.
429
Indo além do básico
12
17_047026 ch12.qxp 02\/04\/07 21:53 página 429
FIGURA 12.30
Uma mensagem de e-mail com um arquivo PDF anexado, criado a partir de um relatório do Access.
Clicando no botão \"Enviar solicitações reordenar\" funciona da mesma forma; Ele cria um arquivo PDF de produtos
relatório de reordenar e e-mails-lo como um anexo. 12,31 Figura mostra os produtos para relatório de reordenar.
FIGURA 12,31
Produtos para relatório de reordenar.
430
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
17_047026 ch12.qxp 02\/04\/07 21:53 página 430
O cmdReorderInventory procedimento de evento é listado aqui:
Private Sub cmdReorderInventory_Click()
Esse manipulador de erro ignora a seção 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 relatório em PDF (isto só irá funcionar se você tiver instalado
Salvar a utilidade do PDF)
strReportFile = strCurrentPath
Debug. Print \"relatório e caminho:\"
Objecttype DoCmd.OutputTo: = acOutputReport, _
ObjectName: = strReport, _
configuração: = acFormatPDF, _
OutputFile: = strReportFile
Se o arquivo PDF foi criado com êxito, vá para a seção de CreateEmail, ignorando o CreateSnapshot
seção de código.
GoTo CreateEmail
No erro GoTo ErrorHandler
CreateSnapshot:
Exporte o relatório para formato de instantâneo.
strReportFile = strCurrentPath
Debug. Print \"relatório e caminho:\"
Objecttype DoCmd.OutputTo: = acOutputReport, _
ObjectName: = strReport, _
configuração: = acFormatSNP, _
OutputFile: = strReportFile
CreateEmail:
Criar uma mensagem de e-mail do Outlook, preencha o seu assunto e anexar o PDF ou arquivo de instantâneo 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 além do básico
12
17_047026 ch12.qxp 02\/04\/07 21:53 página 431
Pedir confirmação definir todos os valores de ReorderAmount a zero e adicione a quantidade que ordenou a
UnidadesPedidas:
strTitle = \"Confirmação\"
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 \"seqüência SQL:\"
StrSQL DoCmd.RunSQL
End If
Exibir a mensagem de email do Outlook com o PDF ou acessório de instantâneo:
MSG.Exposição
DoCmd.Close acForm, Me.Name
ErrorHandlerExit:
Exit Sub
ErrorHandler:
MsgBox \"erro nenhum:\"
& “; Description: “ & Err.Description
Resume ErrorHandlerExit
End Sub
Resumo
As técnicas descritas neste capítulo devem lhe dar mais idéias sobre como você pode usar a palavra,
Excel e Outlook para expandir a funcionalidade dos bancos de dados do Access, usando o código do VBA para examinar
dados e fazer decisões sobre quais dados devem ser exportados e formatar os documentos do Office
preenchido com os dados de acesso.
432
Escrever código VBA para trocar dados entre os componentes do Office
Parte II
17_047026 ch12.qxp 02\/04\/07 21:53 página 432
Adicionando mais
Funcionalidade para
Escritório
NESTA PARTE
Capítulo 13
Criando os suplementos com
Visual Basic 6
Capítulo 14
Criando suplementos do Access
Capítulo 15
Personalizar a faixa de opções com XML
em bancos de dados Access e suplementos
Capítulo 16
Personalizar a faixa de opções de acesso
com um Visual Studio 2005 compartilhado
Suplemento
Capítulo 17
Criando Scripts Standalone com
Windows Script Host
Capítulo 18
Trabalhando com dados do SQL Server
18_047026 pt03.qxp 02\/04\/07 21:53 página 433
18_047026 pt03.qxp 02\/04\/07 21:53 página 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 vínculo dinâmico (DLL)
que está registrado para trabalhar com aplicativos do Office. Suplementos de COM (pelo menos a-
oretically) pode ser escrito para trabalhar com vários programas do Office, porém
realista, por causa das diferenças 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 vários aplicativos do Office.
Se você comprou a edição 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 não era fácil por causa de
a falta de suporte à depuração. Não havia nenhum desenvolvedor Edition do Office
2003, e não há para o Office 2007, para que a opção não é mais viável,
a menos que você ainda tem a edição 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 edição, aquele que suporta o Office 2007, ainda carece de apoio
para a criação de suplementos do Access. Consulte o capítulo 16 para uma discussão de criação Visual
Studio suplementos para trabalhar com o Access 2007 fita.
No entanto, isso não significa que você não 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 contrário de mais outros aplicativos da Microsoft de
que vintage. Se você tem trabalhado com VB 6 anos, você não tem que
pôr de lado sua experiência duramente conquistada e começar a aprender o Visual Studio 2005;
você pode criar suplementos de COM que irão trabalhar no Office 2007 usando o VB 6.
(Se você quer aprender como criar suplementos de com Visual Studio 2005,
Veja capítulo 16).
REFERÊNCIA CRUZADA REFERÊNCIA CRUZADA
435
NESTE CAPÍTULO
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 página 435
Em versões anteriores do Access, suplementos COM botões colocado no menu ou barra de ferramentas especificado,
usando a coleção CommandBars. No Access 2007, os suplementos de colocar botões na barra de ferramentas
Comanda o grupo da Add-Ins guia da faixa de opções, para trás compatibilidade com o velho
Coleção CommandBars.
Além de suplementos de COM e suplementos do Access, Access 2007 também oferece uma opção de novinho em folha: usando
o XML linguagem de programação para adicionar controles para a faixa de opções, alimentada por código escrito em VBA.
Essa técnica é abordada em Capítulo 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 módulo especial de Designer, um stan -
módulo de Dard e (opcionalmente) um formulário. 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
Edição do Office 2000, mas com algumas pequenas modificações, ele funciona bem em VB também.
Usando o modelo de suplemento COM
Para disponibilizar o modelo de suplemento de COM como uma das seleções 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 seleção COM Add-In como um dos projetos tem-
opções 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 formulário e um módulo de um designer. Esses objetos estão 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 página 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 seleção em VB 6.
437
Criando suplementos COM o Visual Basic 6
13
19_047026 ch13.qxp 02\/04\/07 21:54 página 437
FIGURA 13.3
Um novo projeto VB criado usando o modelo de projeto COM Add-in.
Para definir uma referência em um projeto VB 6, drop-down menu projeto e selecione as referências, conforme mostrado
na Figura 13.4.
FIGURA 13.4
Abrindo a caixa de diálogo VB 6 referências.
Para melhor funcionamento, um COM add-in projetado para rodar em acesso deve ter uma referência
definida como o acesso e (se necessário) bibliotecas de objeto DAO, como mostrado na Figura 13.5. Se você
criar seu próprio 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á são 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 página 438
FIGURA 13.5
Referências como os Access e DAO bibliotecas de objeto na caixa de diálogo referências VB.
Você pode modificar a forma (se você precisa de um formulário em seu Adicionar-in) e o código no padrão
módulo e designer, para criar um personalizado COM add-in para usam no Access:
1. Primeiro abra o designer e preencha as informações básicas sobre o add-in no seu geral
guia (guia Avançado raramente precisa ser modificado de suas configurações padrão).
2. Digite o nome de exibição do suplemento e descrição no \"Addin exibir nome\" e \"Addin
Caixas de descrição\", selecione o aplicativo do Office (acesso neste caso) a
Aplicação suspensa lista (Ver Figura 13.6). A versão de Office atualmente em execução está
automaticamente selecionado na caixa de versão do aplicativo.
3. Finalmente, selecione comportamento de carga do add-in suspensa \"Comportamento de carga inicial\" —
Inicialização é a escolha apropriada se você quiser adicionar-in para estar sempre disponíveis em qualquer
Banco de dados Access (que é o caso usual).
O módulo de SharedCode (como seu nome sugere) contém o código que se aplica o todo suplemento,
como um manipulador de erro e o código padrão que cria e remove barra de ferramentas mas - o suplemento
toneladas ou itens de menu (para o caso raro onde um multi-aplicação suplemento coloca um comando
o mesmo menu ou barra de ferramentas em cada aplicativo do Office).
O código no Designer (que chamei de AccessDesigner para indicar que é um Designer de acesso)
contém código específico para o acesso. (Se você estiver criando um suplemento vários aplicativos, você precisa criar
um Designer para cada aplicativo do Office que o add-in oferece suporte). Algum código padrão no
o Designer trabalha com o formulário de frmCOMAddIn; se seu Adicionar-in não precisa exibir um formulário,
você pode excluir ou comentar qualquer código que faz referência a essa forma, mas é uma boa idéia para deixar todos os
os procedimentos no módulo, 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 página 439
Figura 13.6
Entrar o suplemento de COM do identificando informações e outras opções na janela de Designer.
O código do Designer inclui os processos que implementam a funcionalidade do suplemento; eles exigem
pouca (ou nenhuma) modificação daqueles que seria executado em um suplemento do Access.
Criando o controle de LNB renomeando COM Add-in
Os procedimentos que fazem a renomeação dos controles de formulário e relatório na renomeação de controle de LNB
Suplemento COM são 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 capítulo de concentração-
trates sobre as diferenças necessárias para fazer o código funcionar em um COM add-in.
Para mais detalhes sobre o LNB renomear Adicionar-in, consulte meu livro especialista Microsoft-em-um
Desenvolvimento de aplicações de acesso (ISBN: 0764559044).
O módulo de SharedCode
Começando com um projeto criado a partir do modelo de projeto COM, no módulo SharedCode,
Eu removi as declarações padrão (as declarações só preciso são aqueles no
Módulo de AccessDesigner), e também tirei o padrãoAddToCommandBar e
DeleteFromCommandBar funções. Porque eu precisava para criar (e remover) duas barra de comando
botões, destinados especificamente as barras de ferramentas Design de formulário de acesso e de relatório, coloquei
esses procedimentos no Designer do Access.
REFERÊNCIA CRUZADA REFERÊNCIA CRUZADA
440
Adicionando mais funcionalidades ao Office
Parte III
19_047026 ch13.qxp 02\/04\/07 21:54 página 440
Eu adicionei o StripChars função para este módulo; é chamado todo o add-in para remover
vários personagens e espaços de controlam nomes durante a renomeação, assim como evitar problemas quando
os controles são referenciados no código. Modifiquei o modelo padrão AddInErr procedimento
ligeiramente; Ele cria uma seqüência de caracteres de caixa de mensagem que é chamada de manipuladores de erro no add-in. O
Módulo de SharedCode que contém esses procedimentos está listado em seguida:
Opção explícita
Público função StripChars(strText _
Como String) As String
Tiras de uma variedade de caracteres não-alfanuméricos de uma seqüência 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 então
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 página 441
Public Sub AddInErr(errX As ErrObject)
Exibe mensagem de caixa com informações 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 módulo de AccessDesigner
O suplemento precisa de várias entradas na seção declarações do módulo AccessDesigner.
Para abrir o módulo designer, abra a pasta de Designers na árvore do projeto, com o botão direito do
AccessDesigner item e selecione Exibir código no menu de contexto, como mostrado na Figura 13.7.
FIGURA 13.7
Abrindo o módulo de código de AccessDesigner.
O código padrão de designer precisa de algumas modificações 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 são implementados através da biblioteca de IDTExtensibility2, usando o
Implementa linha no início do módulo.
442
Adicionando mais funcionalidades ao Office
Parte III
19_047026 ch13.qxp 02\/04\/07 21:54 página 442
Os procedimentos começam com Private Sub IDTExtensibility2 há suporte os eventos
Esta biblioteca. Você precisa ter todos os procedimentos de evento cinco no módulo Designer, mesmo que seu
Adicionar-in não pode usar todos eles. Os que eu não preciso tem apenas uma linha de comentário:
' Nenhum código necessário, mas deve ter o esboço do evento
OS suplementos geralmente colocar um ou mais botões ou comandos na barra de ferramentas ou menu de acolhimento
aplicação; cada um requer umWithEvents instrução na seção de declarações da
Módulo designer, para apoiar o código no evento Click do botão ou comando. Meu controle de LNB
Renomear código tem dois desses eventos, para apoiar os dois botões da barra de ferramentas.
O restante da seção de declarações contém grupos de variáveis públicas e privadas, para uso em
Adicionar-em vários procedimentos. Os procedimentos neste módulo tem a funcionalidade descrita a seguir:
O OnConnection procedimento de evento define variáveis de botão de barra de comando e usa
o CreateFormCommandBarButton e CreateReportCommandBarButton
funções para criar barras de ferramentas de acesso as botões no Design do formulário (ou Design de relatório)
(em versões anteriores do Access), ou ao grupo de comandos da barra de ferramentas na recuar
Guia de compatibilidade de suplementos da faixa de opções (no Access 2007 em execução no Windows XP).
O OnDisconnection procedimento de evento executa uma função que remove os dois com-
botões de barra de Matos quando o suplemento for desconectado por descarregar o suplemento a
Caixa de diálogo suplementos de COM (eles não são removidos quando o acesso é fechado).
Os dois procedimentos de evento de clique executar o LNCRenameFormControls e
LNCRenameReportControls funções, que respectivamente renomear o formulário e
controles de relatório.
Um botão 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 botão é clicado;
a sintaxe é diferente para os botões 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 botão é tratado pelo clique
procedimento de evento no módulo de Designer.
O CreateFormCommandBarButton cria o botão de barra de ferramentas de acesso que renomeia
controles em formulários abertos. Os primeiros conjuntos de função a pappAccess variável para a
Access.Application objeto, em seguida, define uma referência para a barra de ferramentas de Design do formulário (onde o
botão será colocado), à procura de um botão existente sobre esta barra de ferramentas, usando sua marca prop-
patrimônio e criá-lo se ele já não existir.
O CreateReportCommandBarButton procedimento faz um trabalho semelhante para o relatório
Botão de barra de ferramentas de design que renomeia controles de relatório.
O RemoveAddInCommandBarButton função (chamado OnDisconnection
procedimento de evento) remove botões de comando do suplemento.
O LNCRenameFormControls e LNCRenameReportControls funções são
basicamente semelhante ao código acesso LNC renomear Adicionar-in, por isso não vou discutir os
em detalhe. A principal diferença é que as funções de suplemento COM renomear controles sobre a
Abrir formulários (ou relatórios); a Rename controles de formulário e controles de relatório de renomear
menu add-ins renomear controles em todos os formulários ou relatórios, ou não estão abertas.
NOTA NOTA
443
Criando suplementos COM o Visual Basic 6
13
19_047026 ch13.qxp 02\/04\/07 21:54 página 443
O código de AccessDesigner está listado a seguir, com as modificações específicas necessárias para implementar o
funcionalidade na suplemento, usando os procedimentos de evento suportados pela biblioteca IDTExtensibility2 a cre-
comeu o comando barra de botões e procedimentos de atribuir a eles. O módulo também contém o proce-
dures usado para controlar a mudança de nome:
Implements IDTExtensibility2
Private WithEvents frmcbb como Office.CommandBarButton
Private WithEvents rptcbb como Office.CommandBarButton
Variável global para armazenar a referência ao aplicativo host (acesso)
Público pappAccess como Access.Application
Variáveis regulares para criar botões de barra de ferramentas
Privado cbrMenu como Office.CommandBar
Privado cbbAddIn como Office.CommandBarButton
Variáveis públicas para a manipulação de renomeação
Público pctl como Access.Control
Pdbs pública como DAO.Banco de dados
Público pfrm como Access.Form
Public pintRenameFail As Integer
Public pintReturn As Integer
PlngControlType público como longo
Público prpt como Access.Report
Prst pública 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
Variáveis particulares para a manipulação de renomeação
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 página 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 código necessário, mas deve ter o esboço do evento
ErrorHandlerExit:
Exit Sub
ErrorHandler:
AddInErr Err
Resume ErrorHandlerExit
End Sub
Private Sub IDTExtensibility2_OnBeginShutdown(custom() _
Como variante)
No erro GoTo ErrorHandler
' Nenhum código necessário, mas deve ter o esboço do evento
ErrorHandlerExit:
Exit Sub
ErrorHandler:
AddInErr Err
Resume ErrorHandlerExit
End Sub
Private Sub IDTExtensibility2_OnConnection(ByVal _
Aplicação 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 código para criar um novo botão de barra de comando para renomear os controles em um formulário ou relatório.
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 código necessário, mas deve ter o esboço 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 próximo
Chame LNCRenameFormControls
End Sub
Private Sub rptcbb_Click (ByVal ctl As _
Office.CommandBarButton, CancelDefault As Boolean)
Em erro continuar próximo
Chame LNCRenameReportControls
End Sub
Public Function CreateFormCommandBarButton (ByVal _
Aplicação como objeto, _ ByVal ConnectMode
Como AddInDesignerObjects.ext_ConnectMode _
ByVal AddInInst como objeto) como Office.CommandBarButton
No erro GoTo ErrorHandler
Armazenar uma referência para o objeto de aplicativo em uma variável pública para outros procedimentos do add-in
pode usá-lo.
Definir pappAccess = aplicativo
Retorne uma referência para a barra de comandos...
Definir cbrMenu = pappAccess.CommandBars (\"Design do formulário\")
Adicione um botão para chamar o add-in da barra de comando, se ele já não existir.
Procure o botão na barra de comandos.
Definir cbbAddIn = _
cbrMenu.FindControl (Tag: = \"Renomear os controles do formulário\")
Em erro continuar próximo
Se cbbAddIn não é nada então
447
Criando suplementos COM o Visual Basic 6
13
19_047026 ch13.qxp 02\/04\/07 21:54 página 447
Adicione o novo botão.
Definir cbbAddIn = _
cbrMenu.Controls.Add (tipo: = msoControlButton, _
Parâmetro: = \"Renomear os controles do formulário\")
Defina propriedades de legenda, etiqueta, estilo e OnAction do botão.
Com cbbAddIn
.Caption = \"renomear
.Tag = \"Renomear a controles de formulário\"
.Style = msoButtonCaption
Execute a função de suplemento principal.
.OnAction = PROG_ID_START
& PROG_ID_END
Terminar com
End If
No erro GoTo ErrorHandler
Retorne uma referência para o novo botão de barra de comando.
Definir CreateFormCommandBarButton = cbbAddIn
ErrorHandlerExit:
Exit Function
ErrorHandler:
AddInErr Err
Resume ErrorHandlerExit
End Function
Public Function CreateReportCommandBarButton (ByVal _
Aplicação como objeto, ByVal ConnectMode como _
AddInDesignerObjects.ext_ConnectMode _
ByVal AddInInst como objeto) como Office.CommandBarButton
No erro GoTo ErrorHandler
Armazenar uma referência para o objeto de aplicativo em uma variável pública 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 página 448
Retorne uma referência para a barra de comandos...
Definir cbrMenu = pappAccess.CommandBars (\"relatório Design\")
Adicione um botão para chamar o add-in da barra de comando, se ele já não existir.
Procure o botão na barra de comandos.
Definir cbbAddIn = _
cbrMenu.FindControl (Tag: = \"Renomear relatório controles\")
Se cbbAddIn não é nada então
Adicione o novo botão.
Definir cbbAddIn = _
cbrMenu.Controls.Add (tipo: = msoControlButton, _
Parâmetro: = \"Renomear relatório controles\")
Defina propriedades de legenda, etiqueta, estilo e OnAction do botão.
Com cbbAddIn
.Caption = \"renomear
.Tag = \"Renomear controles de relatório\"
.Style = msoButtonCaption
Execute a função de suplemento principal.
.OnAction = PROG_ID_START
& PROG_ID_END
Terminar com
End If
Retorne uma referência para o novo botão de barra de comandos.
Definir CreateReportCommandBarButton = cbbAddIn
ErrorHandlerExit:
Exit Function
ErrorHandler:
AddInErr Err
Resume ErrorHandlerExit
End Function
Função 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 página 449
Este procedimento remove os botões da barra de comando para o suplemento, se o usuário desconectado.
Em erro continuar próximo
Se o usuário descarregado o add-in, remova o botão. Caso contrário, o suplemento está sendo descarregado
porque o aplicativo está fechando; Nesse caso, deixe o botão como é.
Se RemoveMode = ext_dm_UserClosed Then
Exclua os botões da barra de comando personalizado.
Com pappAccess.CommandBars (\"Design do formulário\")
.Controles (\"controles de formulário renomear\").Excluir
Terminar com
Com pappAccess.CommandBars (\"relatório Design\")
.Controles (\"controles de relatório de renomear\").Excluir
Terminar com
End If
ErrorHandlerExit:
Exit Function
ErrorHandler:
AddInErr Err
Resume ErrorHandlerExit
End Function
LNCRenameFormControls() função pública como variante
Renomeia todos os controles em formulários abertos.
Em erro continuar próximo
Gere tabela de tipos de controle para usar em renomeando controles (se ainda não existir).
CreateCTTable
No erro GoTo ErrorHandler
Determine se quaisquer formulários abertos e sair se não.
Se pappAccess.Forms.Count = 0 Then
MsgBox \"não há formulários estão abertos; sair\"
GoTo ErrorHandlerExit
End If
450
Adicionando mais funcionalidades ao Office
Parte III
19_047026 ch13.qxp 02\/04\/07 21:54 página 450
Determine se original os nomes de controle devem ser armazenados na propriedade Tag.
pstrMessage = _
_ \"Quando processamento controles de formulário, deverá o original\"
& “control name be saved to the control’s 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 formulários 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 página 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 página 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
Próxima pctl
Próxima pfrm
Chamada MsgBox (\"todos formam controles renomeados!\" _
vbOKOnly, \"Feito\")
ErrorHandlerExit:
Exit Function
ErrorHandler:
Se um botão de opção ou caixa de seleção é desacoplada, conjunto blnUnbound Para Verdadeiro Portanto, o código usa o NA
função em vez de CS.
Se Err. Number = 2455 então
blnUnbound = True
Retomar em seguida
Outra coisa
AddInErr Err
Resume ErrorHandlerExit
End If
End Function
[Eu estou omitindo o LNCRenameReportControls função desta lista, porque ele é sub-
stantially semelhante a LNCRenameFormControls função].
Os procedimentos a seguir renomeie controles de formulário e relatório de vários tipos. Controles são agrupados
dependendo se eles estão ligados e outras propriedades relevantes. Cada grupo de con-
XO (ControlCS ControlCA e assim por diante) precisa de um código 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 página 453
o controle. Os controles acoplados, por exemplo, criar um nome usando o nome do campo acoplado;
rótulos de criar um nome usando o texto da legenda e assim por diante:
Público função ControlCS(ctl As Access.Control, _
strPrefix As String, blnTag As Boolean) As Integer
Grupo renomeação de todos os controles com fontes de controle em um formulário ou relatório.
No erro GoTo ErrorHandler
Dim strControlSource As String
strControlSource = Nz (ctl.OrigemDoControle)
pstrOldCtlName = ctl.Nomedocontrole
Verificar se o controle já é chamado corretamente e caso também especial para controles cujo original
nome começa com \"Opção\" ou \"Frame\" (mesmo primeiras três letras como prefixo).
Se deixou (pstrOldCtlName, 3) = strPrefix e _
Esquerda (pstrOldCtlName, 6) <>\"Opção\" e _
Esquerda (pstrOldCtlName, 3) = strPrefix e _
Esquerda (pstrOldCtlName, 5) <>\"Frame\", em seguida,
GoTo ErrorHandlerExit
Se a fonte de controle não é vazia, usá-lo.
ElseIf strControlSource <>\"\" então
pstrNewCtlName = strPrefix
StripChars(strControlSource)
Outra coisa
Caso contrário, use o nome original do controle.
pstrNewCtlName = strPrefix
StripChars(pstrOldCtlName)
End If
Corrigir o nome de \"Page x de y\" textbox controles em relatórios do Assistente de banco de dados.
Se pstrNewCtlName = \"txtPagePageofPages\", em seguida,
pstrNewCtlName = \"txtPages\"
End If
Mostrar ao usuário
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 página 454
e perguntar se o novo nome é aceitável.
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 usuário clicar no botão Sim, mudar o nome do controle.
Se pintReturn = vbYes Then
Se blnTag = True Then
CTL.Tag = ctl.Nomedocontrole
End If
CTL.ControlName = pstrNewCtlName
Caso contrário, 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 diálogo de renomeação.
pintRenameFail = True
Se Err. Number = 2104 então
MsgBox \"Não 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 página 455
Outra coisa
AddInErr Err
Resume ErrorHandlerExit
End If
Retomar em seguida
End Function
Público função ControlCA(ctl As Access.Control, _
strPrefix As String, blnTag As Boolean) As Integer
Grupo renomeação de todos os controles com as legendas em um formulário ou relatório.
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 <>\"\" então
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 página 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 então 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 diálogo de renomeação.
pintRenameFail = True
Se Err. Number = 2104 então
MsgBox \"Não há outro controle chamado\"
pstrNewCtlName
\"Controle nome usado\"
pstrNewCtlName = pstrNewCtlName
Outra coisa
AddInErr Err
Resume ErrorHandlerExit
End If
Retomar em seguida
End Function
Público função 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 renomeação de todos os controles com fonte de objetos em um formulário ou relatório.
' Chamado de RenameFormControls e RenameReportControls
' neste módulo
No erro GoTo ErrorHandler
pstrOldCtlName = ctl.Nomedocontrole
pstrSourceObject = Nz (ctl.SourceObject)
Se deixou (pstrOldCtlName, 3) = strPrefix, em seguida,
Exit Function
ElseIf pstrSourceObject <>\"\" então
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) = \"Subformulário\", 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 página 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 então 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 diálogo de renomeação.
pintRenameFail = True
Se Err. Number = 2104 então
MsgBox \"Não há outro controle chamado\"
pstrNewCtlName
\"Controle nome usado\"
pstrNewCtlName = pstrNewCtlName
Outra coisa
AddInErr Err
Resume ErrorHandlerExit
End If
Resume ErrorHandlerExit
End Function
Público função ControlNA(ctl As Access.Control, _
strPrefix As String, blnTag As Boolean) As Integer
Grupo renomeação de todos os controles, não cabendo as outras categorias em um formulário ou relatório.
' Chamado de RenameFormControls e RenameReportControls
' neste módulo
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 página 459
Caso especial de linhas cujo nome padrão é \"Linha\" ou \"Opção\" (o mesmo três primeiras letras como o stan-
prefixo de dard).
Se deixou (pstrOldCtlName, 3) = strPrefix e _
Esquerda (pstrOldCtlName, 6) <>\"Opção\" 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 então 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 diálogo de renomeação.
pintRenameFail = True
Se Err. Number = 2104 então
MsgBox \"Não 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 página 460
End If
Resume ErrorHandlerExit
End Function
Função pública CreateCTTable()
' Chamado de LNCRenameFormControls e
' Função de LNCRenameReportControls
' neste módulo
Dim strCTTable As String
strCTTable = \"zLNCtblControlType\"
Exclua a tabela antiga, se houver.
Conjunto pdbs = CurrentDb
strCTTable = \"zLNCtblControlType\"
Em erro continuar próximo
PDBs.TableDefs.Delete strCTTable
No erro GoTo ErrorHandler
Gere a tabela de tipos de controle para usar na renomeação de controles. Se houver um erro de \"tabela não encontrada\",
sai da função.
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\"
.Atualização
.AddNew
!ControlType = 101
!ControlTypeName = \"Retângulo\"
.Atualização
.AddNew
!ControlType = 102
!ControlTypeName = \"Linha\"
.Atualização
.AddNew
461
Criando suplementos COM o Visual Basic 6
13
19_047026 ch13.qxp 02\/04\/07 21:54 página 461
!ControlType = 103
!ControlTypeName = \"Imagem\"
.Atualização
.AddNew
!ControlType = 104
!ControlTypeName = \"Botão de comando\"
.Atualização
.AddNew
!ControlType = 105
!ControlTypeName = \"Botão de opção\"
.Atualização
.AddNew
!ControlType = 106
!ControlTypeName = \"Caixa de seleção\"
.Atualização
.AddNew
!ControlType = 107
!ControlTypeName = \"Grupo de opções\"
.Atualização
.AddNew
!ControlType = 108
!ControlTypeName = \"Quadro de objeto acoplado\"
.Atualização
.AddNew
!ControlType = 109
!ControlTypeName = \"Caixa de texto\"
.Atualização
.AddNew
!ControlType = 110
!ControlTypeName = \"Caixa de listagem\"
.Atualização
.AddNew
!ControlType = 111
!ControlTypeName = \"Caixa de combinação\"
.Atualização
.AddNew
!ControlType = 112
!ControlTypeName = \"Subformulário\/sub-relatório\"
.Atualização
.AddNew
!ControlType = 114
!ControlTypeName = \"Quadro de objeto\"
.Atualização
.AddNew
!ControlType = 118
!ControlTypeName = \"Quebra de página\"
.Atualização
.AddNew
462
Adicionando mais funcionalidades ao Office
Parte III
19_047026 ch13.qxp 02\/04\/07 21:54 página 462
!ControlType = 122
!ControlTypeName = \"Alternar botão\"
.Atualização
.AddNew
!ControlType = 123
!ControlTypeName = \"Controle de guia\"
.Atualização
.AddNew
!ControlType = 124
!ControlTypeName = \"Página\"
.Atualização
.Fechar
Terminar com
ErrorHandlerExit:
Exit Function
ErrorHandler:
Se Err. Number = 3010 então
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 código em módulos SharedCode e AccessDesigner conforme necessário, salve o projeto
com um nome significativo (chamei a amostra COM add-in \"LNB controle renomear\"). O projeto
nome também vai ser usado como o nome do arquivo DLL quando você faz esse arquivo. A etapa final é a criação
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 padrão 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 padrão (geralmente c: \/ documentos
e configurações \/ Nome de usuário \/ Application Data\/Microsoft\/AddIns), seus correspondentes devem aparecer automaticamente
o grupo de comandos da barra de ferramentas da guia Add-Ins da faixa de opções (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 página 463
FIGURA 13.8
Um COM add-in botão na guia Add-Ins da faixa de opções no Access 2007.
Se você não 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 diálogo suplementos de COM, que pode ser
aberto a partir da página de Add-ins da caixa de diálogo Opções do Access. Para instalar um suplemento de COM, manualmente,
Faça 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, escritório 12
e selecionando \"Executar como administrador\" de seu menu de contexto do botão direito do mouse.
2. Em um banco de dados do Access, clique no botão Office e, em seguida, clique no botão Opções do Access, o
inferior direita, como mostrado na Figura 13.9.
FIGURA 13.9
Abrindo a caixa de diálogo Opções do Access.
3. Selecione a página de Add-ins na caixa de diálogo opções de acesso para ver seus suplementos instalados (você vai
consulte acesso e COM suplementos listados lá, além 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 diálogo suplementos de COM.
464
Adicionando mais funcionalidades ao Office
Parte III
19_047026 ch13.qxp 02\/04\/07 21:54 página 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 página de Add-ins da caixa de diálogo Opções do Access.
5. Clicar em OK, você verá o velho diálogo suplementos de COM, o mesmo que no Access 2003, como
mostrado na Figura 13.11.
FIGURA 13.11
A caixa de diálogo suplementos de COM.
465
Criando suplementos COM o Visual Basic 6
13
19_047026 ch13.qxp 02\/04\/07 21:54 página 465
6. O nome exibido na lista de \"Add-Ins disponíveis\" é aquele inserido como nome do suplemento
no Designer, mas curiosamente, a descrição inserida na descrição do Designer
campo não aparece esta caixa de diálogo.
7. Se seu suplemento de COM não aparecer na lista de add-ins disponíveis, clique no botão Adicionar para
Procurar por ele; após localizá-lo, clique em OK na caixa de diálogo 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 diálogo suplementos de COM. Você pode verificar seu
caixa de seleção (se necessário) e fechar a caixa de diálogo; seus correspondentes então devem aparecer no Adicionar-
Guia de ins da faixa de opções, no contexto adequado; por exemplo, um botão que pretende dis-
jogo da barra de ferramentas de Design do formulário (como a mostrada na Figura 13.6) aparecerá quando
você tem um formulário aberto no modo design.
No Access 2000 a 2003, COM add-in botões apareceram na barra de ferramentas designada
ou menu; no caso deste suplemento, que seria a barra de ferramentas de design de formulário ou relatório. Em
Acesso 2007, todos os botões aparecem diretamente sobre o grupo de comandos da barra de ferramentas na guia Suplementos. Se você
estiver executando o Windows Vista, você não 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 botão, 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 página 466
Para reabrir um COM add-in para edição, 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 não 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 versão antiga do suplemento do código está sendo executada em vez da versão atual.
Se você tiver carregado de um banco de dados aberto com o suplemento de COM, você receberá uma permissão\"
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 versão da DLL. Na minha experiência, mesmo DLLs não localizados na pasta AddIns
pode ser executado, por isso é melhor ter apenas uma DLL no seu computador para qualquer determinado suplemento (o mais recente
versão). Cópias de segurança podem ser transferidas para outro computador, em um disco, ou em formato zip, para evitar
confusão.
Se você encontrar esse código fazer referência a objetos de acesso não estiver funcionando (com nenhuma mensagem de erro, ou um inap-
prognóstico mensagem de erro, como \"Sem formas abrir\" quando você tem formulários abertos), pode ser necessário
Adicione uma referência de aplicação específica de acesso ao seu código. Especificamente, Considerando que o suplemento COM código em
um Designer de acesso usando apenas Formulários para fazer referência a coleção de formas de acesso, ou Relatórios ref-
ERÊNCIA a coleção de relatórios de um banco de dados, funcionou muito bem em versões anteriores do Office, Office 2007 o
Variável de aplicativo de acesso pappAccess deve ser usado, então a sintaxe atual deve ser
pappAccess.Forms em vez de apenas Formulários .
Se você alterar o nome de um botão de barra de ferramentas criado por um suplemento de COM, você pode ver o botão antigo
na barra de ferramentas, em vez de (ou além) um novo. Para remover o velho botão, adicione uma linha de
código para o RemoveAddInCommandBarButton função para remover o botão, 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 diálogo suplementos de COM para executar o código 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 botão.
Usando um suplemento de COM
Usar um suplemento de COM é fácil: basta clicar no botão ele colocado na guia Add-Ins da faixa de opções, como
mostrado na Figura 13.8. Para renomear controles em quaisquer formas de acesso abertas, por exemplo, abrir um formulário em
visualização de design e clique no botão renomear controles de formulário 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 página 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 referência mais tarde. No entanto, a opção padrão é não,
porque na maior parte, não é necessário conservar o original nome de controle.
Depois de selecionar uma opção, o código então passa a ciclo por meio de formulários abertos e, para cada
forma, percorrer seus controles. Para qualquer controle que não tem o prefixo de controle apropriado, um
novo nome é criado e apresentado para aprovação 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 rótulos com muito
legendas longas ou controles com expressões), o novo nome precisa ser editado, que é feito pela
clicar em não e, em seguida, editar o nome do controle em um InputBox.
Ainda em 2007, quando você cria uma nova forma de limite usando o botão de formulário na guia criar de acessar
da faixa de opções, todos os controles acoplados terão os mesmos nomes como seus campos, o que podem levar ao circuito-
erros de referência de lar durante a execução de código. Assim, é uma boa idéia para executar os controles de formulário renomear
(ou renomear relatório controles) comando imediatamente depois de criar um formulário de limite ou relatório, antes
escrever código que referências de seus campos ou controles.
468
Adicionando mais funcionalidades ao Office
Parte III
19_047026 ch13.qxp 02\/04\/07 21:54 página 468
Comparando os suplementos com
Acesso Adicionar-ins
Em versões anteriores do Office, os suplementos tinham uma vantagem em relação aos suplementos de acesso: você
poderia colocar um botão 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 opções, não no grupo apropriado ou guia de suplementos
a faixa de opções.
Você pode adicionar grupos, botões e as seleções de menu para a faixa de opções usando o XML; Esta tecnologia-
nique é discutida no capítulo 15.
Em comparação com os suplementos, suplementos de acesso tem vários recursos extras: você pode criar não apenas
menu add-ins, mas também os feiticeiros de vários 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 diálogo novo formulário, embora no Access 2007 agora deve ser
feito usando XML para modificar a faixa de opções. No entanto, construtores de propriedade que executar vários adequada-
laços ainda funcionam bem no Access 2007 (pelo menos se você estiver executando o Windows XP), então meu LNB renomear
suplemento pode ser executado a partir da propriedade nome de um controle para renomear um controle individual; Esta func-
nalidade não pode ser duplicada em um suplemento de COM.
Resumo
Neste capítulo você aprendeu a criar um VB 6 COM add-in que funciona com Access 2007, colocação
botões do grupo de comandos da barra de ferramentas da guia Add-Ins da faixa de opções. Se você tem um VB 6
Adicionar-in criado em uma versão anterior do Office, você pode modificá-lo ligeiramente, para que ele vai trabalhar
Acesso 2007, reutilizando o seu código. Se, por outro lado, você quer aprender uma nova programação lan-
calibre, assim você pode colocar botões e grupos específicos guias da faixa de opções, consulte os próximos dois capítulos
para trabalhar com a faixa de opções XML e Visual Studio 2005 add-ins.
REFERÊNCIA CRUZADA REFERÊNCIA CRUZADA
469
Criando suplementos COM o Visual Basic 6
13
19_047026 ch13.qxp 02\/04\/07 21:54 página 469
19_047026 ch13.qxp 02\/04\/07 21:54 página 470
M
OST os bancos de dados de amostra para capítulos anteriores incluídos 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 vários objetos do Access 2007 Backup.accdb
no banco de dados atual e o conjunto de uma referência para o Microsoft Scripting
Biblioteca de tempo de execução, que é um incômodo. Seria muito mais conveniente para
apenas ter backup disponível 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
código em um único pacote que está disponível para todos os bancos de dados do Access. No presente
capítulo eu uso como exemplo um acesso add-in (2007.accda Extras, que inclui
uma versão melhorada do código Backup (a partir de basBackup em acesso 2007
Backup.accdb), com algumas melhorias: um formulário de configuração para especificar o
pasta de backup; e um conjunto de objetos e códigos que permitem que você imprima listas de
tabelas ou consultas e seus campos, excluindo aqueles com especificado pelo usuário
prefixos — muito útil para quando você precisa saber quais campos estão 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 capítulo é 2007.accda Extras.
Se você está tentando instalar um suplemento no Access 2007
executar no Windows Vista, você pode receber o aviso de segurança
mostrado na Figura 14-1. Isto é provavelmente porque você não está executando o acesso
como um administrador. Para executar o acesso como administrador, botão 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 não é um problema ao instalar o add-ins para Access 2007
executando no Windows XP.
CUIDADO CUIDADO
NOTA NOTA
471
NESTE CAPÍTULO
Criação de acesso menu add-ins
Criação de assistentes de acesso
Criando a propriedade de acesso
construtores
Considerações especiais e
Solucionando problemas de acesso
Adicionar-ins
Criando suplementos do Access
20_047026 ch14.qxp 02\/04\/07 21:54 página 471
FIGURA 14.1
Um aviso de segurança ao tentar instalar um suplemento do Access para o Access 2007 em execução 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 extensão. MDA para acesso
formato, ou accda para Access 2007) que contém os objetos e módulos necessários para apoiar o
funcionalidade na suplemento e uma tabela de sistema especial chamaram UsysRegInfo com o registro chave infor-
ção necessária para instalar o add-in. suplementos normalmente são armazenados na pasta padrão Microsoft AddIns
(C: \/ Documents and Settings \/ Nome de usuário \/ Application Data\/Microsoft\/AddIns), que foi também o
Acesso Adicionar-ins pasta padrão para Access 2003). No Access 2007, a pasta padrão da Microsoft
próprio suplementos é a pasta ACCWIZ sob a pasta Office (no meu sistema, isto é e: \/ Microsoft
Office 2007 Beta\/Office12\/ACCWIZ). No entanto, é uma boa idéia para manter seus próprios add-ins
principal pasta de suplementos (c: \/ Documents and Settings \/ Nome de usuário \/ Application Data\/Microsoft\/AddIns para
Windows XP ou c: \/ Users \/ Nome de usuário \/ AppData\/Roaming\/Microsoft\/AddIns para Windows Vista)
ao invés 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 opções), 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 versões anteriores do Access (como bancos de dados biblioteca. MDA) vontade gen-
erally executar no Access 2007 em execução no Windows XP, pelo menos se eles não têm 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 Convenção de nomenclatura Leszynski, funciona bem no Access 2007, embora ele
não 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 opções substitui o
interface antiga de barras de comando. No Windows Vista, recursos de segurança atualmente evitar suplementos que criar
Assistentes ou construtores de propriedade de execução (esse problema está programado para ser corrigido em uma próxima
Serviço de Patch).
Tipos de suplemento
Existem três tipos de acesso add-ins, com vários subtipos, conforme listado na tabela 14.1.
Todos estes tipos de suplementos são 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 são
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 página 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 Não contexto específico, chamado de
consulta, formulário, relatório, ou visualização Design no menu Add-ins
controle é criado.
Subtipos
Assistentes de tabela Construtores de propriedade.
Assistentes de consulta Construtores de expressão
Assistentes de formulário
Assistentes de relatório
Assistentes de controle
Criando um banco de dados biblioteca
Esta seção orienta você através da criação 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 extensão para accda mais tarde, em um painel de Explorer,
ignorando o aviso terrível que o arquivo pode se tornar inutilizável.
Em seguida, você precisa criar a tabela USysRegInfo para armazenar as informações 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 disponível; Talvez você precise primeiro visibilizar tabelas do sistema, conforme descrito nesta seção. EU
recomendo importar essa tabela, porque ela vai lhe poupar tempo na inserção de alguns muito enigmática infor -
mação, embora obviamente você tem que adicionar (ou modificar) linhas da tabela com dados específicos para sua
Add-in.
A tabela USysRegInfo é uma tabela do sistema, assim você não vê-lo (ou ser capaz de editar o seu conteúdo) a menos que
você marcar a caixa de seleção \"Mostrar objetos do sistema\". Em versões anteriores do Access, foi essa caixa de seleção
localizado na página de exibição da caixa de diálogo opções; no Access 2007 é o dia de opções de navegação-
log, que pode ser aberto da seguinte maneira:
1. Clique no botão do Office no canto superior esquerdo da janela do Access.
2. Em seguida, clique no botão de opções 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 página 473
FIGURA 14.2
O menu de acesso 2007 Office.
3. Na caixa de diálogo Opções do Access, selecione a seção de banco de dados atual, conforme mostrado na
Figura 14.3.
FIGURA 14.3
A seção de banco de dados atual da caixa de diálogo Opções do Access.
474
Adicionando mais funcionalidades ao Office
Parte III
20_047026 ch14.qxp 02\/04\/07 21:54 página 474
4. Clique no botão de opções de navegação para abrir a caixa de diálogo opções de navegação, onde
Finalmente, você pode verificar a caixa de seleção \"Mostrar objetos do sistema\", como mostrado na Figura 14.4.
FIGURA 14.4
Verificar a caixa de seleção \"Mostrar objetos do sistema\" na caixa de diálogo opções de navegação.
5. Clique em OK para fechar a caixa de diálogo opções de navegação e novamente para fechar as opções de acesso
caixa de diálogo.
Na seção tabelas do painel de navegação, você agora verá um número de tabelas do sistema, começando
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á também, embora, curiosamente, não é
esmaecido.
Você não 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 necessários.
475
Criando suplementos do Access
14
20_047026 ch14.qxp 02\/04\/07 21:54 página 475
FIGURA 14.5
Tabelas do sistema no painel de navegação.
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 configuração específica do registro; pode
se HKEY_CURRENT_ACCESS_PROFILE ou HKEY_LOCAL_MACHINE.
Acesso Adicionar-ins, o HKEY_CURRENT_ACCESS_PROFILE é preferível,
porque ele usa automaticamente a seção do registro para a versão em execução do
Acesso, permitindo que o mesmo add-in para trabalhar em várias versões do Access.
Tipo Número 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 próprias 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. Não altere o nome de campo, porque cada
Esta tabela deve ter um nome específico para funcionar corretamente.
NOTA NOTA
476
Adicionando mais funcionalidades ao Office
Parte III
20_047026 ch14.qxp 02\/04\/07 21:54 página 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 padrão de GenUniqueID()
no campo tipo, e também tem algumas informações úteis na coluna Descrição, informando a
valor necessário para cada tipo de dados de campo, como mostrado na Figura 14.7.
FIGURA 14.7
Uma tabela USysRegInfo importada com informações de descrição.
Cada tipo de suplemento requer um conjunto de registros na tabela USysRegInfo, conforme descrito a seguir
seções. O Extras 2007 add-in que é o exemplo add-in para este capítulo é um conjunto de menu add-ins,
que será descrita em detalhes; para os outros suplemento tipos fizer referência a dois suplementos que eu cre -
ated em versões anteriores do Access.
Você pode pensar que os suplementos seriam encontrado na guia Add-Ins da faixa de opções no Access
2007 (este guia pode não estar visível se você estiver executando o Windows Vista). Mas este não é o
caso. Seu acesso suplementos estão localizados no menu Add-ins da guia ferramentas de banco de dados. O guia de suplementos
tem um conjunto de menus como nas versões anteriores do Access, exceto que eles não funcionam. A finalidade
desses menus não-funcional é exibir menus de comandos colocados no Access 2003 (ou anteriores)
por suplementos trabalhando com a coleção CommandBars. Este é um método muito difíceis de implementar-
ing para trás compatibilidade; Se você tiver tal um add-in, você provavelmente vai querer refazê-lo para colocar
comandos em várias guias da faixa de opções, conforme descrito no capítulo 15.
NOTA NOTA
477
Criando suplementos do Access
14
20_047026 ch14.qxp 02\/04\/07 21:54 página 477
Menu Add-ins
Um suplemento de menu tem três 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 informações de chave do registro, fazendo referência a seção do Menu Add-Ins sob o
Chave HKEY_CURRENT_ACCESS_PROFILE (que faz referência a execução 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 início de um novo suplemento de ing. Os campos ValName e o valor estão 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 \/ espaço reservado para apontar para a pasta de suplementos (em versões anteriores do
Acesso, esta foi a pasta de acesso próprio, o que explica o nome).
No suplemento terceira linha, o campo de tipo tem um valor de 1, o campo ValName tem o valor
\"Expressão\" e o campo de valor tem o nome da função a ser executada (precedido por um igual
assinar e seguido por um par de parênteses).
Na tabela 14.3, que lista as três linhas para o comando \"Back up Database\" sobre os suplementos
menu, o texto em itálico é a informação específica para este add-in; as outras informações são 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 capitalização do \"Menu Add-ins\" para adicionar Menu-
Ins\"(capitalizando o eu); Se você deixá-lo em quanto a versões anteriores do Office e Windows,
você não será capaz de instalar o suplemento.
TABELA 14.3
USysRegInfo linhas necessárias 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 Expressão =BackupFrontEnd()
&Back up Database
Se você fazer cópias de seu banco de dados add-in biblioteca de vez enquanto trabalhava nele
(sempre uma boa idéia), não salvar as cópias na pasta suplementos, porque caso contrário eles
vai aparecer como extras seleções na caixa de diálogo Gerenciador de suplementos, e pode não ser claro qual é o lat-
versão do est do add-in ao instalar ele, ou qual versão 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 página 478
Assistentes
Meu esquemas projeto add-in (que finalmente pode ser aposentado por causa do superior de características de formatação
de acesso 2007) contém várias Form Wizard suplementos.
Assistente de formulário Adicionar-ins precisa quatro linhas na tabela USysRegInfo, conforme descrito na lista a seguir
(a sintaxe é semelhante para assistentes de relatório):
Na primeira linha do add-in, o campo subchave (que é o mesmo para todos do add-in
linhas) tem as informações de chave do registro, fazendo referência a seção forma assistentes sob o
Chave HKEY_CURRENT_ACCESS_PROFILE (que faz referência a execução 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 início de um novo suplemento de ing. Os campos ValName e o valor estão em branco.
No add-in segunda linha, o campo de tipo tem um valor de 1, o campo ValName tem o valor
\"Descrição\" e o campo de valor tem o texto para exibir na tela inicial do assistente — no
caso do Assistente de formulário personalizado, que é a caixa de diálogo novo formulário.
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 \/ espaço 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
\"Função\" e o campo de valor tem o nome da função executar (sem um sinal de igual).
Tabela 14.4 lista as linhas USysRegInfo para o comando do Assistente de formulário personalizado no menu suplementos
Esquemas do projeto Adicionar-in.
TABELA 14.4
Linhas USysRegInfo necessárias para um Form Wizard Add-in
Subchave Tipo ValName Valor
HKEY_CURRENT_ACCESS_PROFILE\/assistentes \/ 0
Assistente de formulário do formulário personalizado assistentes
HKEY_CURRENT_ACCESS_PROFILE\/assistentes \/ 1 Descrição Selecione um tipo de forma e cor
Assistente de formulário do formulário 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 formulário do formulário personalizado assistentes
HKEY_CURRENT_ACCESS_PROFILE\/assistentes \/ 1 Função StartDSWizard
Assistente de formulário do formulário personalizado assistentes
479
Criando suplementos do Access
14
20_047026 ch14.qxp 02\/04\/07 21:54 página 479
Um menu add-in, a função de chamada do Adicionar-in é precedida por um sinal de igual; em um
Assistente para adicionar-in, não 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 execução no Windows XP, porque a Microsoft ainda não implementada automático
objeto e controle de nomeação de acordo com uma Convenção de nomenclatura. Este add-in permite automaticamente
renomear objetos de banco de dados e controles de formulário e relatório de acordo com a nomenclatura de Leszynski
Convenção. Ele inclui vários menu add-ins e Propriedade dois construtores, que vão da
Nome de propriedade de um controle (para renomear um controle único) ou a seção de detalhes de um formulário ou relatório
(para renomear todos os controles em um formulário ou relatório).
Para mais detalhes sobre o LNB renomear Adicionar-in, consulte meu livro especialista Microsoft-em-um
Desenvolvimento de aplicações 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 informações de chave do registro, fazendo referência a seção Propriedade assistentes em
a chave HKEY_CURRENT_ACCESS_PROFILE (que faz referência o atualmente executando
versão 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 início de um novo suplemento de ing. Os campos ValName e o valor estão em branco.
No add-in segunda linha, o campo de tipo tem um valor de 1, o campo ValName tem o valor
\"Descrição\" e o campo de valor tem o texto para exibir na caixa de diálogo Builder — no caso de
do LNCBuilder Assistente de propriedade, que é a caixa de diálogo 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 \/ espaço 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
\"Função\" e o campo de valor tem o nome da função 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.
REFERÊNCIA CRUZADA REFERÊNCIA CRUZADA
NOTA NOTA
480
Adicionando mais funcionalidades ao Office
Parte III
20_047026 ch14.qxp 02\/04\/07 21:54 página 480
TABELA 14.5
USysRegInfo linhas necessárias 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 Descrição 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 Função LNCBuilder
Construtor LNC\/assistentes\/nome de propriedade
Estritamente falando, um banco de dados biblioteca contém suplementos (geralmente várias), mas geralmente a
banco de dados biblioteca inteira é referido como um add-in.
Coisas que você precisa saber quando
Escrever Adicionar-ins
Existem várias coisas para manter em mente quando você tentar gravar seus próprios add-ins. Alguns são
armadilhas que podem impedir o suplemento de funcionamento e outros são recomendações para o bom
Adicionar-no projeto.
Requisitos especiais para o código de suplemento
Quando você executa um add-in, o código está sendo executado de um outro banco de dados (o suplemento biblioteca
banco de dados), e você precisa ter isso em conta ao fazer referência a objetos de banco de dados em
seu código. 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 referência a um objeto do banco de dados chamada, use
CurrentDb (ambos CodeDb e CurrentDb são usados no Extras 2007 suplemento do código).
Apenas funções podem ser executadas a partir do registro; todos os procedimentos referenciados na
Tabela USysRegInfo deve ser funções, até mesmo, um procedimento que normalmente seria um Sub
(porque ele não retorna um valor). No entanto, outros procedimentos utilizados na biblioteca do suplemento
banco de dados (os que não são executados diretamente do registro e não são 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 página 481
Um suplemento pode exibir formulários, geralmente como caixas de diálogo não acopladas. Normalmente, todos os suplementos excepto
menu add-ins. use uma ou mais formas (e menu add-ins pode usar formulários também). Os Extras
suplemento do 2007 tem um formulário de configuração onde os usuários podem inserir informações que serão usadas pela var-
procedimentos de IOUs add-in.
Você pode fazer referência a tabelas no banco de dados biblioteca Adicionar-in usando o CodeDb sintaxe, que
permite que você armazene dados do suplemento em tabelas se necessário. Isso é útil quando você deseja armazenar infor-
mação que será usada para todos os bancos de dados, executando o add-in, por exemplo, as listas de tabela
e prefixos para a exclusão de tabelas de consulta e consulta da listagem, 2007 Extras Adicionar-in.
Substituir macros e consultas com código a execução de funções públicas, assim eles podem ser executados
directamente a partir de módulos da biblioteca.
Formulários vinculados, executados a partir de um suplemento tem como suas tabelas de origem do registro do banco de dados do código,
não 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 código após o enchimento com dados de chamada
banco de dados, como eu faço Extras 2007 add-in para consulta e tabela e opções de backup,
campos.
O DDL CreateTable instrução cria uma tabela no banco de dados atual; Se você precisa
criar uma tabela do banco de dados do código, você deve usar o mais complexo TableDef
método DAO, especificando CodeDb como o banco de dados no qual deseja criar a tabela.
Um suplemento que pretendiam trabalhar em ambos Access 2007 e versões anteriores do Access podem precisar
para processar as extensões. mdb e. accdb, ou lidar com o novo tipo de dados anexo.
Quando oCopyObject método é executado a partir de um suplemento, o código 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 cópia 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 faço no Extras 2007 suplemento do código. Caso contrário, 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 método do objeto DoCmd funciona em
tabelas do banco de dados chamada e o OpenQuery método funciona em tabelas no código
banco de dados.
Dicas sobre adicionar-em construção
Ao criar o tipo de assistente Adicionar-ins, você pode fazer, em seguida, mais user-friendly, modelagem sua
aparência após o built-in acessar o Adicionar-ins. Access 2007 possui muitos novos recursos de interface, mas o
assistentes muito a mesma aparência como nas versões anteriores (formato Access), embora possa haver alguns
cosméticas diferenças 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 configurações listadas aqui:
Conjunto AutoCentralizar Propriedade dos formulários 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 página 482
Desative botões de navegação.
Se seu assistente tem várias formas, certifique-se de que os controles usados em mais de uma forma em
uma série de telas do Assistente para aparecer no mesmo lugar em cada formulário.
Faça de todas o formas diálogo Assistente de caixas, definindo sua propriedade Modal para Sim, PopUp
Sim e BorderStyle para a caixa de diálogo, para que o usuário não é possível mover para a próxima 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 formulários do assistente.
O código de suplemento de Extras
O código que implementa a funcionalidade do add-in para a criação de cópias de backup do banco de dados ou
seu back-end e para a lista de campos de tabela e consulta, está listado na seção seguinte.
Opções extras
O módulo de formulário fdlgExtrasOptions contém o código por trás da caixa de diálogo opções Extras, onde
você pode configurar suas preferências para o backup, salvar a pasta ou os prefixos excluir quando listagem
campos:
Opção Compare Database
Opção explícita
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 próximo
DoCmd.Close acSaveNo de acForm, Me.Name,
End Sub
483
Criando suplementos do Access
14
20_047026 ch14.qxp 02\/04\/07 21:54 página 483
Private Sub cmdCustomBackupPath_Click()
No erro GoTo ErrorHandler
Dim strSelectedPath As String
Crie um objeto FileDialog como uma caixa de diálogo 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 então
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 \"usuário 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 próximo
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 página 484
Em erro continuar próximo
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 página 485
Salve a opção do usuário 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 módulo
O módulo padrão de basExtras contém funções que são chamadas de tabela USysRegInfo:
Função pública 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 informações de propriedades de banco de dados no banco de dados chamada e gravá-los em zstblBackupChoices em
banco de dados de código para uso como fonte de registro do formulário:
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 página 486
RST.MoveFirst
RST.Editar
RST![BackupChoice] = strBackupChoice
RST![BackupPath] = strBackupPath
RST.Atualização
RST.Fechar
Em erro continuar próximo
Copie a tabela zstblBackupInfo no banco de dados chamada, se necessário:
strCallingDb = CurrentDb.Name
strTable = \"zstblBackupInfo\"
Definir tdfsCalling = dbsCalling.TableDefs
Definir tdfCalling = tdfsCalling(strTable)
Se tdfCalling não é nada então
Debug. Print strTable
DoCmd.CopyObject destinationdatabase: = strCallingDb, _
NewName: = strTable, _
sourceobjectType: = _ acTable,
SourceObjectName: = strTable
Debug. Print \"Copiado\"
End If
Abra o formulário de diálogo para selecionar as opções:
strForm = \"fdlgSetExtrasOptions\"
DoCmd. OpenForm nomedoformulário: = strForm, _
exibição: = acNormal, _
windowMode: = acDialog
ErrorHandlerExit:
Exit Function
ErrorHandler:
MsgBox \"erro nenhum:\"
& “; Description: “ & err.Description
Resume ErrorHandlerExit
End Function
Função pública CopyListObjects()
' Chamado de listTableFields() e ListQueryFields()
Em erro continuar próximo
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 página 487
Copie vários objetos no banco de dados chamada, se eles já não existem. Esses objetos são necessários 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 não é nada então
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 não é nada então
DoCmd.CopyObject destinationdatabase: = strCallingDb, _
NewName: = strReport, _
sourceobjectType: = acReport, _
SourceObjectName: = strReport
End If
strReport = \"zsrptQueryAndFieldNames\"
Conjunto doc = CTR.Documents(strReport)
Se o doc não é nada então
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 página 488
Faça backup de dados
O BackupFrontEnd função é chamada de tabela USysRegInfo para fazer backup de dados atual-
base para o caminho selecionado na caixa de diálogo opções Extra:
Função pública 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 seqüência de caminho de backup, dependendo da escolha do usuário, com um padrão de 2 (\"pasta Backups
sob a pasta de banco de dados\") no caso do usuário não 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 página 489
Pasta personalizada
strBackupPath = strPath
End Select
Debug. Print \"caminho do Backup:\"
Verifique se o caminho é válido.
Em erro continuar próximo
Definir sfld = fso.GetFolder(strBackupPath)
Se sfld não é nada então
Se strBackupChoice = \"3\", em seguida,
strTitle = \"Caminho inválido\"
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 não tiver sido feita a instalação, copie zstblBackupInfo no banco de dados chamada:
strCallingDb = CurrentDb.Name
strTable = \"zstblBackupInfo\"
Definir tdfCalling = dbsCalling.TableDefs(strTable)
Se tdfCalling não é nada então
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 página 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, _
Título: = strTitle, padrão: = strProposedSaveName))
Lidar com usuário 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
.Atualização
.Fechar
Terminar com
FSO.CopyFile Source:=CurrentDb.Name _
destino: = strSaveName
ErrorHandlerExit:
Exit Function
ErrorHandler:
MsgBox \"erro nenhum:\"
Err.Descrição
Resume ErrorHandlerExit
End Function
Backup de banco de dados Back End
O BackupBackEnd função é chamada de tabela USysRegInfo para fazer backup de dados atual-
back-end do base (se houver) para o caminho selecionado na caixa de diálogo opções Extra:
Função pública 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 página 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 seqüência de caminho de backup, dependendo da escolha do usuário.
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 não.
strBackEndDBNameAndPath = \"\"
Em erro continuar próximo
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 <>\"\" então
strBackEndDBNameAndPath = Mid (strConnect, _
InStr (strConnect, \"=\") + 1)
Debug. Print \"nome do db do fim e o caminho de volta:\" _
& strBackEndDBNameAndPath
GoTo ContinueBackup
End If
Próxima tdfCalling
No erro GoTo ErrorHandler
492
Adicionando mais funcionalidades ao Office
Parte III
20_047026 ch14.qxp 02\/04\/07 21:54 página 492
Não encontradas de tabelas vinculadas.
strTitle não = \"Nenhum back-end\"
strPrompt = \"Não 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 seqüência 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 próximo
Verifique se o caminho de back-end é válido.
Definir sfld = fso.GetFolder(strBackEndDBPath)
Se sfld não é nada então
strTitle = \"Caminho inválido\"
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 instalação não tenha sido feita, copie zstblBackupInfo para chamar o banco de dados.
strCallingDb = CurrentDb.Name
strTable = \"zstblBackupInfo\"
Definir tdfCalling = dbsCalling.TableDefs(strTable)
Se tdfCalling não é nada então
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 página 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 próximo
Verifique novamente se o demarcador selecionado é válido.
Definir sfld = fso.GetFolder(strBackupPath)
Se sfld não é nada então
Se strBackupChoice = \"3\", em seguida,
strTitle = \"Caminho inválido\"
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 página 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, _
Título: = strTitle, padrão: = strProposedSaveName))
Lidar com usuário 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
.Atualização
.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 função (chamada de tabela USysRegInfo) lista os campos em toda a
Selecione consultas no banco de dados, usando a coleção QueryDefs do modelo de objeto DAO:
Função pública ListQueryFields()
' Chamado de USysRegInfo
Em erro continuar próximo
Chame CopyListObjects
495
Criando suplementos do Access
14
20_047026 ch14.qxp 02\/04\/07 21:54 página 495
Definir dbsCode = CodeDb
Definir dbsCalling = CurrentDb
Exclua tabela antiga no banco de dados de código (se houver).
strTable = \"zstblQueryAndFieldNames\"
Definir tdfsCode = dbsCode.TableDefs
Definir tdfCode = tdfsCode(strTable)
Se tdfCode não é nada, então
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 não é nada, então
tdfsCalling.Delete (strTable)
End If
Crie uma nova tabela em branco do banco de dados de código para preencher com dados:
DoCmd.CopyObject destinationdatabase: = strCodeDB, _
NewName: = strTable, _
sourceobjectType: = _ acTable,
SourceObjectName: = strTable
Preencha a tabela do banco de dados de código 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
!Necessário = FLD.Necessário
.Atualização
Terminar com
Próxima fld
End If
496
Adicionando mais funcionalidades ao Office
Parte III
20_047026 ch14.qxp 02\/04\/07 21:54 página 496
Próxima qdf
RST.Fechar
Copiar a tabela preenchida no banco de dados chamada assim estará disponível para impressão 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 relatório 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 função (chamada de tabela USysRegInfo) lista os campos em toda a
tabelas no banco de dados, usando a coleção TableDefs do modelo de objeto DAO:
Função pública ListTableFields()
' Chamado de USysRegInfo
Em erro continuar próximo
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 código (se houver):
strTable = \"zstblTableAndFieldNames\"
Definir tdfsCode = dbsCode.TableDefs
Definir tdfCode = tdfsCode(strTable)
Se tdfCode não é nada, então
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 não é nada, então
tdfsCalling.Delete (strTable)
End If
Crie uma nova tabela em branco do banco de dados de código para preencher com dados:
DoCmd.CopyObject destinationdatabase: = strCodeDB, _
NewName: = strTable, _
sourceobjectType: = _ acTable,
SourceObjectName: = strTable
Preencha a tabela do banco de dados de código 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
!Necessário = FLD.Necessário
.Atualização
Terminar com
Próxima fld
End If
Próxima 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á disponível para impressão 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 relatório 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 funções são chamadas de vários 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 vários 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 página 499
ErrorHandler:
Se errar.Número = 3270 então
A propriedade não 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
Público função GetProperty(strName As String, _
strDefault As String) como variante
' Chamado de vários 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.Número = 3270 então
A propriedade não foi encontrada; Use valor padrão:
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 página 500
O SaveNo e BackEndSaveNo funções de criar um número incrementado para o banco de dados (ou
cópias de banco de dados back-end):
SaveNo() função pública como String
' Chamado de BackupFrontEnd()
No erro GoTo ErrorHandler
Crie um exclusivo incrementando salvar número para hoje:
intDayNo = Nz (DMax (\"[SaveNumber]\", \"zstblBackupInfo\", _
\"[SaveDate] = Date()\"))
Debug. Print \"dia nenhum.\"
strNextNo = CStr(intDayNo + 1)
Debug. Print \"próximo n.\"
SaveNo = strNextNo
ErrorHandlerExit:
Exit Function
ErrorHandler:
MsgBox \"erro nenhum:\"
Err.Descrição
Resume ErrorHandlerExit
End Function
BackEndSaveNo() função pública como String
' Chamado de BackupBackEnd()
No erro GoTo ErrorHandler
Crie um único salvar número para hoje:
intDayNo = Nz (DMax (\"[BackEndSaveNumber]\", _
\"zstblBackupInfo\" _
\"[BackEndSaveDate] = Date()\"))
Debug. Print \"Back final dia não.\"
strNextNo = CStr(intDayNo + 1)
Debug. Print \"Back end no próximo.\"
BackEndSaveNo = strNextNo
ErrorHandlerExit:
Exit Function
ErrorHandler:
MsgBox \"erro nenhum:\"
Err.Descrição
Resume ErrorHandlerExit
End Function
501
Criando suplementos do Access
14
20_047026 ch14.qxp 02\/04\/07 21:54 página 501
Finalizando o Add-in
Depois de obter as suas funções, formas e outros objetos para funcionar corretamente, a etapa final é para entrar
informações de identificação em propriedades específicas da folha de propriedades da biblioteca do banco de dados, para dar
informações aos usuários sobre o add-in quando ele é listado na caixa de diálogo Gerenciador de suplementos. As informações
sobre um add-in que aparece no Gerenciador de suplemento diálogo vem da página 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 título valor do campo é exibido como nome do suplemento na lista de suplementos disponíveis.
O valor do campo Company (campo não o autor, como você poderia esperar) aparece como o
Adicionar-em nome do autor da lista de suplementos disponíveis.
Valor do campo de comentários aparece como descrição no suplemento na parte inferior do Add-
Na caixa de diálogo do Gerenciador.
502
Adicionando mais funcionalidades ao Office
Parte III
20_047026 ch14.qxp 02\/04\/07 21:54 página 502
FIGURA 14.9
Inserindo informações de identificação do suplemento na folha de propriedades.
Solucionando problemas de suplementos
Se você precisar depurar código de add-in para determinar o que está causando o problema, você tem dois
Opções. Uma é colocar um Parar instrução o código add-in, que vai parar o código nesse ponto
quando ele está em execução, então você pode percorrer o código 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 instrução, salvar
fechar o Adicionar-in, abrir um banco de dados e executar o add-in que tem o Parar instrução no seu
código. Mais tarde, você precisará de remover o Parar declaração do código de suplemento de forma semelhante.
A alternativa de outra (e rápida) é definir uma referência para o banco de dados da biblioteca, assim você pode abrir sua
módulos de código e coloque pontos de interrupção e até mesmo modificar o código temporariamente, para testar várias alterna-
maristas. Para definir uma referência a um banco de dados do Access add-in biblioteca, execute as seguintes etapas:
Se você pretende definir uma referência a um banco de dados biblioteca, assim você pode depurar seu código eas-
Sabrina (como descrita em seguida), dar seu projeto Visual Basic um nome significativo, então ele vai dizer
\"Extras\" (ou qualquer outro) em vez de \"Projeto1\" nas referências diálogo. 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 página 503
FIGURA 14.10
Renomeando projeto um add-in do.
1. Abra um módulo em qualquer banco de dados do Access e selecione Ferramentas, referências para abrir o
Caixa de diálogo References, conforme mostrado na Figura 14.11.
FIGURA 14.11
A caixa de diálogo referências no Access 2007.
504
Adicionando mais funcionalidades ao Office
Parte III
20_047026 ch14.qxp 02\/04\/07 21:54 página 504
2. Clique no botão 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 referência a um acesso
2003 ou anterior. (MDA) biblioteca banco de dados, ou todos os arquivos (*. *) para definir uma referência para um acesso
banco de dados biblioteca de 2007 (accda) (Ver Figura 14.12).
FIGURA 14.12
Definir uma referência a um banco de dados do Access 2002-2003 biblioteca.
3. Clique em abrir para definir a referência; o nome do projeto do add-in agora aparece marcado na
o diálogo de referências, como mostrado na Figura 14.13.
FIGURA 14.13
Uma referência a um banco de dados biblioteca Adicionar-in.
505
Criando suplementos do Access
14
20_047026 ch14.qxp 02\/04\/07 21:54 página 505
4. Agora você pode ver o add-in projeto no Project Explorer e abra seu módulo (s) e
trabalho com eles como módulos do banco de dados atual, como mostrado na Figura 14.14.
FIGURA 14.14
Abrindo um Adicionar-in módulo na janela de um banco de dados do Visual Basic.
Embora você pode editar o código em um banco de dados biblioteca depois de definir uma referência a ele e correr
o código para testar se as modificações corrigir um problema, as alterações não são salvas para
o banco de dados biblioteca, então salvar qualquer modificado o código 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.
Interpretação 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 página 506
Às vezes, esse erro ocorre quando você fez alterações para o suplemento, mas acesso ainda está em execução
o código antigo. No caso esta é a causa do problema, tente desinstalar o add-in, Add-in
Gerenciador de diálogo 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 função para
Use a tabela USysRegInfo (somente funções podem ser chamadas de registro), ou você alterou o
nome da função a ser chamado, portanto, o um no registro não pode ser encontrado. Verifique se o func -
entradas de ção na tabela USysRegInfo correspondem aos nomes de função no banco de dados biblioteca (e que
os procedimentos chamados são funções, não subs).
Se um formulário em seu Adicionar-in não aparece quando a função que deve abri-lo é executada, sem qualquer
mensagem de erro, isso pode ser porque a fonte de registro do formulário está ausente. Você não vai obter um erro; o
forma apenas não abre. Verifique se a fonte de registro do formulário existe e situa-se a dados de código-
base, não chamado banco de dados. Em alguns casos pode ser necessário preencher uma tabela chamada dados-
base e depois copiá-lo de volta para o banco de dados de código para usar como fonte de registro de um formulário, como faço
Extras Adicionar-in.
Se você receber um erro \"este recurso não está instalado\" mensagem quando tentar executar o suplemento, pode
resultar de qualquer número de erros no código do suplemento. Em primeiro lugar, verificar problemas no seguinte
áreas:
Sintaxe incorreta em uma Adicionar-in função (por exemplo, o número errado ou tipo de argumen-
mentos).
Incompatibilidade entre o módulo de código e o nome da função na tabela USysRegInfo.
Nome do suplemento foi mudado, mas a referência a ele na tabela USysRegInfo ainda tem
o nome antigo.
Erros de sintaxe geral o código de suplemento.
O código de add-in não 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 necessário 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á disponível
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 execução no Windows XP, a pasta de suplementos é no mesmo lugar como
no Office 2003, c: \/ Documents and Settings \/ Nome de usuário \/ Application Data\/Microsoft\/AddIns; Se você
estiver executando o Windows Vista, a pasta de suplementos está em j: \/ usuários\/Helen Feddema\/AppData\/Roaming \/
Microsoft\/AddIns.
507
Criando suplementos do Access
14
20_047026 ch14.qxp 02\/04\/07 21:54 página 507
Se você está tentando instalar um suplemento no Access 2007 sendo executado no Windows Vista, você pode
recebo um aviso de segurança. 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 seleção \"Executar como administrador\". Agora, você deve ser capaz de instalar o suplemento.
Outro requisito de Vista: na tabela USysRegInfo, alterar a capitalização do \"Menu Add-ins\"
(para \"Menu Add-Ins\", com um capital eu). De acordo com a Microsoft, serão abordada neste maiúsculas e minúsculas
em um serviço próximo patch, mas você precisa fazer a mudança para habilitar o menu add-ins para trabalhar
Vista agora mesmo.
Se você prefere manter seus próprios add-ins em uma pasta personalizada, você pode adicionar outra pasta à lista de
locais confiáveis para selecionar arquivo, opções de acesso e, em seguida, selecionar a página da central de confiabilidade do
Acesse a caixa de diálogo de opções, como mostrado na Figura 14,16.
Consulte a barra lateral \"Recebendo seu Adicionar-ins para trabalho em Vista\" no capítulo 15 para mais infor-
ção sobre os requisitos específicos para a instalação de add-ins no Windows Vista.
FIGURA 14,16
A página da central de confiabilidade da caixa de diálogo Opções do Access.
Clique no botão Configurações da central de confiar e selecione a página de locais confiáveis. Em seguida, use o \"Adicionar novo
botão de localização\"para adicionar a pasta onde você deseja armazenar seu Adicionar-ins, como mostrado na Figura 14,17.
REFERÊNCIA CRUZADA REFERÊNCIA CRUZADA
508
Adicionando mais funcionalidades ao Office
Parte III
20_047026 ch14.qxp 02\/04\/07 21:54 página 508
Em seguida, abra qualquer banco de dados do Access e selecione a guia ferramentas de banco de dados da faixa de opções, 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 confiáveis.
FIGURA 14,18
Abrindo o Gerenciador de suplemento no Access 2007.
Depois de abrir o Gerenciador de suplemento, parece apenas que o diálogo familiar de anteriores ver-
Sion de acesso, listando os add-ins que são encontrados na pasta AddIns e deixá-lo a instalar ou
desinstalá-los. Para instalar o suplemento do 2007 Extras, selecione-o e clique no botão 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.
Após clicar em instalar, um x aparece à esquerda do instalado Adicionar-in, e quando você fechar o Adicionar-
No Gerenciador, várias novas seleções 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 três menu suplementos começando com \"Renomear\" na parte inferior da lista são de minha
LNB renomear add-in.
Usando o Extras 2007 Add-in
Depois de instalar o Extras 2007.accda suplemento, você pode executar seus três menu add-ins de suplementos
menu, que é encontrado no grupo ferramentas de banco de dados na faixa de opções de ferramentas de banco de dados.
Se você estiver criando um add-in que pode ser usado em várias versões do Access (não
precisa de alguma especiais novos recursos do Access 2007 e não cria menus ou barras de ferramentas
que só funcionará em versões mais antigas), criar o add-in em um formato mais velho, então ele pode ser executado em ambos os
Access 2007 e versões mais velhos. O suplemento do LNC Rename.mda será executado em qualquer versão do acesso de
Acessar 2000 através 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 página 510
Opções extras
Esta seleção abre uma caixa de diálogo de configuração (mostrada na Figura 14.21) com um grupo de opções para selecionar o
pasta para armazenar os backups de banco de dados e dois subformulários 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 são pré-preenchidos com sistema prefixos, hífens e sublinhados e \"Copiar de\"
(este último é o prefixo usado em cópias de objeto do Access 2007).
Se você selecionar a opção Custom Path, um botão 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, são armazenados no banco de dados código, então eles
são as mesmas para todos os bancos de dados.
Você não precisa abrir a caixa de diálogo de instalação de Extras para usar o outro menu add-ins; Se você ainda não fez
Todas as seleções, o código usa a opção de backup padrão da opção 2 (pasta de Backups em banco de dados
pasta) e os prefixos padrão.
511
Criando suplementos do Access
14
Assinar o código de Add-in com uma assinatura Digital — não!
Y
ou pode ser usado para assinar bancos de dados de código em Access 2003 (ou anterior) com uma assinatura digital (veja
barra lateral de \"Criar uma assinatura Digital para a assinatura de seu código VBA do Access\" no capítulo 12 para
detalhes sobre como criar sua assinatura digital pessoal). Pode parecer uma boa idéia assinar um
Código 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 módulo do add-in, você terá um longo e intrigante mensagem (consulte a fig-
URE abaixo). Observe que o formato accda não é mencionado.
Você pode seguir as instruções 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
extensão. accdc). Mas se você tentar instalar o arquivo accdc como um add-in, você receberá um
Mensagem de erro \"formato de banco de dados não reconhecido\" e você não pode instalar o arquivo de pacote assinado. Assim
(neste momento, pelo menos) não há nenhuma maneira de assinar digitalmente um banco de dados do Access 2007 suplemento biblioteca.
20_047026 ch14.qxp 02\/04\/07 21:54 página 511
FIGURA 14.21
O diálogo de instalação de add-ins Extras 2007.
Faça backup de dados
Esta opção 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 cópia do banco de dados em um InputBox, então você pode editá-lo se
desejada, por exemplo adicionar informações específicas sobre um marco alcançado. A InputBox é
mostrado na Figura 14.22.
Backup de banco de dados Back End
Esta opção 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 não contém 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 cópia 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 página 512
Campos de consulta da lista
Este comando preenche uma tabela com os nomes das consultas select (omitindo aqueles cujos prefixos são em
a lista de exclusão) e seus nomes de campo e ofertas para imprimir um relatório baseado na tabela. A tabela é
mostrado na Figura 14.23.
Apenas consultas select serão listadas. Embora sejam de consultas de outros tipos (consultas de ação)
não listados por nome na coleção QueryDefs, eles têm 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 é incluído na consulta duas vezes. O
campos na tabela são listados na ordem em que eles ocorrem na consulta no modo design; o relatório
com base nesta tabela dá uma listagem alfabética, conforme mostrado na Figura 14.24.
A tabela e relatório são 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 página 513
FIGURA 14.24
O relatório 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 técnicas especiais necessárias para criá-los, um grande
forma de reforçar seu acesso bases de dados com funcionalidades extras, mesmo apoiando várias versões
de acesso.
Resumo
Este capítulo tratou criando Adicionar-ins de acesso em formato de banco de dados de biblioteca do Access 2007 (accda)
(você pode usar as mesmas técnicas 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 código 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 próximo capítulo cobre usando XML da faixa de opções para trabalhar com a faixa de opções 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 página 514
A
s um usuário avançado ou desenvolvedor, você pode ser usado para manualmente personaliz-
ing o acesso as barras de ferramentas e menus, removendo os controles, você não
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 funções para execução de comandos de menu ou botões da barra de ferramentas personalizada. Se
você pretende continuar estas práticas no Access 2007, você é dentro para um choque.
O novo Office 2007 fita é uma alteração de interface principal de acesso (também
como os outros aplicativos do Office), e requer uma mudança importante no programa -
técnicas de Ming para personalizar a interface de acesso. Em vez de trabalhar
com a coleção CommandBars para criar menus e barras de ferramentas ou adicionar com-
mands para os padrões, você personalizar a faixa de opções com código XML
armazenados em uma tabela, trabalhando com guias e grupos em vez de menus e ferramenta-
barras (embora a faixa de opções incluem um menu-o menu do Office — e
uma barra de ferramentas, a barra de ferramentas de acesso rápido).
Para outros aplicativos do Office, como Word e Excel, personalização da faixa de opções
requer a criação e carregando um documento XML separado, mas no Access, você
tem uma opção muito mais conveniente: basta criar uma tabela contendo o XML
código para a criação da faixa de opções, carregá-lo automaticamente, fechando e reabrindo
o banco de dados e em seguida, selecione a faixa de opções que você deseja usar a partir do acesso
Tela de opções. Depois de um fechamento de mais e a reabertura do banco de dados, sua
Personalizações da faixa de opções irão aparecer.
515
NESTE CAPÍTULO
Personalizar a faixa de opções em uma
Banco de dados Access
Personalizar a faixa de opções com um
Suplemento de acesso
Ferramentas para trabalhar com XML
código
Personalizar a faixa de opções
com XML no Access
Bancos de dados e adicionar-ins
21_047026 ch15.qxp 02\/04\/07 22:06 página 515
516
Adicionando mais funcionalidades ao Office
Parte III
Fontes de informações sobre como personalizar a faixa de opções
T
Ele MSDN documentar \"Personalizando a Interface do usuário da faixa de opções Office (2007) para desenvolvedores\"
(Partes 1 a 3) é uma referência muito útil ao criar o XML da faixa de opções para acesso (e outros
Aplicativos do Office).
A lista de IDs de controle (Controls.xls de fita de acesso) é de valor inestimável para trabalhar com a faixa de opções; ele
listas de controle, grupo e nomes de guia que você precisa para usar ao criar código XML da faixa de opções. 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.
Vários blogs também são recursos valiosos para obter informações sobre como trabalhar com a faixa de opções em VBA ou VB
código: blog do Erik Rucker, consulte a 13 de julho de 2006 postar sobre como personalizar a nova interface do usuário para acesso
informações sobre como personalizar a faixa de opções de acesso. Os blogs mantidos por Jensen Harris e Patrick
Schmid têm muita informação valiosa sobre a personalização da faixa de opções (Jensen Harris é o programa
Gerente responsável pela equipe de interface do usuário do Office e Patrick Schmid é um MVP). É o terceiro de cinco blog
também é ú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 têm
mudou desde então, portanto, não é inteiramente exato, especialmente para nomes de grupo e guia.
Aqui estão os links para os recursos mencionados no parágrafo anterior:
Personalizando a Interface do usuário 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 opções no Access 2007:
http:\/\/msdn2.Microsoft.com\/en-US\/
biblioteca\/bb187398.aspx
Fazendo a transição 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
Terço do Blog cinco:
http:\/\/Blogs.msdn.com\/thirdoffive\/
21_047026 ch15.qxp 02\/04\/07 22:06 Page 516
Ferramentas úteis para criação e edição
Código XML
Embora você pode criar código XML em qualquer texto editor — até mesmo o bloco de notas — é muito mais fácil de criar
e editar o código XML em um editor especializado. Vários editores de XML estão disponíveis gratuitamente gratuitamente, ou como
parte de outro aplicativo; eles são descritos nas seções a seguir.
XML Notepad 2007
Uma dessas ferramentas é o XML Notepad 2007, disponível como um download gratuito na página 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 código 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 utilitário de XML Notepad 2007 foi atualizado no final do beta do Office
2007\/Windows Vista e funcionou bem naquela época. Infelizmente, na versão de lançamento
de Vista, ele tem um problema curioso: ele será executado apenas minimizado ou maximizado, não restaurado. Espero que isso
falha vai esclarecer com um patch algum momento em breve. Até então, quando você executar este utilitário, ele aparecerá
minimizado; botão 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 exibição de árvore do editor de XML Notepad 2007.
CUIDADO CUIDADO
517
Personalizar a faixa de opções com XML em bancos de dados Access e suplementos
15
21_047026 ch15.qxp 02\/04\/07 22:06 página 517
A guia de saída XSL deste editor mostra o código em um layout recuado, como mostrado na Figura 15.2.
Editor de XML do VB 2005
Se você tem uma edição 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
Página do Studio do site da web Microsoft encontrados aqui: http:\/\/msdn.Microsoft.com\/vstudio\/
Express\/vb\/download \/ ), estas edições do VB e SQL Server contêm também editores de XML. Consulte
Figura 15.4 no final deste capítulo para a exibição de código XML neste editor.
FIGURA 15.2
A guia de saída 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 usuário personalizada, para uso na escrita de código XML para personalizar o Office
Fita de 2007.
Eu instalei este utilitário, 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 contém o arquivo cor-
rupted dados. No entanto, eu era capaz de copiar o código XML para a área de transferência e colá-lo no editor
janela. Custom UI Editor (Ver Figura 15.3) não é tão útil para edição de código de XML da faixa de opções, como
o Editor de XML do VB 2005 ou XML Notepad 2007, então 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 página 518
Se você tiver o Visual Studio 2005 (qualquer edição), use seu editor de XML embutido; caso contrário, eu recomendo
o editor de XML Notepad 2007 para trabalhar com código XML.
FIGURA 15.3
Código XML no Office 2007 Custom UI Editor.
Personalizar a faixa de opções em um acesso
Banco de dados
Se você quiser adicionar guias, grupos ou controles da faixa de opções em um banco de dados do Access, você tem que escrever
XML e (opcionalmente) VBA código — ao contrário de como personalizar menus e barras de ferramentas, você apenas não pode arrastar uma
comando para um local em qualquer barra de ferramentas ou menu, como nas versões anteriores do Access. O único homem-
ual personalização disponível no Access 2007 é adicionando comandos à barra de ferramentas de acesso rápido. Em um
grande mudança de versões anteriores do Office, você não pode adicionar programaticamente comandos para stan-
Dard grupos de fita, ou remover comandos padrão de grupos, embora você pode ocultar guias com-
pletamente, e adicionar novos grupos contendo comandos personalizados.
519
Personalizar a faixa de opções com XML em bancos de dados Access e suplementos
15
21_047026 ch15.qxp 02\/04\/07 22:06 página 519
520
Adicionando mais funcionalidades ao Office
Parte III
Patrick Schmid em personalização de Ribbon do Access 2007
T
He melhor discussão de personalização da faixa de opções 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 personalização da fita nova interface do usuário no Office 2007, minha resposta seria:
demasiado pouco, demasiado difícil. Em comparação com versões anteriores do Office, especialmente o Office 2003, 2007 simplesmente
tem uma deficiência grave de personalização. Na verdade, a maioria dos usuários provavelmente concluirá que a faixa de opções
não pode ser personalizada em tudo.
Em contraste, o Office 2003 é o escritório mais personalizável nunca. Você pode localizar seus menus e ferramenta-
bares em qualquer lugar que você quer na tela, criar seus próprios menus e barras de ferramentas, alterar ícones e
Etiquetas, modificar os menus e barras de ferramentas e assim por diante. Não há quase nenhum limite sobre quais componentes da
UI, um usuário pode alterar. Como personalizar o Office 2003 também é fácil de fazer, como a alteração pode ser alcançada com uma
alguns cliques do mouse.
A interface do usuário da faixa de opções do Office 2007, porém, é uma história completamente diferente. Estática com muito limitado, cus-
tomizability é a descrição, provavelmente a maioria dos usuários, dar-se-ia esta nova interface do usuário. A maioria dos usuários provavelmente só
descobrir a barra de ferramentas de acesso rápido (QAT) e, em seguida, concluir que deve ser isso. É que realmente tudo
não há? Como nós acabou com tal falta de personalização?
Por que o Office 2007 tem uma deficiência de personalização
Microsoft teve de criar a interface do usuário completamente do zero. Se você leu através de alguns da
Bíblia de interface do usuário do Office, você pode ter uma idéia da enorme quantidade de recursos que entrou em criar este novo
INTERFACE DO USUÁRIO. No entanto, mesmo na Microsoft, os recursos são limitados. Portanto, a necessidade de todos os recursos do
nova interface do usuário tinha que ser justificada. Real possibilidade de personalização foi, infelizmente, uma característica que não fazer o corte.
Como explica a Bíblia de interface do usuário do Office, a equipe de interface do usuário não poderia fazer o caso para personalização, se só
~1.9% as sessões de Office 2003 de cerca de 100 milhões usuários estavam com personalização.
O caso é ainda mais fraco, como 85% dessas personalizações envolvem quatro ou menos botões. Por conseguinte,
Microsoft decidiu apoiar o caso encontrado em 99,7% de todos os usuários: nenhuma personalização ou quatro
ou menos botões. Isso deixou o restante 0,3% na chuva. Os 0,3% representam cerca de 1,35 milhões
as pessoas, pois há 450 milhões pagos a clientes do escritório e são também aqueles que são mais susceptíveis de
participar do processo de desenvolvimento do Office, por exemplo, através da participação no beta. Minha opinião
sobre essa abordagem pode ser encontrada no meu projeto com post de estatísticas.
Além deste argumento, uma interface de usuário altamente personalizável, infelizmente, apresenta um apoio maciço
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 usuários não.
21_047026 ch15.qxp 02\/04\/07 22:06 Page 520
Embora você não pode personalizar as abas de faixa de opções padrão e grupos, você pode adicionar novas guias e
grupos para a faixa de opções, embora a técnica é completamente diferente do que escrever código VBA para trabalhar
com CommandBars, como em versões anteriores do Access. Existem vários passos para personalizar o
Fita em um banco de dados do Access:
1. Escreva o código XML para definir as personalizações da faixa de opções.
2. Crie uma tabela no banco de dados Access para armazenar os nomes de fita e seu código XML.
3. (Opcional) Escrever procedimentos de retorno de chamada VBA para executar a partir da faixa de opções 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 opções para carregar o banco de dados.
6. Feche e reabra o banco de dados para carregar a faixa de opções.
Além de criar o XML de código, código do VBA (se necessário) e a tabela, você também tem que fechar e
reabra o banco de dados duas vezes para obter as personalizações da faixa de opções para aparecer — uma vez para carregar a faixa de opções,
e novamente após selecionar a faixa de opções para usar no banco de dados. As próximas seções guiarão-lo
através da personalização da faixa de opções em um banco de dados do Access.
O banco de dados de amostra para esta seção é Ribbon.accdb de teste.
NOTA NOTA
521
Personalizar a faixa de opções com XML em bancos de dados Access e suplementos
15
Por que eu continuar chamando-uma deficiência de personalização?
A Microsoft decidiu que, para fazer os 99,7% de todos os usuários felizes, uma barra de ferramentas era suficiente. Em
a fim de evitar a personalização acidental e tornar-se usuários sempre tem essa barra de ferramentas acessível,
tornou-se não-flutuante. Nasceu, portanto, foi a barra de ferramentas de acesso rápido. Ou seja não o fim do
personalização história embora. Há também uma guia da faixa de opções que você pode ocultar ou mostrar, ou seja o
Guia do desenvolvedor. Você também pode personalizar totalmente a barra de status. Barras de ferramentas e menus criados em um anterior
Versão do Office e pelo legado (significado não - Office 2007) add-ins também podem ser usados, mas não criado,
em 2007. Últimas mas não 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 números de página, cabeçalhos e rodapés podem ser personalizadas
pelo usuário.
Mas é isso. Sério, é isso. Tudo o resto, especialmente a grande maioria da faixa de opções, é estático
e não podem ser personalizados. Portanto, descrevendo o Office 2007 como tendo um \"personalização defi-
cácia\"ou reclamando sobre a falta de personalização nele, reflete adequadamente a situação
em 2007.
21_047026 ch15.qxp 02\/04\/07 22:06 página 521
Criando o código XML
Tabela 15.1 lista alguns dos mais usados elementos XML para personalizar um Access 2007
Faixa de opções.
TABELA 15.1
Elementos XML para uso em personalizar a faixa de opções
Nome do elemento Uso Comentários
customUI O elemento de nível superior para uma faixa de opções personalizada
faixa de opções A definição da faixa de opções Defina o atributo startFromScratch como
\"verdadeiro\"
para criar uma fita de nova e em branco.
(As aspas são necessárias, uma diferença
do código do VBA com sua
Verdadeiro
e
Falso
Palavras-chave.) Se definido como
\"falso\"
ou
omitido, as personalizações sejam aplicadas
para a faixa de opções padrão.
Guia Cria ou faz referência a um guia da faixa de opções
Grupo Cria ou faz referência a um grupo em uma guia
ID Nome exclusivo de um controle personalizado
idMso Nome de um controle padrão
rótulo Texto exibido em um controle
botão Um botão de comando em uma faixa de opções O
onAction
atributo especifica o
nome de uma função a ser executada quando o
botão é clicado.
menu suspenso Uma lista drop-down Automaticamente limitado para seleções de lista.
comboBox Uma lista drop-down que permite entradas manuais Os usuários podem entrar seleções 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 são
\"normal\"
e
\"grande\"
.
SuperTip O texto para exibir o pop-up que aparece
Quando o mouse passa sobre um controle
visível Se o controle é visível ou não As escolhas são
\"verdadeiro\"
ou
\"falso\"
.
habilitado Se o controle está habilitado ou não As escolhas são
\"verdadeiro\"
ou
\"falso\"
.
Nomes de elementos XML usam camel casing notação; a primeira letra do nome do elemento é
minúsculas e outros componentes tem sua primeira letra maiúscula (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 página 522
Você pode começar criando uma tabela para armazenar o código XML da faixa de opções, ou criar o código XML em primeiro lugar, como você
preferem. Se você tem apenas uma tabela de código da faixa de opções, a Convenção é chamá-lo DbRibbons, com o
USys prefixo indicando que é uma tabela de sistema criados pelo usuário. A tabela possui três campos, conforme descrito
na tabela 15.2.
TABELA 15.2
A tabela DbRibbons
Nome do campo Tipo de dados Uso
ID AutoNumeração Campo de ID exclusivo
RibbonName Texto, 255 Nome da faixa de opções personalizada
RibbonXML Memo O código XML com as configurações de faixa de opções
523
Personalizar a faixa de opções 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ê não vai vê-lo, a menos que você ligue o ecrã do sistema
tabelas, abrindo a tela de opções de acesso do menu do Office:
Abrir a tela de opções do Access.
continuou
21_047026 ch15.qxp 02\/04\/07 22:06 página 523
524
Adicionando mais funcionalidades ao Office
Parte III
continuou
Selecione a página de banco de dados atual e clique no botão Opções de navegação:
Abrindo a caixa de diálogo opções de navegação.
Na caixa de diálogo opções de navegação, marque a caixa de seleção \"Mostrar objetos do sistema\":
Transformando-se em exposição de objetos de sistema na caixa de diálogo opções de navegação.
21_047026 ch15.qxp 02\/04\/07 22:06 página 524
525
Personalizar a faixa de opções 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 visível:
A USysDBRibbons tabela no modo folha de dados.
Para mais exaustiva cobertura de XML, consulte XML de Wrox início.
REFERÊNCIA CRUZADA REFERÊNCIA CRUZADA
Embora você possa editar o código XML diretamente na tabela DbRibbons acesso (use Ctrl + Enter para
ir para uma nova linha), é muito mais fácil trabalhar com ele em um editor de XML, como no VB 2005
(padrão ou expressa), ou a utilidade de XML Notepad 2007. Figura 15.4 mostra que o mesmo código
olha como no editor de XML Notepad 2007, depois de abrir o código salvo como Ribbon.
IntelliSense não funciona para o código de acesso da faixa de opções XML no Visual Basic 2005 Express, mas
Ela funciona no Visual Studio 2005.
É muito mais fácil trabalhar com código 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
são codificados por cores e você tem IntelliSense para auxiliar na criação de código. Suporte correspondente (consulte a
à sombra <tabs> e <\/tabs> nomes na figura) também ajuda, caso você começou um entre colchetes
segmento de código e esqueceu de acabar com ela. Para o código XML no editor do Visual Studio 2005, as cores têm
os significados listados na tabela 15.3.
NOTA NOTA
21_047026 ch15.qxp 02\/04\/07 22:06 página 525
FIGURA 15.4
Código XML no editor XML Notepad 2007.
TABELA 15.3
Código de cores para o código XML no Editor XML VB 2005
Cor Componente de código (s)
Vermelho Nome do atributo
Azul Valor do atributo
Delimitador
Palavra-chave
Verde Comentário
Brown Nome
Cinza Tag doc
Instrução 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 página 526
Para que documentos XML ser capaz de usar elementos e atributos que têm a
mesmo nome, mas vêm de fontes diferentes, deve haver uma maneira de diferenciar
entre as várias fontes de elementos de marcação. Em XML, um namespace é uma coleção de nomes, identi-
cados por uma referência de URL, que são usados como tipos de elemento e atributo nomes em documentos XML.
O código XML começa com especificando o namespace como http:\/\/schemas.Microsoft.com\/
escritório\/2006\/01\/customui . Este é o namespace XML apenas usado para faixas de opções do Office 2007.
Em seguida, a faixa de opções startFromScratch atributo está definido como \"false\" (para programadores VBA, observe que
no código XML, a sintaxe é \"falsa\", com as citações, não apenas falsa, como no código VBA). Essa configuração
significa que você está modificando a barra de ferramentas padrão, em vez de criar uma faixa de opções do zero.
As próximas seções mostram como personalizar a faixa de opções de várias maneiras.
Adicionando uma nova guia, grupo e controles da faixa de opções
Para criar uma guia personalizada para a faixa de opções, na seção <tabs>do código 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 código XML para fazer referência a guia, e o rótulo attrib-
Ute é definido com a legenda texto para exibir a guia definir atributo de visível 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 vários
grupos) na guia; para o exemplo de código XML que criei dois botões, cada um deles executa um retorno de chamada
função.
Consulte a que tabela 15.1 para obter uma lista dos mais comumente utilizados elementos para a criação de guias, grupos,
e controles da faixa de opções.
Controles (minimamente) possuem atributos id e label e também um habilitado atributo (geralmente, definido como
\"verdadeiro\" ). Eles geralmente exibem uma imagem, que normalmente é definida com imageMso argumento, usando um
valor correspondente ao botão de fita padrão que tem a imagem que você deseja exibir.
Você não pode remover um controle de um grupo de faixa de opções padrão, ou adicionar um controle a um stan-
Grupo de dard; consulte que a barra lateral no início deste capítulo para Patrick Schmid do iluminando com-
mentary sobre esta questão. Para justificação da Microsoft desta política, consulte o Visão geral de desenvolvedor do
Interface de usuário para o 2007 Microsoft Office System artigo (
http:\/\/msdn2.Microsoft.com\/
en-us\/library\/aa338198.aspx
). Ele se resume a algo como \"nós fizemos a fita perfeita,
assim os usuários não precisam personalizá-lo.\" Escusado será dizer, eu (e muitos outros desenvolvedores e usuários avançados)
discordo. A fita é de fato uma grande melhoria sobre menus e barras de comandos, mas eu realmente
gostaria de ser capaz de arrastar um botão que eu preciso para um grupo padrão ou remover um que eu nunca uso.
Para usar a imagem de formulário em um controle personalizado, use \"CreateForm\" como o valor do argumento imageMso
ao definir o botão em código XML.
Atributo de tamanho do controle tem apenas duas seleções: \"grande\" e \"normal\". Por fim, para um comando
botão, defina o atributo onAction com o nome de uma função a ser executada quando o botão é clicado.
NOTA NOTA
REFERÊNCIA CRUZADA REFERÊNCIA CRUZADA
NOTA NOTA
527
Personalizar a faixa de opções com XML em bancos de dados Access e suplementos
15
21_047026 ch15.qxp 02\/04\/07 22:06 página 527
Removendo um guia ou grupo de faixa de opções
Para remover um dos guias padrão ou grupos da faixa de opções (na realidade, você se escondem, não
excluí-lo), defina o atributo visível 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 código XML desliga-se o padrão
Crie guia:
<tab idMso=\"TabCreate\" visible=\"false\"\/>
528
Adicionando mais funcionalidades ao Office
Parte III
Encontrar nomes de controle para uso no código XML
EU
f você deseja atribuir uma imagem familiar do acesso a um botão na faixa de opções, você precisa saber o
nome do controle de acesso padrão que usa essa imagem, portanto, você pode definir o
imageMso
argumento
para o botão com esse nome. Você pode baixar uma planilha do Excel (AccessRibbonControls.xls) com
Esta informação do
http:\/\/www.Microsoft.com\/downloads\/details.aspx?FamilyId=
4329d9e9-4d11-46a5-898d-23e4f331e9ae
no site da Microsoft.
Mesmo embora o Office 2007 foi lançado, as últimas planilhas de nomes de controle
foram preparados durante o beta (novembro de 2006), e eles não são totalmente precisos
para a versão 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 método que funciona bem para muitos controles: aberto o
Acessar a tela de opções de menu do Office e clique na página de personalização. Esta página é
destina-se para personalizar a barra de ferramentas de acesso rápido, mas também é muito útil para encontrar-se fora de controle
nomes para uso em código XML. Para localizar um nome de controle, primeiro selecione o guia da faixa de opções 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 parênteses após o nome amigável:
Obtendo o nome do controle para uso em atribuir uma imagem para um controle na faixa de opções.
CUIDADO CUIDADO
21_047026 ch15.qxp 02\/04\/07 22:06 Page 528
Para remover uma guia interna ou grupo de faixa de opções, 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 estão 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 padrão.
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 opções com XML em bancos de dados Access e suplementos
15
21_047026 ch15.qxp 02\/04\/07 22:06 página 529
TABELA 15.5 (continuação)
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 página 530
Tabela 15.6 lista os nomes de controle padrão.
TABELA 15.6
Nomes de controle do acesso interno da fita
531
Personalizar a faixa de opções 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 página 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
Cópia
CreateClassModule
CreateDiagram
CreateEmail
CreateForm
CreateFormBlankForm
CreateFormInDesignView
CreateFormMoreFormsGallery
CreateFormPivotChart
CreateFormSplitForm
CreateFormWithMultipleItems
CreateLabels
CreateMacro
CreateModule
CreateOtherObjectsMenu
CreateQueryFromWizard
CreateQueryInDesignView
CreateReport
CreateReportBlankReport
CreateReportFromWizard
CreateReportInDesignView
CreateShortcutMenuFromMacro
TABELA 15.6 (continuação)
21_047026 ch15.qxp 02\/04\/07 22:06 página 532
533
Personalizar a faixa de opções 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 (continuação)
21_047026 ch15.qxp 02\/04\/07 22:06 página 534
535
Personalizar a faixa de opções 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 página 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
Itálico
LabelFontDialog
LoadFromQuery
MacroArguments
MacroConditions
MacroConvertMacrosToVisualBasic
MacroNames
MacroRun
MacroShowAllActions
MacroSingleStep
MailMergeGoToFirstRecord
MailMergeGoToNextRecord
MailMergeGoToPreviousRecord
MailMergeGotToLastRecord
ManageReplies
MasterViewClose
MenuPublish
MergeToWord
Numeração
ObjectBringToFront
ObjectGallery
ObjectsAlignBottom
TABELA 15.6 (continuação)
21_047026 ch15.qxp 02\/04\/07 22:06 página 536
537
Personalizar a faixa de opções 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 página 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 (continuação)
21_047026 ch15.qxp 02\/04\/07 22:06 página 538
539
Personalizar a faixa de opções 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
FiltroDoServidorPorFormulário
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 página 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 (continuação)
21_047026 ch15.qxp 02\/04\/07 22:06 página 540
541
Personalizar a faixa de opções 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 código XML listado avançar (o nome da faixa de opções é desvio) desativa a guia página inicial padrão, e
Remove o grupo de exportação da guia dados externos:
< customUI xmlns =
\"http:\/\/schemas.microsoft.com\/office\/2006\/01\/customui\" >
<ribbon startFromScratch=\"false\">
<tabs>
< guia idMso = \"TabHomeAccess\"
visível = \"false\" >
<\/tab>
< guia idMso = \"TabExternalData\"
visível = \"true\" >
< Grupo idMso = \"GroupExport\"
visível = \"false\" >
<\/group>
<\/tab>
<\/tabs>
<\/ribbon>
<\/customUI>
Para ver isto (ou qualquer) faixa de opções personalizada em um banco de dados do Access, você precisará selecioná-lo em
o \"Nome da faixa de opções\"-lista suspensa na caixa de diálogo Opções do Access, como mostrado na Figura 15.8.
NOTA NOTA
21_047026 ch15.qxp 02\/04\/07 22:06 página 541
Figura 15.5 mostra a guia dados externos, sem o grupo de exportação.
FIGURA 15.5
Na guia dados externos sem o grupo de exportação.
Código VBA
Para abrir a caixa de diálogo referências, selecione referências no menu ferramentas no Visual Basic
janela.
Para executar comandos de controles na sua faixa de opções personalizada, você precisa escrever um procedimento de retorno de chamada
para cada botão de comando da faixa de opções. Em primeiro lugar, definir uma referência à biblioteca de objeto do Office 12.0 na
Referências de diálogo (Ver Figura 15.6); é necessário para oferecer suporte a vários objetos relacionados à faixa de opções no código.
FIGURA 15.6
Definir uma referência à biblioteca de objeto do Office 12.0.
O banco de dados do teste da fita de amostra contém dois procedimentos para ser executado a partir de botões 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 próximo
DICA DICA
542
Adicionando mais funcionalidades ao Office
Parte III
21_047026 ch15.qxp 02\/04\/07 22:06 página 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 através da coleção 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
!Necessário = FLD.Necessário
.Atualização
Terminar com
Próxima fld
End If
Próxima tdf
RST.Fechar
DoCmd.OpenTable strTable
strTitle = \"Tabela cheia\"
strPrompt = \"Imprimir relatório 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 opções 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 próximo
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 através da coleção QueryDefs do banco de dados
(somente consultas select terão 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
!Necessário = FLD.Necessário
.Atualização
Terminar com
Próxima fld
End If
Próxima qdf
RST.Fechar
DoCmd.OpenTable strTable
14 °
Adicionando mais funcionalidades ao Office
Parte III
21_047026 ch15.qxp 02\/04\/07 22:06 página 544
strTitle = \"Tabela cheia\"
strPrompt = \"Imprimir relatório 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 código XML e armazenado na tabela DbRibbons e escritos de qualquer
necessários procedimentos de retorno de chamada para executar a partir do comando botões na faixa de opções, você precisa fechar o
banco de dados e reabri-lo, para carregar o Ribbon(s) personalizado. Então você tem que selecionar a faixa de opções você
quer usar o banco de dados, conforme descrito aqui:
1. Feche o banco de dados e, em seguida, reabri-lo.
2. Clique no botão Office e, em seguida, no botão de opções de acesso (Figura 15.7).
FIGURA 15.7
Abrir a tela de opções do Access.
545
Personalizar a faixa de opções com XML em bancos de dados Access e suplementos
15
21_047026 ch15.qxp 02\/04\/07 22:06 página 545
3. Selecione a página de banco de dados atual e selecione a faixa de opções que você deseja carregar da faixa de opções
Nome-lista suspensa, como mostrado na Figura 15.8.
FIGURA 15.8
Selecionar a faixa de opções 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 opções
personalização.
FIGURA 15.9
Na guia Opções de listagem criada pela faixa de opções personalizada ListFields.
546
Adicionando mais funcionalidades ao Office
Parte III
21_047026 ch15.qxp 02\/04\/07 22:06 página 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 código XML. Observe a referência de linha e coluna, que
deve ajudar a descobrir qual é o problema, mesmo que a descrição do erro não ajuda muito.
Às vezes é tão simples como um suporte de faltando.
FIGURA 15.10
Uma mensagem de erro informativas ao carregar código de XML de personalização da faixa de opções.
Fitas de forma
Você também pode fazer a forma de fitas, substituir ou personalizar as fitas internas. A fita de teste
banco de dados tem um formulário de exemplo da faixa de opções, AddButtons. Esta faixa de opções exibe um formulário específico, após
selecionando-o na página de banco de dados atual da tela opções do Access e na Propriedade do formulário
folha. O XML para a faixa de opções de AddButtons é mostrado na Figura 15.11.
FIGURA 15.11
O código XML para o personalizado AddButtons formar faixa de opções.
NOTA NOTA
547
Personalizar a faixa de opções com XML em bancos de dados Access e suplementos
15
21_047026 ch15.qxp 02\/04\/07 22:06 página 547
Este código adiciona uma guia personalizada chamada guia de forma personalizada, com um único grupo e dois comando mas-
toneladas. O botão de colar interno é executado o comando de colar padrão (se houver algo no
Área de transferência para colar); o clique Me botão aparece uma caixa de mensagem simples. Para exibir um personalizado
Fita em um formulário, você precisa selecionar o nome da faixa de opções na Propriedade do formulário RibbonName, como
mostrado na Figura 15.12.
FIGURA 15.12
Selecionar uma faixa de opções para um formulário.
O guia é mostrado na Figura 15.13.
548
Adicionando mais funcionalidades ao Office
Parte III
21_047026 ch15.qxp 02\/04\/07 22:06 página 548
FIGURA 15.13
Um formulário de faixa de opções personalizada com dois botões e a caixa de mensagem apareceu pelo clique Me botão.
Personalizar a faixa de opções com um
Suplemento de acesso
Porque acesso Adicionar-ins (em versões anteriores do Access) não adicionar botões de barras de comando
(menus ou barras de ferramentas), você não pode substituir o código antigo referenciando CommandBars com novo código referenc
ção da faixa de opções. No entanto, você pode substituir um conjunto de menu add-ins com um único menu add-in para carregar
uma faixa de opções personalizada e coloque o resto do comandos do seu suplemento na faixa de opções. Por exemplo, eu
fiz uma versão minha extras 2007.accda suplemento (o banco de dados sample para capítulo 14) e modificado
-ao carregar uma fita personalizada.
O banco de dados da biblioteca de amostra para esta seção é accda Extras (fita),
Se você está tentando instalar um suplemento no Access 2007 sendo executado no Windows Vista, você
pode receber o aviso de segurança mostrado na Figura 15,14. Impõem-se algumas técnicas especiais
para obter a faixa de opções do Access add-ins para funcionar no Vista; consulte a barra lateral \"Recebendo seu Adicionar-ins para trabalho em Vista\"
para obter detalhes. Este não é um problema ao instalar o add-ins para o Access 2007 em execução no Windows XP.
CUIDADO CUIDADO
NOTA NOTA
549
Personalizar a faixa de opções com XML em bancos de dados Access e suplementos
15
21_047026 ch15.qxp 02\/04\/07 22:06 página 549
FIGURA 15,14
Um aviso de segurança ao tentar instalar um suplemento do Access para o Access 2007 em execução no Windows
Vista.
Para mais informações, consulte a Solutions(Wiley, 2007) segurança PC revista Windows Vista
sobre como lidar com questões de segurança do Vista.
No Windows Vista, funções de retorno de chamada não será executado de botões de faixa de opções, a menos que você incluir
o nome do banco de dados do suplemento de projeto antes do nome da função, como tenho feito
Código XML listado abaixo.
A técnica para criar o XML da faixa de opções e armazenando-o em uma tabela é o mesmo para um regular
Access 2007 banco de dados, conforme descrito na seção anterior. O banco de dados biblioteca de Extras (fita)
tem apenas um suplemento com três registros na tabela USysRegInfo, carregar o ExtrasRibbon do
Tabela DbRibbons. Seu código 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\"
visível = \"true\" >
< group id = \"dbListingGroup\"
Label = \"Campos de listagem\" >
< id do botão = \"btnListTableFields\"
Label = \"Lista de campos da tabela\"
Enabled = \"true\"
imageMso = \"CreateTable\"
tamanho = \"normal\"
onAction=\"Extras(Ribbon).ListTableFields \"\/ >
< id do botão = \"btnListQueryFields\"
Label = \"Campos de consulta da lista\"
Enabled = \"true\"
imageMso = \"CreateQueryInDesignView\"
tamanho = \"normal\"
onAction=\"Extras(Ribbon).ListQueryFields \"\/ >
< id do botão = \"btnOpenOptionsDialog\"
Label = \"Selecionar opções\"
Enabled = \"true\"
imageMso = \"CreateFormBlankForm\"
tamanho = \"normal\"
onAction=\"Extras(Ribbon).ExtrasOptions \"\/ >
NOTA NOTA
REFERÊNCIA CRUZADA REFERÊNCIA CRUZADA
550
Adicionando mais funcionalidades ao Office
Parte III
21_047026 ch15.qxp 02\/04\/07 22:06 página 550
<\/group>
< group id = \"dbBackupGroup\"
Label = \"Backup de banco de dados\" >
< id do botão = \"btnBackupFrontEnd\"
Label = \"backup de banco de dados atual\"
Enabled = \"true\"
imageMso = \"Copiar\"
tamanho = \"normal\"
onAction=\"Extras(Ribbon).BackupFrontEndDB \"\/ >
< id do botão = \"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 opções 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 segurança 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. Botão 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 página 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 necessário) alterar o
capitalização do \"Menu Add-ins\" para \"Menu Add-Ins\" (capitalizando o eu). Isso só é necessário para
executando o add-ins em Vista; \"Menu Add-ins\" funciona bem para Access 97 até 2003.
Também pode ser necessário um passo extra: se seu suplemento do Access 2007 cria uma faixa de opções e seus botões
têm funções de retorno de chamada, você também 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 \"\/ >
Após fazer as alterações acima tabelas do sistema do add-in, compilar o código 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
botões devem funcionar.
21_047026 ch15.qxp 02\/04\/07 22:06 página 552
Uma tabela por meio de programação com a função de LoadCustumUI de carregamento não sempre
trabalho; se a tabela não é carregada automaticamente, você pode carregá-lo manualmente, conforme descrito
no início deste capítulo (Ver Figura 15.8).
O módulo de basExtrasRibbon também contém vários procedimentos de retorno de chamada, que são os mesmos como
aqueles no padrão Extras 2007.accda Adicionar-in, exceto para o ByVal controle como
IRibbonControl argumento (além 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 diálogo referências, em seguida, procurada por ele no registro, usando o utilitário de RegEdit; o
GUID está na linha acima a um anúncio o caminho.
Função pública LoadRibbons()
' Deve ser uma função, então ele pode ser executado da tabela USysRegInfo.
Em erro continuar próximo
Dim i As Integer
Dim strRibbonName As String
Dim strRibbonXML As String
Definir dbsCode = CodeDb
Definir dbsCalling = CurrentDb
Adicione uma referência à biblioteca de objeto do Office 12 (se não houver um já).
Application.References.AddFromGuid _
\"{000C0126-0000-0000-C000-000000000046}\", 1, 0
Copiar a tabela DbRibbons no banco de dados chamada, após a exclusão 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 não é nada então
Debug. Print strTable
DoCmd.CopyObject destinationdatabase: = strCallingDb, _
NewName: = strTable, _
sourceobjectType: = _ acTable,
SourceObjectName: = strTable
Outra coisa
DICA DICA
CUIDADO CUIDADO
553
Personalizar a faixa de opções com XML em bancos de dados Access e suplementos
15
21_047026 ch15.qxp 02\/04\/07 22:06 página 553
Tabela encontrada; excluí-lo e, em seguida, copie a versão 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 não rst.EOF
strRibbonName = rst![RibbonName]
strRibbonXML = rst![RibbonXML]
Carrega a faixa de opções do registro de tabela (se não 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 opções, como mostrado na Figura 15.16.
554
Adicionando mais funcionalidades ao Office
Parte III
21_047026 ch15.qxp 02\/04\/07 22:06 página 554
FIGURA 15.16
Selecionando um menu add-in para carregar uma faixa de opções personalizada de um suplemento do Access.
Consulte o capítulo 14 para obter informações sobre como instalar um suplemento do Access.
Feche e reabra o banco de dados. Se o ExtrasRibbon não 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 botão \"Selecionar opções\" abre a caixa de diálogo onde várias opções podem ser selecionadas; os outros mas-
toneladas executar funções de campos de tabela ou consulta de lista ou fazer backup do banco de dados atual ou o seu back-end.
REFERÊNCIA CRUZADA REFERÊNCIA CRUZADA
555
Personalizar a faixa de opções com XML em bancos de dados Access e suplementos
15
21_047026 ch15.qxp 02\/04\/07 22:06 página 555
Figura 15.18 mostra a caixa de diálogo Selecionar opções:
FIGURA 15.18
A caixa de diálogo Selecionar opções para selecionar uma pasta de backup e inserindo prefixos para excluir.
A fita é um novo recurso para o Office e (não surpreendentemente) até mesmo na versão de lançamento
do Access 2007 não é totalmente estável, especialmente quando os botões 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 próxima patch ou serviço
lançamento 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 relatório 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 página 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 seqüência de conexão 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 opções com XML em bancos de dados Access e suplementos
15
21_047026 ch15.qxp 02\/04\/07 22:06 página 557
Se você executar esse comando em um banco de dados que tem não 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 não tabelas vinculadas.
Os procedimentos para a \"Lista de campos da tabela\", \"Campos de consulta da lista\", \"Selecionar opções\", \"Back-up atual
banco de dados\"e\"Faça backup de dados de back-end\"botões são similares na 2007.accda Extras
Adicionar-in, exceto que eles usam o controle ByVal IRibbonControl como argumento que é necessário para executar
-os botões de fita; seu código não está listado aqui.
Resumo
Embora a princípio pode parecer que a nova faixa de opções não é personalizável, você pode personalizar na verdade
ele, pelo menos pela adição de novas guias e grupos, com controles para executar seu código. Este capítulo coberto
escrevendo o código XML para carregar uma faixa de opções personalizada e código VBA para procedimentos executar do costume
Botões de fita, em bancos de dados Access 2007 regulares e em bancos de dados de biblioteca para Access 2007
Adicionar-ins. O próximo capítulo descreve como escrever Shared add-ins trabalha com a faixa de opções de acesso
no Visual Basic 2005.
558
Adicionando mais funcionalidades ao Office
Parte III
21_047026 ch15.qxp 02\/04\/07 22:06 página 558
EU
n capítulo 13, descrevi criando um VB 6 COM add-in para adicionar extra
funcionalidade para acesso. VB 6 (embora ainda suportado pela Microsoft) não é
a versão mais recente do Visual Basic; Se você quiser usar a versão mais recente,
que é o VB 2005, incluído no Visual Studio 2005, disponível em várias edições.
Existem diferenças significativas entre essas versões 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 difícil do que
deve ser, e sua funcionalidade é limitada, porque o Visual Studio Tools
para o Office Adicionar-in ainda não incluem um modelo de suplemento do Access.
Este capítulo descreve a criação 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ê começar a escrever um suplemento do Visual Studio, há várias preliminares
etapas que você precisa tomar. O primeiro é para verificar como o.net suporte está habilitado para
Escritório, para suportar o componente de interoperabilidade de acesso necessário ao trabalho
com o acesso.
Adicionando suporte a .NET para escritório
Desde a instalação do Office 2007 não pode ter .NET suporte habilitado,
você precisa verificar que esse recurso foi selecionado; Ele é necessário em ordem
criar Shared add-ins. Verificar suporte de whether.NET estiver habilitado, você
559
NESTE CAPÍTULO
Personalizar a faixa de opções com um
Visual Studio 2005 Shared add-in
Uma comparação 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 página 559
precisará executar a instalação 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 instalação do Office 2007 no Windows Vista.
Na tela seguinte, mostrada na Figura 16.2, selecione a opção de alterar, em seguida, \"Adicionar ou remover recursos\"
para o Vista, ou a opção \"Adicionar ou remover recursos\" para o Windows XP.
Na caixa de diálogo opções de instalação, a Microsoft Office Access lista suspensa; se o .NET
Item de suporte à programação tem um X vermelho grande, o que significa que ele não 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 página 560
FIGURA 16.2
Selecionando a opção \"Adicionar ou remover recursos\" para mudar o Office no Windows XP.
FIGURA 16.3
Selecionando a opção \"Executar de meu computador\" para suporte de programação do .NET.
561
Personalizar a faixa de opções de acesso com um Visual Studio 2005 Shared Add-in
16
22_047026 ch16.qxp 02\/04\/07 22:07 página 561
Se você deseja criar suplementos para quaisquer outros componentes do Office, selecione \"Executar de meu computador\"
seus componentes de suporte de programação .NET também. Após 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 configuração do Office.
Embora o VB 2005 Express tem um assistente de atualização, não é útil para atualizar um VB 6 COM Adicionar-
no VB 2005 porque a edição Express do VB 2005 não 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 serão atualizados, exceto o Designer de acesso crítico e você
receberá uma mensagem \"O Designer do Activex AccessDesigner.Dsr não foi atualizada\" no relatório de atualização,
como mostrado na Figura 16.5.
562
Adicionando mais funcionalidades ao Office
Parte III
22_047026 ch16.qxp 02\/04\/07 22:07 página 562
FIGURA 16.5
O relatório de atualização para um suplemento do VB 6 COM, mostrando que o Designer de acesso não foi atualizado.
O VB 6 suplemento foi o tema do capítulo 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 atualização para download que suporta o Office
2007 — afinal de contas, o acesso é parte do Office. Mas isso não é assim. Embora você pode criar suplementos para todos
os outros principais componentes do Office 2007 e alguns bem menores (Ver Figura 16.6), você não pode
criar um suplemento do Access com o VSTO, e, portanto, nesta seção 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 diálogo New Project, selecione a seleção 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 solução; você pode aceitar o local padrão para arquivos do add-in ou procure um cus-
Localização de Tom, como eu fiz na Figura 16.7.
REFERÊNCIA CRUZADA REFERÊNCIA CRUZADA
563
Personalizar a faixa de opções de acesso com um Visual Studio 2005 Shared Add-in
16
22_047026 ch16.qxp 02\/04\/07 22:07 página 563
FIGURA 16.6
A tela do novo escritório de projeto VSTO, mostrando que a criação de add-in de acesso não é suportada.
FIGURA 16.7
Criar um Shared add-in Visual Studio 2005.
Nome do suplemento não pode conter espaços ou marcas de Pontuação — apenas letras e números.
No entanto, o nome da solução pode conter espaços ou marcas de Pontuação.
Após 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 página 564
565
Personalizar a faixa de opções 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 várias versões
dependendo da edição do Visual Studio). O hotfix é chamado o Visual Studio 2005 Service Pack 1
Atualização 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 página 565
566
Adicionando mais funcionalidades ao Office
Parte III
continuou
Se você clicar no link, você receberá uma página de Web com mais links para páginas com informações
executando o Visual Studio 2005 no Vista:
Para execução Visual Studio 2005 no Vista, o link que você precisa é de um terceiro, \"correndo com elevada
permissões de administrador.\" Há muita informação nesta página, 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 página 566
567
Personalizar a faixa de opções 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 personalizações) funcionará no Access 2007
bancos de dados.
22_047026 ch16.qxp 02\/04\/07 22:07 página 567
Na tela representada na Figura 16.9, selecione Visual Basic como a linguagem de programação para usar (
pode ser a única opção, dependendo do suporte a linguagem selecionada durante a instalação do Visual
Studio).
FIGURA 16.9
Selecionando uma linguagem de programação 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 página 568
Diante da tela 3 do assistente (Ver Figura 16,11), insira do suplemento nome e a descrição (não o
mesmo que o nome do projeto e o nome de solução entrada na primeira tela).
FIGURA 16,11
Dando o add-in, um nome e uma descrição.
Em seguida, conforme representado na Figura 16.12, seleccione Adicionar-in — durante o desenvolvimento, é melhor verificar
apenas a primeira caixa de seleção, para que somente você (desenvolvedor) pode trabalhar com o suplemento.
FIGURA 16.12
Selecionar as opções de suplemento.
569
Personalizar a faixa de opções de acesso com um Visual Studio 2005 Shared Add-in
16
22_047026 ch16.qxp 02\/04\/07 22:07 página 569
A última página do Shared Add-in Wizard (Ver Figura 16.13) dá um resumo dos selecionados
Opções.
FIGURA 16.13
A página de resumo do Shared Add-in Wizard.
Em clicar em concluir, o novo projeto é criado, com todos os componentes necessários e a
Conectar a classe (módulo vb) é exibido, como mostrado na Figura 16.14 (Observe a semelhança
para o Designer de acesso no VB 6 COM add-in). Para trabalhar mais facilmente com as referências, selecione
Projeto

Mostrar todos os arquivos e expanda a pasta de referências no Solution Explorer na parte direita da
a tela.
Se você não vir a pasta de referências no Solution Explorer, selecione Mostrar todos os arquivos de
menu do projeto, para tornar a pasta visível.
DICA DICA
570
Adicionando mais funcionalidades ao Office
Parte III
22_047026 ch16.qxp 02\/04\/07 22:07 página 570
FIGURA 16.14
O novo Shared add-in projeto.
Em seguida, adicione uma referência para o item de acesso interoperabilidade. Para adicionar referências, clique com botão direito as referências
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 referências na solução no Solution Explorer.
571
Personalizar a faixa de opções de acesso com um Visual Studio 2005 Shared Add-in
16
22_047026 ch16.qxp 02\/04\/07 22:07 página 571
FIGURA 16.15
Adicionando uma referência para o item de Interop.Access.
FIGURA 16.16
A referência de interoperabilidade de acesso e referências.
572
Adicionando mais funcionalidades ao Office
Parte III
22_047026 ch16.qxp 02\/04\/07 22:07 página 572
O próximo passo é adicionar alguns Importaçõesdemonstrações segundo as declarações de dois padrão a
Seção de declarações do módulo de classe, usando o IntelliSense (Ver Figura 16.17):
Extensibilidade de importações
Imports System.Runtime.InteropServices
Importações Microsoft.Office.Core
Importa acesso = Microsoft.Office.Interop.Access
FIGURA 16.17
Usando o IntelliSense para adicionar uma instrução Imports para o módulo de classe Connect.
Em seguida, substituir o (variáveis de nível de classe applicationObject e addInInstance ), ambos
declarados como Objeto , com rigidez de tipos referências, substituindo Dim comPrivada (Eu também dei a
applicationObject variável um nome mais específico do aplicativo, appAccess ):
Private appAccess como Microsoft.Office.Interop.Access.Application
Private addInInstance como Microsoft.Office.Core.COMAddIn
Depois de adicionar instruções e modificar as variáveis, há algumas modificações mais para ser
feitas no código no módulo de classe Connect. Essas alterações são descritas na próxima seção.
Modificar o código do módulo de classe Connect
Se você (por exemplo) foram criando um Excel 2007 add-in usando 2005 VSTO com a atualização de 2007,
você pode adicionar suporte de fita para seu suplemento, simplesmente adicionando um item da faixa de opções de suporte para seu
projeto. Visual Studio 2005 não tem um item da faixa de opções de suporte e VSTO não suporta a criação de
Acesso Adicionar-ins, para que esta etapa exige extensa modificação manual do módulo de classe Connect,
para oferecer suporte ao trabalho com o acesso e a faixa de opções.
573
Personalizar a faixa de opções de acesso com um Visual Studio 2005 Shared Add-in
16
22_047026 ch16.qxp 02\/04\/07 22:07 página 573
Na OnConnection método, 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 variáveis como segue:
appAccess = DirectCast (aplicativo, Access.Application)
addInInstance = DirectCast (aplicativo, Core.COMAddIn)
Adicionar outro Implementa instrução para conectar-se classe como a seguir:
Implementa o Extensibility. IDTExtensibility2
IRibbonExtensibility implementa
Se toda essa modificação manual do Shared add-in código está ficando entediante, espero que
a próxima versão (v. 3) do VSTO inclui um modelo de acesso que irá eliminar a maioria
da codificação manual para suporte de acesso compartilhado suplementos e a faixa de opções.
Depois de adicionar o IRibbonExtensibility implementa linha, um novo esboço de função deve
aparecem no módulo de classe Connect, GetCustomUI .
Se você não vir o esboço da função, tente fazer um Save All. Se ainda não aparecer, basta digitar
na função inteira.
Adicione uma linha de código para esta função, 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 informações sobre o add-
em (você não tem que preencher todas as informações), como mostrado na Figura 16.18.
Isso completa as alterações gerais no módulo de classe Connect; Agora você precisará adicionar código para
funcionalidade específica no add-in.
NOTA NOTA
NOTA NOTA
574
Adicionando mais funcionalidades ao Office
Parte III
22_047026 ch16.qxp 02\/04\/07 22:07 página 574
FIGURA 16.18
Adicionando informações 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, formulário,
ou relatório programaticamente, adicionando campos para a tabela e os controles para o formulário ou relatório. A imple-
mento essa funcionalidade, eu precisava escrever código XML da faixa de opções personalizada, três botão funções,
e algum código de apoio.
Para criar o XML da faixa de opções 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 diálogo Add New Item (dar o arquivo
o nome da Ribbon), como mostrado na Figura 16.19.
575
Personalizar a faixa de opções de acesso com um Visual Studio 2005 Shared Add-in
16
22_047026 ch16.qxp 02\/04\/07 22:07 página 575
FIGURA 16.19
Criando um item de arquivo XML para sustentação da fita.
O código XML para a faixa de opções neste suplemento está listado aqui (Ver capítulo 15 para maiores infor-
informações sobre como criar código XML da faixa de opções):
<? xml versão = \"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\"
visível = \"true\" >
< group id = \"dbAccessObjectsGroup\"
Label = \"Criar objetos de acesso\" >
< id do botão = \"btnCreateTable\"
Label = \"Criar nova tabela\"
Enabled = \"true\"
imageMso = \"Tabela\"
tamanho = \"normal\"
onAction = \"CreateTableInDesignView\" \/ >
< id do botão = \"btnCreateForm\"
Label = \"Criar novo formulário\"
Enabled = \"true\"
imageMso = \"CreateFormInDesignView\"
tamanho = \"normal\"
onAction = \"CreateNewForm\" \/ >
< id do botão = \"btnCreateReport\"
Label = \"Criar novo relatório\"
Enabled = \"true\"
576
Adicionando mais funcionalidades ao Office
Parte III
22_047026 ch16.qxp 02\/04\/07 22:07 página 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ê não 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ê
não já tiver criado um arquivo de recursos, tudo o que você verá é a ligação 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
Comentário. 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 opções de acesso com um Visual Studio 2005 Shared Add-in
16
22_047026 ch16.qxp 02\/04\/07 22:07 página 577
FIGURA 16,22
O arquivo Ribbon adicionado ao arquivo de recursos do projeto.
Cada um dos botões no código XML da faixa de opções precisa de seu próprio processo; os três botão proce-
dures, além de um manipulador de erro padrão 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 (\"instrução SQL:\"
Se ele já não existir, crie tabela.
Para cada obj em appAccess.CurrentData.AllTables
Se obj.Nome = strTable Then
' Já existe
GoTo ErrorHandlerExit
End If
Próxima
578
Adicionando mais funcionalidades ao Office
Parte III
22_047026 ch16.qxp 02\/04\/07 22:07 página 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 formulário.
FRM = appAccess.CreateForm()
frm.RecordSource = \"tblTest\"
txt = appAccess.CreateControl (nomedoformulário: = 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 (nomedoformulário: = 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 (nomedoformulário: = 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 (nomedoformulário: = 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 opções de acesso com um Visual Studio 2005 Shared Add-in
16
22_047026 ch16.qxp 02\/04\/07 22:07 página 579
chk = appAccess.CreateControl (nomedoformulário: = 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 relatório.
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 página 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 informações 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
referência,
Microsoft.Office.Interop.Access.acControlType
.
Se você ativar o painel de lista de erros (Ver

Lista de erros), você verá uma série de avisos
sobre a conversão implícita de uma variável de controle de acesso a um controle específico de acesso tipo (Ver
Figura 16,23).
Em geral, você pode limpar avisos de conversão usando uma função de conversão no código, mas
Visual Studio 2005 não tem quaisquer funções de conversão para controles de acesso, assim você só tem que
viva com os avisos (o código será executado multa).
NOTA NOTA
581
Personalizar a faixa de opções de acesso com um Visual Studio 2005 Shared Add-in
16
22_047026 ch16.qxp 02\/04\/07 22:07 página 581
FIGURA 16,23
Avisos de conversão implícita na lista de erros.
Se você é muito hábil em escrever código e muita sorte, neste momento você pode instalar e testar o
código e tudo funcionaria perfeitamente. Mas é mais realista esperar que haverá algumas
bugs no código que irá impedir o suplemento trabalhando, por isso é uma boa idéia fazer alguma depuração-
Ging neste ponto, para economizar o tempo que você gastaria indo através da instalação e, em seguida, encontrar-
ção que o suplemento não funciona como esperado.
Depurando o Add-in
O painel de lista de erros (mencionado na seção anterior) ajuda você a localizar erros em seu
código; você pode clicar duas vezes em um item para ir para a linha de código que causou o erro. Quando se trabalha
com um suplemento, você pode usar a \"Start Debugging\" seleção no menu Debug para percorrer
o código, 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 seleção da opção de \"Iniciar programa externo\". (Figura 16,24 mostra a caixa de diálogo Selecionar arquivo
que aparece quando você clica no botão Procurar à direita da opção \"Start external program\".)
Agora você pode definir pontos de interrupção em seu código (usando a tecla de função 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 botões para executar e depurar o código; ele vai parar
nos pontos de interrupção que você definiu assim você pode percorrer o código com a tecla de função F8.
582
Adicionando mais funcionalidades ao Office
Parte III
22_047026 ch16.qxp 02\/04\/07 22:07 página 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 código do suplemento, você está pronto para criar o suplemento; Para
fazer isso, clique no botão 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 então instalar o
solução, selecionando a instalação no mesmo menu de contexto.
Se a seleção de instalar é desabilitada após uma bem sucedida primeira compilação, selecione reconstruir; Depois disso,
Instalação deve ser habilitada.
DICA DICA
583
Personalizar a faixa de opções de acesso com um Visual Studio 2005 Shared Add-in
16
22_047026 ch16.qxp 02\/04\/07 22:07 página 583
FIGURA 16.25
Criando a solução.
Selecionar instalação inicia o Assistente de configuração de ObjectsSetup criar desajeitadamente nomeado (Ver Figura 16.26).
FIGURA 16.26
A primeira tela do Assistente de instalação.
584
Adicionando mais funcionalidades ao Office
Parte III
22_047026 ch16.qxp 02\/04\/07 22:07 página 584
Clicando em Next você obtém a tela Selecionar pasta de instalação (Ver Figura 16.27), onde você pode
quer aceitar o local padrão ou navegar para outro local e selecione se o suplemento é
disponível para todos os usuários ou apenas você.
FIGURA 16.27
Selecionando a pasta de instalação para a solução.
Na tela do Assistente de instalação, mostrado na Figura 16.28 confirmar instalação, clique em Avançar para iniciar
a instalação.
FIGURA 16.28
A tela de confirmar a instalação do Assistente de instalação.
585
Personalizar a faixa de opções de acesso com um Visual Studio 2005 Shared Add-in
16
22_047026 ch16.qxp 02\/04\/07 22:07 página 585
A próxima tela, omitida aqui, mostra uma barra de progresso durante a instalação da solução.
Quando a instalação estiver concluída, você receberá a tela de instalação completa, retratada em
Figura 16.29.
FIGURA 16.29
A tela final do Assistente de instalação.
Em geral, depois de clicar em fechar a última tela do assistente, o suplemento é instalado automati-
camente; no entanto, se você não vê a faixa de opções personalizada que o suplemento deve criar um Access 2007
banco de dados, você pode instalá-lo manualmente. Abra a caixa de diálogo Opções do Access no menu do Office, e
Selecione a página de Add-ins. Na parte inferior da página, clique no botão de ir para a direita da OCM
Suplementos suspensa, conforme mostrado na Figura 16.30.
A caixa de diálogo suplementos de COM (mostrada na Figura 16,31) parece o mesmo que em versões anteriores do Access. Se
você vê o suplemento listado, basta verificá-lo; caso contrário, você pode procurá-lo.
586
Adicionando mais funcionalidades ao Office
Parte III
22_047026 ch16.qxp 02\/04\/07 22:07 página 586
FIGURA 16.30
Abrir a caixa de diálogo suplementos de COM a partir da página de Add-ins da caixa de diálogo Opções do Access.
FIGURA 16,31
Instalar um suplemento de COM na caixa de diálogo suplementos de COM.
587
Personalizar a faixa de opções de acesso com um Visual Studio 2005 Shared Add-in
16
22_047026 ch16.qxp 02\/04\/07 22:07 página 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 opções com um grupo chamado \"criar acesso
Objetos\"que contém três botões. Não é necessário adicionar manualmente a faixa de opções, ou mesmo para fechar
e reabra o banco de dados; a faixa de opções é exibida imediatamente (uma refrescante mudança da luta
você tem que atravessar para chegar a uma faixa de opções personalizada para aparecer de um suplemento de acesso).
FIGURA 16.32
Uma nova guia e o grupo criado pelo add-in.
Clicando no botão \"Criar nova tabela\" cria uma nova tabela com vários campos de dados diferentes
tipos, no botão \"Criar novo formulário\" cria um novo formulário com a nova tabela como sua fonte de registro
e vários controles de tipos diferentes e o botão \"Criar novo relatório\" cria um novo relatório,
também com a nova tabela como sua fonte de registro e de vários 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 página 588
16.34 a figura mostra o novo formulário; o novo relatório é semelhante.
FIGURA 16.34
Uma forma criada pelo add-in.
O formulário é chamado Form1 (ou outro número); não podem ser renomeada no código, sob a
Visual Studio add-in ou diretamente no Access VBA, porque o
Nome
Propriedade do
Formulário
objeto é somente leitura quando o formulário é criado usando o
CreateForm
método (e da mesma forma para o
CreateReport
método).
Resumo
Depois de trabalhar com todos os três suplemento tipos (acesso, VB 6 e Visual Studio 2005), minha conclusão é
que suplementos de acesso têm vantagens sobre o Visual Studio 2005 e VB 6 suplementos, pelo menos se você
estão executando o Windows XP. Uma das vantagens mais significativas de acesso add-ins é que eles são
próprios bancos de dados Access e isso lhe permite copiar objetos de banco de dados de códigos postais
no banco de dados chamada. Se você precisar de formulários em um VB ou Visual Studio add-in, você tem que criá-los
partir do zero como VB ou Windows forms; relatórios (em algumas versões 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 código de acesso, assim você não precisa aprender uma nova pro-
dialeto gramming, apenas algumas técnicas especiais.
No entanto, se você quer seu acesso add-ins para criar fitas personalizadas, existem alguns obstáculos no
presentes. Recebendo a faixa de opções personalizada para exibir e executar o código de suplemento, pode exigir muito tempo
passei em desinstalar e reinstalar o suplemento, descarregar e recarregar a tabela e fechamento
NOTA NOTA
589
Personalizar a faixa de opções de acesso com um Visual Studio 2005 Shared Add-in
16
22_047026 ch16.qxp 02\/04\/07 22:07 página 589
e reabrir o banco de dados inúmeras vezes, que você ficar completamente frustrado na tentativa de obter o add-
em s faixa de opções personalizada para exibir (e seus botões) para trabalhar. Por outro lado, acessar o Adicionar-ins que criar
menu add-ins e Propriedade construtores funcionam bem, uma vez que eles estão instalados e então, fitas e
botões criados por VB 6 e o Visual Studio add-ins.
Quando você precisa colocar um botão em algum lugar que não na guia Add-Ins, e você não quer
mexer com a obtenção de botões da faixa de opções para o trabalho de acesso Adicionar-ins, você pode criar um VB ou Visual
Studio add-in — ambos trabalham muito bem com fitas.
Outra consideração especial suplementos está em execução no Windows Vista — neste momento, acessar o Adicionar-ins
tenho problemas com a segurança do Vista, enquanto (pelo menos se você tiver instalado o hotfix mencionado na
\"Executando o Visual Studio 2005 no Windows Vista\" barra lateral — Visual Studio add-ins correr bem no Vista.
Esperançosamente, v. 3 do VSTO (finalmente!) deve incluir um modelo de acesso, que deve muito
simplifica o processo de criação Shared add-ins para acesso.
590
Adicionando mais funcionalidades ao Office
Parte III
22_047026 ch16.qxp 02\/04\/07 22:07 página 590
F
ou muitas versões, Windows teve sua própria linguagem de script,
Windows Script Host, um dialeto de Visual Basic Script (VBS). Windows
Scripts do WSH (Host) de script podem ser executados na linha de comando (para
nessas versões do Windows que tem uma linha de comando, clique em Iniciar

Executar), por
clicando duas vezes o arquivo de script em uma janela do Explorer e também do
Agendador de tarefas Windows Vista, que é útil se você deseja executar um script
automaticamente, em intervalos regulares.
Um uso para um script do WSH é criar um backup de banco de dados em intervalos regulares;
outra é para copiar do Word ou Excel modelos ou outros arquivos de suporte, para o
pasta apropriada, como parte de uma instalação de aplicativo do Office, quando você não
quer (ou necessidade) para criar um pacote de instalação completo. WSH scripts também são úteis
para trabalhar com arquivos em uma pasta, fazendo tarefas como excluir ou renomear
arquivos que contêm um determinado prefixo, sufixo ou extensão. Este capítulo descreve
como criar e modificar scripts do WSH, incluindo scripts de exemplo para alguns
usos comuns.
Ferramentas para trabalhar com Windows
Scripts de Host de script
Embora você pode criar e editar scripts WSH com bloco de notas, é muito mais fácil
trabalhar com eles no Microsoft Script Editor (MSE), usando o VBScript
arquivo de ajuda para download para referência. Curiosamente, nem o MSE nem o
Arquivo VBScript ajuda aparece como parte da interface quando você trabalha com um WSH
script; você tem que localizar (e possivelmente baixar) esses arquivos e configurá-los
manualmente para proporcionar um ambiente de trabalho mais funcional. O próximo-sec
ções dizer-lhe como obter e usar essas ferramentas para trabalhar com scripts do WSH.
5