Select Menu



por Alessandro Trovato

Seguidores

Seguidores

Slider

O NERD ENSINA

#116 - Excel VBA - UPDATE de vários registros no Banco de Dados - Parte 1

Continuando nossas aulas de VBA + Access vamos trabalhar com 
 a atualização de dados ou realização de UPDATES no banco!

Conteúdo da aula:

 - Identificar registros alterados para fazer o Update
 - Criação e execução do Update






Espero que goste do conteúdo.
Bons estudos!

Se gostou compartilhe com seus colegas de trabalho e amigos!

Acesso as planilhas: 
www.sigaonerd.com

Facebook / Twitter

Inscreva-se em meu canal de vídeos no Youtube clicando aqui 

Microsoft Excel é um produto do pacote Microsoft Office
-------------------------------------------------------
1)  Tenha acesso a mais de 465 vídeos tutoriais em meu canal de vídeos no Youtube. Clique aqui e conheça o site que criei com o catálogo das aulas dos cursos completos que gravei!

2) Clique aqui para ter acesso ao download de centenas de planilhas e apostilas que criei (tudo gratuito)


Bons estudos!
- - - -
#115 - Excel VBA - Como excluir texto de células após critérios 

Esta é uma aula de Tira Dúvidas recebidas no fórum TechNet da Microsoft. 
Explico como fazer para eliminar textos a partir de um critério definido pelo usuário. 

Conteúdo da aula

 - Instrução MID
 - Estrutura de Repetição For Next





Espero que goste do conteúdo.
Bons estudos!

Se gostou compartilhe com seus colegas de trabalho e amigos!

Acesso as planilhas: 
www.sigaonerd.com

Facebook / Twitter

Inscreva-se em meu canal de vídeos no Youtube clicando aqui 

Microsoft Excel é um produto do pacote Microsoft Office
-------------------------------------------------------
1)  Tenha acesso a mais de 465 vídeos tutoriais em meu canal de vídeos no Youtube. Clique aqui e conheça o site que criei com o catálogo das aulas dos cursos completos que gravei!

2) Clique aqui para ter acesso ao download de centenas de planilhas e apostilas que criei (tudo gratuito)


Bons estudos!
- - - -

Deixando o código autodocumentado

Muita gente tem problemas quando precisa pegar um código feito por outra pessoa, gastando um tempo considerável para entender o que foi feito. Normalmente o código legado não tem nenhuma documentação além de alguns comentários aqui ou ali. Há também pessoas que têm problema para entender o próprio código ao olhá-lo depois de alguns meses ou mesmo algumas poucas semanas. Muito desse problema se dá por causa do não uso de boas práticas de programação. Veremos as principais aqui neste artigo. Alguns dos meus próprios códigos em artigos anteriores não seguem algumas dessas recomendações, pois o foco sempre foi deixar o mais didático possível, abstraindo os leitores de detalhes que não sejam relevantes no momento. Algumas dicas já foram mencionadas em alguns dos artigos anteriores, encare-as como uma revisão ou lembrete.

O primeiro ponto é escolher nomes adequados às variáveis que serão utilizadas. Como os leitores devem ter percebido, nos meus artigos sempre procuro colocar nomes que definam bem o propósito da variável. Recomenda-se que o tamanho deve ter no mínimo cinco caracteres se for composto de apenas uma palavra. Se houver mais de duas palavras, pode-se utilizar abreviação, mas é preciso que esta seja consistente. Por exemplo, não adianta abreviar produto para Prod em algumas variáveis, Pro em outras e ainda Prd em outras. É preciso estabelecer um padrão e se ater a ele. Assim, quem ler o programa conhecerá o padrão das abreviações em pouco tempo.

Mesmo em iterações simples, onde muitos programadores, mesmo experientes, usam variáveis com apenas um caractere, sempre usando a ordem i, j e k. Essa prática atrapalha muito quem estiver lendo o código, pois fica difícil saber qual o propósito do i, do j e do k. É preciso gastar um tempo considerável para entender para que serve cada uma e qual o seu uso. Mesmo quando tem apenas uma estrutura de repetição, é uma boa prática especificar a função da iteração. For Linha, For Cliente e For Produto são mais fáceis de entender do que For i, já fica bem evidente o propósito do loop. Caso não saiba, programadores gastam mais tempo lendo código do que programando. Portanto, gastar alguns caracteres a mais no nome das variáveis facilita muito no entendimento dos leitores. Lembre-se que você mesmo pode não entender o que você escreveu há alguns dias atrás por causa da economia de digitação.

Outro ponto em variáveis é a forma de escrever as palavras individuais do nome da variável. Há duas formas bastante populares e utilizadas: PascalCase e CamelCase. A primeira diz para colocar a inicial de cada palavra em maiúscula e o restante em minúsculas, a segunda diz a mesma coisa, exceto para a primeira palavra, que deve iniciar em minúscula. Exemplo: CodProduto é a forma em PascalCase e codProduto em CamelCase. Não há uma forma certa ou errada, mas o ideal é decidir por uma e usá-la consistentemente no código. O formato CamelCase é mais utilizada quando o programador coloca o tipo da variável ou objeto no nome, como int (inteiro), str (string), frm (formulário), btn (botão), cls (classe) etc. Com relação a constantes, o consenso entre a maioria dos programadores é utilizá-las em maiúsculas, como QTD_MAX, NUM_LINHAS etc. Perceba que neste caso é melhor colocar uma sublinha (underline) para separar as palavras e facilitar o entendimento.

Uma outra dica interessante é evitar o uso de chamados "números mágicos" ou "textos mágicos", que seriam números e textos colocados de forma fixa no código. O ideal é substituí-los por constantes. Por exemplo, você tem uma planilha com orçamento que será impressa, há um limite de 20 produtos por questões de layout e no seu código há algumas validações que usam esse valor. Mas suponha que um dia você refaça o layout do orçamento, alguns ajustes aqui ou ali e agora tem 25 linhas à disposição para colocar os produtos. O que será preciso fazer no código? Procurar cada "20" e trocar por "25", checando antes se esse número realmente tem relação com o layout do orçamento. Ou seja, será trabalhoso demais, sujeitando-se a erros. É melhor colocar uma constante como NUM_LINHAS com o valor da quantidade de linhas. Assim, se houver alguma alteração, basta alterar a linha com o valor dessa constante. Reduz muito o tempo da manutenção do código e mitiga as chances de esquecer de alterar algum ou alterar algum errado.

Da mesma forma que os números, há textos que podem ser substituídos por constantes, de forma a deixar mais explícito o que significa o valor. Um "F" no código pode indicar uma validação de pessoa física ou sexo feminino, por exemplo. Criar as constantes e validar PES_FISICA ou FEMININO deixa mais explícito o que está sendo validado no momento, além de evitar erros de colocar minúsculas quando deveriam ser maiúsculas e vice-versa.

Passando para os procedimentos, é fundamental que sejam curtos e tenham um único propósito. É comum ouvir dizer que se deve dividir rotinas para evitar repetição de código. Isso é verdade, mas também deve-se dividir para reduzir a complexidade do código. As boas práticas recomendam que uma sub-rotina ou função não deve ter mais do que uma tela de código de altura, pois mais do que isto indica que há muita coisa sendo feita e aumenta a complexidade do procedimento. Além disso, analisar um procedimento sem precisar usar a barra de rolagem ajuda a manter o foco – só o fato de subir ou descer o código é uma distração.

Deve-se considerar a possibilidade de extrair alguns trechos em novas sub-rotinas de forma a isolar alguns procedimentos. Isto é particularmente útil em instruções If e Select Case quando o código em cada opção tem muitas linhas. É melhor criar uma sub-rotina e colocar uma chamada no lugar de várias linhas. Veja o exemplo abaixo como fica mais fácil entender o que é feito:

Select Case TipoPessoa
    Case PES_FISICA
        ProcessarPesFisica
    Case PES_JURIDICA
        ProcessarPesJuridica
    Case Other
        GerarErro "Tipo de pessoa inválida"
End Select

Fica mais fácil entender o código desta forma, pois as linhas referentes ao processamento de cada tipo de pessoa foram isoladas em procedimentos separados, o leitor saberá que algumas partes foram separadas. Se houver necessidade de investigar alguma dessas partes, basta ir até aquela parte do programa. Imagine como ficaria o código se cada When viesse acompanhado de pelo menos 10 linhas; o procedimento teria muito mais linhas e certamente ocuparia mais de uma tela.

Da mesma forma que em variáveis, a nomenclatura dos procedimentos é importante. É essencial que ele descreva de forma sucinta tudo que o procedimento faz. Assim, se uma sub-rotina consiste e processa um registro, o nome deverá ser ConsistirEProcessarRegistro, o que indica que está fazendo muita coisa. O ideal é separar em duas separadas, uma que consiste e outra que processe o registro. Neste caso, a consistência pode ser substituída por uma função que retorna Verdadeiro ou Falso, indicando se a consistência foi bem-sucedida ou não:

If RegistroConsistente(Registro) Then
    ProcessarRegistro Registro
Else
    GerarErro "Registro inconsistente"
End If

Perceba que neste exemplo tanto a função quanto a sub-rotina usa um parâmetro Registro. Habitue-se a usar parâmetros, pois evita ter de declarar variáveis como públicas para que possam ser acessadas em vários procedimentos. No VBA há como passar valores que podem ser alterados ou não, veja este artigo para mais detalhes.

Outro fator importante na nomenclatura dos procedimentos é a forma, normalmente composta de um verbo e um objeto. Eu costumo usar os verbos no infinitivo, há quem prefira usar na terceira pessoa, vai da preferência de cada um. Com relação a funções, a recomendação é usar o resultado dela como nome. Por exemplo, Sin e Cos são funções que retornam o seno e o cosseno. No caso de valores booleanos, o ideal é colocar o nome do caso Verdadeiro, como fiz no exemplo acima: RegistroConsistente. Também pode-se colocar ÉConsistente (da mesma forma que algumas funções do Excel começam com É), mas em certos casos como validações ou consistências é melhor especificar o que está sendo validado ou consistido para que a função não fique ambígua.

Lembre-se que um código legível permite que você leia de cima para baixo e entenda tudo, sem interrupções. As sub-rotinas e funções com nome de entendimento fácil permitem que você saiba o que é feito naquele momento do programa. Desta forma, a instrução GoTo deve ser evitada ao máximo. A única condição que utilizo é em tratamento de erros. Se seu programa tem GoTo para determinados pontos e não é para tratamento de erro, é bem provável que você precise reescrever o código e criar alguns procedimentos para melhorar o fluxo do programa e evitar esses GoTo.

Estrutura de decisão é outro ponto que merece atenção. Sempre coloque o caso normal após o If, nunca após o Else. Isto melhora tanto a legibilidade da instrução quanto o desempenho em si, pois os casos mais comuns devem ser tratados antes dos demais. No código acima, por exemplo, o caso normal é o registro ser consistente e o anormal é o erro, por isso valida-se o caso positivo. Em caso de instruções If aninhadas, procure sempre colocar o mais provável na frente e seguindo a sequência de importância.

No caso de instruções Select Case é tentador manter os itens em ordem alfabética ou numérica. Porém, nem sempre o caso mais comum está na frente. Por exemplo, muitas instituições financeiras trabalham com arquivos gigantescos e trazem como primeiro caractere o tipo do registro. Normalmente 1 indica cabeçalho (ou header, termo mais usado), 9 é o rodapé (ou trailer) e outros números são detalhes. Há arquivos com mais de um tipo de registro detalhe, sendo que cada um tem um número diferente: 2, 3 etc. O caso mais comum certamente é o detalhe e, se tiver mais de um, é preciso verificar o mais comum. Assim, neste caso você terá seu código validando primeiro o 2, depois o 3, depois o 1 e por fim o 9, ordenando pelo tipo mais provável na frente e o menos provável no fim para manter um melhor desempenho. Se você deixar a ordem como está, é capaz de alguém que for fazer alguma manutenção resolver deixar em ordem numérica, prejudicando assim o desempenho. Há dois caminhos: validar com constantes ou com enumerações. Lembre-se que as enumerações só aceitam números inteiros, o que é o caso aqui. Vejamos como fica a declaração usando nomes que indiquem o significado dos números:

Enum enumRegistro
    Reg_Cabecalho = 1
    Reg_Cliente = 2
    Reg_Parcela = 3
    Reg_Rodape = 9
End Enum

Lembre-se que a enumeração não precisa ter todos os números em sequência, pode-se escolher os valores de acordo com a necessidade. Agora vejamos a estrutura de decisão:

Select Case Registro.Tipo
    Case Reg_Cliente
        ProcessarCliente Registro
    Case Reg_Parcela
        ProcessarParcela Registro
    Case Reg_Cabecalho
        ProcessarCabecalho Registro
    Case Reg_Rodape
        ProcessarRodape Registro
    Case other
        GerarErro "Tipo de registro inválido"
End Select

Com a validação acima, fica mais fácil perceber qual tipo de registro está sendo validado. Se você achar que alguém ainda pode ficar tentado a colocar em ordem alfabética, talvez seja melhor colocar um comentário dizendo que a ordem atual é importante e que deve ser mantida. De qualquer forma, Case Reg_Cliente é muito mais fácil de entender que Case 2.

Estruturas de repetição também merecem alguns pontos de atenção. O primeiro é decidir qual a melhor forma: usar For, While, Until, validação no início ou no fim? O For deve ser usado quando se sabe a quantidade de repetições que o laço terá. E, como citado anteriormente, se possível substituir os "números mágicos" por constantes ou variáveis/propriedades que contenham a quantidade de iterações, como Sheets.Count, por exemplo.

Quando a quantidade de iterações não é conhecida, é preciso decidir por um entre While e Until. A escolha depende do tipo da condição que será usada: While significa enquanto e Until significa até. Se a repetição deve acontecer enquanto uma condição for verdadeira, use While, se a repetição for até que uma condição seja verdadeira, use Until. O VBA permite as duas formas justamente para não precisar usar a chamada lógica negativa, ou seja, ter algo na validação que indique o oposto do que quer que valide. Lógica negativa é um grande problema em qualquer linguagem, pois exigem que quem esteja lendo o código faça alguns exercícios mentais até compreender o que realmente está sendo validado. Por fim, para decidir entre fazer a validação no começo e no fim, basta verificar se o conteúdo da estrutura de repetição precisa executar uma vez antes de verificar a condição. Se for o caso, valide no fim, senão valide no início.

Uma outra coisa bem legal que o VBA nos fornece é a possibilidade de agrupar dados em uma estrutura de dados. Uma variável chamada Nome fica muito vaga no programa, mas Produto.Nome, Cliente.Nome e Fornecedor.Nome deixam mais claro o propósito de cada uma. Se você possui variáveis relacionadas, considere criar um objeto Type, é possível até criar um array deles, permitindo que você trabalhe com um bom volume de dados em memória ao invés de precisar guardá-las na planilha para processar depois. Caso não conheça essas estruturas de dados, recomendo que leia os dois artigos, vale muito a pena usar o Type.

Por fim, tem as classes. Quando bem projetadas ajudam muito a reduzir a complexidade do código. O melhor é que uma classe pode ser facilmente exportada e reutilizada em outros programas. Por exemplo, eu tenho uma classe para um arquivo de log. Desta forma acrescento o arquivo da classe na minha planilha e só preciso instanciar um objeto para usar seus métodos. Toda a complexidade de verificar se o arquivo existe, saber se precisa criar um arquivo ou não, a parte de abrir e fechar o arquivo, a forma de gravar o texto no arquivo, tudo está encapsulado nessa classe. Não preciso nem saber mais como ela funciona, só preciso conhecer os métodos que preciso usar e pronto, funciona como se fosse um objeto nativo do Excel. Tem uma série de três artigos onde expliquei como usar classe com formulários. Lembre-se que a classe deve ter um propósito bem definido e ser especialista naquilo, como está bem demonstrado nos artigos. Uma classe que faz mais de uma coisa não é uma classe bem projetada, é melhor dividir em classes menores. Pode parecer mais trabalhoso, mas torna o entendimento e as manutenções mais fáceis.

Se você seguir todas as dicas citadas aqui, a necessidade de escrever comentários para explicar determinadas partes do programa será bem reduzida. Em alguns procedimentos talvez não precise ter nenhum, nem para descrever o que a função ou sub-rotina faz caso o nome seja bem autoexplicativo. Um código autodocumentado é excelente tanto para quem vai fazer a manutenção quanto para a reputação de quem o fez.

Muitas dessas dicas vieram com a prática e troca de conhecimento com outros programadores. Elas valem para praticamente qualquer linguagem de programação, salvo limitações de algumas. Outras dicas vieram de leitura de livros. Recomendo fortemente Code Complete, de Steve McConnell, que é popularmente conhecido como "a bíblia do programador". A segunda edição é de 2005, mas todo o conteúdo ainda é válido para qualquer linguagem, mesmo as mais modernas.

Para dúvidas sobre o artigo, comentários ou sugestões, utilize os comentários abaixo. Até o próximo artigo!

Pedro Martins

Pós-graduando em Business Intelligence e Big Data pela Faculdade Impacta de Tecnologia. Formado em Tecnologia em Eletrônica Digital com Ênfase em Microprocessadores

- - - - - - - - - -
Porque não aproveitar o aprendizado disponível? 

Olá meu amigo! 

Você que está lendo este artigo com certeza me conhece ou teve sua curiosidade aguçada pelo título. 

Neste texto vou explicar algo que aconteceu aqui no Brasil e que indiretamente prejudicou e está prejudicando pessoas que desejam fazer cursos gratuitos de qualidade e com certificado comprovando sua participação e estudo. 

O que exatamente aconteceu? 

Em meados de 2014 a Udemy (um grande portal internacional de distribuição de cursos) entrou em contato comigo para ser um dos produtores de conteúdo aqui no Brasil. Eles estavam trazendo um modelo de negócios para cá e precisavam de produtores locais. Fiquei muito feliz com o convite e decidi produzir dois cursos: Informática Básica e Word 2013. Ambos completos e com a mesma qualidade que ministro nos treinamentos presenciais. Ainda tinha nos planos a reformulação completa das aulas do Excel e outros aplicativos, mas no formato monetizado. 

Assim que os dois primeiros cursos gratuitos foram publicados um grande número de alunos começou a frequentá-los e concluí-los, recebendo no final um certificado de conclusão. As estatísticas de envolvimento e o feedback sobre os treinamentos estavam ótimos! 

Em agosto de 2016 a Udemy suspendeu a emissão de certificados de conclusão para cursos gratuitos que estavam disponíveis no portal APENAS para o Brasil. Isso mesmo, em todos os países que eles tem cursos sendo produzidos, APENAS no Brasil a emissão dos certificados foram suspensos para os cursos gratuitos. 

Essa decisão pegou todos nós produtores de conteúdo de surpresa e causou uma avalanche de mensagens em minha caixa postal com reclamações e pedidos de emissão de certificados particular. Mas, qual foi o motivo para isso ocorrer? Milhares de pessoas estavam se inscrevendo no treinamento (não só nos meus) mas, ao invés de aproveitar o curso, os alunos estavam simplesmente pulando as aulas para chegar no final e ter a liberação do certificado de participação! 

Esse abuso a meu ver, desacredita os cursos EAD disponíveis no mercado pois a empresa ou entidade que está recebendo o certificado não tem a garantia e a certeza que o aluno realmente "fez" o treinamento. Eu fiz minha graduação em EAD, tenho mais de 80 certificados de cursos dessa modalidade (muitos pagos), e sou um fervoroso defensor dessa forma de ensino. 

Para minha surpresa resolvi verificar também em outros portais (neste caso no portal Curseduca) onde publicava cursos gratuitos com certificado. Percebi que o mesmo acontecia. O aluno inscrito no treinamento, após dez ou quinze minutos já tinha concluído 100% do treinamento (que tem mais de trinta e cinco aulas e pelo menos 10 horas de vídeo)! 

Consequência disso: tive que converter os cursos de gratuitos para pagos (por um preço acessível) para que, aos realmente interessados que continuassem ter comprovação de conclusão do treinamento. É claro que há outros portais que fornecem certificados para cursos gratuitos ainda, cito a Microsoft Virtual Academy, a Fundação Bradesco entre outras. 

Porque elas ainda o fazem? 

Pois toda a estrutura de compartilhamento dos cursos é bancada com recursos próprios e de alguma forma essas empresas devem se beneficiar desse público que acessa os cursos. Seja na isenção de impostos ou em projetos sociais tocadas pelas empresas. Agora imagine nós, os pequenos produtores de conteúdo que temos que pagar a hospedagem dos vídeos, a divulgação feita com marketing, pagamos domínio e hospedagem dos sites! 

Além de recolher altas taxas de impostos sobre as vendas realizadas. Como fazer para continuar ajudando? Buscar um patrocínio resolve? Fechar os olhos a esses abusos e fingir que não existe apenas para "contar" alunos inscritos? Sinceramente não me sinto a vontade com esse último argumento. 

Há ambientes de estudo online que permitem controlar o que o aluno está fazendo, como está fazendo e com possibilidade de aplicar testes e verificar seu nível de aprendizado. Esses ambientes são conhecidos como LMS (Learning Management System ou Sistema de Gestão de Aprendizagem). 

Um ambiente bem conhecido é o Moodle (que é free) mas tem custos de configuração, implantação e volume de tráfego percorrido no ambiente. Estou avaliando a possibilidade de ter meu próprio portal LMS mas, sem um bom plano de negócios, não há condições de manter toda essa estrutura! 

Acho que esse texto tem mais por objetivo ser um desabafo, pois afinal, o jeitinho brasileiro é algo que é difícil de acabar. Enquanto isso procuro não desanimar e continuo pensando em formas de transmitir conhecimento e que ele seja acessível a todos! 

Vida longa ao Youtube! 

Abraços, bons estudos e sucesso!


- -

Gerando arquivos PDF via VBA

Exportar sua planilha para o formato PDF (Portable Document Format, tipo de arquivo criado pela Adobe) é uma tarefa simples: entre no menu Arquivo, depois Exportar, daí clique em Criar Documento PDF/XPS, escolha o nome e local do arquivo e pronto, o arquivo é gerado. XPS é um tipo de arquivo criado pela Microsoft para concorrer com o PDF, sem muita aceitação pelo mercado.

Quando você só precisa exportar uma vez e a planilha está no formato apropriado para exportar, essa solução funciona basta. Porém, se a planilha for um relatório e que precise de novas versões com uma certa periodicidade, é melhor considerar a automatização dessa tarefa. Em um outro cenário, se você precisar gerar um PDF diferente para várias entidades diferentes em um curto período de tempo, um código para automatizar é essencial.

Antes de mais nada, vamos usar o gravador de macros para ver o código gerado pela exportação para PDF:

Sub ExportarPDF()
'
' ExportarPDF Macro
'

'
    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
        "C:\Temp\Teste.pdf", Quality:=xlQualityStandard, _
        IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:= _
        True
End Sub

Em primeiro lugar, vemos que o objeto que está sendo utilizado é o ActiveSheet e o método é o ExportAsFixedFormat. Isto dá a entender que só podemos exportar a partir de um objeto de planilha (Worksheet). Usando o Pesquisador de Objeto (tecla F2 no editor de VBA), vemos que esse método também existe para os objetos pasta de trabalho (Workbook ), intervalo de células (Range) e gráfico (Chart).

Vemos que no código gerado o método ExportAsFixedFormat contém seis parâmetros. Olhando no pesquisador de objeto vemos que há mais alguns que não foram gerados na gravação. Vejamos a função de cada parâmetro:

- Type: Único parâmetro obrigatório, define o formato do arquivo que será gerado. Deve receber um valor da enumeração XlFixedFormatType, cujos valores são os seguintes: xlTypePDF (exporta como PDF) e xlTypeXPS (exporta como XPS);
- Filename: Como o próprio nome entrega, é o nome do arquivo. Você pode colocar o caminho completo onde o arquivo será gravado ou pode colocar apenas o nome do arquivo. Neste caso ele será gravado na pasta padrão, que normalmente é a pasta Documentos;
- Quality: Pode receber dois valores, xlQualityStandard (valor padrão) e xlQualityMinimum. O primeiro especifica qualidade normal, enquanto o segundo reduz a qualidade;
- IncludeDocProperties: Variável booleana. Quando True indica que irá exportar também as propriedades do documento, enquanto False diz para não exportar essas propriedades com o PDF;
- IgnorePrintAreas: Outra variável booleana. Quando True indica para ignorar as áreas de impressão demarcadas no Excel, enquanto False diz para considerar as áreas de impressão;
- OpenAfterPublish: Mais uma variável booleana. Quando True indica para abrir o arquivo gerado, enquanto False não abre o arquivo;
- From: Indica a partir de que página será exportado. Quando não informado considera a partir do início;
- To: Indica a até que página será exportado. Quando não informado considera até o final.

Após conhecer as funcionalidades, fica fácil perceber que mínimo para exportar um PDF é o seguinte código:

Sub ExportarPDF()
    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF
End Sub

Esse código irá exportar a planilha ativa com o mesmo nome do arquivo do Excel, apenas alterando a extensão para .pdf e irá gravar na pasta Documentos. Vamos fazer uma alteração nesse código:

Sub ExportarPDF()
    ActiveWorkbook.ExportAsFixedFormat Type:=xlTypePDF
End Sub

Alterando de ActiveSheet para ActiveWorkbook altera o objeto que está sendo exportado. Neste caso irá exportar todas as planilhas da pasta de trabalho ativa para o arquivo PDF. Se alterar o objeto para Range, apenas o intervalo especificado será exportado. Assim vemos diferentes possibilidades para diferentes necessidades.

Em condições normais, você usará também o parâmetro Filename para especificar o caminho e o nome do arquivo onde será gravado, pois nem sempre você quer obrigar o usuário a ir na pasta Documentos e também pode querer alterar o nome do arquivo para algo mais apropriado ao que está sendo gerado.

Pode aparecer uma situação em que você quer exportar mais de uma planilha, mas não quer exportar toda a pasta de trabalho que está aberta. Com o que vimos até aqui só poderíamos exportar cada planilha em um arquivo separado. Mas há um macete: selecionando as planilhas desejadas:

Sub ExportarPDF()
    Sheets(Array("Fornecedores", "Produtos")).Select
    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
        ActiveWorkbook.Path & "\Fornecedores e produtos.pdf", IgnorePrintAreas:=False
End Sub

Ao fazer isso, você perceberá que ambas as planilhas estarão selecionadas. No seu código você deverá deixar apenas uma selecionada antes de continuar o processamento.

Um caso onde é bem interessante ter uma rotina para exportar para PDF é quando você precisa gerar diversos arquivos personalizados. Uma rotina preenchen a planilha usando uma fonte de dados, que pode ser outra planilha na mesma pasta de trabalho, sendo que a cada preenchimento completado deverá gerar o PDF com um nome específico. Vejamos um procedimento bem simples para exemplificar:

Sub GerarRelatorios()
    Dim UltimaLinha As Long
    Dim Linha As Long
    plDados.Select
    UltimaLinha = plDados.Cells.Find("*", LookIn:=xlFormulas, _
        SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
    plRelatorio.Select
    For Linha = 2 To UltimaLinha
        plRelatorio.Range("Nome").Value = plDados.Cells(Linha, 1).Value
        plRelatorio.Range("Cargo").Value = plDados.Cells(Linha, 2).Value
        plRelatorio.Range("Meta").Value = plDados.Cells(Linha, 3).Value
        plRelatorio.Range("Alcançado").Value = plDados.Cells(Linha, 4).Value
        plRelatorio.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
            ActiveWorkbook.Path & "\Relatórios\" & _
            plRelatorio.Range("Nome").Value & ".pdf", _
            IgnorePrintAreas:=False
    Next
End Sub

Neste exemplo a planilha com os dados é plDados e a planilha que será usada para gerar PDF é plRelatorio. A estrutura de repetição percorre todas as linhas de plDados e preencher quatro campos em plRelatorio: Nome, Cargo, Meta e Alcançado. Em seguida, exporta para PDF usando o campo Nome como nome do arquivo, guardando em uma pasta Relatórios, que está junto à pasta de trabalho. Quando a necessidade é fazer isso com dois ou três casos, dá pra fazer manualmente, mas quando há dezenas ou centenas de casos, é muito melhor fazer um processo automatizado. O código acima pode gerar mil arquivos em poucos minutos, enquanto um processo manual levaria dias para completar.

Perceba que não temos como alterar os atributos de impressão, isso é um processo à parte. É feito utilizando o objeto PageSetup, que é um sub-objeto de Worksheets, e tem dezenas de propriedades e sub-objetos. Os mais importantes são os seguintes:

- Orientation: Propriedade que define a orientação da página, podendo ser xlPortrait (retrato) ou xlLandscape (paisagem);
- PrintArea: Propriedade que define o intervalo que será impresso;
- PaperSize: Propriedade que define o tamanho da folha;
- PrintGridlines: Propriedade booleana que define se as linhas de grades serão impressas ou não;
- PrintHeadings: Propriedade booleana que define se a barra de linhas e colunas da planilha serão impressas ou não;
- PrintTitleRows: Propriedade que define linhas que serão repetidas no topo de cada página;
 - PrintTitleColumns: Propriedade que define colunas que serão repetidas à esquerda de cada página;
- CenterHorizontally e CenterVertically: Propriedades booleanas, especificam se a planilha será centralizada na horizontal e na vertical, respectivamente;
- FitToPagesTall: Define a quantidade de páginas na altura em que os dados impressos serão escalado;
- FitToPagesWide: Define a quantidade de páginas na largura em que os dados impressos serão escalado;
- Zoom: Propriedade que define a escala em percentual em que a planilha será redefinida para a impressão;
- LeftHeader, CenterHeader e RightHeader: Propriedades que definem a seção esquerda, central e direita do cabeçalho da página;
- LeftHeaderPicture, CenterHeaderPicture e RightHeaderPicture: Objetos semelhantes às propriedades acima, mas usando figura. Estes objetos possuem diversas propriedades para definir os atributos da imagem. Quando este objeto for utilizado, a propriedade equivalente acima deverá ser definida com o valor "&G";
- LeftFooter, CenterFooter e RightFooter: Definem a seção esquerda, central e direita do rodapé da página;
- LeftFooterPicture, CenterFooterPicture e RightFooterPicture: Objetos semelhantes às propriedades acima, mas usando figura. Estes objetos possuem diversas propriedades para definir os atributos da imagem. Quando este objeto for utilizado, a propriedade equivalente acima deverá ser definida com o valor "&G";
 - TopMargin, BottomMargin, LeftMargin e RightMargin: Propriedades que definem a margem superior, inferior, esquerda e direita, respectivamente;
- HeaderMargin: Propriedade que define o espaço entre a margem superior e o cabeçalho;
- FooterMargin: Propriedade que define o espaço entre a margem inferior e o rodapé.

Há muitas outras propriedades, mas as principais são essas listadas acima. Não se pode esquecer que as definições de página devem ser feitas antes de gerar o PDF (ou imprimir um documento), portanto no exemplo anterior o código deve ser colocado antes da estrutura de repetição. Se colocar dentro do laço For... Next vai redefinir várias vezes pelos mesmos valores sem necessidade, reduzindo o desempenho do código.

Suponha que você queira exportar o intervalo A1 até D200, mantendo a linha de cabeçalho da tabela no topo de cada página. A definição das propriedades seria assim:

With plRelatorio.PageSetup
    .Orientation = xlPortrait
    .PrintArea = "$A$1:$D$200"
    .PrintTitleRows = "SA$1:$D$1"
    .Zoom = False
    .FitToPagesTall = False
    .FitToPagesWide = 1
End With

Não se pode esquecer que ao usar o método ExportAsFixedFormat a propriedade IgnorePrintArea deve ser definida como False, caso contrário a área definida para impressão será ignorada e o resultado provavelmente será diferente do esperado.

Espero que este artigo lhe ajude a automatizar seus relatórios, análises, boletins e afins, não importando se será gerado apenas um ou centenas de uma vez.


Para dúvidas sobre o artigo, comentários ou sugestões, utilize os comentários abaixo. Até o próximo artigo!

Pedro Martins

Pós-graduando em Business Intelligence e Big Data pela Faculdade Impacta de Tecnologia. Formado em Tecnologia em Eletrônica Digital com Ênfase em Microprocessadores

- - - - - -
#45 - Excel - Parâmetros de inicialização do Excel (linha de comando)

Esta foi a minha primeira aula ao vivo para o Canal onde explico como fazer para utilizar os parâmetros de inicialização do Excel por linha de comando. 
Aprenda a inicializar o Excel em modo de segurança, abri-lo em uma nova instância entre outros parâmetros pouco documentados. 

Boa aula!


Espero que goste do conteúdo.

Se gostou compartilhe com seus colegas de trabalho e amigos!

Acesso as planilhas: 
www.sigaonerd.com

Facebook / Twitter

Inscreva-se em meu canal de vídeos no Youtube clicando aqui 

Microsoft Excel é um produto do pacote Microsoft Office
-------------------------------------------------------
1)  Tenha acesso a mais de 420 vídeos tutoriais em meu canal de vídeos no Youtube. Clique aqui e conheça o site que criei com o catálogo das aulas dos cursos completos que gravei!

2) Clique aqui para ter acesso ao download de centenas de planilhas e apostilas que criei (tudo gratuito)


Bons estudos!

- - - -
Essa é a pergunta que eu mais recebo nos meus canais de comunicação: Youtube, Twitter, LinkedIn, email, WhatsApp, comentários dos vídeos, sinais de fumaça e no blog. 
Por dia recebo entre 50 e 80 mensagens diferentes com elogios, críticas e muitos, mas muitos pedidos de ajuda!
Por ser um projeto que comecei como um hobby, hoje posso dizer que os números atingidos estão muito além dos que um dia esperei alcançar. 
Meu canal de vídeos no Youtube e o blog SigaONerd.com não são minha principal fonte de renda. Considero ambos como um hobby mas que em breve precisa ser profissionalizado. Tenho muitas demandas ainda para produção de conteúdo. Vou começar com a produção de um site próprio para distribuição dos conteúdos com certificado.
O blog possui mais de 410 posts e um volume de 3000 visualizações por dia. No Youtube já tenho mais de 430 vídeos publicados, 54.000 inscritos no canal, mais de 4 milhões de visualizações e respondi até o momento mais de 16.000 comentários nos vídeos. São números consideráveis para uma atividade que começou há 4 anos atrás como um hobby.
Trabalho como analista de sistema e infelizmente não tenho tempo para ministrar treinamentos particulares (apesar de estar organizando duas turmas presenciais, uma de banco de dados oracle + VBA e outra de VBA Avançado). Arrumo um tempo para que, em alguns finais de semana eu possa ministrar treinamentos para turmas em empresas e que tenham no mínimo 8 alunos (isso para facilitar a propagação do conhecimento e para compensar à empresa a contratação deste profissional!).
Considero minhas aulas e o blog como ferramentas de ajuda e tira dúvidas. Não presto consultorias ou suporte técnico particulares devido a total falta de tempo. 
Normalmente demoro de um dia a algumas semanas para responder as perguntas enviadas (como disse são entre 50 e 80 por dia e com graus de complexidade que vão de um simples sinal de igual em uma fórmula até soluções complexas como sistemas!). Isso também me toma um tempo considerável.
Então eu posso te dizer que Eu Posso te ajudar com mais de 150 horas em vídeos e outros 400 posts, 5 apostilas completas e mais de duas centenas de planilhas para download que podem ser baixadas para esclarecer boa parte das dúvidas de aplicações como o: Excel, VBA, Word, Powerpoint, Windows, Planilhas Google, Google Drive, Outlook, Backups, Imposto de Renda, Google Chrome, Internet Explorer, Gmail entre outras dezenas de aulas diversas. 
Ah! E quase ia me esquecendo... Valorize os produtores de conteúdo. Quando você baixa as aulas, compartilha apostilas baixadas de forma irregular, você está tirando do produtor de conteúdo sua relevância. Ajude na divulgação dos trabalhos compartilhando os links e sites em que a informação é publicada! Com uma maior relevância ficamos mais motivados para continuar a produzir conteúdo de qualidade para você!
E para ajudar, segue abaixo diversos links dos trabalhos que realizo.
Desejo a você que me acompanha bons estudos e muito sucesso profissional!
Relação completa das aulas dos cursos completos do Youtubeclique aqui
PlayLists Youtube
Excel Básico (curso completo com 30 aulas): 
Funções Excel ( mais de 45 vídeos níveis intermediário e avançado) : 
Desafios Excel (participação de amigos em gravações)
Meu Blog - SigaONerd e Download de material (centenas de planilhas e apostilas que desenvolvi)
-