MS Access 2007 VBA Biblia Traducao Maquina Portugues

April 8, 2017 | Author: AlailtonGama | Category: N/A
Share Embed Donate


Short Description

Download MS Access 2007 VBA Biblia Traducao Maquina Portugues...

Description

Acesso 2007 Bíblia VBA ™

®

Para aplicativos centrados em dados de Microsoft Office

Helen Feddema

Bíblia de VBA do Access 2007 ™

Acesso 2007 Bíblia VBA ™

®

Para aplicativos centrados em dados de Microsoft Office

Helen Feddema

™ ® 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 q 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 trabalh 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 dispo livros eletrônicos.

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 e Access Poder de relatórios para o Microsoft (Pinnacle, Access 1994),Acesso comoTos(Waite Group Press, 1995), MCSD: Guia de estudo Access (Sybex, 95 1998),Modelo de objeto DAO: O Guia definitivo(O ' Reilly, de janeiro de 2000),Access e 2002 de dentro(Microsoft para fora Press, 2001), que foi #1 julgados na categoria de livro de Desktop e aplicativos do Office 2004 Waterside conferemENCE. 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 (Que, 971997),Escritório aborrecimentos (O ' Reilly, 1997),Outlook Aborrecimentos (O ' Reilly, 1998),Edição especial: Usando Microsoft Project (Que, 98 1997),Ensine-se Yourself Projeto(Sams, 1998), e Edição especial: Outlook 2000 (Que, 2000). Helen foi um regular contributor 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 é currently editor do Acesso relógio Ezine (anteriormente Relógio de acesso do ), Woody para que ela escreve a Coluna de Arconte de acesso.

Kerry e Jean King, bons vizinhos e bons amigos

Créditos Editor Executivo Bob Elliott

Coordenador do projeto Adrienne Martinez

Editor de desenvolvimento Kelly Talbot

Gráficos e especialistas de produção Sean Decker Jennifer Mayberry Heather Papa Amanda Spagnuolo

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

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

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

Conteúdo

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

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

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

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

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

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

W

elcome para Bíblia o de VBA do Access . Como 2007 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 cenTral aplicativo para armazenar dados e usando outros aplicativos para produzir atraente formatoTed documentos de vários tipos. Quando você tiver concluído B o íblia de VBA do Access , você 2007 vai estar bem preparado para escrever código VBA automação que usa seus dados de acesso para produzir a pala 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 escrever código VBA, mas precisa de mais informações sobre como escrever código de automação para trabalhar 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 amos 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 A 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

Introdução

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.

CUIDADO

DICA NOTA

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

NOVO RECURSOsoftware 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 Ex 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 Windo 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 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).

XVI

Introdução

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 transferi dados de acesso aos documentos criados com outros componentes do Office e formatar os documentos com necessários; Isto lhe permitirá criar procedimentos que podem ser executados a partir de eventos de formulário o 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

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

Armazenar e exibir Dados no Access

S

Ince seus primeiros dias — cerca de 14 anos — acesso foi um real NESTE CAPÍTULO 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. Comhistória dos dados do escritório Uma breve sucessivas versões do Office, movimentação de dados entre os componentes do Office (espetroca cialmente de Word, Excel e Outlook) tornou-se muito mais fácil que é agora Armazenamento de dados no Access 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.Exibindo dados de acesso em formas e relatórios

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. Muitoscom texto rico em Trabalhando Os usuários do Office tem uma edição do Office que não inclui acesso — masCampos eles de memorando todos têm o Word e Excel, e muitos também têm o Outlook, para que eles possam facilmente Nova interatividade de relatório trabalhar com documentos do Word, mensagens do Outlook ou nomeações e Excel planilhas, preenchido com dados de tabelas do Access.

Usando o Access como um controle Centro para trabalhar com Se você planeja apresentar seus dados como um relatório do Access, gráfico dinâmico, ou Documentos do Office

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

Parte I

Os componentes do Office e o que fazem melhor

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 conecta 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 ap como o Word ou Excel. Acesso, por exemplo, era apenas um cliente, Considerando que a palavra era apenas um ser 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 out 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 é sempr 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 luga

Uma exceção válida é armazenar os dados em bancos de dados SQL Server back-end, usando o acesso com

REFERÊNCIAoCRUZADA 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 V 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 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.

4

Armazenar e exibir dados no Access

1

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

NOVO RECURSO2007, 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çã 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.

NOTA

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 t 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.

5

Parte I

Os componentes do Office e o que fazem melhor

Se você selecionar um bloco de texto em um campo Memorando de Text–enabled Rich, você verá um flutuan barra de ferramentas que permite que você aplique alguma formatação, incluindo o recuo ou recuar para a a palavra (isso funciona bem; ver Figura 1.2). No entanto, se você aplicar marcadores ou numeração a partir desta ferrame bar, você vai ter os marcadores ou números, mas o texto que corre ao longo de uma linha não será recuado propErly, conforme mostrado na Figura 1.3. Por esse motivo, eu recomendo contra o uso desses recursos, a menos que todos itens em suas listas são não mais de uma linha de comprimento.

AVISO

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 text 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çã 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.

6

Armazenar e exibir dados no Access

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

1

Parte I

Os componentes do Office e o que fazem melhor

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, co um campo de Rich Text–enabled Memo para armazenar o texto de corpo da carta e um ID e um campo de texto Lette 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á preservido. 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.

DICA

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 form 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.

8

Armazenar e exibir dados no Access

1

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

Parte I

Os componentes do Office e o que fazem melhor

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 proDuce uma letra da palavra para obter a aparência que você quer em documentos impressos. No entanto, em compa 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 dado armazenados no documento propriedades serão impresso em um determinado ponto no texto, com o texto ao re acondicionamento, conforme necessário, dependendo do comprimento do texto nos campos. Isso não é possível com Campo memorando em um relatório do Access, então se você precisar inserir mesclar campos ou DocProperty camp 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, preenc

REFERÊNCIADados CRUZADA de acesso. FIGURA 1.9 Um relatório com texto formatado.

10

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 tom ao longo de um banco de dados criado por outro programador. O banco de dados tinha uma tabela, uma consulta, um form 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 objetos de banco de dados, controles e variáveis. Usar uma Convenção de nomenclatura também faz com que seu banco de d 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 giving 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 .

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ê ter interativamente — e se você quer interatividade plena, você pode criar um formulário de tabela dinâmica ou de Para demonstrar estas características, eu usei uma variação do banco de dados de exemplo Northwind, com objeto renomeado de acordo com a Convenção de nomenclatura Leszynski.

Relatórios de folha de dados simples

NOTA

O banco de dados de amostra para esta seção é modificado Northwind.accdb.

A consulta qryNorthwindAll links de todas as tabelas no banco de dados Northwind modificado. Para produzir um relatório de folha de dados simples, iniciar, selecionando e selecionando Assistente de relatório no qryNorthwindAll Grupo relatórios na guia criar da faixa de opções, como mostrado na Figura 1.10.

11

Parte I

Os componentes do Office e o que fazem melhor

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

Armazenar e exibir dados no Access

1

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 subAgrupamento, conforme mostrado na Figura 1.13). FIGURA 1.13 Selecione níveis de subgrupo para um relatório.

13

Parte I

Os componentes do Office e o que fazem melhor

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

Armazenar e exibir dados no Access

1

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óri 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

Parte I

Os componentes do Office e o que fazem melhor

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.

DICA

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 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.)

16

Armazenar e exibir dados no Access

1

O Assistente de relatório geralmente aplica-se o alinhamento padrão para cada rótulo de coluna, que

NOVO RECURSOpode 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 con (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 esque do grupo, em seguida, botão direito do mouse qualquer controle no grupo e selecione Remover no submenu Layou (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, quand registros de apenas um cliente, como mostrado na Figura 1.22.

17

Parte I

Os componentes do Office e o que fazem melhor

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

Armazenar e exibir dados no Access

1

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 consulta. No Access 2007, o processo de criação de uma tabela dinâmica tem sido implicaçã qryNorthwindAll cados; apenas selecione a tabela ou consulta de fonte de dados, selecione, conforme representado na Figura 1.24 no menu mais formas do grupo na guia criar formulários da faixa de opções.

19

Parte I

Os componentes do Office e o que fazem melhor

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 cad Campos, campos de coluna e (opcionalmente) campos de filtro soltar zonas, que são indicadas em texto cinza n 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

REFERÊNCIAobter CRUZADA 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.

20

Armazenar e exibir dados no Access

FIGURA 1.25 Uma dinâmica recém-criado, pronta para selecionar os campos.

FIGURA 1.26 Uma tabela dinâmica concluída.

21

1

Parte I

Os componentes do Office e o que fazem melhor

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 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 apro 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

Armazenar e exibir dados no Access

1

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 d 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

Parte I

Os componentes do Office e o que fazem melhor

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 unlimITED interatividade, mas ambos têm uma limitação séria: a interatividade só está disponível quando você es trabalhando no banco de dados Access; Quando você envia um relatório de acesso, tabela dinâmica ou gráfico dinâm alguém que não tem acesso, dizer como um arquivo PDF, o destinatário recebe uma imagem somente leitura relatório, tabela dinâmica ou gráfico dinâmico, com nenhuma interatividade. Este pode ser o que você quer em alguns 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 ta ou de gráfico dinâmico.

24

Armazenar e exibir dados no Access

1

Consulte o capítulo 3 para obter informações sobre a criação de planilhas Excel e gráficos cheios

REFERÊNCIARepleta CRUZADA de dados de acesso e o capítulo 12 para obter informações sobre como criar gráficos dinâmicos d Dados de acesso.

Resumo

Neste capítulo você aprendeu sobre algumas novidades do Access 2007, especialmente aquelas relacionad a produção de relatórios de acesso para exibir dados armazenados em tabelas do Access. Mas às vezes você prec 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 Outlo 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 p 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 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.

25

Criação de documentos do Word de acesso

EU

f que você precisa produzir documentos com formatação mais sofisticados NESTE CAPÍTULO 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 maneirasModelos de e documentos do Word exportar dados do Access para o Word; depende de qual deles usar circumcom marcadores de palavra posições, o tipo de dados para exportação e as preferências do usuário. Este capítuloTrabalhando discusses os vários tipos de documentos do Word que você pode criar e os métodos Trabalhando com o TypeText você pode usar para preenchê-las com dados, com exemplos básicos. método Para exemplos mais complexos e realistas de exportação

Trabalhando com documentos do Word REFERÊNCIAAcessar CRUZADA dados em documentos do Word, consulte os capítulos 6 e 12. Propriedades

NOTA

O banco de dados de amostra para este capítulo é o acesso a Word.accdb.

Trabalhando com campos de formulário Trabalhando com tabelas

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

27

Parte I

Os componentes do Office e o que fazem melhor

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 referENCE 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.

NOTA

Se você não precisa de qualquer fantasia formatação, apenas um documento de texto sem formatação, você pode mento com texto usando o método. O FillWithTypeText procedimento listado em seguida TypeText 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 us 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

28

Criando documentos de palavra de acesso

.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 oCreateObject Word com

:

Set appWord = CreateObject(\"Word.Application\") Retomar em seguida Outra coisa MsgBox \"erro nenhum:\" & “; Description: “ & Err.Description Resume ErrorHandlerExit End If End Sub

29

2

Parte I

Os componentes do Office e o que fazem melhor

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.

DICA

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 bloco 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 nec 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 ac Coloque DocProperty campos no modelo onde deseja que os dados de acesso para aparecer.

30

Criando documentos de palavra de acesso

2

Marcadores

Como um exemplo do uso de marcadores em um modelo do Word, eu criei um modelo projetado para imprimir em 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 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 pessoasNing Office 2007, então se você precisa distribuir documentos do Word para pessoas executando versões mais antigas d Exercício, é melhor usar o formato de modelo. dot e criar documentos. doc, que pode ser usada em Office 97 até 2007.

AVISO

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 difeficulty, 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

31

Parte I

Os componentes do Office e o que fazem melhor

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.

32

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.

33

Parte I

Os componentes do Office e o que fazem melhor

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.

AVISO

É 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 documento; 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

34

Criando documentos de palavra de acesso

2

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

Parte I

Os componentes do Office e o que fazem melhor

No código de dados de amostra do capítulo, o pressuposto é que os modelos do Word

REFERÊNCIAestão CRUZADA 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 p 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

36

Criando documentos de palavra de acesso

2

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 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

Parte I

Os componentes do Office e o que fazem melhor

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

Criando documentos de palavra de acesso

Palavra não está em execução; Abra oCreateObject Word com

2

:

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 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 Proprie como mostrado na Figura 2.7. FIGURA 2.7 Abrir o painel de informações do documento.

39

Parte I

Os componentes do Office e o que fazem melhor

Isso abre o painel de informações do documento, com alguns dos mais comuns documento própriolaç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 fará para uma propriedade de texto) e, em seguida, clique em Adicionar. A Figura 2.10 mostra as propriedades de do Modelo de carta de Milano (adereços de Doc).

40

Criando documentos de palavra de acesso

2

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 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 camp e criar um indicador para ele.

NOTA

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 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.

DICA

Figura 2.12 mostra a primeira página do modelo, com DocProperty campos exibidos e um livromarca para indicar o local onde o texto da carta deve ser digitada.

41

Parte I

Os componentes do Office e o que fazem melhor

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

Criando documentos de palavra de acesso

2

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

Parte I

Os componentes do Office e o que fazem melhor

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 oCreateObject Word com

:

Set appWord = CreateObject(\"Word.Application\") Retomar em seguida

44

Criando documentos de palavra de acesso

2

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õ 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 documento. Naturalmente, os usuários podem apenas digitar texto em um documento, mas campos de formulário perm limitar as informações para uma seleção de valores apropriados, talvez em uma seção do documento protegi 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.

DICA

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.

45

Parte I

Os componentes do Office e o que fazem melhor

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

Criando documentos de palavra de acesso

2

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.

DICA

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 se 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 suspe seta para abrir a lista e selecionar um item (Figura 2.17).

47

Parte I

Os componentes do Office e o que fazem melhor

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 preforemaranhado de modelos do Word, você pode fazer usar o armazenamento de dados superior e editando recursos d Acesso e o superior documento Propriedades de formatação do Word.

48

Análise de dados com Excel

Y

ou pode imprimir acessar dados diretamente, usando relatórios de acesso, conforme descrito no NESTE CAPÍTULO 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 Exportar dados do Access para Excel limitações, porque você só pode trabalhar interativamente com tabelas dinâmicas eusando um comando de fita 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 Criando novas planilhas de Excel a partir de modelos instalado, planilhas do Excel são uma excelente escolha. Formatação de dados do Access exportados

Ao invés de elaboração dos relatórios de acesso, tabelas dinâmicas ou gráficos dinâmicos (ou em para uma planilha do Excel 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.

NOTA

O banco de dados de amostra para este capítulo é o acesso a Excel.accdb.

49

Parte I

Os componentes do Office e o que fazem melhor

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 fantasiaTing, 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 b De dados de exemplo Northwind, tem uma consulta que liga todas as tabelas de dados, .A qryNorthwindAll 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 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

Análise de dados com Excel 3

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

Parte I

Os componentes do Office e o que fazem melhor

Usando uma consulta como uma fonte de dados permite que você combinar dados de várias tabelas e també para formatar os dados como você deseja que ele apareça na planilha destino, usando dados tipo converfunções de Sion, tais como CDate ,CCur , ouCStr .

DICA

Com alguns cliques, você pode redimensionar as colunas da planilha, conforme necessário, edite os cabeçalhos de c 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 comMatos na faixa de opções, usar código VBA para exportar os dados de acesso linha por linha para a área de dados d criado com base no modelo de planilha. Eu criei um conjunto de consultas para o arquivamento de dados, novamente dados de exemplo Northwind e uma forma de diálogo (fdlgArchiveOrders) que permite que o usuário selecione uma da 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

NOVO RECURSOCampo 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.

52

Análise de dados com Excel 3

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 exclu 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 proceCreateAndTestQuery Dure, que ele usa para criar uma consulta por meio de programação e outro procedimento ( ) que TestFileExists 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

Parte I

Os componentes do Office e o que fazem melhor

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

Análise de dados com Excel 3 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 mento para mover para a próxima célula:

argumen-

55

Parte I

Os componentes do Office e o que fazem melhor

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 argumento: RowOffset 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 selecionad a caixa de diálogo: strSaveName = strDBPath Debug. Print \"folha de tempo salve o nome:\"

56

Análise de dados com Excel 3 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 r 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

Parte I

Os componentes do Office e o que fazem melhor

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 caracte 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

Análise de dados com Excel 3 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.

NOTA

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.

59

Parte I

Os componentes do Office e o que fazem melhor

NOTA

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 paraesteira, 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 constante nomeada criará uma planilha em um formato utilizável por pessoas correndo xlExcel9795 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.)

60

Análise de dados com Excel 3

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.

AVISO

FIGURA 3.12 Selecionar uma planilha salvar formato.

61

Parte I

Os componentes do Office e o que fazem melhor

NOTA

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 o comeu um total sob a última linha de dados, você pode escrever código VBA para usar comandos do Excel para faze 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

REFERÊNCIAmétodo. CRUZADA

Nesta seção, os dados de qryOrdersAndDetails são exportados para uma nova planilha, feita a partir de uma templaca e, em seguida, formatado no código. Para sua conveniência, a procedimento ExportNorthwindData 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 escrito às linhas qryOrdersAndDetails na planilha e, em seguida, um conjunto de comandos do Excel é usado para aplicar bordas de linha fina para os dado á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

62

Análise de dados com Excel 3 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

Parte I

Os componentes do Office e o que fazem melhor

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,columnoffusando o argumento para mover para a próxima célula: conjunto 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 argumento: RowOffset RST.MoveNext Set rng = rngStart.Offset(rowoffset:=n) Seguinte n

Determinar o número de linhas de dados na planilha comUsedRange o 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

Análise de dados com Excel 3 .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

Parte I

Os componentes do Office e o que fazem melhor

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

Análise de dados com Excel 3 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

Parte I

Os componentes do Office e o que fazem melhor

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

Análise de dados com Excel 3 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

Organizar e Comunicando-se com o Outlook

Ó

utlook é o componente do Office que é usado para comunicação via NESTE CAPÍTULO 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 Criar compromissos do Outlook é chamado um calendário), a interface do Outlook é tão superior que eu recomendo e tarefas de dados de acesso não tentar replicar sua funcionalidade no Access, mas sim para exportar o acesso Gravar os dados de acesso para o dados para o Outlook, criar mensagens de email, compromissos ou outro Outlook Diário do Outlook itens conforme necessário. Criando e-mails para contatos em um

Caminho de volta no Access 2.0, eu criei um banco de dados para gerenciar tarefas, permitindo-me Tabela do Access 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 justificaraliado 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

Parte I

Os componentes do Office e o que fazem melhor

Se você armazenar endereços de e-mail em uma tabela de contatos, clientes ou clientes, você pode usar código do VB comeu e-mails para eles de uma forma de acesso, tanto para um único destinatário ou de um grupo de destinatários, se 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 sim 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 m sincronizar dados entre contatos do Outlook e acesso; meu Contacts.accdb Sincronizando dadosbase faz exatamente isso. Veja capítulo 11 para uma discussão sobre o banco de dados de sincronização de contatos. Capítulo 8

REFERÊNCIAlida CRUZADA 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.

NOTA

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ã clicando no botão de cronograma de nomeação. CódigoBeforeUpdate sobre a 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

72

Organizar e comunicar-se com o Outlook

4

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

Parte I

Os componentes do Office e o que fazem melhor

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 Outloo 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ânc de usar o OutlookCreateObject se o GetObject função falhará porque o Outlook não estiver sendo executado.

NOTA

FIGURA 4.2 Definir uma referência à biblioteca de objeto do Outlook.

74

Organizar e comunicar-se com o Outlook

4

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 em procedimento 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

Parte I

Os componentes do Office e o que fazem melhor

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

Organizar e comunicar-se com o Outlook

4

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 p para o funcionário ou um supervisor, usando ométodo da coleção de pastas na pasta calendário. Adicionar 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 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 método usar oem vez disso. Adicionar

NOTA

Você não pode usar o método diretamente com uma pasta do Outlook; Esse método funciona com Adicionar 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.

NOTA

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.

77

Parte I

Os componentes do Office e o que fazem melhor

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

Organizar e comunicar-se com o Outlook

4

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 d 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

Parte I

Os componentes do Office e o que fazem melhor

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 d 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

NOTA

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 tblMainframeD 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 s 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 em Campo (empresa interface) de um item padrão de jornal. Dados de vários campos são concateNAT em uma variável de seqüência de caracteres, que é escrita para o campo do corpo (o textbox grande na parte in o item de jornal).

80

Organizar e comunicar-se com o Outlook

4

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 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 u 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

Parte I

Os componentes do Office e o que fazem melhor

Dois botões permitem que você rapidamente marque (ou desmarque) todos os contatos; uma vez selecionado o edestinatá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-m 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 iten é 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

Organizar e comunicar-se com o Outlook

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

4

Parte I

Os componentes do Office e o que fazem melhor

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

Organizar e comunicar-se com o Outlook

NOTA

4

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-mai ou itens de jornal de dados em tabelas do Access, permitindo que você usar o Access como um centro de controle fazendo uso dos itens do Outlook onde eles oferecem uma interface superior, ou são mais amplamente acessível para os usuários.

85

Escrever código VBA par 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

Trabalhando com dados de aces

EU

n versões mais antigas do Microsoft Office, havia duas opções para trabalho NESTE CAPÍTULO 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 Usando o DAO de antigo e novo Acessar dados em conjuntos de registros (incluindo os conjuntos de registros do formulário) e trabalhar com tabelacom modelos de objeto para trabalhar estrutura usando as tabelas (e campos subsidiários) coleções. Por causa deDados de acesso Estas personalizado recursos, DAO foi o melhor modelo de objeto para trabalhar com Trabalhando com bancos de dados Access Dados de acesso. em formatos de 2000 a 2007

A outra opção para trabalhar com dados de acesso foi (e é) o objeto ADO Usando o modelo de objeto do ADO para modelo, introduzido com o Visual Studio 97 e disponível para uso no Office 2000 trabalhar com dados de acesso 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 cusConversão de código DAO para tomized características que o tornam tão bem adequado para acessar dados, códigoCódigo em ADO do DAO ADO 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 subsubsidiá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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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.

NOTA

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ê conv um formato anterior ao formato do Access 2007 do banco de dados, ou criar um novo banco de dados Access 2007, p Ele tem uma referência para o modelo de objeto do mecanismo de banco de dados Microsoft Office Access 2007 (no 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 d 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ê 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 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.accdtC:na \/ Arquivos de programa \/ pasta. Microsoft Office\/modelos\/1033\/acesso

NOTA

90

Trabalhando com dados de acesso 5

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 v no Access 2007

Mesmo se você está usando Access 2007, você ainda pode estar trabalhando com Access 2002\/2003, par esteira de bancos de dados (ou até mesmo banco de dados formato Access 2000) por um tempo. Access 2007 su com estes formatos de banco de dados mais velho no modo de leitura\/gravação, e talvez você precise fazer isso — Se você estiver trabalhando em um banco de dados para um cliente que esteja executando uma versão anterior não precisa usar nenhum dos novos recursos introduzidos no Access 2007 (tais como a pesquisa de valores múltipl campos ou RTF, em campos Memo e anexos), você pode continuar a trabalhar com bancos de dados 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ê d 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 c 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 declarações, porque certos nomes de objeto são usados em ambos estes modelos de objeto. Isso é verdadeiro para

91

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 camp 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 AD modelo de objeto, o que levou a muitos problemas para usuários e desenvolvedores que estavam trabalhando princip ou exclusivamente com DAO (Ver Figura 5.3). No entanto, se você criar um novo banco de dados no Access 2003, n 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 mod 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

Trabalhando com dados de acesso 5

FIGURA 5.4 As referências padrão para um novo banco de dados do Access 2003.

Ao usar um o , e assim por diante), Find * (métodos de pesquisa FindFirst FindNext 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.

DICA

Se você estiver trabalhando em um banco de dados criado originalmente várias versões de acesso atrás, poderia te 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 us para localizar a primeira partida para \"Microsoft\" no campo CompanyID: FindFirst 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

93

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

Se você tem uma referência definida apenas para o modelo de objeto do ADO, esse código não vai mesmo compilar receberá um erro de \"tipo definido pelo usuário não definido\". Se você tem referências conjunto para ambos modelo e a referência ADO é o primeira, você obterá um erro diferente, desta vez na linha com o método de referência: \"método ou membro de dados não encontrado.\" Se você tiver apenas um DAO FindFirst 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 encon 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.

DICA

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 pro 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

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 compomações ou atributo. Figura 5.5 mostra os atributos do objeto ADO campo no Pesquisador de objetos.

94

Trabalhando com dados de acesso 5

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), corretipo de propriedades específicas do campo de acesso; as propriedades do campo de ADO são mais genéricas, porq 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 disambiguating de 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 is Vale a pena documentar, porque você pode precisar continuar trabalhando com mais velhos Formatar bancos de dad 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, conj 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

Trabalhando com dados de acesso 5

FIGURA 5.7 O modelo de objeto do DAO 3.6. DBEngine Erros

Erro

Espaços de trabalho Espaço de trabalho Bancos de dados Banco de dados Recipientes

Recipiente Documentos Documento

QueryDefs

QueryDef Campos

Campo

Parâmetros

Parâmetro

Conjuntos de registros Conjunto de registros Campos Relações

Campos TableDefs

Grupos Usuários

Campo

TableDef Campos

Campo

Índices

Índice

Grupo Usuários

Campo

Relação

Campos

Campo

Usuário

Usuário Grupos

Grupo

Novos objetos no modelo de objeto do Access 2007 DAO Há três novos objetos no novo modelo: , ,e ComplexType campo2 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 a os valores.

Campo2 Este objeto representa um campo em um banco de dados do Access 2007. Tem os novos atributos descritos Tabela 5.1, em comparação com a propriedade de campo, que representa um campo em um Access 2000 ou banco de dados de 2002\/2003.

97

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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çã velho opor-se, que ele tem apenas uma propriedade nova, , representando a par Conjunto de registros ParentRecordset 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 colexplanador é 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

Recipiente

AllPermissions Herdar Proprietário Permissões Nome de usuário

DBEngine

98

SystemDB

Métodos

Constantes

Trabalhando com dados de acesso 5

Objeto ou coleção

Propriedades

Métodos

Grupos

CreateGroup

Nome de usuário

CreateUser

Constantes

Grupo\/grupos Usuário\/usuários Espaço de trabalho

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 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 método do objeto aplicativo Access, depois de declarar a CurrentDb 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 método, com o nome de OpenDatabase 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 r 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 reg consultas em um banco de dados. Existem cinco tipos de conjuntos de registros DAO, com propriedades diferentes 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

VBScript (VBS), não suportam constantes nomeadas, então você precisará usar os valores numéricos em vez disso, p exemplo, quando escrever código VBS Outlook ou Windows Script Host (WSH). Consulte o capítulo 17 para obter exemplos de código WSH.

REFERÊNCIA CRUZADA 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 conjunto de registros, e se isso é impossível, então um dynaset, um instantâneo, em seguida um conjunto de registro 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 qu o código está sendo executado, em oposição a tabelas vinculadas). Você pode adicionar, editar ou excluir registros d usando um conjunto de registros do tipo tabela. Esses conjuntosEncontrar de registros métodos não ( indFirst suportam o, F , , ); em vez disso, eles apóiam o método. FindLast FindNext FindPrevious Procurar 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.

NOTA

Se você não receber uma resposta ao pressionar uma tecla de função, teclas de função podem ser desativad alguns teclados mais recentes desativar teclas de função padrão. Para ativar as teclas de função, pressione a tecla F Lock.

DICA

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

100

Trabalhando com dados de acesso 5 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 ba uma tabela. Você pode usar esses conjuntos de registros para adicionar, editar ou excluir registros de uma ou mais Suportam a conjuntos de registros do tipo dynaset Encontrar mais flexível métodos F ( indFirst FindLast , ,

101

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 comfora 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 representaing 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.

, FindNext FindPrevious

); ao contrárioProcurar do 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 exe 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

Trabalhando com dados de acesso 5 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 p geração de relatórios. O procedimento a seguir se move através de um conjunto de registros com base em uma ta os valores em vários campos para a janela imediata, usando as constantes do VB e vbTab vbCrLf 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 º: [email protected]

Ao contrário de conjuntos de registros do tipo table e tipo dynaset, você pode trabalhar com um mesmo conjunto tabela subjacente é aberta, o que ocasionalmente pode ser útil.

103

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

Forward-only

Avançar-only de conjuntos de registros são semelhantes aos conjuntos de registros do tipo instantâneo, exceto que 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 tabela. Você pode usar esses conjuntos de registros para adicionar, editar ou excluir registros de uma ou mais tabelas 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 ofer funcionalidade: você pode criar uma consulta em tempo real, no código do VBA (por exemplo, para filtrar por um valo entrou ou selecionado em um formulário) e, em seguida, usar esse QueryDef como fonte de dados para um conjunto 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

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ódig 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

Trabalhando com dados de acesso 5 .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 nome da consulta como argumentos para o função. Essa função retorna numCreateAndTestQuery 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 função. CreateAndTestQuery

Você também pode criar um QueryDef e usá-lo diretamente para criar um conjunto de registros, como na linha segu de código: Set rst = qdf.OpenRecordset

105

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

Nomes de argumento inconsistente são capitalizados no código VBA. Independentemente de como você digit 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 capitalréégal dos argumentos em seus tópicos de ajuda, onde eles geralmente são representados como em minúsculas.

NOTA

Você também pode criar um QueryDef correspondente a uma consulta de ação e executá-lo diretamente do código, 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 é exe 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

DICA

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çãoGing efeitos, se necessário.

TableDefs e campos

TableDefs correspondem às tabelas na interface. Embora seja muito mais comum a necessidade de crecomeu uma consulta por meio de programação, às vezes, talvez você precise criar uma tabela no código. Quando vo uma nova tabela, você também precisará criar campos para ele. O código a seguir cria uma nova tabela em um e 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 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

106

Trabalhando com dados de acesso 5 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

.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

Trabalhando com dados de acesso 5 Aqui está a lista de tabelas, como impresso para a janela imediata a procedimento: NewTable 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 método não tem um argumento para a criação do disCreateField formato para um campo de jogo.

NOTA

Outras maneiras de criar tabelas por meio de programação

EU

adição de n para oCreateTableDef Código VBA:

método, existem três outras maneiras de criar tabelas de acesso em

nO

CopyObject método do objeto DoCmd no modelo de objeto do Access cria um novo tabela baseada em uma tabela existente.

método do DoCmd n Executar uma consulta criar tabela usando oOpenQuery ou ExecutarSQL objeto, ou a Executar a consulta.

método de objeto QueryDef, cria uma nova tabela como a saída de

n 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 método dá a você o máximo controle CreateTableDef 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.

109

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 ob No entanto, com algumas exceções (trabalhando com conjuntos de registros do formulário e criando tabelas program 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

NOTA

No conjunto de registrosBOF DAO, Propriedade o 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 determina 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 do procedimento, strSearch variável (o segmento de código é parte TestKeysetOptimistic 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, é extrem 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 s 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

110

Trabalhando com dados de acesso 5 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 diferen para especificar o nome de arquivo e caminho do banco de dados e especificar o provedor Microsoft Jet 4.0, como o 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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

Trabalhando com dados de acesso 5 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 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 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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

Trabalhando com dados de acesso 5 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 re atributos são mais genéricos. Um conjunto de registros ADO pode ser baseado em uma tabela, consulta, instrução de 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

Trabalhando com dados de acesso 5 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 pa 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 argumento. Os dois mais usados bloqueio LockType os tipos são a read-only (chamado constante: adLockReadOnly ) e otimista (chamado constante: ) tipo. 5.4 Tabela lista os tipos de cursor ADO, com seus equivalentes numéricos, adLockOptimistic 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 chav 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):

NOTA

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

118

Trabalhando com dados de acesso 5 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 é 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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

Trabalhando com dados de acesso 5 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 A conjunto de registros, você pode também especificar o cursor de conjunto de chaves quando você cria o conjunto de 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 (converte adOpenKeyset)

AdLockOptimistic

AddNew Excluir Encontrar MoveFirst MovePrevious MoveNext MoveLast Atualização

adOpenDynamic (converte adOpenStatic)

adLockReadOnly

Encontrar MoveFirst MovePrevious MoveNext MoveLast

adOpenKeyset

AdLockOptimistic

AddNew Excluir Encontrar MoveFirst MovePrevious MoveNext MoveLast Atualização

adOpenKeyset

AdLockReadOnly

Encontrar MoveFirst MovePrevious MoveNext MoveLast

continuou

121

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

TABELA 5.6

(continuação)

Tipo de cursor chamado constante

Tipo de bloqueio chamado constante Métodos disponíveis

adOpenStatic (converte adOpenKeyset)

AdLockOptimistic

AddNew Excluir Encontrar MoveFirst MovePrevious MoveNext MoveLast Atualização

adOpenStatic

AdLockReadOnly

Encontrar MoveFirst MovePrevious MoveNext MoveLast

adOpenForwardOnly (converte adOpenKeyset)

AdLockOptimistic

AddNew 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 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 some (adLockReadOnly ) para acesso de dados mais rápido. A seguir procedimento adiciona um novo registro para o tlkpCategories TestKeysetOptimistic 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

Trabalhando com dados de acesso 5 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

& 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

Trabalhando com dados de acesso 5 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 procedimento. Se você fizer adLockReadOnly tipo de bloqueio, como o seguinte TestStaticReadOnly 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 anteriormen

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, impres 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 , EOF banco , de dados DA BOF , ):* 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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

Trabalhando com dados de acesso 5 & 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ár

127

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

É 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,adLockOptimistic use o 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

Trabalhando com dados de acesso 5 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 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ãoem 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 vo campos de referência conforme necessário no registro atual em um conjunto de registros, sem criar um objeto de re

Fluxo

Um objeto de fluxo representa um fluxo de dados de um arquivo de texto, XML documento ou página da web. Porqu Este objeto não funciona com dados de acesso, ele é tratado nos capítulos sobre como trabalhar com arquivos de 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 d Código DAO não pode ser convertido em ADO, porque eles não têm nenhum equivalente no modelo de objeto do A assim você ainda precisará usar DAO para conjuntos de registros de forma de acesso, ou criando tabelas e seus ca gramaticalmente.

129

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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.

DICA 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

QueryDef

Nenhum equivalente direto, mas pode usar o objeto de comando para obter a mesma funcionalidade

TableDef

Não há equivalente

Somente os campos de conjunto de registro

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

130

Trabalhando com dados de acesso 5 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 re Existem algumas diferenças, consulte as seções sobre ADO recordset cursor e o bloqueio de tipos para obter detal as diferenças. Para mais informações sobre conversão de código DAO para ADO código veja Alyssa Henry article \"Portar DAO para ADO com o Microsoft Jet provedor de código,\" que está disponível on-line na biblioteca MSDN, procurando seu títulohttp:\/\/msdn.Microsoft.com\/library\/ ou no . default.asp?url=\/library\/en-US\/dndao\/HTML\/daotoado.asp

DICA

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 20 em vez de remover o modelo de objeto DAO, Microsoft escolheu sabiamente para apará-lo de alguns raramente us componentes e renomeie-o modelo de objeto do mecanismo de banco de dados Microsoft Office Access 2007. Meu 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, AD você precisa usar de modelo de objeto (nenhuma escolha lá — DAO funciona apenas com dados de acesso). ADO usado para trabalhar com dados de acesso, bem como, embora tenha algumas limitações em comparação com DA alguns casos você pode quer (ou precisa) para usar o ADO para trabalhar com dados de acesso; Eu tenho desde in mação sobre a conversão de código DAO para ADO para estas situações.

131

Trabalhando com palavra Documentos e modelos

D

espite o novo e melhorado relatório interativos recursos discutidos NESTE CAPÍTULO 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,Built-in VBA exportação de Word Office 2007 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 Componentes do objeto Word modelo usado no código de automação 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. Criação de documentos do Word cheio com dados de acesso, através de quatro

Em contraste com os relatórios de acesso (mesmo no modo de exibição Layout novo), palavra docudiferentes métodos 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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

NOVO RECURSOtinha a visualização de impressão, visualização do Layout (somente leitura, sem dados) e visualização d 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 redim colunas de relatório observando os dados (um recurso muito solicitado).

A nova exibição de Layout de um relatório do Access.

134

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, especialmente se você precisa distribuir documentos contendo os dados de acesso para as pessoas que não tem acesso instalado.

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 ver Access 2003 era o controle de lista suspensa de OfficeLinks na barra de ferramentas de banco de dados, oferecen 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 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.

NOTA

FIGURA 6.1 Novo guia dados externos sobre o Access 2007 fita, com o menu mais caiu.

135

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 pala opção, todos os dados de todo o objeto selecionado é automaticamente exportada para uma nova palavra documento, 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 pa dados em uma tabela do Access ou a consulta select, mas um jogo muito pobre para um formulário. Relatórios são c documentos, não de tabelas (mesmo se eles são relatórios tabulares), com rodapés como texto no corpo do do 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

Trabalhando com documentos do Word e modelos 6

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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 porformando a mesclagem e você pode criar uma nova carta na mosca, assim esta escolha de interface pode s ú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 filtrad

Minha conclusão, depois de analisar os novos recursos de exportação de dados no Access 2007, é que (assim como versões anteriores do Access) se você quer ser capaz de selecionar os registros para a exportação de dados de ace 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 document

NOTA

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 e Acesso VBA. Código de automação não é uma linguagem de programação especial, apenas um conjunto de funções 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 conjun 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 argumento cria um novo Classe Instância da palavra; ele funciona ou não palavra já está aberta.GetObject O função com \"Word. Application\" comoClasse o 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, euGetObject uso o função no corpo de um proprocedimento, o que define uma referência a um objeto de aplicativo do Word existente, se a palavra estiver em exec analgesia com um manipulador de erro CreateObject que usa 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

138

Trabalhando com documentos do Word e modelos 6 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.

NOTA

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 usadoCreateObject com o ouGetObject função. Apesar de você usar ouGetObject para definir uma referência diretamente para um documento d CreateObject 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 p objetos no modelo, deixando-o fazer quase qualquer coisa que você pode fazer na interface e porHAPs algumas coisas que não podem ser feitas na interface. O modelo de objeto do Word é muito extensivo, m 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 propriedad 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.

139

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

FIGURA 6.5 Analisar o objeto da palavra MailMerge no Pesquisador de objetos.

Criando um documento do Word de novo, em branco O

NewDoc funçã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

Trabalhando com documentos do Word e modelos 6 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 Fold 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 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.

REFERÊNCIA CRUZADA FIGURA 6.7

141

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 procedimento, depois de criar o novo documento, o NewDocFromTemplate 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 CustomProperty um objeto, esta coleção e objeto realmente pertencem as marcas inteligentes, por isso, se você declarar variáveis desses tipos de dados, você receb erro de compilação; Portanto, eles devem ser declarados como objeto.

NOTA

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

142

Trabalhando com documentos do Word e modelos 6 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 Acce envolvia dados de diversas áreas, conforme necessário para obter melhores resultados quando se trabalha com d Um campo concatena o nome, cargo e informações de nome da empresa,IIf usando função 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, mesm

143

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

a falta de alguns campos de dados. Eu, também, criar um campo ZipCode separado para uso na criação de barra de códigos em envelopes ou etiquetas. O banco de dados da amostra, esta consulta é . As expressões de campo calculado eu qryContactsForMerge 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 (carCarre retorno além de avanço de linha) iniciar uma nova linha em uma seqüência de caracteres de texto, m ser usado em expressões de consulta campo, então eu uso o Chr valores dos caracteres CR e LF.

DICA

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 problem antes de realizar a mesclagem. Depois de criar as expressões, basta mudar para o modo folha de dados para inspeci resultados e, em seguida, alternar de volta para criar modo de exibição para corrigir quaisquer problemas que você

144

Trabalhando com documentos do Word e modelos 6

Escolhendo um método para mesclar o acesso Dados para o Word

O NewDocFromTemplate procedimento listado na seção anterior lista palavra documento properties que pode ser preenchido com os dados de acesso. Este é meu método preferido para exportação de dados Documentos do Word, mas não é o único método. Você também pode exportar os dados de acesso ao livro de pala 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 inforpara 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 Requer ser 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 docargu 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.

NOTA

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 exibi informações de vant no Explorer.

DICA

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).

146

Trabalhando com documentos do Word e modelos 6

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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

O comando de propriedades no menu do Office abre um novo recurso do Word 2007, o

NOVO RECURSOPainel 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.

148

Trabalhando com documentos do Word e modelos 6

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 folha de propriedades do modelo, com várias propriedades de documento personalizadas que são úteis para criar d 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:

n Se você não especificar um valor padrão para uma propriedade de texto, Word não vai deixar você salvá Use um espaço (o que é permitido) como o valor padrão.

n Campos de data geralmente devem ser evitados, exceto raros casos onde você realmente preci um padrão de data valor, porque não há nenhuma maneira de lhes dar um valor padrão em branco. É pos formate um valor de texto como uma data, utilizando switches de campo de palavra.

149

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

n 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 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. n 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 baixoneste 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 caixa de diálogo IAR Word 2003 para que recurso (veja Figura 6.14).

DICA

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 na Figura 6.15.

Se você clicar na palavra no cabeçalho deste formulário, é criada uma carta para o contato selecionado, enchime Propriedades de documento do Word com dados de registo.

150

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.

151

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 valore 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 lista 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 dois cem cinqüenta e 50\/100

DOCPROPERTY \"DollarAmount\" \/ * DollarText

150250.25

CENTO CINQUENTA MIL DOIS CEM CINQÜENTA E 25\/100

DOCPROPERTY \"DollarAmount\" \/ * DollarText \/ * superior

150250.50

cento cinquenta mil duzentos cinquenta

DOCPROPERTY \"EntryAmount\" \/ * 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 InserirPartes 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 barra próxima figura).

DICA

152

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 formatoTing 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.

DICA

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 form

REFERÊNCIADocProperty CRUZADA campos.

153

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

O cmdWord_Click() procedimento de evento primeiro salva as informações de variáveis, para uso mais tarde n código e, em seguida, verifica se o modelo é encontrado na pasta modelos, define um aplicativo do Word varicapaz 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) us Fazer...Loop instrução para criar um save o nome para o documento que contém os dados mesclados, picking 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

Trabalhando com documentos do Word e modelos 6 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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

Trabalhando com documentos do Word e modelos 6 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).

DICA

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 incr números de Ludo. FIGURA 6.16 Uma letra da palavra preenchido com dados de acesso de um único registro de contato.

157

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

Se você não quiser criar vários documentos, você pode eliminarFazer...Loop a 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 você precisa de uma interface diferente. O frmMergeToWord de formulário tem uma caixa de combinação para selec modelo e uma caixa de listagem seleção múltipla para selecionar um ou mais contatos como destinatários (Ver Figura 6 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 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 documento, 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á umaseguida declaração em Se...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

Trabalhando com documentos do Word e modelos 6

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 caminh 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 collectora 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

Trabalhando com documentos do Word e modelos 6 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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

Trabalhando com documentos do Word e modelos 6 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 f çõ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.

DICA

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 d Private Sub cmdDeselectAll_Click() No erro GoTo ErrorHandler Conjunto lst = Me![lstSelectContacts] intRows = lst.ListCount - 1

164

Trabalhando com documentos do Word e modelos 6 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, s Todas as linhas no listbox; seu código é similar, definindo o valor para Em vez de Selecionado Verdadeiro Falso . Clicando no botão de comando de limpar todas as selecções limpa todas as seleções que você fez na listacaixa; clicando no botão de comando criar documentos inicia a mesclagem, chamando um dos quatro procedures, 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 tato, com marcadores preenchido com dados de acesso. Uma destas cartas é mostrada na Figura 6.20 (eu f favoritos visíveis, assim você pode ver suas localizações; Note que o eu-barras cinza). O MergeBookmarks procedimento (listado em seguida) é basicamenteMergeDocProps semelhante a 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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

Trabalhando com documentos do Word e modelos 6 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

.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

Trabalhando com documentos do Word e modelos 6 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 cer 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 tabel

NOVO RECURSOdados 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 método: MoveRight Private Sub MergeTypeText(strWordTemplate As String, _ strExtension As String) No erro GoTo ErrorHandler

170

Trabalhando com documentos do Word e modelos 6 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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

Trabalhando com documentos do Word e modelos 6 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 Mod operador para lidar com cada registro de segundo ou terceiro forma diferente, a fim de gravar dados a 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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

Trabalhando com documentos do Word e modelos 6 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 oCreateObject Word com

:

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 e desvantagens para este método. O documento de mala direta não vai abrir, a menos que o banco de dados do Ac 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-c arquivo de texto como fonte de dados do documento de mala direta. Isso significa que o documento pode ser aberto 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 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 método, porque é muito mais simples TypeText configurar um documento de etiquetas simples de um documento de mala direta; tudo o que você tem que fazer é tipo de documento no Word, Considerando que a criação de um documento de mala direta requer manualmente lig fonte de dados e inserir campos de mesclagem.

175

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 compa 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 conregistro de tato. Eu prefiro usar o método de propriedades ou marcadores de documento, a fim de ter um sepadocumento 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ágin deste documento de mesclagem.

176

Trabalhando com documentos do Word e modelos 6

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 cri outro documento de mala direta vinculado à mesma fonte de dados, você receberá uma mensagem de erro dizendo que já existe, e você não será capaz de continuar. Para evitar isso de Merge Data. txt acontecendo, o código da mala fecha o documento original de mesclagem após a fusão de dados para um novo documento.

AVISO

O MailMergeTextFile procedimento é listado como segue. Esse procedimento primeiro preenche uma tabe com os dados da coleção ItemsSelected do ListBox e, em seguida, exporta os dados de que tabela para um arquivo texto , que é usado como a fonte de dados para a mala docu Mergede Data. txt mento. A mesclagem é executada para um novo documento (para que o documento pode ser aberto posteriorment 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:

177

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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

Trabalhando com documentos do Word e modelos 6 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 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

Trabalhando com documentos do Word e modelos 6 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 oCreateObject Word com

:

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 interenfrentar e no código do VBA, você pode produzir documentos de palavra altamente formatados preenchidos com da 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

Trabalhando com o Excel Planilhas

J

Ust como você pôde querer exportar dados de acesso a documentos do Word para NESTE CAPÍTULO Aproveite sua formatação superior e transportabilidade, você maio também quer (ou necessidade) para exportar dados de acesso a planilhas do Excel, O modelo deassim objeto do Excel os usuários podem rever, editar, adicionar dados ou executar vários numérica cCriação de planilhas de ções, em um formato familiar e amplamente utilizado (todos os usuários do Office que o Excel, a faixa de opções 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 - Criação de planilhas de ções e outras formas. Ou você pode querer exportar dados do Access para um simples modelos linhas e colunas de planilha, para que os usuários podem manipular os dados em vari Formatação de planilhas UOs maneiras e produzir gráficos com base nos dados, usando as ferramentas no Excel. Código VBA

Este capítulo descreve como você pode exportar dados de planilhas do Excel para uma Preenchimento de planilhas de Excel com 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 método em um único Quadro de horários de acesso a dados TransferirPlanilha 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 trabalhofolha, como descrever como funciona um procedimento.

NOTA

183

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 suj 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ór 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ê po 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

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 vincula 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

Trabalhando com planilhas do Excel 7

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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 for 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

Trabalhando com planilhas do Excel 7

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, minimamen formatado ou não formatada planilha preenchida com dados de uma tabela do Access ou a consulta, mas se você p para criar planilhas totalmente formatadas, como formas de pessoal, quadros de horários, relatórios de vendas, fáb relatórios de dados de produção e assim por diante, você precisará trabalhar com o modelo de objeto do Excel para planilhas usando código de automação, preenchê-los com dados de acesso e, em seguida, aplicar a formatação, us componentes do modelo de objeto do Excel.

NOTA

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 para recuperar uma referência a um GetObject 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 trab 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

187

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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

Err

:

Set appExcel = CreateObject(\"Excel.Application\") Retomar em seguida Outra coisa MsgBox \"erro nenhum:\" Resume ErrorHandlerExit End If

End Sub

NOTA

Os procedimentos nesta seção podem ser executados a partir de macros; cada procedimento tem uma macr cujo nome é MCRAlé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 função de uma linha na CreateObject manipulador de erro do procedimento. SeCreateNewWorkbook você executar o 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 mostrado na Figura 7.5.

188

Trabalhando com planilhas do Excel 7

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 s 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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

Err

:

Set appExcel = CreateObject(\"Excel.Application\") Retomar em seguida Outra coisa MsgBox \"erro nenhum:\" 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

Trabalhando com planilhas do Excel 7 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 tra 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 trabalh título, corretamente dimensionada de colunas e a fonte e outro layout de sua escolha e preenchê-lo com aces 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 m 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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

Trabalhando com planilhas do Excel 7 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 d começa Iterando através de registros no conjunto de registros, usandométodo o da célula ativa para Deslocamento coloca os dados de cada campo na coluna correta.

194

Trabalhando com planilhas do Excel 7

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.

NOTA

O ExportContactsToExcel mcrExportContactsToExcel

procedimento nesta seção pode ser executado a partir da macro .

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 preenchid dados peloTransferirPlanilha método: Função pública ExportAccountSummary() Dim strWorksheet As String Dim strWorksheetPath As String Dim appExcel como Application

195

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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

Trabalhando com planilhas do Excel 7 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

.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

Trabalhando com planilhas do Excel 7 .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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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

Trabalhando com planilhas do Excel 7

NOTA

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, e 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 método. A nova planilha é aberta e ativada e vários TransferirPlanilha 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.

DICA

Em seguida, o procedimento insere linhas em branco na parte superior da planilha e texto de título é inserido na parte 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 u 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.

201

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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.

DICA

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 ho 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 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 po vários quadros de horários em uma semana. No caso (por exemplo) é um estabelecimento de pesquisa científica, o horas não são tarifadas fora aos clientes, um quadro de horários por funcionário, listando vários projetos em uma sem 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 fun projeto e preenchimento em um quadro de horários para que o empregado. A suposição é que um quadro de horários para cada combinação de projeto\/cliente, assim um empregado pode ter vários quadros de horários para uma determ

Fonte de na cboEmployeeID caixa de combinação linha é uma consulta União que combina dados de dois consultas: , que lista os quadros de horários que foram preenchidos até agora qryThisWeeksTimesheets Esta semana,qryNeedTimesheets e , 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ário ter sido preenchido até agora, como ilustrado na Figura 7.10.

202

Trabalhando com planilhas do Excel 7

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 procedimento calcula o fim de semana CurrentWeekEnding Data (hoje, se for domingo, caso contrário no domingo passado) e preenche as legendas dos sete data rótulos a forma com que o dia correto da semana; o nome do gerente também é exibido no Gerenciador de domí (a cor de fundo azul clara indica que a caixa de texto está bloqueada). (Consulte a Figura 7.11).

NOTA

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 edi

controles.

203

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

FIGURA 7.11 Informações de data automaticamente preenchido após selecionar um funcionário.

O

CurrentWeekEnding

e

FillDateControls

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

procedimentos são listados a seguir:

Trabalhando com planilhas do Excel 7 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 porque caso contrário, a consulta não poderia ser executada. A consulta de fonte de linha é uma consulta de FindUn 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 v

205

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 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

Trabalhando com planilhas do Excel 7

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ár 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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

Trabalhando com planilhas do Excel 7 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 evento DblClick procedimento, então você pode clicar duas vezes o nome de um funcionário para abrir esse quadro de horários pa necessário: Private Sub txtEmployeeID_DblClick (Cancel As Integer) No erro GoTo ErrorHandler Dim lngID como longo Dim strClientCode As String

209

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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

Trabalhando com planilhas do Excel 7 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 ho 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 executaCreateExcelTimesheets o procedimento, que cria uma planilha do Excel para cada quadro de horários listado na caixa de diálogo; Dentre estes quadros de h é mostrado na Figura 7.16.

211

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 DA quadros de horários na semana atual e outro conjunto de registros de horas na que o empregado. O funcionário inform ção é inserida na planilha primeiro e, em seguida, o código itera por meio de registros de horas, processoing 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

Trabalhando com planilhas do Excel 7 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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

Trabalhando com planilhas do Excel 7 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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

Trabalhando com planilhas do Excel 7 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 nov . 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

Trabalhando com Itens do Outlook

Ó

utlook tem uma ótima interface para trabalhar com calendários, contatos, NESTE CAPÍTULO 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), Links para pastas do Outlook o que significa que se você estiver usando acesso por mais do que isso, você sobre o Outlook provavelmente tem calendário, contato ou tarefa dados armazenados nas tabelas deAprendendo acesso de dadosmodelo de objeto bases que foram criadas há muitas versões do Office. (Eu tenho alguns que foram Originalmente criado em Access 1.0!) Trabalhando com o Outlook nomeações

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 Trabalhando com tarefas do Outlook configurar ligações de um-para-muitos entre empresas e contatos, contatos e Trabalhando com email do Outlook telefones, contatos e endereços e assim por diante. Outlook, por outro lado, não é um mensagens 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 Trabalhar com contatos do Outlook (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 comdo Josenildo contatos. No Outlook, por outro lado, se você tiver 10 contatos para um comCris 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

Por exemplo, o registro de Microsoft em meu banco de dados de contatos de acesso pessoal tem 30 de telefoneBers, 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 convenient, 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 correspondem aos slots padrão do Outlook). E se você tiver tarefas ou itens de calendário armazenados em um acess 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 A

REFERÊNCIAcom CRUZADA 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 de procedimentos de evento ou macros. Por exemplo, se você tem um banco de dados relacionados com o projecto i çã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 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 u forma, ou você deseja definir propriedades internas que não são argumentos do comando. EnviarObjeto

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 exp 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).

220

Trabalhando com itens do Outlook 8

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 o menu mais do grupo Import na faixa de opções. Você pode ver esta selecção na Figura 8.3.

221

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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, acrescentand 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

Trabalhando com itens do Outlook 8 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, verSion 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 olTask (mostrado na Figura 8.7) tem um grande muitos campos, mas falta-lhe o campo de assunto crucial, tornando tu mas inútil.

223

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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, q 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

Trabalhando com itens do Outlook 8

FIGURA 8.9 Uma pasta de contatos vinculada.

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

225

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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.

226

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

227

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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.

228

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.

229

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 -

NOVO RECURSOAtes, 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 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.

230

Trabalhando com itens do Outlook 8

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.

NOTA

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 só é adequado para manter uma simples lista de contatos de arquivos simples e não tem maioria da fea esp 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 vo regularmente exportar dados básicos de contato para um arquivo de texto ou planilha para distribuição via e-mail, o exportar para um banco de dados de arquivos simples de mainframe.

231

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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

Trabalhando com itens do Outlook 8 Todas essas formas dos novos modelos de banco de dados usam as macros incorporadas novas

NOVO RECURSOem 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 assinatu mesmo quando você executa assinado código, no Windows Vista). Para tarefas simples, como fechar um formulário ou 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 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.

NOTA

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.

233

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 Outloo 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 nomeada referência ou criar os tipos de item específico. Pastas são acessadas através de curiosamente nomeado objeto (representando os dados armazenados nas pastas do Outlook), o que faz para alguns muito Espaço para nome 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 currently 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 usarCreateObject o 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,Novo usando palavra-chave o 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 palavra-chave o Novousar quando declarar o aplicativo Outlook objeto e, em seguida, defina a variável Nadade 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

Trabalhando com itens do Outlook 8

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 método, ou uma pasta personalizada por fazer referência a ele como um membro de nível su GetDefaultFolder 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 comfora 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.

NOTA

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 arma que tem pego muitos programadores do Outlook a partir. Assim, quando você precisa trabalhar com itens

235

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

em uma pasta, você também precisa declarar uma variável como Object. Isso ocorre porque uma variável de obje 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,Adicionar usemétodo o com a coleção de itens de uma pasta (este creates 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 objeto, com o nome CreateItemFromTemplate 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 em que Novopalavra-chave, caso que você não precisa definir a variável. Ou você pode declará-lo palavra-chave o e então Novosem Defina a variável mais tarde com ouCreateObject , como eu geralmente faço em meu completo pro GetObject 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ávelObjeto como 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

Trabalhando com itens do Outlook 8 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 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.

DICA

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 contor 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.

237

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

Na caixa de diálogo escolher formulário, selecione \"Modelos de usuário no sistema de arquivos\" na lista drop-down \"Olh 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

Trabalhando com itens do Outlook 8 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 executando:

linha e erro manipulador padrãoCreateObject para

Outlook não for

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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 dif diferentes nomes em código que eles têm na interface do usuário (por exemplo, um artigo de jornal tem uma mensage classe de \"Atividade\"). Tabela 8.1 irá ajudá-lo a encontrar o nome certo ou uma constante nomeada para cada situaçã TABELA 8.1

Referenciar itens do Outlook Mensagem de modelo de objeto de interface Nome Nome

Classe

OlObjectClass OlItemType 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 mos 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 constantes nomeadas são usadas para deterOlObjectClass que tipo de item que você está tratando, usando o meu Classea 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 Propriedade. Consulte os procedimentos de amostra na próxima segDefaultItemType ções para exemplos que usam essas constantes.

240

Trabalhando com itens do Outlook 8

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 O

Trabalhando com compromissos do Outlook

Você pode ter dados de calendário (marcação) armazenados em uma tabela do Access, talvez datam de an 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 amost base, chamado de tblEvents) para compromissos do Outlook, use a função listado próximo (pode também ser exec 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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

Trabalhando com itens do Outlook 8 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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

End If Itm próximo

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

RST.Fechar DoCmd.OpenTable \"tblImportedCalendar\" ErrorHandlerExit: Exit Function ErrorHandler:

244

Trabalhando com itens do Outlook 8 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 aces tabela de dados do projeto, uso o função (ele também pode ser executado a partir do CreateProjectAppts 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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

Trabalhando com itens do Outlook 8 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 re 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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

Trabalhando com itens do Outlook 8 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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

Trabalhando com itens do Outlook 8 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.

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

End If Itm próximo

.Atualização Terminar com

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

Trabalhando com itens do Outlook 8

Para um cenário mais realista, no qual você deseja criar tarefas baseadas em dados em uma tabela do Outloo consulteCreateProjectTasks o 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 u 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

Trabalhando com itens do Outlook 8

Se você tem um conjunto de tabelas vinculadas do acesso dos dados de contato, e você deseja manter os

REFERÊNCIAnas CRUZADA tabelas sincronizadas com correspondência de itens de contato do Outlook, você precisa de mais de u 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 seg (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çã falha de referência para a pasta, a pasta será criada.

255

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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

Trabalhando com itens do Outlook 8 & 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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

Trabalhando com itens do Outlook 8 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

Use as seguintes linhas para definir uma referência a uma pasta de contatos personalizada, criá-la se necessário. Se 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

Trabalhando com itens do Outlook 8 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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-

REFERÊNCIAconcluído CRUZADA 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 deciSion 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.

262.

Trabalhando com arquivos e pastas

EU

n os capítulos anteriores abordei a criação de documentos, Excel do Word NESTE CAPÍTULO 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 Criação de pastas do Windows com — às vezes você precisa criar um documento de texto sem formatação ou importar dados Criando FolderPicker e de um em uma tabela do Access. Mas, antes que você possa trabalhar com esses docuFilePicker caixas de diálogo usando o mentos, você precisará trabalhar com pastas. O presente capítulo compreende escrever código Objeto FileDialog de escritório que trabalha com pastas do Windows Explorer e arquivos de texto, usando vários métodos diferentes. Gravar dados em arquivos de texto usando o FileSystemObject, legado do VB

Como acesso versões progrediram, as ferramentas disponíveis para trabalhar com arquivos instruções e ADO 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 caixadados de combinação ou texto Lendo de arquivos ListBox. Pelo Windows 95,CommonDialog o controle era uma possibilidade, no usando o FileSystemObject, pelo menos se você teve a edição de desenvolvedor do Office. Mas o legado demonstrações de VB e ADO CommonDialog controle foi flagelada com problemas de versão — se você colocar uma versão Carregando arquivos em anexo um formulário e enviado o banco de dados para outra pessoa que tinha uma versão diferente campos e salvar anexos do controle, a outra pessoa apenas recebo a mensagem misteriosa para arquivos \"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

REFERÊNCIApastas. CRUZADA

Outro avanço veio com a biblioteca de tempo de execução de script, que forneceu um objeto (sim, isso é dois objetos!) que é muito útil para FileSystemObject 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 objeto (a parte do escritório FileDialog

263

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

modelo de objeto) permite-lhe aparecer uma caixa de diálogo para selecionar um arquivo ou uma pasta, com vários Opções. Esta caixa de diálogo permite que os usuários facilmente selecionar um arquivo ou pasta, cujo nome pode s mais operações. Não há qualquer razão para usar um função ou a CommonDialog controle para Retorno de chamada trabalhando com arquivos e pastas, então este capítulo cobreFileSystemObject usando o eo objeto para trabalhar com arquivos e pastas e os componentes de modelo de objeto do ADO FileDialog 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ê precisa 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 par seus modelos. Você pode obter a pasta de modelos do usuário padrão na caixa de diálogo opções de arquivo do Wor 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

REFERÊNCIAcódigo CRUZADA para selecionar os caminhos de documentos e modelos.

Para trabalhar com pastas do Windows, você tem duas opções: o escritório objeto, ou a FileDialog . Esses dois métodos são discutidos nas seções a seguir. FileSystemObject

NOTA

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 se usado em todo o banco de dados. Do banco de dados de amostra para este capítulo, arquivos e Folders.accdb, par 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 docume (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 s o botão de comando. A Figura 9.1 mostra um menu principal com essas opções.

264

Trabalhando com arquivos e pastas 9

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 objeto.FileDialog objetos podem ser criados como um seletor de arquivo ou uma pasta selecio FileDialog 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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

Trabalhando com arquivos e pastas 9 ErrorHandler: MsgBox \"erro nenhum:\" & “; Description: “ & Err.Description Resume ErrorHandlerExit End Sub

Na cmdInputDocsPath_Click procedimento de evento, o função é GetInputDocsPath() 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 valor selecionado na caixa de diálogo é salvo em txtInputDocsPath caixa de texto no formulário, que é vinculada ao campo InputDocsPath em tblInfo. O procedimento de evento cmdOutputDocsPath_Click armazena o caminho do modelo selecionado para txtOutputDocsPath, que é armazenado na OutputDocsPa campo em tblInfo.

Eu uso uma mesa de tblInfo na maioria de meus bancos de dados para armazenar dados que são necess banco de dados, como informações de caminho. Embora você possa usar variáveis globais para este purpose, 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.

NOTA

Os caminhos de entrada e saída de documentos personalizados armazenados no tblInfo são captados, sempre qu no banco de dados, usando o e GetOutputDocsPath() funções, GetInputDocsPath() 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

267

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 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

Trabalhando com arquivos e pastas 9

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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

O

FileDialog

objeto tem várias propriedades e métodos úteis:

n Filters.Add

— Permite especificar o filtro (s) para a exibição de arquivos, tais como

FD.Filters.Add \"Documentos do Word\", \"*. doc\"

— O nome de arquivo padrão, para uma caixa de diálogo Seletor de arquivo; o camin n InitialFileName para uma caixa de diálogo selecionador de pasta n ButtonName — O botão de legenda (no caso você quer algo diferente de \"Select\").

n DialogType — A seleção do tipo de diálogo Seletor de arquivo, selecionador de pasta, abrir ou salvar com (do enum, que pode ser visto no Pesquisador de objetos). Seguintes

— Permite-lhe definir a exibição da caixa de diálogo (detalhes, ícones grandes, visualização e n InitialView sobre). Olhar para o enum no Pesquisador de objetos para a seleção completa. MsoFileDialogView

— Se definido como True, permite que os usuários selecionar vários arquivos na c n AllowMultiSelect Arquivo caixas de diálogo selecionador somente). Figura 9.4 mostra oMsoFileDialogView a caixa de diálogo.

enum, com todas as opções para definir o modo de exibição para

FIGURA 9.4 Exibindo o MsoFileDialogView

270

enum no Pesquisador de objetos.

Trabalhando com arquivos e pastas 9

O FileSystemObject

O FileSystemObject a biblioteca fornece uma outra maneira de trabalhar com pastas do Windows (e arquivo Para usar os componentes da biblioteca de objetos em um banco de dados, você precisará definir uma referência, 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 ( ) é um arquivo de ajuda HTML compilado. Você vai encontráscript56.chm muito útil, pois inclui um livro de ajuda com informações completas sobre os componentes do , além de exemplos de código útil. FileSystemObject

271

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

FIGURA 9.6 O arquivo de ajuda do FileSystemObject.

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.

272

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 contendas 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

273

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 con Sion: se precisar de ajuda para Access 2007, tente o Google.

274

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 ToabControl 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

275

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 aprotópico de ajuda do Quad.

276

Trabalhando com arquivos e pastas 9

Um tópico da ajuda Access 2003 para o controle guia.

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 co possível fazer backup de um banco de dados. Meu menu principal de banco de dados padrão possui um Backup o chamadas a procedimento listado em seguida. Eu criei o botão de menu e o código de Backup em uma ore BackupDB versão de Lier de acesso, quando não havia nenhuma maneira de fazer backup de um banco de dados sem fechá

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 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 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

278

Trabalhando com arquivos e pastas 9

Embora seja muito mais fácil fazer backup de um banco de dados de acesso no Access 2007 do que em versões a a nova seleção de \"Back Up Database\" sobre os padrões do menu de gerenciar para salvar a cópia do banco de d a mesma pasta que o próprio banco de dados. Se você deseja salvar os backups para outra pasta (que 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 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

REFERÊNCIAincluindo CRUZADA 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 bas eo 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()

279

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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

Trabalhando com arquivos e pastas 9 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 Propriedade do CurrentProject 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 arqu nomes.) O proposto salvar nome é apresentado em um InputBox, onde ele pode ser editado como desejado, t como adicionar informações sobre alterações específicas feitas no banco de dados; Ele é salvo em uma pasta chama sob a pasta de banco de dados atual. O GetFolder método para a é usado para fazer referência a pasta de Backups; se FileSystemObject 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

método para a é usado para copiar o banco de dados atual para um backup FileSystemObject com o final salve o nome na pasta Backups. CopyFile

A tabela tblBackupInfo armazena datas e números de incremento para os nomes de backup. A voltaups que você faz em um dia terá um número (começando com 1) e a data, então eles não overescrever 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 método de acesso e arquivos delimitados por vírgula pode TransferText 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 , os métodos herdados de VB, ou ADO. FileSystemObject Para (e importada de) arquivos de texto delimitado por vírgulas e largura fixa é coberto

REFERÊNCIAnoCRUZADA 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 Nome do (aberto Para arquivo 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 Fluxo ADO o objeto em particular).

A amostra selecionar contatos para formulário de E-mail (frmEMailMerge), mostrado na Figura 9.10, tem um multiSelecione listbox para selecionar contatos para receber um email, caixas de texto para introduzir o assunto da mensa 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.

282

Trabalhando com arquivos e pastas 9

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 verif 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, Estadoum Select Caseconfigura 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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

Trabalhando com arquivos e pastas 9 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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

Trabalhando com arquivos e pastas 9 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.

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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

Trabalhando com arquivos e pastas 9 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 procedimento de evento cmdCreateEMails_Click 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 trabalha 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 método, em parte porque eu costumo ter uma referência de conjunto para a criação de script FileSystemObject 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 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

Trabalhando com arquivos e pastas 9

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, ma oferecer alguns recursos extras que são muito úteis para trabalhar com arquivos de texto, em especial o o procedimento de evento começa por setFluxo objeto. O caso do ADO nocmdCreateEMails_Click Ting uma variável para um objeto no modelo de objeto do ADO (note que o prefixo do modelo de objeto é Fluxo ADODB), usando o Novopalavra-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 seremstrText gravados para o arquivo variável e, em seguida, escrito para uma linha de fluxo usando a método. Para criar dois WriteText linhas em branco no arquivo de texto, é usado com dois vbCrLf constantes (que representa um WriteText 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).

NOTA

Você precisa de uma referência para a biblioteca de objetos ActiveX Data Objects para oferecer suporte a

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 u ou de ambos os campos obrigatórios (e assim não vai receber uma mensagem e-mail), instrução uma Se... Emde seguida 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 usan o SaveToFile método com o adSaveCreateNotExist opção, que cria o arquivo se ele não existe.

291

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

FileSystemObject

O FileSystemObject biblioteca de objeto fornece uma abordagem alternativa para trabalhar com arquivos de t usando oTextStream objeto. O caso da FSO nacmdCreateEMails_Click procedimento de evento começa criando um variável e, em seguida, criando uma variável FileSystemObject TextStream usando oCreateTextFile método. É uma seqüência de caracteres de texto introdutório a serem gravados para 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 deWriteBlankLines texto, o método é usado com o Linhas argumento definido como 2.

NOTA

Você precisa de uma referência para a biblioteca de objetos do Microsoft Scripting Runtime para oferecer s 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 e-mail), instrução uma Se... Emde seguida 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 referemENCE é necessária.StrFile O 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 variável arquivo é salvo para o strText e, em seguida, escrito para uma linha no arquivo de texto usando o bastante intuitiva método. Para criar Impressão #1 dois em branco linhas no arquivo deImpressão texto, dois#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 e-mail), instrução uma Se... Emde seguida 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 declaração. #1 Fechar 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 código, VB, FileSystemObject ou código ADO para ler dados de arquivos texto. Importar dados de formulário de arquivo de texto (frmTextImport) tem u 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, FS (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.

292

Trabalhando com arquivos e pastas 9

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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 procecmdLoadData_Click 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 um Select 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

Trabalhando com arquivos e pastas 9 .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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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, Novo usando palavra-chave, o o o objeto é Fluxo aberto e o selecionado texto arquivo é carregado, utilizando o método. O ReadText LoadFromFile 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 variável. Finalmente, o objeto strData Fluxo 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 é abertoOpenTextFile com o método para a , FileSystemObject 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 estrutura para processar todas as linhas no arquivo de texto, salvando dados Enquanto... Loop de cada linha para o um constante no strData variável, incrementando-linha por linha com vbCrLf entre linhas. Quando todas as linhas tiverem sido processadas, o arquivo de texto é fechado. Finalmente, no entanto os dados tem sido acumulados, o variável é escrito para o strData txtImportedText caixa de texto, como mostrado na Figura 9.15.

296

Trabalhando com arquivos e pastas 9

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.

NOVO RECURSO

Versões anteriores do Access tinham um tipo de dados de campo objeto OLE, que somente certos tipos suportad 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 tipo de dados, e os anexos são automaticamente compactados para economizar espaço de banco de dados. Os co 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; 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

297

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

Discutido usando o FileSystemObject (Scripting Runtime library) para trabalhar com pastas em uma seção anterior deste capítulo; Você tambémFileSystemObject pode usar o 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 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

Trabalhando com arquivos e pastas 9

FIGURA 9.18 Selecionando um arquivo TIF na caixa de diálogo Escolher arquivo.

NOTA

Se você armazenar vários arquivos em um campo de anexo, apenas o primeiro ícone do arquivo será o controle de formulário.

Embora seja fácil o suficiente armazenar um anexo ou dois manualmente, se você tiver uma pasta cheia de ane 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úmer 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

NOVO RECURSOTipo 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 com \"ID de contato\" salva o documento para o campo do arquivo do registro de contato correspondente (este camp 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 objeto (novo no Access 2007) para trabalhar com os acessórios Recordset2 permite que você useLoadFromFile o novo 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

299

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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, declarandorstAttachments a variável como um do novo e Recordset2 objeto (em vez de um objeto Recordset) permite o usoLoadFromFile 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

Trabalhando com arquivos e pastas 9 Extrair o ID de contato do arquivo, usandoMeados o nome 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 pres 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 LoadAttachments chama a 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 tipo de conjunto de registros para iterar por meio de anexos Recordset2

302

Trabalhando com arquivos e pastas 9

coleção de um registro e salva cada um em um arquivo na pasta de documentos de saída selecionado sobre 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

Loop

.Fields(\"FileData\").SaveToFile strFileAndPath .MoveNext Loop .Fechar Terminar com rstTable.MoveNext

rstTable.Close strPrompt = \"todos os novos anexos salvos\" _ & strDocsPath & “ folder” strTitle = \"Feito!\" MsgBox strPrompt, vbOKOnly + vbInformation, strTitle

303

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 econo

NOVO RECURSOuma 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écnica 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 varied para adicionar funcionalidades extras para seus bancos de dados, para além de trabalhar com documentos do Office.

304

Trabalhando com Dados externos

EU

n o capítulo anterior, você aprendeu como trabalhar com arquivos de texto, usando um NESTE CAPÍTULO 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 Importação e exportação arquivos de texto ao trabalhar com dados em código TransferText VBA. O método delimitado por vírgulas e fixatem sido usado para importar dados do (ou exportar dados para) delimitado por vírgula ou arquivos de texto de largura fixo-largura arquivos desde os primeiros dias de acesso e ele ainda é útil no acesso e exportação de dBASE, 2007, quando você estiver trabalhando com arquivos nesses formatos. No Office XP,Importação o Paradoxo e arquivos do Lotus 1-2-3 método foi atualizado para também exportar para e importar de TransferText Arquivos HTML. Importação e exportação de XML e 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 arquivos de texto exportado Enviando 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 método para importar dados de-los ou exportar dados TransferirPlanilha 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 método também é útil para exportar dados do Access para arquivos de texto. TransferText

Trabalhando com texto arquivos usando o Método TransferText

Quando você usa TransferText o 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, especialme 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 você criar especificações para importar um arquivo de texto delimitado por vírgula ou exportar qualquer um desses arq 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 p 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 Procure o botão para selecionar o arquivo de texto para importar (empregos 02-Jul-2006.txt no exemplo).

306

Trabalhando com dados externos10

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 o Assistente de texto de importação (Figura 10.3), com uma seleção de delimitado ou largura fixa; Generally acesso pre-selects a opção correta. FIGURA 10.3 A caixa de diálogo do Assistente de importação de texto.

307

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 falta 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 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 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 c porque os dados serão anexados a uma tabela que tem um campo AutoNumeração, o \"não priopçã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

Trabalhando com dados externos10

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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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).

NOVO RECURSOSe você marcar a caixa de seleção \"salvar etapas de importação\", mais controles aparecem na caixa de diá 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. Feature trabalhou para várias versões anteriores, mas neste momento ele está quebrado, então temos de espera 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 func (Você pode importar ou exportar para um arquivo delimitado por vírgula sem uma especificação, mas não um fixoarquivo de largura).

CUIDADO

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.

310

Trabalhando com dados externos10

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 camp 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 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 ca

NOTA

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.

311

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 mastoneladas para a abertura de vários formulários que importar e exportar os dados em uma variedade de formatos de 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 tr 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 Figu

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 Sele caixa é filtrada para exibir delimitado por vírgula (. csv) ou arquivos de largura fixa (. txt), acordoing 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

Trabalhando com dados externos10

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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

3. Depois de selecionar um arquivo de texto, clique no botão de \"Inspecionar novos postos de trabalho do a 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 par 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.

n Clicando no botão \"Clear importado empregos dados\" descartará os dados (que não é adicionado à tblJobs).

n Clique no botão de \"Salvar novos postos de trabalho em mesa\" executa uma consulta de acréscimo qu Dados de postos de trabalho para tblJobs. O código faz algum tipo de conversão de dados (como most 10.14), porque todos os campos no arquivo de texto são campos de texto.

314

Trabalhando com dados externos10

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 import procedimento de evento do botão limpa a folha de dados, chamadas de comando a Procedimento Sub, SaveTextFile 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 internalmente e, portanto, você deve criar uma especificação separada para cada arquivo de texto que você deseja criar. Est 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

315

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

Procedimento de evento do botão de comando \"Inspecionar novos postos de trabalho do arquivo de texto\" primeiro 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 declaração lida com os dois tipos de importação (delimitado por vírgula Select Case e largura fixa) separadamente, usando o declaração com argumentos diferentes: TransferText 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

Trabalhando com dados externos10 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 d 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

Procedimento de evento do botão de comando \"Arquivo de texto de origem\" abre uma caixa de diálogo de arquivo 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

Trabalhando com dados externos10 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 selecion 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 Sub: SaveTextFile 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 mainfram aplicativo que pode importar dados de arquivos de texto delimitado por vírgula ou de largura fixa), muitas vezes você para filtrar os dados, geralmente por data. O emprego de exportar dados para formato de arquivo de texto (frmExpor duas caixas de texto vinculado a campos de data que você pode usar para selecionar datas para um intervalo de da 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 aguarda

NOVO RECURSOmostrado 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.

320

Trabalhando com dados externos10

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 perm 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 traba o intervalo de datas selecionado em empregos para inspecionar o subformulário (fsubNewJobs), como m 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 execut o TransferText método para exportar o intervalo de datas selecionado de postos de trabalho para 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

321

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

FIGURA 10.17 Um arquivo de texto delimitado por vírgulas exportado aberto no Excel.

NOTA

O novo método de lidar com especificações funciona bem com as exportações de largura fixa, pelo menos a 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 expo 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

322

Trabalhando com dados externos10 Procedimento de evento do botão \"Exportar empregos para arquivo de Case texto\" configura instruçãoum para Select exportar os trabalhos selecionados,TransferText usando o 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 d para o subformulário vinculado a , para exibir os trabalhos selecionados: qryFilteredJobs 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 ated por eles no ano passado, então você ainda pode precisar de importar dados de um dBASE, Paradox ou Lotu arquivo ou (embora seja muito menos provável) exportar para um desses formatos. Acesso ainda suporta a importaç 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

Trabalhando com dados externos10

1. Para abrir o trabalho de importar dados de formulário de arquivo de aplicativo (frmImportAppData), selecio \"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 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 arqui 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 d o arquivo selecionado para uma tabela temporária. O código define essa tabela como o objeto de origem Empregos para inspecionar subformulário, assim você pode ver os novos registros antes de acrescentá-l tabela de tblJobs, como mostrado na Figura 10.20.

325

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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

Trabalhando com dados externos10 Quando o importador de (ou exportadores para) dBASE ou Paradox formatos usando o método, o DatabaseName argumento leva o caminho, não o TransferirBancoDeDados nome do banco de dados; o nome do banco de dados é definido argumento. com o O caminho deve ser definido sem uma Fonte barra invertida final, ou então ele irá causar um erro.

NOTA

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 po Importando um arquivo de paradoxo é bastante semelhante; apenas o argumento de tipo de banco de d 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.

327

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 no os valores de argumentoSeguintes o 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

Trabalhando com dados externos10

Quando você inspecionar novos dados de emprego importados de uma planilha do Lotus (como mostrado na Figur o campo de data\/hora de trabalho parece estranho, porque o campo é criado como um campo de número. No enta Quando você clicar os postos de trabalho salvar botão de tabela, função o na CDate) 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 chega 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 próxima. Procedimento de evento do botão \"Clear importado empregos dados\" limpa a folha de dados de registros 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 u foi selecionado, analisa o caminho do arquivo e o nome do arquivo para uso em diferentes argumentos do TransferirBancoDeDadosdeclaração, configura-se então Selectum 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

Trabalhando com dados externos10 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 emCase mesa\" instrução configura para um executar Select 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

Trabalhando com dados externos10 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 arq importando, filtragem para dBASE, Paradox ou Lotus arquivos dependendo da opção selecionada no formulá 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 arquivoAfter_Update de importação\" procedimento primeiro verifica que o selecionado arquivo do aplicativo é o tipo certo e limpa-lo se não, então configura um instrução para Select Case processar os três tipos de arquivos de aplicativo diferente, chamando a Sub: SaveTextFile 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

Trabalhando com dados externos10 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ê pod trabalhar com ele no futuro.

335

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 ex 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 esquerd o emprego de exportar dados para formato de arquivo do aplicativo (frmExportAppData) abre. Desta forma (muito pare Dados do trabalho de exportação para o formato de arquivo de texto) permitem exportar uma série de registros filtrad Paradoxo, ou arquivo do Lotus 1-2-3. Figura 10.23 mostra dados filtrados prontos para exportar para um arquivo do dB 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. os outros procedimentos de exportação, esse procedimento uma para fazer a exportação Select configura Case instrução Diferentemente de acordo com o tipo de aplicativo selecionado; o declaração com TransferirBancoDeDados vários argumentos: Private Sub cmdExportJobs_Click() No erro GoTo ErrorHandler Dim intFileType As Integer Dim strQuery As String

336

Trabalhando com dados externos10 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 com 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 com 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 u 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 c essas opções) você pode usar o formulário HTML de importação ou dados de emprego de XML (frmImportHTMLXMLDat 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 subformulário, conforme mostrado na Figura 10,24.

338

Trabalhando com dados externos10

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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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.

NOTA

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

340

Trabalhando com dados externos10

HTML

Caso 1 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\" XML

Caso 2 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 d 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 traba 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 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 é fe com o TransferText método com o acExportHTML valor para oTransferType argumenmento; a exportação XML é feita com o método de acesso Aplicativo objeto. ExportXML Figura 10.27 mostra um arquivo HTML exportado aberto no Internet Explorer 7. Infelizmente, é completamente não formatado e, assim, provavelmente não muito útil.

342

Trabalhando com dados externos10

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 p tipos de exportação; somente o procedimento de evento para o botão \"Exportar empregos para HTML\/XML File\" Segue-se; Ele usa um Case instrução para exportar os dados para um arquivo de HTML (usando o Select método) ou um XML arquivo, usando o método de acesso TransferText ExportXML 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 segura aviso. Se você clicar na barra você pode selecionar para permitir o conteúdo bloqueado, como mostrado na Figura 10

344

Trabalhando com dados externos10

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.2 Finalmente, o XML do arquivo exibe (Ver Figura 10.30), mas como código-fonte, não um corretamente formatado cumento, então (como o arquivo HTML) não é muito útil. FIGURA 10.29 Outro aviso de segurança do Vista.

345

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 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

Trabalhando com dados externos10

Se você aceitar a opção padrão de \"Como uma tabela XML\", receberá a mensagem mostrada na Figura 1 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 e 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.

NOTA

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 argumento, para produzir um arquivo XML, PersistFormat mas um arquivo produzido usando esse método também abre como código-fonte.

NOTA

347

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 co 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

Trabalhando com dados externos10 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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.

NOTA

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 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 d esses arquivos, assim você pode obter seus dados antigos em tabelas do Access. Embora não seja provável que se 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 simples não funcionam ou porque eles não são realmente relevantes. Felizmente, esses formatos de arquivo será melhor su portado para acesso importação e exportação em futuras versões do Office.

350

Sincronizando o acesso e Contatos do Outlook

F

ou muito tempo — realmente, desde o Office 97, quando foi introduzido o Outlook NESTE CAPÍTULO — Eu queria escrever código VBA para sincronizar contatos de acesso com contatos do Outlook. Meu contatos são armazenados em um conjunto deAtualização acesso ligados de contatos do Outlook tabelas, com empresas ligadas a contatos e contatos ligados aos endereços, Acesso e vice versa números de telefone e identificações de vários tipos, que permite a máxima flexibilidade Copiar para entrada de dados e, ao mesmo tempo evita a necessidade de inserir os mesmos dadosanexos de Outlook para acesso, e em vários registros. Outlook, por outro lado, tem uma muito atraente e vice-versa 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 conTatos 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\"

REFERÊNCIACapítulo CRUZADA 8 para obter informações sobre o intercâmbio de dados entre um tabela de contatos de acesso única e contatos do Outlook.

351

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 t desnormalização; o processo inverso — gravar dados de uma tabela de arquivo simples volta a um conjun lig mesas — é chamado Renormalizando.

NOTA

Se você encontrar uma mensagem de \"Consulta muito complexa\" ao tentar executar uma consulta profundamente 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 u tabela baseada em algumas das consultas vinculadas e uso que de tabela como parte da consulta final, para reduzir s complexidade. As técnicas que eu uso no presente capítulo para preparar uma única tabela de dados do Access para parison com contatos do Outlook pode ser modificado para uso em qualquer lugar que você precisa para produzir um tabela de arquivos de dados de tabelas vinculadas do Access.

NOTA

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 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 tbl 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.

352

Sincronizando contatos do Outlook e acesso11

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 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 synchrogalvanizado com itens de contato do Outlook.

DICA

A Figura 11.2 mostra um número de telefone selecionado no formulário de informações de contato (frmContactInfo).

353

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 não vai ser sincronizado com o Outlook.

354

Sincronizando contatos do Outlook e acesso11

Figura 11.3 mostra o guia de endereços de contato de forma a obter informações de contato; a menos que você pre 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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

Sincronizando contatos do Outlook e acesso11

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 seleciona Caminho da pasta de anexos; seu procedimento de evento usa a mesma técnica quanto ao comando semelhante toneladas nos capítulos anteriores, abrindo uma caixa de diálogo selecionador de pasta Office para que você sele Capítulo pasta selecionada é usado para armazenar temporariamente os arquivos para uso como anexos ao co anexos de um registro de tabela do Access para um contato do Outlook ou vice-versa.

357

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 pa na caixa de diálogo para selecionar a pasta onde são armazenados os arquivos a serem usados como anexos. O ca 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

Sincronizando contatos do Outlook e acesso11 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 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 d 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.

NOTA

Para testar a sincronização de dados de contactos, faça uma nova pasta de contatos e copiar alguns (ou to 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

359

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 ing o acesso e contatos do Outlook. Esta caixa de diálogo é mostrada na Figura 11.9.

360

Sincronizando contatos do Outlook e acesso11

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 ac ou o Outlook, clique em Sim para atualizar os dados nas tabelas que serão comparados. Clicar em Sim chama procedimentos que claro tblOutlookContacts e tblAccessContacts e enchem-los com actualizada dados. OImportOutlookContacts procedimento (listado em seguida) é mais simples: ele copia os dados de 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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

Sincronizando contatos do Outlook e acesso11 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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\/45 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

Sincronizando contatos do Outlook e acesso11 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

Se você sempre sincronizar seus contatos de acesso para a mesma pasta do Outlook, você pode Comente o segmento de código e inserir um disco rígido-codificado SelectContactFolder 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 segmento de código. SelectContactFolder

DICA

O outro procedimento, , é consideravelmente mais complexa, CreateDenormalizedContactsTable 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 denormalized 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:

366

Sincronizando contatos do Outlook e acesso11 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 calcula 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

Sincronizando contatos do Outlook e acesso11 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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) synchronized, 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ç 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

Sincronizando contatos do Outlook e acesso11

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 para um registro de destino correspondente, e se ele for encontrado, ele é atualizado com informações do conjunto de 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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

Sincronizando contatos do Outlook e acesso11

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.1 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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, clas 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 identical, diferente, ou um está faltando, como mostrado na tabela 11.1.

374

Sincronizando contatos do Outlook e acesso11

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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 actuaing 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

Sincronizando contatos do Outlook e acesso11

Você pode usar as seguintes linhas para exportar para a pasta de contatos padrão local ou um disco rígido-codifica pasta de sua escolha. Para usar a pasta de contatos padrão, basta remover o apóstrofo no inícioNing 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 el 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

& 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

Sincronizando contatos do Outlook e acesso11 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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

Sincronizando contatos do Outlook e acesso11 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

& “; Description: “ & Err.Description Resume ErrorHandlerExit End If End Sub

O UpdateAllAccessContacts procedimento tem a tarefa mais complexa da cópia atualizada, condados 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, c 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 c Tatos marcados para exclusão:

382

Sincronizando contatos do Outlook e acesso11 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, 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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

Sincronizando contatos do Outlook e acesso11

Para atualizar os dados em tblContactAddresses, se houver dados em qualquer um dos campos de endereço de n 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 encont 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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

Sincronizando contatos do Outlook e acesso11 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 variável strDescription 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, cr 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

Sincronizando contatos do Outlook e acesso11 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 diferen 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 pa 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 procedimento para gravar dados para tblAccessContacts, e CreateDenormalizedContactsTable em seguida, executa o código que é semelhanteUpdateAllOutlookContacts ao código na 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 procedimento, que pede confirmação, então correImportOutlook o ContactsToAccess Contatos procedimento para gravar dados de contatos do Outlook para tblOutlookContacts, em seguida, executa o c que é semelhante ao código a procedimento, exceto que ele não UpdateAllAccessContacts busca de registros correspondentes, apenas cria novos registros de acesso para todos os registros de contatos de Outl

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 man 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

390

Sincronizando contatos do Outlook e acesso11

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 ca Tipo de dados anexo. Porque podem ter um item de contato do Outlook e uma tabela do Access anexarmentos, 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.

NOVO RECURSO

Quando você adiciona um campo de tipo de dados de anexo a uma tabela do Access 2007, tem três subcam que você pode ver no diagrama de relacionamentos (Ver Figura 11.1). O acessório em si é armazenado o subcampo FileData; Digite seu nome de arquivo e caminho o subcampo de nome de arquivo e o arquivo 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 método o para essa coleção. Adicionar

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 procedure que aparece em uma caixa de diálogo selecionador de pasta. Os procedimentos listados em seguida são ch 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 e às vezes contém o caminho (às vezes várias vezes) bem como o nome do arquivo.

391

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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

Sincronizando contatos do Outlook e acesso11 ' 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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

Sincronizando contatos do Outlook e acesso11 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 c 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 personalizad 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 conTatos para qualquer situação que requer a conversão de um conjunto de tabelas vinculadas do Access para uma ún ou o contrário — algo que poderá surgir durante a troca de dados com programas antigos ou bancos de dados do mainframe.

396

Indo além o básico

E

arlier capítulos neste livro descreveram como trabalhar com Word, Excel, NESTE CAPÍTULO e Outlook, usando o código do VBA para criar documentos do Word, Excel trabalhofolhas e itens do Outlook e encha-os com dados de acesso. Este Criar etiquetas de envio de palavra capítulo descreve algumas técnicas mais avançadas para trabalhar com os outros com informações sobre Componentes do Office, tais como aqueles que você podem precisar em um bancoembarques de dados com o navioping e solicitar informações.

Criar gráficos dinâmicos do Excel preenchido com os dados de acesso

Criando a palavra extravagante Etiquetas de envio

Enviando relatórios de acesso de transporte e reordenação informações

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 prodRegiste o seu produto, a data em que o produto é necessário e a disponibilidade de transporte supPlies, veículos e pessoal para fazer o transporte.

NOTA

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.

397

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

O exemplo de banco de dados do Northwind Plus contém tabelas do banco de dados Northwind. mdb, com sevEral campos extras em algumas tabelas, consultas, (usadas na próxima seção) e três novas formas — dois principai 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 v Abra o banco de dados, Cadastre o código VBA com uma assinatura digital, conforme descrito na barra lateral.

NOTA

FIGURA 12.1 Um alerta de segurança Vista ao abrir um banco de dados com código VBA não assinado.

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.

398

Indo além do básico

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

399

12

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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:

400

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

anos 60

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 d

14. Clicar em OK, o banco de dados extraído abre como um banco de dados Access 2007 normal.

402

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 abriring 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 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 sucessoinventá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.

NOTA

Figura 12.3 mostra a forma de seleção de ordem.

403

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 subformulário. Ele é usado para inspecionar as ordens que estão no intervalo de tempo correto para o transporte e m 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 baseqryNorthwindAll em (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: n OrderDate de ) E < DateAdd(\"d\",30,Date()) Para n DataDeEntrega (com um critério > Date) incluir apenas ordens necessárias a partir de amanhã, a menos de 30 dias no futuro n DateShipped n Fornecedor (um alias para CompanyName em tblSuppliers) n ProductID n ProductName n OrderID n NoCases (um alias para quantidade)

404

Indo além do básico

12

n CategoryName

critério para deselecionar as ordens que estão prontas para e n ReadyToShip, um campo booleano com umVerdadeiro 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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

Indo além do básico

Configurar um conjunto de registros (rstShip) com base na qrySelectedNorthwindShippingLabels que tem um registro para cada produto em um pedido selecionado:

12

consulta,

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 proddade 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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

Indo além do básico

12

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

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.

NOTA

.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

409

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

.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 co .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

Indo além do básico

12

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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 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

Indo além do básico

12

& “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 oCreateObject Word com

:

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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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

Indo além do básico

12

Cada projeto de desenvolvimento tem requisitos exclusivos; ao usar o Access para criar etiquetas de endereçament (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 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 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âmic Tabelas dinâmicas), como observado no capítulo 1. No entanto, há um inconveniente a usar gráficos dinâmicos de 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 a outra pessoa, é apenas uma imagem, não um interativo gráfico ou tabela. Se você precisa colocar os dados de em um gráfico interativo ou tabela para outros para trabalhar com (mesmo se eles não têm o Access instalad você pode usar uma abordagem diferente: exportar os dados de acesso a uma planilha do Excel e, em seguida, cria Excel gráfico dinâmico ou tabela dinâmica que usuários podem manipular como quiserem.

NOTA

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 sere cartografado. Gráficos dinâmicos do Excel não são exatamente o mesmo que acesso gráficos dinâmicos; em part o recurso de agrupamento de data que automaticamente cria uma variedade de data classifica-se de um campo de 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; tem apenas três campos: OrderQuarter, categoria, e qryQuarterlySalesByCategory 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.

415

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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

Indo além do básico

12

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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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

Indo além do básico

12

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 \"Formatar eixo\" no menu de contexto, como mostrado na Figura 12.14.

419

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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

Indo além do básico

12

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.

NOTA

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 m 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 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) generaliar-se muito bem, mas há muitas mais opções disponíveis. Para selecionar um estilo gráfico diferente, s 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.

421

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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

Indo além do básico

12

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.

NOTA

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

NOVO RECURSOcom 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, qu produzi em Excel, com base em dados de acesso. Os seis mais populares tipos de gráfico são mostrados nos gráfic 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.

423

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 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

Indo além do básico

12

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 Exc 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 precisa 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úmer 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 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

Indo além do básico

12

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. onde você pode editar a quantidade de produto conforme necessário.

427

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 co Depois de definir a quantidade de reordenar conforme desejado para todos os registros, clique o \"Enviar relatórios d tonelada para salvar o relatório de envio (rptShipping) como um arquivo PDF, atualizar valores de campo em tblProdu 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 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,

NOVO RECURSOA 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 argumento do SaídaPara OutputFile método para criar um arquivo PDF, como no exemplo de código abaixo.

428

Indo além do básico

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

12

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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

Indo além do básico

O

cmdReorderInventory

12

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 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

Parte II

Escrever código VBA para trocar dados entre os componentes do Office

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 exam dados e fazer decisões sobre quais dados devem ser exportados e formatar os documentos do Office preenchido com os dados de acesso.

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

Criar suplementos de COM com o Visual Basic 6

Ó

Office 2000 introduziu os suplementos como uma nova ferramenta de desenvolvimento, de uma NESTE CAPÍTULO alternativa para criar suplementos VBA para Access, Excel, Outlook, e Palavra. Um suplemento de COM é criado como uma biblioteca de vínculo Criando dinâmicoos (DLL) suplementos com que está registrado para trabalhar com aplicativos do Office. Suplementos de COM (pelo menos Visual Basica-6 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, Instalando e Solucionando problemas Outlook e Excel, apenas muito simples os suplementos da \"Olá, mundo!\" Suplementos de COM tipo na verdade pode ser projetado para trabalhar em vários aplicativos do Office. Comparando os suplementos e Acesso Adicionar-ins

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 supporta 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

REFERÊNCIAAdicionar-ins CRUZADA 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).

435

Parte III

Adicionando mais funcionalidades ao Office

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 fo o XML linguagem de programação para adicionar controles para a faixa de opções, alimentada por código escrito em 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 (com você faria para um suplemento do Access), você cria um projeto do VB, com um módulo especial de Designer, um sta módulo de Dard e (opcionalmente) um formulário. Quando criar um COM add-in usando o VB 6, você pode economiz 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 VBect, copiar o suplemento COM arquivos de modelo para a pasta de projetos sob a pasta de modelos do VB (usualiado 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 temopçõ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

Criando suplementos COM o Visual Basic 13 6

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

Parte III

Adicionando mais funcionalidades ao Office

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 mostra 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 referemcias; Defini-los no projeto de modelo VB de amostra, para que eles já são verificados em projetos feita a partir deste modelo.

NOTA

438

Criando suplementos COM o Visual Basic 13 6

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 qualqu 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 suplement 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 cr 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 to os procedimentos no módulo, no caso que pode precisar deles mais tarde sobre.

439

Parte III

Adicionando mais funcionalidades ao Office

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 LN Suplemento COM são basicamente o mesmo que o acesso de renomear LNC suplemento, que foi abordado em detal em meu livro anterior Desenvolvimento de aplicativos de um especialista Microsoft ; Este Access capítulo de concentraçãotrates 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

REFERÊNCIADesenvolvimento CRUZADAde 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.

440

Criando suplementos COM o Visual Basic 13 6

Eu adicioneiStripChars o 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 modeloAddInErr padrão procedimento ligeiramente; Ele cria uma seqüência de caracteres de caixa de mensagem que é chamada de manipuladores de 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

Parte III

Adicionando mais funcionalidades ao Office

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

Criando suplementos COM o Visual Basic 13 6

Os procedimentos começam com Sub IDTExtensibility2 há suporte os eventos Private 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 acolhim aplicação; cada um requer um WithEvents 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:

n 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 rela (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 procedimento de evento executa uma função que remove os dois comn O OnDisconnection 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). executar o e n Os dois procedimentos de evento de clique LNCRenameFormControls funções, que respectivamente renomear o formulário e LNCRenameReportControls controles de relatório. Um botão de barra de comando de 2000 – 2003 acesso tem sua Propriedade para o nome OnAction 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.

NOTA

n 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 variável a para a pappAccess Access.Application objeto, em seguida, define uma referência para a barra de ferramentas de Design do botão será colocado), à procura de um botão existente sobre esta barra de ferramentas, usando sua marc patrimônio e criá-lo se ele já não existir. procedimento faz um trabalho semelhante para o relatório n O CreateReportCommandBarButton Botão de barra de ferramentas de design que renomeia controles de relatório. n O RemoveAddInCommandBarButton função (chamado OnDisconnection procedimento de evento) remove botões de comando do suplemento.

n 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.

443

Parte III

Adicionando mais funcionalidades ao Office

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 procedures 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

Criando suplementos COM o Visual Basic 13 6 Constantes para personagens que cercam o ProgID PROG_ID_START 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

Parte III

Adicionando mais funcionalidades ao Office

Chamadas compartilhado o código para criar um novo botão de barra de comando para renomear os controles em 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

Criando suplementos COM o Visual Basic 13 6 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

Parte III

Adicionando mais funcionalidades ao Office

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

Criando suplementos COM o Visual Basic 13 6 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

Parte III

Adicionando mais funcionalidades ao Office

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

Criando suplementos COM o Visual Basic 13 6 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

Parte III

Adicionando mais funcionalidades ao Office

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

Criando suplementos COM o Visual Basic 13 6 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 Para Portanto, o código usa o NA blnUnbound Verdadeiro 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 omitindoLNCRenameReportControls o função desta lista, porque ele é substantially semelhante LNCRenameFormControls a 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 conXO (ControlCS ControlCA e assim por diante) precisa de um código diferente para criar um nome apropriado para

453

Parte III

Adicionando mais funcionalidades ao Office

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 n o nome original de controle n o tipo de controle n fonte de controle n proposto novo nome

454

Criando suplementos COM o Visual Basic 13 6 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

Parte III

Adicionando mais funcionalidades ao Office

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

Criando suplementos COM o Visual Basic 13 6 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

Parte III

Adicionando mais funcionalidades ao Office

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

Criando suplementos COM o Visual Basic 13 6 & 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

Parte III

Adicionando mais funcionalidades ao Office

Caso especial de linhas cujo nome padrão é \"Linha\" ou \"Opção\" (o mesmo três primeiras letras como o stanprefixo 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

Criando suplementos COM o Visual Basic 13 6 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 encon 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

Parte III

Adicionando mais funcionalidades ao Office

!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

Criando suplementos COM o Visual Basic 13 6 !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 cr 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 nes 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.

DICA

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: \/ document e configurações Nome \/ de usuário \/ Application Data\/Microsoft\/AddIns), seus correspondentes devem aparecer automaticamen o grupo de comandos da barra de ferramentas da guia Add-Ins da faixa de opções (como mostrado na Figura 13.8); p Se você estiver executando o Windows XP.

463

Parte III

Adicionando mais funcionalidades ao Office

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 arq 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, m 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 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 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

Criando suplementos COM o Visual Basic 13 6 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, com mostrado na Figura 13.11. FIGURA 13.11 A caixa de diálogo suplementos de COM.

465

Parte III

Adicionando mais funcionalidades ao Office

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 mostra 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 Guia de ins da faixa de opções, no contexto adequado; por exemplo, um botão que pretende disjogo 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. E Acesso 2007, todos os botões aparecem diretamente sobre o grupo de comandos da barra de ferramentas na guia Suplem estiver executando o Windows Vista, você não verá a guia Add-Ins, a menos que você executar o acesso como administrad descrito no passo 1 acima.

NOTA

Você pode desmarcar o checkbox do add-in para temporariamente descarregá-lo, ou você pode selecioná-lo e clique 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.

466

Criando suplementos COM o Visual Basic 13 6

Para reabrir um COM add-in para edição, clique duas vezes no arquivo. vbp (projeto do VB). Você precisa de ter qu 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 problem 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 per 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.

AVISO

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 suplem versão). Cópias de segurança podem ser transferidas para outro computador, em um disco, ou em formato zip, par confusão.

Se você encontrar esse código fazer referência a objetos de acesso não estiver funcionando (com nenhuma men prognóstico mensagem de erro, como \"Sem formas abrir\" quando você tem formulários abertos), pode ser necessá Adicione uma referência de aplicação específica de acesso ao seu código. Especificamente, Considerando que o um Designer de acesso usando apenas para fazer referência a coleção de formas deRelatórios acesso, ou refFormulários ERÊNCIA a coleção de relatórios de um banco de dados, funcionou muito bem em versões anteriores do Office, 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 na barra de ferramentas, em vez de (ou além) um novo. Para remover o velho botão, adicione uma linha d código paraRemoveAddInCommandBarButton o função para remover o botão, usando o masnome 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 supl Caixa de diálogo suplementos de COM para executar o código com a linha extra uma vez. Fechar o acesso, reabra 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 visualização de design e clique no botão renomear controles de formulário na guia Suplementos. Primeiro você rec mensagem perguntando se você deseja salvar os nomes de controle original para sua propriedade Tag, conforme Figura 13.13.

467

Parte III

Adicionando mais funcionalidades ao Office

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 erros de referência de lar durante a execução de código. Assim, é uma boa idéia para executar os controles de formu (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

Criando suplementos COM o Visual Basic 13 6

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: vo poderia colocar um botão em qualquer menu ou barra de ferramentas, considerando acesso menu add-ins só apare No menu Add-ins. Embora o VB 6 os suplementos funcionam no Access 2007, perderam este advanTage 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 suple 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 te

REFERÊNCIAnique CRUZADA é discutida no capítulo 15.

Em comparação com os suplementos, suplementos de acesso tem vários recursos extras: você pode criar não ape menu add-ins, mas também os feiticeiros de vários tipos e construtores; Isso permite que você adicionar funcionalid diferentes locais em um banco de dados do Access. No Access 2000 a 2003, você poderia criar assistentes qu 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 ad laços ainda funcionam bem no Access 2007 (pelo menos se você estiver executando o Windows XP), então meu L suplemento pode ser executado a partir da propriedade nome de um controle para renomear um controle individua 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 lancalibre, assim você pode colocar botões e grupos específicos guias da faixa de opções, consulte os próximos dois c para trabalhar com a faixa de opções XML e Visual Studio 2005 add-ins.

469

Criando suplementos do Acces

M

OST os bancos de dados de amostra para capítulos anteriores incluídos objetos NESTE CAPÍTULO do banco de dados Access 2007 Backup, usado para fazer incremenTally backups de banco de dados numerados. Para utilizar esse recurso em um de acesso menu add-ins Criação 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 ScriptingCriação de assistentes de acesso Biblioteca de tempo de execução, que é um incômodo. Seria muito mais convenienteCriando para a propriedade de acesso apenas ter backup disponível em todos os seus bancos de acesso dados, dizer a partir de um menu construtores comando. Considerações especiais e

Um suplemento de acesso vai fazer apenas isso, encapsulando um conjunto de objetos de banco deproblemas dados e de acesso Solucionando código em um único pacote que está disponível para todos os bancos de dados do Access. No presente Adicionar-ins 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.

NOTA

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

471

Parte III

Adicionando mais funcionalidades ao Office

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 pa 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 inf ção necessária para instalar o add-in. suplementos normalmente são armazenados na pasta padrão Microsoft Ad (C: \/ Documents and SettingsNome \/ 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 Nome Settings de usuário \/ Application \/ Data\/Microsoft\/AddIns para Windows XP ou c: \/ UsersNome \/ 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 Banco de dados do Access.

Acesso Adicionar-ins criado em versões anteriores do Access (como bancos de dados biblioteca. MDA) von 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 crebarras de menus personalizados de ates, no entanto, definitivamente terá problemas, porque a nova faixa de opções subst 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óx Serviço de Patch).

NOTA

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 construto Suplemento do menu referido como um assistente, mas eu reservará o Assistente do termo para o Adicionar-ins que chamado quando um novo objeto é criado, como listado na coluna do Assistente de tabela 14.1.

472

Criando suplementos do Access 14

TABELA 14.1

Tipos de acesso Add-ins Assistente

Construtor

Suplemento de menu

Chamado quando uma nova tabela, consulta, formulário, relatório, ou controle é criado.

Permite que você defina propriedades Nãoem contexto específico, chamado de visualização Design no menu Add-ins

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 n Banco de dados Access no formato de banco de dados de sua escolha. Você pode criar e salvar um banco de dad o formato de banco de dados de biblioteca. MDA mais velho, mas para o novo formato do accda, você precisa prim o banco de dados como um banco de dados. accdb, altere a extensão para accda mais tarde, em um painel de Exp 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 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 su 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 me você marcar a caixa de seleção \"Mostrar objetos do sistema\". Em versões anteriores do Access, foi essa caixa de localizado na página de exibição da caixa de diálogo opções; no Access 2007 é o dia de opções de navegaçã 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

Parte III

Adicionando mais funcionalidades ao Office

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

Criando suplementos do Access 14

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 Fig 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 d caixa de diálogo.

Na seção tabelas do painel de navegação, você agora verá um número de tabelas do sistema, começan 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 consulte a tabela 14.2 para obter uma listagem de seus tipos de dados e os campos necessários.

475

Parte III

Adicionando mais funcionalidades ao Office

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

476

Criando suplementos do Access 14

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 seg seções. O Extras 2007 add-in que é o exemplo add-in para este capítulo é um conjunto de menu add-in 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 su tem um conjunto de menus como nas versões anteriores do Access, exceto que eles não funcionam. A finalidad 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 implementaring 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

477

Parte III

Adicionando mais funcionalidades ao Office

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 seg n 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 verSion 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, indicadoo início de um novo suplemento de ing. Os campos ValName e o valor estão em branco.

n 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 d Acesso, esta foi a pasta de acesso próprio, o que explica o nome). n 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 comseg 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 MenuIns\"(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.

DICA

TABELA 14.3

USysRegInfo linhas necessárias para um Menu Add-in Subchave

Tipo

ValName

Valor

HKEY_CURRENT_ACCESS_PROFILE\/Menu Add-Ins \/ &Back up Database

0

HKEY_CURRENT_ACCESS_PROFILE\/Menu Add-Ins \/ &Back up Database

1

Biblioteca

|ACCDIR\/Extras 2007.accda

HKEY_CURRENT_ACCESS_PROFILE\/Menu Add-Ins \/ &Back up Database

1

Expressão =BackupFrontEnd()

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 latversão do est do add-in ao instalar ele, ou qual versão está sendo executado quando você usar o suplemento.

DICA

478

Criando suplementos do Access 14

Assistentes

Meu esquemas projeto add-in (que finalmente pode ser aposentado por causa do superior de características de form 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 seg (a sintaxe é semelhante para assistentes de relatório):

n 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 verSion 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, indicadoo início de um novo suplemento de ing. Os campos ValName e o valor estão em branco. n 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.

n No suplemento terceira linha, o campo de tipo tem um valor de 1, o campo ValName tem o valo \"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. n 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 suplem 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 Assistente de formulário do formulário personalizado assistentes

Selecione um tipo de forma e cor esquema para o fundo da forma Propriedades de cores e controle

HKEY_CURRENT_ACCESS_PROFILE\/assistentes \/ 1 Biblioteca Assistente de formulário do formulário personalizado assistentes

|ACCDIR\/Design Schemes.mda

HKEY_CURRENT_ACCESS_PROFILE\/assistentes \/ 1 Função Assistente de formulário do formulário personalizado assistentes

StartDSWizard

479

Parte III

Adicionando mais funcionalidades ao Office

NOTA

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 é usoful 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 automaticamen renomear objetos de banco de dados e controles de formulário e relatório de acordo com a nomenclatura de Leszyns 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 (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

REFERÊNCIADesenvolvimento CRUZADAde aplicações de acesso (ISBN: 0764559044).

Construtores de propriedade exigem cinco linhas na tabela USysRegInfo, conforme descrito na lista a seguir: n 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, indicadoo início de um novo suplemento de ing. Os campos ValName e o valor estão em branco. n 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. n 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. n 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. n 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.

480

Criando suplementos do Access 14

TABELA 14.5

USysRegInfo linhas necessárias para um construtor de propriedade. Subchave

Tipo

ValName

Valor

HKEY_CURRENT_ACCESS_PROFILE\/assistentes \/ Construtor LNC\/assistentes\/nome de propriedade

0

HKEY_CURRENT_ACCESS_PROFILE\/assistentes \/ Construtor LNC\/assistentes\/nome de propriedade

1

Descrição

LNB renomear controle atual

HKEY_CURRENT_ACCESS_PROFILE\/assistentes \/ Construtor LNC\/assistentes\/nome de propriedade

4

Pode editar

1

HKEY_CURRENT_ACCESS_PROFILE\/assistentes \/ Construtor LNC\/assistentes\/nome de propriedade

1

Biblioteca

|Rename.mda ACCDIR\/LNB

HKEY_CURRENT_ACCESS_PROFILE\/assistentes \/ Construtor LNC\/assistentes\/nome de propriedade

1

Função

LNCBuilder

NOTA

Estritamente falando, um banco de dados biblioteca contém suplementos (geralmente várias), mas geralm 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

n Quando você executa um add-in, o código está sendo executado de um outro banco de dados (o suplem 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, para definir uma referCodeDbuse ENCE para esse banco de dados; Se você deseja fazer referência a um objeto do banco de dados cham CurrentDb (ambos CodeDb e CurrentDb são usados no Extras 2007 suplemento do código).

n 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 suplement 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.

481

Parte III

Adicionando mais funcionalidades ao Office

n Um suplemento pode exibir formulários, geralmente como caixas de diálogo não acopladas. Normalmente 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 s procedimentos de IOUs add-in.

Adicionar-in sintaxe, usando que o n Você pode fazer referência a tabelas no banco de dados biblioteca CodeDb permite que você armazene dados do suplemento em tabelas se necessário. Isso é útil quando você deseja mação que será usada para todos os bancos de dados, executando o add-in, por exemplo, as listas de tabe e prefixos para a exclusão de tabelas de consulta e consulta da listagem, 2007 Extras Adicionar-in.

n Substituir macros e consultas com código a execução de funções públicas, assim eles podem ser executado directamente a partir de módulos da biblioteca.

n Formulários vinculados, executados a partir de um suplemento tem como suas tabelas de origem do regis 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 cha banco de dados, como eu faço Extras 2007 add-in para consulta e tabela e opções de backup, campos. n 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 maisTableDef complexo método DAO, especificando CodeDb como o banco de dados no qual deseja criar a tabela.

n Um suplemento que pretendiam trabalhar em ambos Access 2007 e versões anteriores do Access podem p para processar as extensões. mdb e. accdb, ou lidar com o novo tipo de dados anexo.

n 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 cheio de tabela, como eu faço no Extras 2007 suplemento do código. Caso contrário, você vai acabar copian a tabela preenchida no banco de dados chamada de volta para si. de dados método da biblioteca, do objeto o DoCmd funciona em n Quando executado a partir de um banco ExecutarSQL tabelas do banco de dados chamada eo método funciona em tabelas no código OpenQuery 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: n Conjunto AutoCentralizar Propriedade dos formulários para sim. n Desligue a seletores de registros. n Definir as barras de rolagem para nenhum deles.

482

Criando suplementos do Access 14 n Desative botões de navegação. n 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.

n 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 caix um foi preenchido. n 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 o 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

Parte III

Adicionando mais funcionalidades ao Office

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

Criando suplementos do Access 14 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

Parte III

Adicionando mais funcionalidades ao Office

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 zstblBackupCho 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

Criando suplementos do Access 14 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

Parte III

Adicionando mais funcionalidades ao Office

Copie vários objetos no banco de dados chamada, se eles já não existem. Esses objetos são necessários pa 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

Criando suplementos do Access 14

Faça backup de dados O BackupFrontEnd função é chamada de tabela USysRegInfo para fazer backup de dados atualbase 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 Bac 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

Parte III

Adicionando mais funcionalidades ao Office

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

Criando suplementos do Access 14 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 atualback-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

Parte III

Adicionando mais funcionalidades ao Office

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

Criando suplementos do Access 14 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

Parte III

Adicionando mais funcionalidades ao Office

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

Criando suplementos do Access 14 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

Parte III

Adicionando mais funcionalidades ao Office

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

Criando suplementos do Access 14 Próxima qdf RST.Fechar

Copiar a tabela preenchida no banco de dados chamada assim estará disponível para impressão na chama 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

Parte III

Adicionando mais funcionalidades ao Office

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

Criando suplementos do Access 14

Copie a tabela preenchida no banco de dados chamada assim estará disponível para impressão no banco de d 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 Adicionarno 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

Parte III

Adicionando mais funcionalidades ao Office

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

Criando suplementos do Access 14 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

Parte III

Adicionando mais funcionalidades ao Office

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 informações aos usuários sobre o add-in quando ele é listado na caixa de diálogo Gerenciador de suplementos. As in 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 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: n O título valor do campo é exibido como nome do suplemento na lista de suplementos disponíveis. n 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. n Valor do campo de comentários aparece como descrição no suplemento na parte inferior do AddNa caixa de diálogo do Gerenciador.

502

Criando suplementos do Access 14

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 é colocarParar um 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 instrução, biblioteca salvar e adicionar o Parar fechar o Adicionar-in, abrir um banco de dados e executar o add-in que teminstrução o no seu Parar código. Mais tarde, você precisará de remover Parar odeclaraçã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 abri módulos de código e coloque pontos de interrupção e até mesmo modificar o código temporariamente, para testar maristas. Para definir uma referência a um banco de dados do Access add-in biblioteca, execute as seguintes etap

Se você pretende definir uma referência a um banco de dados biblioteca, assim você pode depurar seu có Sabrina (como descrita em seguida), dar seu projeto Visual Basic um nome significativo, então ele vai dize \"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

503

Parte III

Adicionando mais funcionalidades ao Office

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

Criando suplementos do Access 14

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ênci 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

Parte III

Adicionando mais funcionalidades ao Office

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 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 seg banco de dados do biblioteca de quando você em seguida abri-lo diretamente.

CUIDADO

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.

506

Criando suplementos do Access 14

Às vezes, esse erro ocorre quando você fez alterações para o suplemento, mas acesso ainda está em execuçã 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 ob mensagem depois de reinstalar o add-in, pode ser porque você criou uma sub em vez de uma função p 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 q 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 qualque mensagem de erro, isso pode ser porque a fonte de registro do formulário está ausente. Você não vai obter um erro forma apenas não abre. Verifique se a fonte de registro do formulário existe e situa-se a dados de códigobase, não chamado banco de dados. Em alguns casos pode ser necessário preencher uma tabela chama base e depois copiá-lo de volta para o banco de dados de código para usar como fonte de registro de um formulár Extras Adicionar-in.

Se você receber um erro \"este recurso não está instalado\" mensagem quando tentar executar o suplemento, po resultar de qualquer número de erros no código do suplemento. Em primeiro lugar, verificar problemas no seguinte áreas: n Sintaxe incorreta em uma Adicionar-in função (por exemplo, o número errado ou tipo de argumenmentos). n Incompatibilidade entre o módulo de código e o nome da função na tabela USysRegInfo. n Nome do suplemento foi mudado, mas a referência a ele na tabela USysRegInfo ainda tem o nome antigo. n Erros de sintaxe geral o código de suplemento. n 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 todos os bancos de dados do Access. Para instalar o suplemento do 2007 Extras, primeiro copie o banco de dado Pasta de suplementos. No Access 2007 em execução no Windows XP, a pasta de suplementos é no mesmo lugar c no Office 2003, c: \/ Documents and SettingsNome \/ 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\/Roa Microsoft\/AddIns.

507

Parte III

Adicionando mais funcionalidades ao Office

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úscu 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 confiab 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 info

REFERÊNCIAção CRUZADA 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 \"Ad botão de localização\"para adicionar a pasta onde você deseja armazenar seu Adicionar-ins, como mostrado na Figura

508

Criando suplementos do Access 14

Em seguida, abra qualquer banco de dados do Access e selecione a guia ferramentas de banco de dados da faix 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 verSion 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 n Figura 14.19.

509

Parte III

Adicionando mais funcionalidades ao Office

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 AdicionarNo 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.

NOTA

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

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 a 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

510

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 d 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 figURE 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. Ass (neste momento, pelo menos) não há nenhuma maneira de assinar digitalmente um banco de dados do Access 2007 suplemen

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 par pasta para armazenar os backups de banco de dados e dois subformulários listando os prefixos de tabela e consul 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 p onde você pode selecionar uma pasta personalizada de backup de log. A escolha de backup é armazenada separ banco de dados, usando propriedades de banco de dados; os prefixos, no entanto, são armazenados no banco d 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ã 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 da pasta) e os prefixos padrão.

511

Parte III

Adicionando mais funcionalidades ao Office

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 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 é s 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

Criando suplementos do Access 14

Campos de consulta da lista

Este comando preenche uma tabela com os nomes das consultas select (omitindo aqueles cujos prefixos são e a lista de exclusão) e seus nomes de campo e ofertas para imprimir um relatório baseado na tabela. A tabe mostrado na Figura 14.23.

NOTA

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. 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 re-executar o menu add-in.

513

Parte III

Adicionando mais funcionalidades ao Office

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 (ac (você pode usar as mesmas técnicas para criar suplementos no formato. MDA mais velho para uso com bancos de da criado em anteriores formatos de banco de dados de acesso como Access 2007). Acesso Adicionar-ins que você enca sulate um conjunto de objetos de banco de dados (principalmente código e formas), para uso em qualquer banco d de adicionar funcionalidades extras para um banco de dados sem a necessidade de importar manualmente objetos e 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 supl assim como outros tipos de suplementos.

514

Personalizar a faixa de opções com XML no Access Bancos de dados e adicionar-

A

s um usuário avançado ou desenvolvedor, você pode ser usado para manualmente personalizNESTE CAPÍTULO 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 geralPersonalizar a faixa de opções em uma reorganizando as barras de ferramentas e menus, assim como preferir, e você pode ter Banco de dados Access escrita de funções para execução de comandos de menu ou botões da barra de ferramentas personalizada. Se Personalizar a faixa de opções com um você pretende continuar estas práticas no Access 2007, você é dentro para um choque. Suplemento de acesso

O novo Office 2007 fita é uma alteração de interface principal de acesso (também Ferramentas para trabalhar com XML como os outros aplicativos do Office), e requer uma mudança importante no programa código 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 commands 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 ferramentabarras (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

Parte III

Adicionando mais funcionalidades ao Office

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 baixocarregar esta planilha de http:\/\/www.Microsoft.com\/downloads\/details.aspx?Family no site da Microsoft. ID = 4329d9e9 - 4D 11-46a5-898 d-23e4f331e9ae

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 aces 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:

n Personalizando a Interface do usuário Office Ribbon (2007) para desenvolvedores, partes 1 a 3: n http:\/\/msdn2.Microsoft.com\/en-us\/library\/ms406046. aspx #OfficeCustomizingRibbonUIforDevelopers_AppLevel

n http:\/\/msdn2.Microsoft.com\/en-us\/library\/aa338199.aspx n http:\/\/msdn2.Microsoft.com\/en-us\/library\/aa722523.aspx n Office 2007 Developer Center: http:\/\/msdn2.Microsoft.com\/en-US\/Office\/ aa905358.aspx

2007: n Extensibilidade da faixa de opções no Access http:\/\/msdn2.Microsoft.com\/en-US\/ biblioteca\/bb187398.aspx

Access 2007: n Fazendo a transição de seus aplicativos existentes do Access para o http:\/\/msdn2. Microsoft.com\/en-us\/library\/bb203849.aspx

n Blog de Erik Rucker: http:\/\/Blogs.msdn.com\/Access n Blog do Jensen Harris: http:\/\/Blogs.msdn.com\/jensenh\/default.aspx n Blog de Patrick Schmid: http:\/\/pschmid.net\/blog\/2006\/10\/09\/58 n Terço do Blog cinco: http:\/\/Blogs.msdn.com\/thirdoffive\/

516

Personalizar a faixa de opções com XML em bancos de dados Access e suplement 15

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 e editar o código XML em um editor especializado. Vários editores de XML estão disponíveis gratuitamente gratuit 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 d 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 disjogado 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 qu falha vai esclarecer com um patch algum momento em breve. Até então, quando você executar este utilitário, ele aparec minimizado; botão direito do mouse o ícone da barra de tarefas e selecione maximizar para abri-lo em tela cheia.

CUIDADO

FIGURA 15.1 Na guia modo de exibição de árvore do editor de XML Notepad 2007.

517

Parte III

Adicionando mais funcionalidades ao Office

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\/ ), estas edições do VB e SQL Server contêm também editores de XML. Consulte Express\/vb\/download \/ 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 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 corrupted 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

Personalizar a faixa de opções com XML em bancos de dados Access e suplement 15

Se você tiver o Visual Studio 2005 (qualquer edição), use seu editor de XML embutido; caso contrário, eu recomend 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ê te XML e (opcionalmente) VBA código — ao contrário de como personalizar menus e barras de ferramentas, você a comando para um local em qualquer barra de ferramentas ou menu, como nas versões anteriores do Access. O ún ual personalização disponível no Access 2007 é adicionando comandos à barra de ferramentas de acesso rápido. E 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 completamente, e adicionar novos grupos contendo comandos personalizados.

519

Parte III

Adicionando mais funcionalidades ao Office

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 se demasiado pouco, demasiado difícil. Em comparação com versões anteriores do Office, especialmente o Office 2003, 2007 simple 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 ferramentabares 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 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 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 lim tomizability é a descrição, provavelmente a maioria dos usuários, dar-se-ia esta nova interface do usuário. A maioria dos usuário 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 rec nova interface do usuário tinha que ser justificada. Real possibilidade de personalização foi, infelizmente, uma característica que

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 personal ~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.

520

Personalizar a faixa de opções com XML em bancos de dados Access e suplement 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 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 automaticamente, por exemplo, a lista de documentos recentes ou a Galeria de formas. Outros podem ser manualmente personalizado, 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 deficácia\"ou reclamando sobre a falta de personalização nele, reflete adequadamente a situação em 2007.

Embora você não pode personalizar as abas de faixa de opções padrão e grupos, você pode adicionar novas guias grupos para a faixa de opções, embora a técnica é completamente diferente do que escrever código VBA para traba 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çõ 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 ve 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.

NOTA

O banco de dados de amostra para esta seção é Ribbon.accdb de teste.

521

Parte III

Adicionando mais funcionalidades ao Office

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

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\"

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\"

.

Defina o atributo startFromScratch como para criar uma fita de nova e em branco. \"verdadeiro\" (As aspas são necessárias, uma diferença do código do VBA com sua e Verdadeiro definido como ou Falso Palavras-chave.) Se\"falso\" omitido, as personalizações sejam aplicadas para a faixa de opções padrão.

e

\"grande\" .

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 aparecerdade da corcunda de um camelo). Exemplo: . menu suspenso

NOTA 522

Personalizar a faixa de opções com XML em bancos de dados Access e suplement 15

Você pode começar criando uma tabela para armazenar o código XML da faixa de opções, ou criar o código XML preferem. Se você tem apenas uma tabela de código da faixa de opções, a Convenção é chamá-lo DbRibbon USys prefixo indicando que é uma tabela de sistema criados pelo usuário. A tabela possui três campos, conforme d 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

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

523

Parte III

Adicionando mais funcionalidades ao Office

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.

524

Personalizar a faixa de opções com XML em bancos de dados Access e suplement 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

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.

NOTA

IntelliSense não funciona para o código de acesso da faixa de opções XML no Visual Basic 2005 Express, Ela funciona no Visual Studio 2005.

É muito mais fácil trabalhar com código XML no XML Notepad 2007 ou o Visual Studio 2005 ediTor. 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 (con à sombra e 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 os significados listados na tabela 15.3.

525

Parte III

Adicionando mais funcionalidades ao Office

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

Personalizar a faixa de opções com XML em bancos de dados Access e suplement 15 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, identicados por uma referência de URL, que são usados como tipos de elemento e atributo nomes em documentos XML.

NOTA

O código XML começa com especificando o namespace como http:\/\/schemas.Microsoft.com\/ . Este é o namespace XML apenas usado para faixas de opções do Office 2007. escritório\/2006\/01\/customui

Em seguida, a faixa de opções atributo está definido como \"false\" (para programadores VBA, observe startFromScratch 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 do código XML, adicionar uma linha de e definir seus atributos id e label, conforme desejado. O é um identificador exclusivo para um personalizado ID atributo Fita de controle que pode ser usado em outro lugar no código XML para fazer referência a guia,attribeo rótulo 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ár grupos) na guia; para o exemplo de código XML que criei dois botões, cada um deles executa um retorno de chama função.

Consulte a que tabela 15.1 para obter uma lista dos mais comumente utilizados elementos para a criação

REFERÊNCIAeCRUZADA controles da faixa de opções.

Controles (minimamente) possuem atributos id e label e também atributo (geralmente, definido como habilitadoum ). Eles geralmente exibem uma imagem, que normalmente imageMso é definida com argumento, usando um \"verdadeiro\" 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 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\/ ). Ele se resume a algo como \"nós fizemos a fita perfeita, en-us\/library\/aa338198.aspx assim os usuários não precisam personalizá-lo.\" Escusado será dizer, eu (e muitos outros desenvolvedores e usuários 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.

NOTA

Para usar a imagem de formulário em um controle personalizado, use como o valor do argumento imageMso \"CreateForm\" 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.

527

Parte III

Adicionando mais funcionalidades ao Office

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 argumento imageMso 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= no site da Microsoft. 4329d9e9-4d11-46a5-898d-23e4f331e9ae 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.

CUIDADO

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.

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á referencing um guia de fita interna ou grupo. A seguinte linha de código XML desliga-se o padrão Crie guia:

528

Personalizar a faixa de opções com XML em bancos de dados Access e suplement 15 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 stanguias 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

Parte III

Adicionando mais funcionalidades ao Office

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

Personalizar a faixa de opções com XML em bancos de dados Access e suplement 15 Tabela 15.6 lista os nomes de controle padrão. TABELA 15.6

Nomes de controle do acesso interno da fita AccessRelinkLists

AdpOutputOperationsSortDescending

AddInsMenu

AdpOutputOperationsTableRemove

AdpConstraints

AdpPrimaryKey

AdpDiagramAddRelatedTables

AdpStoredProcedureEditSql

AdpDiagramAddTable

AdpStoredProcedureQueryAppend

AdpDiagramArrangeSelection

AdpStoredProcedureQueryAppendValues

AdpDiagramArrangeTables

AdpStoredProcedureQueryDelete

AdpDiagramAutosizeSelectedTables

AdpStoredProcedureQueryMakeTable

AdpDiagramColumnNames

AdpStoredProcedureQuerySelect

AdpDiagramColumnProperties

AdpStoredProcedureQueryUpdate

AdpDiagramCustomView

AdpVerifySqlSyntax

AdpDiagramDeleteTable

AdpViewDiagramPane

AdpDiagramHideTable

AdpViewGridPane

AdpDiagramIndexesKeys

AdpViewSqlPane

AdpDiagramKeys

AdvertisePublishAs

AdpDiagramModifyCustomView

AlignCenter

AdpDiagramNameOnly

AlignLeft

AdpDiagramNewLabel

AlignLeftToRightMenu

AdpDiagramNewTable

AlignRight

AdpDiagramRecalculatePageBreaks

ApplyCommaFormat

AdpDiagramRelationships

ApplyCurrencyFormat

AdpDiagramShowRelationshipLabels

AplicarFiltro

AdpDiagramTableModesMenu

ApplyPercentageFormat

AdpDiagramViewPageBreaks

AutoFormatGallery

AdpManageIndexes

AutoFormatWizard

AdpOutputOperationsAddToOutput

AutoSumAverage

AdpOutputOperationsGroupBy

AutoSumCount

AdpOutputOperationsSortAscending

AutoSumMax

continuou

531

Parte III

Adicionando mais funcionalidades ao Office

TABELA 15.6 (continuação) AutoSumMin

ControlSpecialEffectMenu

Bold (realce)

ControlSpecialEffectRaised

Balas

ControlSpecialEffectShadowed

BusinessFormWizard

ControlSpecialEffectSunken

CacheListData

ControlSubFormReport

ClearGrid

ControlTabControl

ClearMenuAccess

ControlTitle

CloseDocument

ControlToggleButton

ColumnWidth

ControlUnboundObjectFrame

ComAddInsDialog

ControlWizards

ControlActiveX

ConvertDatabaseFormat

ControlAlignToGrid

Cópia

ControlAttachment

CreateClassModule

ControlBoundObjectFrame

CreateDiagram

ControlChart

CreateEmail

ControlImage

CreateForm

ControlLayoutRemove

CreateFormBlankForm

ControlLayoutStacked

CreateFormInDesignView

ControlLayoutTabular

CreateFormMoreFormsGallery

ControlLine

CreateFormPivotChart

ControlLineColorPicker

CreateFormSplitForm

ControlLineThicknessGallery

CreateFormWithMultipleItems

ControlLineTypeGallery

CreateLabels

ControlLogo

CreateMacro

ControlMarginsGallery

CreateModule

ControlPaddingGallery

CreateOtherObjectsMenu

ControlPage

CreateQueryFromWizard

ControlRectangle

CreateQueryInDesignView

ControlSetControlDefaults

CreateReport

ControlSnapToGrid

CreateReportBlankReport

ControlSpecialEffectChiseled

CreateReportFromWizard

ControlSpecialEffectEtched

CreateReportInDesignView

ControlSpecialEffectFlat

CreateShortcutMenuFromMacro

532

Personalizar a faixa de opções com XML em bancos de dados Access e suplement 15

CreateStoredProcedure

Excluir

CreateTable

DeleteTab

CreateTableInDesignView

DrillInto

CreateTableTemplatesGallery

DrillOut

CreateTableUsingSharePointListsGallery

ExportAccess

CustomizeHide

ExportDBase

Corte

ExportExcel

DatabaseAccessBackEnd

ExportHtmlDocument

DatabaseAnalyzePerformance

ExportLotus

DatabaseAnalyzeTable

ExportMoreMenu

DatabaseCopyDatabaseFile

ExportOdbcDatabase

DatabaseDocumenter

ExportParadox

DatabaseEncodeDecode

ExportSavedExports

DatabaseLinedTableManager

ExportSharePointList

DatabaseMakeMdeFile

ExportSnapshot

DatabaseMoveToSharePoint

ExportTextFile

DatabaseObjectDependencies

ExportWord

DatabasePartialReplica

ExportXmlFile

DatabasePermissions

Lista de campos

DatabasePermissionsMenu

FileBackupDatabase

DatabaseRelationships

FileBackUpSqlDatabase

DatabaseSetLogonSecurity

FileCloseDatabase

DatabaseSqlServer

FileCompactAndRepairDatabase

DatabaseSwitchboardManager

FileDatabaseProperties

DatabaseUserAndGroupAccounts

FileDropSqlDatabase

DatabaseUserLevelSecurityWizard

FileManageMenu

DataRefreshAll

FileNewDatabase

DatasheetColumnDelete

FileOpenDatabase

DatasheetColumnLookup

FilePackageAndSign

DatasheetColumnRename

FilePrintMenu

DatasheetNewField

FicheiroPré

DateAndTimeInsert

FilePrintQuick

DefaultView

FilePublishToSharePoint

continuou

533

Parte III

Adicionando mais funcionalidades ao Office

TABELA 15.6 (continuação) FileSave

FindDialog

FileSaveAs

FindNext

FileSaveAsAccess2000

First10RecordsPreview

FileSaveAsAccess2002_2003

Fonte

FileSaveAsAccess2007

FontAlternateFillBackColorPicker

FileSaveAsMenuAccess

FontColorPicker

FileSaveAsPdfOrXps

FontConditionalFormatting

FileSendAsAttachment

FontFillBackColorPicker

FileServerLinkTables

FontSize

FileServerMenu

FormatCellsDialog

FileServerTransferDatabase

FormatPainter

FilterAdvancedByForm

FormattingDataType

FilterAdvancedMenu

FormattingDecreaseDecimals

FilterAfterSelection

FormattingFormat

FilterBeforeSelection

FormattingIncreaseDecimals

FilterBeginsWithSelection

FormattingRequiredField

FilterBetween

FormattingUnique

FilterBySelection

FormControlButton

FilterClearAllFilters

FormControlCheckBox

FilterContainsSelection

FormControlComboBox

FilterDoesNotBeginsWithSelection

FormControlEditBox

FilterDoesNotContainSelection

FormControlGroupBox

FilterDoesNotEndWithSelection

FormControlLabel

FilterEndsWithSelection

FormControlListBox

FilterEqualsSelection

FormControlRadioButton

FilterExcludingSelection

FormHeaderOrFooterShowHide

FilterIsNotSelected

GoToMenuAccess

FilterIsSelected

GoToNewRecord

FilterLargerThanSelection

GridlinesColorPicker

FilterNotEqualsSelection

GridlinesGallery

FilterSmallerThanSelection

GridlinesStyleGallery

FiltersMenu

GridlinesWidthGallery

FilterToggleFilter

GridShowHide

534

Personalizar a faixa de opções com XML em bancos de dados Access e suplement 15

GroupAddInsCustomToolbars

GroupFormattingControls

GroupAddInsMenuCommands

GroupFormattingGridlines

GroupAddInsToolbarCommands

GroupGroupingAndTotals

GroupAdminister

GroupImport

GroupAdpDiagramLayout

Agrupamento

GroupAdpDiagramShowHide

GroupLayoutShowHide

GroupAdpOutputOperations

GroupMacro

GroupAdpQueryTools

GroupMacroClose

GroupAdpQueryType

GroupMacroRows

GroupAdpSqlStatementDesignTools

GroupMacroShowHide

GroupAnalyze

GroupMacroTools

GroupAutoFormatAccess

GroupMarginsAndPadding

GroupClipboard

GroupMarginsAndPaddingControlLayout

GroupCollectData

GroupMoveData

GroupControlAlignment

GroupPageLayoutAccess

GroupControlAlignmentLayout

GroupPivotChartActiveFieldAccess

GroupControlPositionLayout

GroupPivotChartDataAccess

GroupControlsAccess

GroupPivotChartFilterAndSort

GroupControlSize

GroupPivotChartShowHide

GroupCreateForms

GroupPivotChartTools

GroupCreateOther

GroupPivotChartType

GroupCreateReports

GroupPivotTableActiveFieldAccess

GroupCreateTables

GroupPivotTableDataAccess

GroupDatabaseSourceControl

GroupPivotTableFilterAndSort

GroupDatabaseTools

GroupPivotTableSelections

GroupDatasheetRelationships

GroupPivotTableShowHideAccess

GroupDataTypeAndFormatting

GroupPivotTableToolsAccess

GroupDesignGridlines

GroupPosition

GroupExport

GroupPositionLayout

GroupFieldsAndColumns

GroupPrintPreviewClosePreview

GroupFieldsTools

GroupPrintPreviewData

GroupFontAccess

GroupPrintPreviewPrintAccess

GroupFormatting

GroupQueryClose

continuou

535

Parte III

Adicionando mais funcionalidades ao Office

TABELA 15.6 (continuação) GroupQueryResults

ImportLotus

GroupQuerySetup

ImportMoreMenu

GroupQueryShowHide

ImportOdbcDatabase

GroupQueryType

ImportOutlook

GroupRecords

ImportParadox

GroupRelationships

ImportSavedImports

GroupRelationshipsTools

ImportSharePointList

GroupRichText

ImportTextFile

GroupSchemaTools

ImportXmlFile

GroupSharePointList

IndentDecrease

GroupSharepointLists

IndentIncrease

GroupSizeAndPosition

Itálico

GroupSortAndFilter

LabelFontDialog

GroupSourceControlManage

LoadFromQuery

GroupSourceControlShow

MacroArguments

GroupTableDesignShowHide

MacroConditions

GroupTableDesignTools

MacroConvertMacrosToVisualBasic

GroupTextFormatting

MacroNames

GroupToolsAccess

MacroRun

GroupViews

MacroShowAllActions

GroupViewsShowHide

MacroSingleStep

GroupWindowAccess

MailMergeGoToFirstRecord

GroupZoom

MailMergeGoToNextRecord

HeaderFooterPageNumberInsert

MailMergeGoToPreviousRecord

HideDetails

MailMergeGotToLastRecord

HorizontalSpacingDecrease

ManageReplies

HorizontalSpacingIncrease

MasterViewClose

HorizontalSpacingMakeEqual

MenuPublish

Hiperlinkinserir

MergeToWord

ImportAccess

Numeração

ImportDBase

ObjectBringToFront

ImportExcel

ObjectGallery

ImportHtmlDocument

ObjectsAlignBottom

536

Personalizar a faixa de opções com XML em bancos de dados Access e suplement 15

ObjectsAlignLeft

PivotChartMultipleUnified

ObjectsAlignRight

PivotChartSortByTotalAscending

ObjectsAlignTop

PivotChartSortByTotalDescending

ObjectSendToBack

PivotChartSortByTotalMenu

ObjectsGroup

PivotChartType

ObjectsSelect

PivotClearCustomOrdering

ObjectsUngroup

PivotCollapseFieldAccess

OleDdeLinks

PivotCollapseFieldAccess

PageBreakInsertOrRemove

PivotCreateCalculatedTotal

PageHeaderOrFooterShowHide

PivotCreateCalulatedField

PageMarginsGallery

PivotDropAreas

PageOrientationLandscape

PivotExpandField

PageOrientationPortrait

PivotExpandIndicators

PageSetupDialog

PivotExportToExcel

PageSizeGallery

PivotFieldList

Colar

PivotFilterBySelection

PasteAppend

PivotFormulasMenu

PasteDuplicate

PivotGroupItems

PasteSpecial

PivotHideDetails

PasteSpecialDialog

PivotMoveField

PivotAutoCalcAverage

PivotMoveToColumnArea

PivotAutoCalcCount

PivotMoveToDetailArea

PivotAutoCalcMax

PivotMoveToFieldArea

PivotAutoCalcMenu

PivotMoveToFilterArea

PivotAutoCalcMin

PivotRefresh

PivotAutoCalcStandardDeviation

PivotRemoveField

PivotAutoCalcStandardDeviationPopulation

PivotShowAll

PivotAutoCalcSum

PivotShowAsMenu

PivotAutoCalcVariance

PivotShowAsNormal

PivotAutoCalcVariancePopulation

PivotShowAsPercentOfColumnTotal

PivotAutoFilter

PivotShowAsPercentOfGrandTotal

PivotChartLegendShowHide

PivotShowAsPercentOfParentColumnItem

PivotChartMultiplePlots

PivotShowAsPercentOfParentRowItem

continuou

537

Parte III

Adicionando mais funcionalidades ao Office

TABELA 15.6 (continuação) PivotShowAsPercentOfRowTotal

QueryCrosstab

PivotShowDetails

QueryDataDefinition

PivotShowOnlyTheBottomMenu

QueryDelete

PivotShowOnlyTheTopMenu

QueryInsertColumn

PivotShowTopAndBottomItemsMenu

QueryInsertColumns

PivotSubtotal

QueryMakeTable

PivotSwitchRowColumn

QueryParameters

PivotUngroupItems

QueryReturnGallery

PositionAnchoringGallery

QueryRunQuery

PositionFitToWindow

QuerySelectQueryType

PostcardWizard

QueryShowTable

PrintColumns faz um

QuerySqlPassThroughQuery

PrintDataOnly

QueryTableNamesShowHide

PrintDialogAccess

QueryTotalsShowHide

PrintPreviewClose

QueryUnionQuery

PrintPreviewEightPages

QueryUpdate

PrintPreviewFourPages

QuickAccessToolbarCustomization

PrintPreviewMultiplePagesMenu

RecordsAddFromOutlook

PrintPreviewTwelvePages

RecordsCollapseAllSubdatasheets

PrintPreviewZoom10

RecordsDeleteColumn

PrintPreviewZoom1000

RecordsDeleteRecord

PrintPreviewZoom150

RecordsExpandAllSubdatasheets

PrintPreviewZoom200

RecordsFreezeColumns

PrintPreviewZoom25

RecordsHideColumns

PrintPreviewZoom50

RecordsInsertSubdatasheet

PrintPreviewZoom500

RecordsMoreRecordsMenu

PrintPreviewZoom75

RecordsRefreshMenu

PrintPreviewZoomMenu

RecordsRefreshRecords

PrintPreviewZoomTwoPages

RecordsRemoveSubdatasheet

PropertySheet

RecordsSaveAsOutlookContact

PublishToPdfOrEdoc

RecordsSaveRecord

QueryAppend

RecordsSubdatasheetMenu

QueryBuilder

RecordsTotals

538

Personalizar a faixa de opções com XML em bancos de dados Access e suplement 15

RecordsUnfreeze

SharePointListsWorkOffline

RecordsUnhideColumns

ShowClipboard

Refazer

ShowMargins

RelationshipDesignAllRelationships

SizeToFit

RelationshipsClearLayout

SizeToFitAccess

RelationshipsDirectRelationships

SizeToGridAccess

RelationshipsEditRelationships

SizeToNarrowest

RelationshipsHideTable

SizeToShortest

RelationshipsReport

SizeToTallest

ReplaceDialog

SizeToWidest

ReplicationCreateReplica

SortAndFilterAdvanced

ReplicationOptionsMenu

SortDown

ReplicationRecoverDesignMaster

SortRemoveAllSorts

ReplicationResolveConflicts

SortSelectionMenu

ReplicationSynchronizeNow

SortUp

Reverter

SourceControlAddDatabase

RowHeight

SourceControlAddObjects

RulerShowHide

SourceControlCheckIn

SaveAsQuery

SourceControlCheckOut

SaveObjectAs

SourceControlCreateDatabaseFromProject

SelectAllAccess

SourceControlGetLatestVersion

SelectAllRecords

SourceControlOptions

SelectMenuAccess

SourceControlProperties

SelectRecord

SourceControlRefreshStatus

ServerConnection

SourceControlRun

ServerFilterApply

SourceControlShareObjects

FiltroDoServidorPorFormulário

SourceControlShowDifferences

Propriedades

SourceControlShowHistory

ServerRestoreSqlDatabase

SourceControlUndoCheckOut

SetDatabasePassword

SpellingAccess

SharePointListsDiscardAllChanges

SubformInNewWindow

SharePointListsDiscardAllChangesAndRefresh

SubformMenu

SharePointListsDiscardChangesMenu

SynchronizeData

continuou

539

Parte III

Adicionando mais funcionalidades ao Office

TABELA 15.6 (continuação) TabAddIns

TabReportToolsFormatting

TabAdpDiagramDesign

TabReportToolsLayout

TabAdpFunctionAndViewToolsDesign

TabReportToolsPageSetupDesign

TabAdpSqlStatementDesign

TabReportToolsPageSetupLayout

TabAdpStoredProcedureToolsDesign

TabSetAdpDiagram

TabControlLayout

TabSetAdpFunctionAndViewTools

Guiacriar

TabSetAdpSqlStatement

TabDatabaseTools

TabSetAdpStoredProcedure

TabExternalData

TabSetFormReportExtensibility

TabFormToolsDesign

TabSetFormTools

TabFormToolsFormatting

TabSetFormToolsLayout

TabFormToolsLayout

TabSetMacroTools

TabHomeAccess

TabSetPivotChartAccess

TableColumnsDelete

TabSetPivotTableAccess

TableDesign

TabSetQueryTools

TableIndexes

TabSetRelationshipTools

TableListAlertMe

TabSetReportTools

TableListPermissions

TabSetReportToolsLayout

TableRowsDelete

TabSetTableToolsDatasheet

TableRowsInsertWord

TabSetTableToolsDesign

TableSharePointListsModifyColumnsAndSettings

TabSourceControl

TableSharePointListsModifyWorkflow

TabTableToolsDatasheet

TableSharePointListsRefreshList

TabTableToolsDesignAccess

TableTestValidationRules

TextDirectionLeftToRight

TabMacroToolsDesign

TextDirectionRightToLeft

TabOrder

TextHighlightColorPicker

TabPivotChartDesign

TotalsCountRecords

TabPivotTableDesign

TotalsMenu

TabPrintPreviewAccess

TotalsStandardDeviation

TabQueryToolsDesign

TotalsSum

TabRelationshipToolsDesign

TotalsVariance

TabReportToolsAlignment

Sublinhado

TabReportToolsDesign

Desfazer

540

Personalizar a faixa de opções com XML em bancos de dados Access e suplement 15

VerticalSpacingDecrease

ViewVisualBasicCodeAccess

VerticalSpacingIncrease

VisualBasic

VerticalSpacingMakeEqual

WindowMoreWindowsDialog

ViewMessageBar

WindowNameGoesHere

ViewsAdpDiagramPrintPreview

WindowsArrangeIcons

ViewsAdpDiagramSqlView

WindowsCascade

ViewsDatasheetView

WindowsDataEntry

ViewsDesignView

WindowSplit

ViewsFormView

WindowsSwitch

ViewsLayoutView

WindowsTileHorizontally

ViewsModeMenu

WindowsTileVertically

ViewsModeMenu

WindowUnhide

ViewsPivotChartView

Zoom100

ViewsPivotChartView

ZoomFitToWindow

ViewsPivotTableView

ZoomOnePage

ViewsReportView

ZoomPrintPreviewExcel

ViewsSwitchToDefaultView

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\" > < guia idMso = \"TabHomeAccess\" visível = \"false\" > < guia idMso = \"TabExternalData\" visível = \"true\" > < Grupo idMso = \"GroupExport\" visível = \"false\" >

NOTA

Para ver isto (ou qualquer) faixa de opções personalizada em um banco de dados do Access, você precisa o \"Nome da faixa de opções\"-lista suspensa na caixa de diálogo Opções do Access, como mostrado na Fi

541

Parte III

Adicionando mais funcionalidades ao Office

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 DICA janela.

Para executar comandos de controles na sua faixa de opções personalizada, você precisa escrever um procedimento para cada botão de comando da faixa de opções. Em primeiro lugar, definir uma referência à biblioteca de objeto do Off Referências de diálogo (Ver Figura 15.6); é necessário para oferecer suporte a vários objetos relacionados à faixa de op 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 fit Lista campos fita personalizada; Nota o argumento, que Controle ByVal como IRibbonControl o procedimento para o controle de links: Public Sub ListTableFields(ByVal control As IRibbonControl) Em erro continuar próximo

542

Personalizar a faixa de opções com XML em bancos de dados Access e suplement 15 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 dad 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

Parte III

Adicionando mais funcionalidades ao Office

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 °

Personalizar a faixa de opções com XML em bancos de dados Access e suplement 15 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 banco de dados e reabri-lo, para carregar o Ribbon(s) personalizado. Então você tem que selecionar a faixa de opç 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

Parte III

Adicionando mais funcionalidades ao Office

3. Selecione a página de banco de dados atual e selecione a faixa de opções que você deseja carregar da fai 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

Personalizar a faixa de opções com XML em bancos de dados Access e suplement 15 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.

NOTA

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 fo selecionando-o na página de banco de dados atual da tela opções do Access e na Propriedade do formulári 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.

547

Parte III

Adicionando mais funcionalidades ao Office

Este código adiciona uma guia personalizada chamada guia de forma personalizada, com um único grupo e dois com 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 perso Fita em um formulário, você precisa selecionar o nome da faixa de opções na Propriedade do formulário RibbonNam 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

Personalizar a faixa de opções com XML em bancos de dados Access e suplement 15

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 nov ção da faixa de opções. No entanto, você pode substituir um conjunto de menu add-ins com um único menu add-in uma faixa de opções personalizada e coloque o resto do comandos do seu suplemento na faixa de opções. Por exe 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.

NOTA

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 Adic para obter detalhes. Este não é um problema ao instalar o add-ins para o Access 2007 em execução no Windows XP.

CUIDADO

549

Parte III

Adicionando mais funcionalidades ao Office

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

REFERÊNCIAsobre CRUZADA 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 me o nome do banco de dados do suplemento de projeto antes do nome da função, como tenho feito Código XML listado abaixo.

NOTA

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\" > < 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 \"\/ >

550

Personalizar a faixa de opções com XML em bancos de dados Access e suplement 15 < 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 \"\/ >

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.

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

551

Parte III

Adicionando mais funcionalidades ao Office

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.

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

Personalizar a faixa de opções com XML em bancos de dados Access e suplement 15

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 des no início deste capítulo (Ver Figura 15.8).

CUIDADO

O módulo de basExtrasRibbon também contém vários procedimentos de retorno de chamada, que são os mesmos aqueles no padrão Extras 2007.accda Adicionar-in, excetoByVal paracontrole o como argumento (além de um novo procedimento, para fazer backup de um banco de dados back-e IRibbonControl 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.

DICA

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 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

553

Parte III

Adicionando mais funcionalidades ao Office

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

Personalizar a faixa de opções com XML em bancos de dados Access e suplement 15

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.

REFERÊNCIA CRUZADA

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 m 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

555

Parte III

Adicionando mais funcionalidades ao Office

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.

CUIDADO

Se você selecionar o comando de lista de campos de tabela, uma tabela é preenchida com os nomes das tabelas e s campos e uma caixa de mensagem pergunta se você deseja imprimir o relatório vinculado à tabela agora, como most Figura 15.19:

556

Personalizar a faixa de opções com XML em bancos de dados Access e suplement 15

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

Parte III

Adicionando mais funcionalidades ao Office

Se você executar esse comando em um banco de dados que tem não tabelas vinculadas, em vez disso você recebe 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 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 exec 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

Personalizando o acesso A fita com um Visual Studio Suplemento de 2005 compa

EU

n capítulo 13, descrevi criando um VB 6 COM add-in para adicionar extra NESTE CAPÍTULO 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, Personalizar a faixa de opções com um que é o VB 2005, incluído no Visual Studio 2005, disponível em várias edições. Visual Studio 2005 Shared add-in Existem diferenças significativas entre essas versões do VB e alguns comUma comparação de acesso e patibility problemas com Office 2007, mas você podem criar o Visual Studio 2005 Visual Adicionar-ins que funcionam com acesso, embora neste momento, o trabalho é muito mais Studio difícil doadd-ins 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

Parte III

Adicionando mais funcionalidades ao Office

precisará executar a instalação do Office. No Windows Vista, primeiro selecione programas no painel de controle, em 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 para baixo de sua lista e selecione o \"executar de meu computador\" item (veja a Figura 16.3).

560

Personalizar a faixa de opções de acesso com um Visual Studio 2005 Shared Add-in 16

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

Parte III

Adicionando mais funcionalidades ao Office

Se você deseja criar suplementos para quaisquer outros componentes do Office, selecione \"Executar de meu compu 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 Adicionarno 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

Personalizar a faixa de opções de acesso com um Visual Studio 2005 Shared Add-in 16

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.

REFERÊNCIA CRUZADA

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 p 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 cria 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 nome da solução; você pode aceitar o local padrão para arquivos do add-in ou procure um cusLocalização de Tom, como eu fiz na Figura 16.7.

563

Parte III

Adicionando mais funcionalidades ao Office

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.

CUIDADO

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.

564

Personalizar a faixa de opções de acesso com um Visual Studio 2005 Shared Add-in 16

FIGURA 16.8 A primeira tela do Shared Add-in Wizard.

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 hotFix. 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 emhttp:\/\/www.Microsoft.com\/downcargas\/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

565

Parte III

Adicionando mais funcionalidades ao Office

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:

566

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.

567

Parte III

Adicionando mais funcionalidades ao Office

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

Personalizar a faixa de opções de acesso com um Visual Studio 2005 Shared Add-in 16 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, é mel 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

Parte III

Adicionando mais funcionalidades ao Office

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.

DICA

570

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.

Personalizar a faixa de opções de acesso com um Visual Studio 2005 Shared Add-in 16

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 co pasta e selecione Add Reference, em seguida, selecione a guia de .NET, selecione \"Microsoft.Office.Interop.Access\" na Figura 16.15) e clique em OK. Figura 16.16 mostra referências na solução no Solution Explorer.

571

Parte III

Adicionando mais funcionalidades ao Office

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

Personalizar a faixa de opções de acesso com um Visual Studio 2005 Shared Add-in 16 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 e addInInstance ), ambos applicationObject declarados como substituindo com Privada (Eu também dei a Objeto , com rigidez de tipos referências,Dim variável um nome mais específico do aplicativo, applicationObject 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 d 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

Parte III

Adicionando mais funcionalidades ao Office

Na OnConnection veis como segue:

método, modifique as linhas que defina o aplicativo (acesso) e o suplemento vari -

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.

NOTA

Depois de adicionar o IRibbonExtensibility implementa aparecem no módulo de classe Connect, GetCustomUI .

NOTA

linha, um novo esboço de função deve

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 addem (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.

574

Personalizar a faixa de opções de acesso com um Visual Studio 2005 Shared Add-in 16

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 im mento essa funcionalidade, eu precisava escrever código XML da faixa de opções personalizada, três botão funçõe 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 selecion ing projeto Adicionar Novo Item e, em seguida, o item de arquivo XML na caixa de diálogo Add New Item (dar o o nome da Ribbon), como mostrado na Figura 16.19.

575

Parte III

Adicionando mais funcionalidades ao Office

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 inforinformações sobre como criar código XML da faixa de opções):
View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF