br
Português    
Ing
English and Others      

b IMPRESSOR DE XLS PORTÁVEL
para Microsoft Excel

Novo   Download   Home  Anúncios

Este utilitário possibilita gerar um arquivo XLS (ou XLSX) a partir de uma planilha de outro XL aberto no Microsoft Excel® resumindo apenas os dados imprimíveis na área de impressão definida. O XLS gerado e o seu original são iguais quando são impressos e quando são exibidos na tela, mas o XLS gerado é mais portável, pois só tem os dados necessários para produzir a mesma impressão. E, como qualquer outro arquivo, pode ser enviado por email, WhatsApp ou transferido usando pendrive ou conexão de rede. Ele também fica fácil de compartilhar, pois é possível exibi-lo em qualquer computador ou em ambiente de computação na nuvem que tenha um visualizador de planilha atual instalado, mesmo se não tiver a versão do Excel usada e necessária para criar o XL original com toda a sua possível complexidade de formulas, filtros, links, macros etc. Esta solução também evita o envio desnecessário de dados com direitos autorais e de dados ocultos ou filtrados no XL original que requerem privacidade como um todo.

A impressão aqui para um XLS Portável do Excel é similar à impressão para um PDF da Adobe, mas com algumas vantagens:

- Programas capazes de visualizar arquivos XLS básicos são amplamente mais instalados do que visualizadores de PDF;

- É mais fiel ao original, pois ainda é uma planilha;

- Por ser planilha possibilita maiores facilidades e recursos de edição se eventuais alterações ou complementos forem necessários tais como formatação, inclusão de textos e fórmulas antes de ser encaminhada para um destinatário que, por sua vez, pode fazer alterações e retornar com dados de resposta que podem ser captados para o XL original. Tudo isso feito por interface de usuário ou por código VBA. Veja as figuras abaixo.

Ele consiste basicamente de um único arquivo (PortblXLSPrinter.dll, PortblXLSPrinter.exe ou PortblXLSPrinter.xla) que pode ser instalado automaticamente usando um dos pacotes de arquivo de instalação disponíveis abaixo para download. Exceto para a DLL, se optar por Suplemento de COM, nenhuma outra configuração é salva no Registro do Windows. Sua configuração é salva nos arquivos PortblXLSPrinter.ini, PortblXLSPrinter LoadExe.xla, SendKeys.exe e PortblXLSPrinter.xlam que são criados e mantidos pelo próprio utilitário. Você também pode desinstalá-lo total e automaticamente, não deixando nenhuma sujeira no Registro do seu Windows ou disco.

Itens a seguir nesta página:

Características

Download

Opções de Suplementos para Instalar

Figuras

Função fPortblXLSPrinter() em VBA

Função fGetVersion() em VBA

Um Exemplo Avançado em VBA

Características:

- O utilitário faz uma cópia especial de uma planilha captando só os dados necessários para produzir uma impressão ou visualização na tela idêntica à planilha original;

- Ao captar somente dados imprimíveis, o tamanho do arquivo é reduzido e evita enviar dados confidenciais, fórmulas, links e segredos autorais. As opções de configuração da planilha especial serão as mesmas da planilha original: tamanho do papel, orientação, cabeçalho, rodapé, margens etc. Esses são os diferenciais e as grandes vantagens deste utilitário em relação às soluções diretas oferecidas pelo Excel para o envio de planilha ou de área de impressão por e-mail. Para mais informações sobre essas soluções, veja o excelente estudo feito por Ron de Bruin em: http://www.rondebruin.nl/sendmail.htm;

- A planilha criada pode opcionalmente ser protegida contra alterações por uma senha padrão criada aleatoriamente a cada execução ou por uma senha informada por você;

- O utilitário salva a pasta de trabalho da planilha criada como um arquivo XLS ou XLSX, aqui denominado apenas de XLS Portável, independentemente de qual seja a extensão;

- Suporta abrir um XLS Portável salvo anteriormente e adicionar novas planilhas. Assim, um único XLS Portável pode conter a impressão de todas as planilhas de uma ou mais pastas de trabalho;

- Em uma única execução, é possível imprimir qualquer das planilhas em qualquer das pastas de trabalho já abertas no Excel, incluindo planilhas de macro, para um ou mais arquivos XLS Portáveis;

- Ao salvar um XLS Portável do Excel, pode imediatamente comprimi-lo para um arquivo zip, reduzindo ainda mais o tamanho do arquivo a portar;

- Ao salvar um XLS Portável do Excel, pode imediatamente anexar o mesmo ou sua versão zipada a uma mensagem de e-mail que você pode verificar e então enviar pelo Microsoft Outlook® ou outro recipiente de e-mail padrão no Windows. Ele pode compor o e-mail com dados padrão ou capturar endereço, assunto e mensagem de texto na célula ativa e suas adjacentes, procurando para baixo ou para direita. Estas células, normalmente, devem ficar fora da área de impressão definida que vai como anexo;

- Ao salvar um XLS Portável, pode imediatamente salvá-lo como pagina da Web (htm, html). Assim, seu XL original com toda a possível complexidade de formulas, filtros, links, macros etc. possibilitado pelo Excel pode ser exibido na Web tal como impresso ou como visualizado na tela de seu computador enviando apenas os dados necessários e suficientes para tal, economizando banda e evitando o envio desnecessário para área pública de dados com direitos autorais e de dados ocultos ou filtrados no XL original que requerem privacidade como um todo;

- O arquivo portável, em vez de XLS ou XLSX, pode ser salvo como documento do Word no formato doc ou docx ou ainda, via Excel, como PDF, txt, csv e todos outros formatos suportados pelo Excel;

- Um XLS Portável é útil sempre que o necessário para uma impressão idêntica seja menor do que todo o conteúdo da planilha e particularmente quando enviando planilhas contendo autofiltro que filtre apenas algumas dezenas de linhas entre milhares ou quando há informação no original que seja confidencial em partes ou quando vista no todo;

- Em envio de arquivo para impressão direta, um XLS Portável tem a grande vantagem no tamanho em bytes em relação a um arquivo do tipo gráfico (ex. TIF) ou a um arquivo do tipo binário de impressão (ex. PRN). E ainda o destinatário pode usar o Excel para visualizar a planilha ou editá-la, se não protegida, e para imprimir em diferentes tipos de impressora;

- Depois de instalado, o utilitário é chamado a partir do Menu Arquivo do Excel > Comando Impressor de XLS Portável... ou, no Excel 2007, a partir do Botão do Office > Botão Split Impressor Portável > Comando Impressor de XLS Portável ou, no Excel 2010 ou mais recente, a partir do Menu Arquivo > Guia Impr. de Arquivo > Comando Impressor de XLS Portável.

- Pode ser chamado diretamente a partir de qualquer código VBA através das funções fPortblXLSPrinter() e fGetVersion(). Veja, logo abaixo das figuras, uma descrição detalhada destas funções e exemplos de aplicativos em VBA que a usam;

- Ocupa menos de 600 Kb quando instalada.

Download:

Testado no Excel para Windows, versões 2000, 2002(XP), 2003, 2007, 2010 (32 e 64-bit), 2013 (32 e 64-bit), 2016 (32 e 64-bit) e 2019 (32 e 64-bit) em instalações MSI-based e Click-To-Run do Office 365™ de serviços baseados na nuvem.

Download

Baixe a versão portuguesa agora

Você pode baixar também deste site-espelho

Última atualização: 23/07/2022 - 1687,6kb

Grátis baseado neste Contrato de Licença

Obs.: O link acima baixa o pacote instalador e desinstalador programado em VBA em um XLS devidamente convertido para EXE pelo XLtoEXE para tornar a instalação mais fácil para leigos em macros e Windows, no entanto, se você é experiente e por alguma razão preferir um pacote instalador e desinstalador em formato ZIP aberto, clique aqui. Com este pacote zip você pode instalar de três maneiras: (1) Simplesmente acionar o Install.exe que carrega o mesmo XLS no Excel sem alerta de macro; (2) Extrair o pacote inteiro para uma pasta e acionar o XLS, habilitando as macros no Excel e usando 123 como senha, ou (3) Instalar a DLL manualmente.

Opções de Suplementos para Instalar:

Este utilitário pode estar disponível para ser instalado em três opções de suplemento: Suplemento de EXE, Suplemento de COM ou Suplemento do Excel. Suplemento de COM e Suplemento do Excel rodam no Windows no mesmo processo ou espaço de memória do Excel e são tecnologias bem detalhadas na documentação do Excel e em bons livros sobre VBA, enquanto Suplemento de EXE é uma denominação especial aqui para um misto daquelas duas tecnologias onde o mesmo código VBA é rodado em um processo EXE separado e um pequeno Suplemento do Excel faz a conexão entre os dois processos. Apesar das diferenças nas tecnologias, este utilitário é totalmente funcional em qualquer uma delas. Assim, o que pode decidir na sua escolha para instalar são as características abaixo comparadas:

Características / Opções de Suplem.

 Suplemento
de EXE

 Suplemento
de COM

 Suplemento
do Excel

- Disponibilidade neste pacote:

Sim

Sim

Não¹

- Requer elevação de direitos no Windows:

Não

Sim Não

- Suportabilidade do Excel 64-bit:

Sim

Não Sim

- Desempenho na carga:

Ótimo

Ótimo Ruim

- Desempenho nas funcionalidades:

Bom/ótimo

Ótimo Ótimo

- Interferência no desempenho do Excel:

Muito pouco

Pouco Médio

- Risco de crash do Excel:

Muito baixo

Baixo Médio

- Extensão de arquivo principal:

xla/exe

dll xla

¹Indisponível temporariamente.

Figuras:

Figura

Função fPortblXLSPrinter():

O Impressor de XLS Portável pode ser chamado diretamente a partir de qualquer código VBA através da função fPortblXLSPrinter() que tem estes 11 argumentos opcionais:

1 - ToPrintWorkbookName¹ as String (Opcional. Padrão nome da Pasta ativa). O nome de uma Pasta de Trabalho já aberta no Excel.

2 - ToPrintSheetName as String (Opcional. Padrão nome da planilha ativa). O nome de uma planilha na Pasta ToPrintWorkbookName a imprimir para o arquivo XLS Portável.

3 - ToPrintSheetPasswrd as String (Opcional. Padrão=""). Senha de planilha se a planilha ToPrintSheetName for protegida.

4 - PortblSavePath as String (Opcional. Padrão o mesmo caminho de ToPrintWorkbookName). O caminho no disco onde o arquivo XLS Portável está ou será salvo.

5 - PortblSaveName as String (Opcional. Padrão um nome automático baseado no nome de ToPrintWorkbookName). O nome para o arquivo XLS Portável.

6 - PortblSheetPasswrd as String (Opcional. Padrão “”, sem senha). A senha se a planilha no XLS Portável necessitar ser protegida contra alterações. Em especial, se for passado “RandomPassword” como senha, isto será interpretado como flag para proteger com uma senha aleatória gerada pelo código que não será do conhecimento de ninguém, nem mesmo da pessoa que imprimiu.

7 - ZipPortbl As Boolean (Opcional. Padrão=Falso). Se Verdadeiro, o arquivo XLS Portável criado ou atualizado será imediatamente comprimido para um arquivo zip.

8 - AfterDoneEmail¹ as String (Opcional. Padrão "0"). Um comando definindo a ação a ser realizada depois que o arquivo XLS Portável estiver pronto e salvo. Deve ser uma destas quatro opções:

     "0" - Para emitir alerta de sucesso.

     "1" - Para não emitir alerta de sucesso (Fazer e salvar em silêncio).

     "Um endereço de e-mail" - Para enviar o arquivo XLS Portável anexado a um e-mail para o endereço informado (Pode ser mais de um endereço separados por ";").

     "SaveAs" - Para exibir a caixa de diálogo Salvar Como padrão do Excel possibilitando salvar o arquivo XLS Portável em outros formatos suportados pelo Excel como html, txt, pdf etc.

      Obs.: Para salvar o arquivo portável como documento do Word em vez de XLS ou XLSX, basta informar o nome do arquivo com a extensão .doc ou .docx através do argumento 5, o PortblSaveName.

9 - EmailSubj as String (Opcional). O assunto do e-mail a enviar tendo o arquivo XLS Portável como anexo.

10 - EmailMsg as String (Opcional). A mensagem do e-mail a enviar tendo o arquivo XLS Portável como anexo.

11 - SndKeys as String (Opcional). Possibilita o envio de teclas para a janela de mensagem do e-mail como última ação. Por exemplo:

     "{PAUSE 1}{VK_162}{VK 83}{VK 162}{PAUSE 2}{ESC}" - Faz uma pausa, envia as teclas CTRL+S, faz outra pausa e finalmente envia ESC para a janela de mensagem do Outlook para salvar, fechar e enviar a mensagem como está para a Caixa de Entrada ou de Rascunho;

     "{PAUSE 1}{VK_162}{VK 13}{VK 162}" - Faz uma pausa e envia as teclas Ctrl+Enter para a janela de mensagem do Outlook para salvar, fechar e enviar a mensagem como está para a Caixa de Saída. Obs.: Nestes exemplos, as teclas de controle ALT e CTRL são as do lado esquerdo do teclado, pois as do lado direito podem estar customizadas para outras funções, por exemplo, em máquinas virtuais. Para entender a sintaxe dos códigos de envio de teclas, ver aqui e aqui.

     Caso tenha Microsoft Outlook instalado, em vez de código de teclas, você pode usar as flags SendByCode ou SaveByCode para enviar o e-mail silenciosamente via código para a Caixa de Saída do Outlook ou salvar na Caixa de Rascunho, mas por razões de segurança o Outlook pode eventualmente pedir autorização temporária para o acesso à sua lista de contatos.

¹Se forem informados apenas o argumento ToPrintWorkbookName e o argumento AfterDoneEmail passando e-mail, o arquivo informado em ToPrintWorkbookName será enviado imediatamente tal como está. Isto possibilita que alterações possam ser feitas em um XLS portável já feito antes de enviá-lo como anexo para o e-mail informado. Ou seja, fPortblXLSPrinter() pode ser chamada duas vezes em um processo de três etapas. Na primeira etapa, é chamada para imprimir para um complexo XL em um XLS portável. Na segunda etapa, são feitas alterações no XLS portável gerado tais como formatação, inclusão de textos e fórmulas, pois ele continua sendo uma planilha, uma grande vantagem em relação a imprimir para PDF. E finalmente, na terceira etapa, é chamada novamente para enviá-lo por e-mail com as alterações feitas.

A função fPortblXLSPrinter() pode dar os seguintes retornos:

fRet = -1 (Cancelado pelo usuário);
fRet = 0 (Executado com sucesso);
fRet = 1 (Falha: Ao tentar desproteger a planilha com a senha informada em versões do Excel anteriores à versão 2007);
fRet = 2 (Falha: Ao tentar desproteger a planilha com a senha informada em qualquer versão do Excel);
fRet = 3 (Falha: Ao tentar enviar e-mail);
fRet = 101 (Falha: Pasta de trabalho informada pelo argumento ToPrintWorkbookName ou nenhuma pasta de trabalho ativa encontrada contendo a planilha para imprimir);
fRet = 102 (Falha: Planilha informada pelo argumento ToPrintSheetName ou nenhuma planilha ativa encontrada para imprimir);
fRet = 103 (Falha: Não foi informado a senha pelo argumento ToPrintSheetPasswrd e a planilha para imprimir está protegida);
fRet = 104 (Falha: Pasta no disco informada pelo argumento PortblSavePath não encontrada);
fRet = 105 (Falha: O nome de arquivo informado pelo argumento PortblSaveName não é válido, talvez a extensão);
fRet = 106 (Falha: Opção informada pelo argumento AfterDoneEmail inválida, talvez endereço de email informado inválido);
fRet = 107 (Falha no código VBA sem definição, mas com alerta).

Exemplos se instalar como Suplemento de COM:

1 - O código abaixo chama a função fPortblXLSPrinter() para imprimir a planilha ativa para o arquivo SeuPortavel.xlsx na Área de Trabalho do Windows e o zip.

Sub SeuSub()
    Dim ObjToVBA As Object, lRet As Long
    Set ObjToVBA = Application.COMAddIns("AddInPortblXLSPrinter.ExcelDesigner").Object
    lRet = ObjToVBA.fPortblXLSPrinter(, , , "%Desktop%", "SeuPortavel.xlsx", , True)
    If lRet <> 0 Then MsgBox "Error Nº: " & lRet, vbCritical, "Falha!"
End Sub

2 - O código abaixo chama a função fPortblXLSPrinter() tal como o utilitário é chamado a partir do comando de menu.

Sub SeuSub2()
    Dim ObjToVBA As Object, lRet As Long
    Set ObjToVBA = Application.COMAddIns("AddInPortblXLSPrinter.ExcelDesigner").Object
    lRet = ObjToVBA.fPortblXLSPrinter
    If lRet <> 0 Then MsgBox "Error Nº: " & lRet, vbCritical, "Falha!"
End Sub

3 - O código abaixo chama a função fPortblXLSPrinter() para imprimir a planilha ativa para o arquivo SeuPortavel.doc na Área de Trabalho do Windows.

Sub YourSub3()
    Dim ObjToVBA As Object, lRet As Long
    Set ObjToVBA = Application.COMAddIns("AddInPortblXLSPrinter.ExcelDesigner").Object
    lRet = ObjToVBA.fPortblXLSPrinter(, , , "%Desktop%", "SeuPortavel.doc")
    If lRet <> 0 Then MsgBox "Error Nº: " & lRet, vbCritical, "Falha!"
End Sub

Exemplos se instalar como Suplemento de EXE:   (Obs.: Suplemento de COM também suporta esta abordagem)

O suplemento EXE disponibiliza objeto para o VBA por meio de um objeto Office CommandBars. Uma string composta com o nome da função e argumentos por posição separados por vírgulas é passado através da propriedade Parameter do botão de comando do utilitário criado no menu do Excel neste formato:

sCmd = "fPortblXLSPrinter(" & ToPrintWorkbookName & "," & ToPrintSheetName & "," & ToPrintSheetPasswrd & "," _
     & PortblSavePath & "," & PortblSaveName & "," & PortblSheetPasswrd & "," & ZipPortbl & "," & AfterDoneEmail & "," _
     & EmailSubj & "," & EmailMsg & "," & SndKeys
ObjToVBA.Parameter = sCmd

Observações:
1 - Como a vírgula é usada como separador de argumentos, os argumentos não suportam vírgula neles, mas a vírgula pode ser codificada com {Chr(44)}. Use sArg = Replace(sArg, ",", "{Chr(44)}") antes ou diretamente na fórmula;
2 - Como a propriedade Parameter suporta no máximo 255 caracteres, duas outras funções, fGetBuff() e fSetBuff(), foram implementadas para gerar um buffer temporário e assim passar a mesma string por ele sem limite de caracteres;
3 - A função é executada de forma síncrona, mas também ela suporta ser executada de forma assíncrona que é útil em execuções demoradas devido a muitos dados na planilha a imprimir ou a uma longa exibição de janela de e-mail, provocando a mensagem: "O Microsoft Excel está aguardando para concluir uma ação OLE". Para execução assíncrona, ver a constante bAsynchrn no exemplo avançado abaixo que também exemplifica o uso do código {Chr(44)} para a vírgula e das funções fGetBuff() e fSetBuff().

Veja os códigos dos mesmos três exemplos acima:

1 - O código abaixo chama a função fPortblXLSPrinter() para imprimir a planilha ativa para o arquivo SeuPortavel.xlsx na Área de Trabalho do Windows e o zip.

Sub SeuSub()
     Dim ObjToVBA As CommandBarButton, sCmd As String, sRet As String
     Set ObjToVBA = Application.CommandBars.FindControl(Tag:="Orlando's " & "PortblXLSPrinter")
     sCmd = "fPortblXLSPrinter(,,," & "%Desktop%" & "," & "SeuPortavel.xlsx" & ",," & True
     ObjToVBA.Parameter = sCmd: ObjToVBA.Execute
     sRet = ObjToVBA.Parameter: ObjToVBA.Parameter = ""
     If sRet <> "0" Then MsgBox "Error Nº: " & sRet, vbCritical, "Falha!"
End Sub

2 - O código abaixo chama a função fPortblXLSPrinter() tal como o utilitário é chamado a partir do comando de menu.

Sub SeuSub2()
     Dim ObjToVBA As CommandBarButton, sCmd As String, sRet As String
     Set ObjToVBA = Application.CommandBars.FindControl(Tag:="Orlando's " & "PortblXLSPrinter")
     sCmd = "fPortblXLSPrinter("
     ObjToVBA.Parameter = sCmd: ObjToVBA.Execute
     sRet = ObjToVBA.Parameter: ObjToVBA.Parameter = ""
     If sRet <> "0" Then MsgBox "Error Nº: " & sRet, vbCritical, "Falha!"
End Sub

3 - O código abaixo chama a função fPortblXLSPrinter() para imprimir a planilha ativa para o arquivo SeuPortavel.doc na Área de Trabalho do Windows.

Sub YourSub3()
     Dim ObjToVBA As CommandBarButton, sCmd As String, sRet As String
     Set ObjToVBA = Application.CommandBars.FindControl(Tag:="Orlando's " & "PortblXLSPrinter")
     sCmd = "fPortblXLSPrinter(,,," & "%Desktop%" & "," & "SeuPortavel.doc"
     ObjToVBA.Parameter = sCmd: ObjToVBA.Execute
     sRet = ObjToVBA.Parameter: ObjToVBA.Parameter = ""
     If sRet <> "0" Then MsgBox "Error Nº: " & sRet, vbCritical, "Falha!"
End Sub

Função fGetVersion() em VBA:

Esta função possibilita obter o número da versão instalada a partir de qualquer código VBA, retornando um número no formato 0.0.0.

O exemplos abaixo chamam a função fGetVersion() para verificar se a versão instalada está atualizada.

Exemplo se instalar como Suplemento de COM:

Sub SeuSub()
    Dim ObjToVBA As Object, sRet As String, vCallVerOld As Variant
    On Error Resume Next
    Set ObjToVBA = Application.COMAddIns("AddInPortblXLSPrinter.ExcelDesigner").Object
    sRet = ObjToVBA.fGetVersion
    If Err.Number <> 0 Then
        MsgBox "O 'Impressor de XLS Portável para Excel' como suplemento não encontrado!"
    Else
        vCallVerOld = Split(sRet, ".")
        vCallVerOld = vCallVerOld(0) * 10 ^ 6 + vCallVerOld(1) * 10 ^ 3 + vCallVerOld(2)
        If vCallVerOld < 2000001 Then MsgBox "O 'Impressor de XLS Portável para Excel' encontrado é antigo!"
        If vCallVerOld >= 2000001 Then MsgBox "O 'Impressor de XLS Portável para Excel' encontrado é adequado para este código!"
    End If
End Sub

Exemplo se instalar como Suplemento de EXE:  (Obs.: Suplemento de COM também suporta esta abordagem)

Sub SeuSub()
     Dim ObjToVBA As CommandBarButton, sCmd As String, sRet As String, vCallVerOld As Variant
     On Error Resume Next
     Set ObjToVBA = Application.CommandBars.FindControl(Tag:="Orlando's " & "PortblXLSPrinter")
     sCmd = "fGetVersion"
     ObjToVBA.Parameter = sCmd: ObjToVBA.Execute
     sRet = ObjToVBA.Parameter: ObjToVBA.Parameter = ""
     If Err.Number <> 0 Then
          MsgBox "O 'Impressor de XLS Portável para Excel' não encontrado!"
     Else
          vCallVerOld = Split(sRet, ".")
          vCallVerOld = vCallVerOld(0) * 10 ^ 6 + vCallVerOld(1) * 10 ^ 3 + vCallVerOld(2)
          If vCallVerOld < 2000001 Then MsgBox "O 'Impressor de XLS Portável para Excel' encontrado é antigo!"
          If vCallVerOld >= 2000001 Then MsgBox "O 'Impressor de XLS Portável para Excel' encontrado é adequado para este código!"
     End If
End Sub

Um Exemplo Avançado em VBA:

O código abaixo que suporta qualquer tipo de suplemento instalado é um extrato de um projeto em uso desenvolvido profissionalmente em VBA para um supermercado que tem uma planilha com sua lista geral de dezenas de milhares de produtos que compra e vende, ou seja, seu portfólio. A partir desta lista, calcula os pedidos necessários e gera planilhas de cotação de preços personalizadas para cada fornecedor pré-cadastrado para concorrências e envia por e-mail de forma automática. Em seguida, importa as cotações retornadas dos fornecedores e monta uma concorrência eletrônica para automaticamente indicar o fornecedor ganhador de cada produto. Encerrada a concorrência, emite e envia o e-mail de pedido para cada fornecedor com os produtos que ganhou.

Na prática, o projeto VBA envolve processos onde são aplicados filtros na planilha geral que é então impressa para um arquivo XLS portável e não para PDF para serem enviadas por e-mail para os fornecedores que continuam o trabalho em planilha para retornar e serem devidamente importadas de volta para lista geral. Os filtros geram visualizações e, portanto planilhas portáveis extremamente personalizadas. Assim, da mesma lista geral em uma mesma concorrência, um fornecedor conforme seu portfólio pode receber uma planilha com um único produto e outro com milhares mesmo na etapa de cotação.

Este projeto mostra a importância da impressão para um arquivo XLS portável e não para um PDF. Nele o ‘Impressor de XLS Portável para Excel’ é normalmente chamado em duas de três etapas. Na primeira, a impressão do que visualizado após filtros aplicados é feita para um arquivo XLS ou XLSX tal como seria feito para um PDF, na segunda etapa, o projeto reabre o XLS portável salvo e insere cabeçalho conforme o fornecedor e formulas de total e subtotal e salva, e, na terceira etapa, ele chama o ‘Impressor de XLS Portável para Excel’ novamente apenas para enviar o XLS para o e-mail do fornecedor tal como foi editado e salvo, ou seja, só envia o e-mail sem imprimir para outro XLS portável, pois eliminaria as fórmulas inseridas. Assim, o fornecedor terá toda comodidade de trabalhar em uma planilha eletrônica com fórmulas e somas automáticas e não em um PDF morto. Além disso, talvez o mais importante, os dados retornados pelas centenas de fornecedores serão importados de planilhas de forma automática e precisa o que não seria prático de ser feito de PDFs, DOCs ou TXTs.

Como neste projeto o ‘Impressor de XLS Portável para Excel’ é chamado repetidamente, o melhor foi desenvolver uma função fPortblXLSPrinter() similar onde o objeto disponibilizado para o projeto VBA é criado e criticado uma única vez ao longo de todos os processos. Nele, a crítica de versão atualizada e a necessidade ou não de codificar virgulas e usar as funções fGetBuff() e fSetBuff() já estão embutidas. Assim, se pode usar virgula em qualquer argumento que podem ser de qualquer tamanho. E ainda independe do tipo de suplemento instalado:

Option Explicit
Sub AdvancTest()
    Dim lRet As Long
    Dim PortblSavePath As String, PortblSaveName As String, AfterDoneEmail As String, EmailSubj As String, EmailMsg As String, SndKeys As String
    PortblSavePath = ThisWorkbook.Path
    PortblSaveName = ThisWorkbook.Name & "Portble.xls"
    If Dir(PortblSavePath & "\" & PortblSaveName) <> "" Then Kill PortblSavePath & "\" & PortblSaveName

    '1st Step: Silently save the portable XLS from the active sheet.
    AfterDoneEmail = 1
    lRet = fPortblXLSPrinter(, , , PortblSavePath, PortblSaveName, , , AfterDoneEmail)   'Save the Portable XLS silently.
    If lRet <> 0 Then MsgBox "Error Nº: " & lRet, vbCritical, "Fail!": Stop

    '2nd Step: Open the portable XLS saved above, make changes such as changing cell text, inserting formulas and then saving.
    If Dir(PortblSavePath & "\" & PortblSaveName) <> "" Then    'Open to edit the title and enter sum and subtotal formulas..
        Dim PortblWb As Workbook, iMax As Long
        Set PortblWb = Workbooks.Open(PortblSavePath & "\" & PortblSaveName)
        Range("A2").Value = "CUSTOM TITLE"
        iMax = Cells(4, 1).CurrentRegion.Rows.Count: iMax = 10
        With Range("H4")
            .Offset(1).FormulaR1C1 = "=IF(RC[-4]="""","""",RC[-4]*RC[-3])"
            If iMax > 1 + 1 Then .Offset(1).Resize(1, 1).AutoFill Destination:=Range("H4").Offset(1).Resize(iMax - 1, 1), Type:=xlFillValues
            .Offset(iMax + 1, 0).FormulaR1C1 = "=SUBTOTAL(109,R[-" & iMax & "]C:R[-2]C)"
        End With
        PortblWb.Save
    End If

    '3rd Step: Send by email the portable modified above as it was saved. In other words, it doesn't generate a new portable one, it just sends it by email, keeping the formulas.
    AfterDoneEmail = "bigwholesale@server.com"
    EmailSubj = "COMPETITION 2022-06-10 - Price Quote - Supplier 7112-Big Wholesale"
    EmailMsg = "Dear supplier 7112-Big Wholesale," & vbCrLf & vbCrLf _
             & "Attached is our worksheet for price quotation for the competition named ' COMPETITION 2022-06-10 '." & vbCrLf & vbCrLf _
             & "Closing of offers: 06/19/22 at 11:30," & vbCrLf & vbCrLf _
             & "Best regards," & vbCrLf & vbCrLf _
             & "=================" & vbCrLf _
             & "Amplo Supermarkets"
    SndKeys = "{PAUSE 1}{VK_162}{VK 13}{VK 162}"   'Ctrl+Enter
    lRet = fPortblXLSPrinter(PortblWb.Name, , , , , , , AfterDoneEmail, EmailSubj, EmailMsg, SndKeys)
    If lRet <> 0 Then MsgBox "Error Nº: " & lRet, vbCritical, "Fail!": Stop
    PortblWb.Close False
    Set PortblWb = Nothing
    MsgBox "The portable XLS of active sheet was generated, reopened, changed, saved and finally emailed successfully!"
End Sub

Function fPortblXLSPrinter(Optional ToPrintWorkbookName As String, Optional ToPrintSheetName As String, Optional ToPrintSheetPasswrd As String, _
                           Optional PortblSavePath As String, Optional PortblSaveName As String, Optional PortblSheetPasswrd As String, _
                           Optional ZipPortbl As Boolean, Optional AfterDoneEmail As String, Optional EmailSubj As String, Optional EmailMsg As String, Optional SndKeys As String) As Long
    Static ObjToVBA As CommandBarButton
    Dim vCallVerOld As Variant, sCmd As String, sParmIni As String: Const bAsynchrn As Boolean = True
    DoEvents    'Necessary in Excel SDI, 15 and earlier, to avoid an open Wb instability.

    If ObjToVBA Is Nothing Then    'If the object is not yet created, create it and check the version, calling the PORTABLE XLS PRINTER here.
        On Error Resume Next        'Look for any add-in type where ObjToVBA will be a CommandBarButton object.
        Set ObjToVBA = Application.CommandBars.FindControl(Tag:="Orlando's " & "PortblXLSPrinter")
        If Not ObjToVBA Is Nothing Then
            sCmd = "fGetVersion"
            ObjToVBA.Parameter = sCmd: ObjToVBA.Execute
            vCallVerOld = ObjToVBA.Parameter: ObjToVBA.Parameter = ""    'Get and clean.
            If vCallVerOld = sParmIni Or vCallVerOld = "" Then Set ObjToVBA = Nothing: Err.Raise vbObjectError + 1
        Else
            Err.Raise vbObjectError + 1
        End If

        'Criticize the object creation and its version.
        If Err.Number <> 0 Then
            If MsgBox("'Portable XLS Printer for Excel' not found! This command requires its installation. You can download it for free for personal use from its homepage. OK?", vbOKCancel + vbQuestion, "Object not found! Portable XLS Printer for Excel") = vbOK Then ThisWorkbook.FollowHyperlink "http://cpap.com.br/orlando/PortblXLSPrinterMore.asp?IdC=Help"
            Set ObjToVBA = Nothing: fPortblXLSPrinter = -1: Exit Function
        Else
            vCallVerOld = Split(vCallVerOld, ".")
            vCallVerOld = vCallVerOld(0) * 10 ^ 6 + vCallVerOld(1) * 10 ^ 3 + vCallVerOld(2)
            If vCallVerOld < 2000001 Then
                If MsgBox("Found 'Portable XLS Printer for Excel' is old! A newer version is required for this command. You can download it for free for personal use from its homepage. OK?", vbOKCancel + vbQuestion, "Object not found! Portable XLS Printer for Excel") = vbOK Then ThisWorkbook.FollowHyperlink "http://cpap.com.br/orlando/PortblXLSPrinterMore.asp?IdC=Help"
                Set ObjToVBA = Nothing: fPortblXLSPrinter = -2: Exit Function
            End If
        End If
        On Error GoTo 0
    End If
    If ToPrintWorkbookName = "VrfObjOnly" Then Exit Function

    'Object created and criticized now calls fPortblXLSPrinter() function passing its arguments.
    sCmd = "fPortblXLSPrinter(" & ToPrintWorkbookName & Chr(0) & ToPrintSheetName & Chr(0) & ToPrintSheetPasswrd & Chr(0) & _
            PortblSavePath & Chr(0) & PortblSaveName & Chr(0) & PortblSheetPasswrd & Chr(0) & _
            CLng(ZipPortbl) & Chr(0) & AfterDoneEmail & Chr(0) & EmailSubj & Chr(0) & EmailMsg & Chr(0) & SndKeys
    sCmd = Replace(sCmd, ",", "{Chr(44)}"): sCmd = Replace(sCmd, Chr(0), ",")    'With this trick with Chr(0) and Chr(44) all arguments suports comma(,) that is used as separator arguments by fPortblXLSPrinter().
    If Len(sCmd) <= 255 Then
        ObjToVBA.Parameter = sCmd
    Else
        Dim sBuff As String
        ObjToVBA.Parameter = "fGetBuff": ObjToVBA.Execute: sBuff = ObjToVBA.Parameter
        Open sBuff For Random As #FreeFile Len = Len(sCmd) + 2: Put #(FreeFile - 1), , sCmd: Close #(FreeFile - 1)
        ObjToVBA.Parameter = "fSetBuff(" & sBuff
    End If
    sParmIni = ObjToVBA.Parameter: If bAsynchrn Then Application.Cursor = xlWait
    ObjToVBA.Execute: If bAsynchrn Then Do: DoEvents: Loop While Application.Cursor = xlWait
    If ObjToVBA.Parameter <> "0" Then fPortblXLSPrinter = -3: MsgBox "Failed to call fPortblXLSPrinter() function to " & Dir(ToPrintWorkbookName) & "!", vbOKOnly + vbCritical, "Portable XLS Printer for Excel"
    fPortblXLSPrinter = Val(ObjToVBA.Parameter)
    ObjToVBA.Parameter = ""    'Clean
End Function

 

Mais informação

Home

 

Facebook



gplus

 

 

Visitas acumuladas em todas as páginas:
Visitas hoje só nesta página: