VBA – Listando as impressoras instaladas no computador

O VBA é uma linguagem de automação poderosa. Porém, apesar de herdar as características no Visua Basic tradicional, não goza de todas as suas vantagens. Muitas coisas acabam precisando ser feitas na não.

O código abaixo permite listas as impressoras listas no computador, fazendo a função da coleção Printers existente no VB tradicional:

Option Explicit
 
Const PRINTER_ENUM_CONNECTIONS = &H4
Const PRINTER_ENUM_LOCAL = &H2
 
Private Declare Function EnumPrinters Lib "winspool.drv" Alias "EnumPrintersA" _
                                      (ByVal flags As Long, ByVal name As String, ByVal Level As Long, _
                                       pPrinterEnum As Long, ByVal cdBuf As Long, pcbNeeded As Long, _
                                       pcReturned As Long) As Long
 
Private Declare Function PtrToStr Lib "kernel32" Alias "lstrcpyA" _
                                  (ByVal RetVal As String, ByVal Ptr As Long) As Long
 
Private Declare Function StrLen Lib "kernel32" Alias "lstrlenA" _
                                (ByVal Ptr As Long) As Long
 
 
Public Function ListPrinters() As Variant
 
    Dim bSuccess As Boolean
    Dim iBufferRequired As Long
    Dim iBufferSize As Long
    Dim iBuffer() As Long
    Dim iEntries As Long
    Dim iIndex As Long
    Dim strPrinterName As String
    Dim iDummy As Long
    Dim iDriverBuffer() As Long
    Dim StrPrinters() As String
 
    iBufferSize = 3072
 
    ReDim iBuffer((iBufferSize \ 4) - 1) As Long
 
    'A função EnumPrinters retornará falso casa a fila de impressão estiver muito cheia
    bSuccess = EnumPrinters(PRINTER_ENUM_CONNECTIONS Or _
                            PRINTER_ENUM_LOCAL, vbNullString, _
                            1, iBuffer(0), iBufferSize, iBufferRequired, iEntries)
 
    If Not bSuccess Then
        If iBufferRequired > iBufferSize Then
            iBufferSize = iBufferRequired
            Debug.Print "iBuffer too small. Trying again with "; _
                        iBufferSize & " bytes."
            ReDim iBuffer(iBufferSize \ 4) As Long
        End If
 
        'Tentar chamar a função novamente
        bSuccess = EnumPrinters(PRINTER_ENUM_CONNECTIONS Or _
                                PRINTER_ENUM_LOCAL, vbNullString, _
                                1, iBuffer(0), iBufferSize, iBufferRequired, iEntries)
    End If
 
    If Not bSuccess Then
        'Mostra mensagem em caso de erro na chamada da EnumPrinters
        MsgBox "Error enumerating printers."
        Exit Function
    Else
        'Caso EnumPrinters retorne True, preenche o array com as impressoras
        ReDim StrPrinters(iEntries - 1)
        For iIndex = 0 To iEntries - 1
            'Pega o nome da impressora
            strPrinterName = Space$(StrLen(iBuffer(iIndex * 4 + 2)))
            iDummy = PtrToStr(strPrinterName, iBuffer(iIndex * 4 + 2))
            StrPrinters(iIndex) = strPrinterName
        Next iIndex
    End If
 
    ListPrinters = StrPrinters
 
End Function
 
Public Function IsBounded(vArray As Variant) As Boolean
    'Se a variável passada é um array, retorna True, do contrário, False
    On Error Resume Next
    IsBounded = IsNumeric(UBound(vArray))
End Function

Créditos

Autor do código: Astrid Zeelenberg
http://word.mvps.org/FAQs/MacrosVBA/AvailablePrinters.htm
Adaptado por Tomás Vásquez

Download do exemplo

ListarImpressoras.zip

Excel – Forçando o salvamento da planilha sem intervenção do usuário

O ambiente

A partir do momento em que aprimoramos nossos conhecimentos em uma ferramenta, torna-se confortável tirar proveito das possibilidades que esta traz, e não é diferente com o Microsoft Excel. As planilhas ficam mais elaboradas, de forma a agilizar os tarefas mais rotineiras e também tornar o trabalho mais profissional. Mas enquanto estas planilhas estiverem restritas ao uso de quem as criou, não é trivial notar a possíveis falhas ou inconsistências que esta contém por estarmos acostumados com elas.

Quando se desenvolve planilhas que serão utilizadas por outros usuários, os cuidados a serem tomados tornam-se muito importantes, pois disso dependerá o bom funcionamento de seu trabalho. Geralmente, este é o próximo passo dado por quem aprimora seus conhecimentos em uma ferramenta. Com o Excel, você provavelmente deverá desenvolver planilhas que serão utilizadas por outras pessoas com pouco conhecimento na ferramenta. Por isso estas planilhas devem prever uma série de situações a fim de garantir que o objetivo da planilhas seja atingido sem falhas.

Neste exemplo, discutiremos uma necessidade comum neste ambiente que é o de salvar planilhas automaticamente sem intervenção do usuário. Este é apenas um exemplo de situação que pode ser tratado para garantir a consistência de informações em uma planilha. A idéia é garantir que ao terminar de usar a planilha, todas as informações sejam salvas.

O problema

Tendo que contar com a atenção do usuário é algo praticamente impossível. Não por incompetência ou falta de vontade, mas porque estes estão preocupados com seu trabalho em si. A planilha deve ser um facilitador, e não algo que impeça ou torne maçante seu trabalho. Dificultar o a entrada de dados, efetuar cálculos de forma errada e perder os dados são problemas comuns que geram grande parte da irritação dos usuário no uso de planilhas. Tratar o salvamento automático da planilha auxiliará a evitar perda equivocada dos dados da planilha.

Para tratarmos esse problema, será necessário um pouco de código VBA. Mesmo que o leitor não conheça sobre Macros ou programação, não haverá problemas se seguir as instruções passo a passo para fazer com que tudo funcione e sem grande problemas, adicionar esta funcionalidade em suas planilhas.

O trecho de código em VBA que salva a planilha aberta atualmente é mostrado abaixo.

1
ThisWorkbook.Save

Executar este trecho de código causa o mesmo efeito de pressionar o botão Salvar na barra de ferramentas. Como pode ser notado, é bem simples promover o salvamento da planilha via código VBA. O que fará a grande diferença é executar este bloco de código em determinadas ocasiões, garantindo que as informações inseridas pelo usuário sejam automaticamente salvas.

Uma situação bastante comum é tentar conduzir o usuário a efetuar a operação de fechamento ou encerramento da planilha por outro caminho, por exemplo, colocando um botão na barra de ferramentas ou mesmo um botão de comando (da barra de ferramentas Formulário). Bastaria induzir o usuário com uma mensagem ou ícone a clicar neste botão toda vez que fosse necessário executar uma ação importante, como por exemplo, inserir um novo dado, trocar de planilha ou efetuar um filtro.

As situações podem ser muitas. A planilha para download possui alguns exemplos destas situações.

A solução definitiva (ou quase)

A ação que mais tem mais efeito sobre a perda de dados por usuários e garantir que a planilha seja salva quando o usuário fechar a planilha. Para promover esta funcionalidade, basta seguir os seguintes passos:

Em uma planilha do Excel, preferencialmente existente, ative o VBA indo ao menu Ferramentas->Macro->Editor do Visual Basic (ou clicando o atalho Alt+F11).
Na janela de Projeto – VBA Project, navegue pelo item VBAProject->Microsoft Excel Objetos e clique duas vezes no item EstaPasta_de_trabalho para abrir a janela de código a direita.

Janela de Projeto VBA

Na janela de código aberta, na parte superior existem duas caixa de combinação, que listam os objetos disponíveis. Na caixa da esquerda, seleciona o item Workbook que representa a pasta de trabalho atual.

Janela de Código VBA

Isso automaticamente gera um bloco de código automaticamente. Ignore este bloco de código pois ele não fará parte de nosso exemplo e não surtirá nenhum efeito sobre ele. Agora, na caixa da direita, com o item Workbook selecionado na caixa esquerda, selecione o item BeforeClose.

Janela de Código VBA

Isto fará com que o seguinte código seja gerado:

1
2
3
Private Sub Workbook_BeforeClose(Cancel As Boolean)
 
End Sub

Este bloco de código responde a um evento da pasta de trabalho, que como o próprio nome diz, ocorre um instante antes da desta ser fechada. Este é o instante ideal para efetuar a ação que queremos. O código final que executa a tafera fica desta forma.

1
2
3
Private Sub Workbook_BeforeClose(Cancel As Boolean)
     ThisWorkbook.Save
End Sub

Não fizemos nada mais do que adicionar o código que salva a pasta de trabalho ao evento descrito acima. Para fazer um teste na funcionalidade, digite algum valor em qualquer lugar da planlha e em seguida clique no botão fechar. A planilha será fechada sem que nenhuma mensagem seja mostrada. Normalmente o Excel emitiria uma mensagem perguntando se gostaria de salvar a modificações realizadas. Abra a planilha e veja que as modificações foram salvas automaticamente.

Conclusão

Foram apresentadas algumas situações em que ocorrem perda de dados na maioria das vezes por falta de atenção no uso das planilhas de Excel no dia-a-dia. A solução apresentada visa evitar que esse tipo de situação ocorra com tanta frequência. Com ela, é possível auxiliar soluções profissionais e também a aqueles usuários mais distráidos.

Comentários

O Excel dispõem do recurso de auto-recuperação, porém, este garante a recuperação da pasta de trabalho em caso de mau funcionamento do aplicativo Microsoft Excel ou até mesmo do próprio Windows. Portanto, não contempla situações de guarda correta de dados, até porque utilizar o recurso de auto-recuperação exige um certo conhecimento por parte do usuário.

Baboseiras – O fenômeno de Telmo Júnior

Se ainda não ouviu falar dele, não se preocupe. Ele está dominando os blogs e o Twitter do ramo de TI.

O motivo, confiram vocês mesmos:

http://telmojunior.com/index.html

http://twitter.com/telmojr

http://twitter.com/#search?q=telmo%20j%C3%BAnior

Não me responsabilizo pelas excessivas gargalhadas no ambiente de trabalho. Controlem-se…

VBA – Excluindo Linhas com valores em branco

Esta macro foi disponibilizada no Fórum Julio Battisti, do qual também participo. Coloco-a aqui pois é uma grande contribuição pela sua simplicidade. Colaboração do membro DIBIAI (foi no ângulo!).

A macro exclui linhas de uma lista cuja os valores estejam em branco. Abaixo seguem o processo manual de via macro de como fazer:

Manual:

Selecione a coluna, depois tecle F5, clique em Especial, selecione a opção “Em Branco” e OK. Isso vai marcar todas as células vazias na coluna.
Depois tecle Ctrl + – (Tecla control mais tecla do sinal de menos) e selecione a opção Linha inteira. Isso vai excluir todas as linhas que tenham a célula da coluna vazias.

Código:

1
2
3
4
5
Sub apagaLinha()
Columns("B:B").Select 'Adapte para a coluna que quiser
Selection.SpecialCells(xlCellTypeBlanks).Select
Selection.EntireRow.Delete
End Sub

Valeu DIBAI!