Arquivo da tag: VBA

Porque sentiremos falta do VBA….

Nem a Microsoft sabe ainda qual será o fim do VBA. Em conversas com MVPs e discussões freqüentes em Fóruns, nada surge além de suposições ou idéias do que pode acontecer.

O fato é que não podemos esquecer que o VBA é uma suíte de desenvolvimento que vai muito além do Microsoft Office. Claro que sua presença é mais evidente neste, mas o que deve ser valorizado no VBA, é a capacidade de automação dos aplicativos em que ele hospeda, que é justamente para o que ele se propõe.

Outro dia surgiu um necessidade que mais dia menos dia, sabia que viria a tona. Faço algumas brincadeiras no Corel Draw, não que seja design ou coisa parecida. Os mais atentos devem ter reparado que a suíte Corel é munida do pacote VBA. Resumindo, quase todos os objetos disponibilizados pelo Corel são manipuláveis pelo VBA. No momento de desenvolvimento de um trabalho em Corel Draw, encarei uma situação em que a quantidade de trabalho braçal que teria que fazer, sabe, aquelas que levam horas de mouse e muita paciência.

Foi quando lembrei do VBA. A parte mais difícil foi acostumar com os objetos do Corel que na maioria são os Shapes já existentes no Microsoft Office. Depois da macro pronta, em minutos o trabalho que duraria horas estava pronto. Pergunte-se, que chefe não gosta de receber o trabalho concluído antes do tempo previsto?

Existem ainda tantos outros software que suportam o VBA com é o caso do AutoCAD e outros que nem sei da existência. Para ter uma idéia mais ampla, vale uma olhada no site oficial do VBA (http://msdn.microsoft.com/isv/technology/vba/)

Vai ser uma pena se o VBA perder a essa concepção. Claro que a adaptação ao .NET é fator crucial para seu crescimento, mas até que ponto valeria a pena mudar o foco da ferramenta. Por esse e outros motivo, creio que o VSTO nasceu e continuará até que uma solução definitiva seja tomada a respeito desta ferramenta, que pasmem, já foi motivo de mais elogios do que os poderosos Visual Studio, ASP.NET, C#, etc.

Nada contra o VSTO, mas se for esse o caso, sentirei muita falta do VBA.

Tomás Vásquez
http://www.tomasvasquez.com.br

Republicação de post. Originalmente publicado no blog theSpoke.net.

Adicionando controles dinamicamente no VBA

Quando as aplicações se tornam avançadas, algumas tarefas tornam-se necessárias no VBA, entre elas a manipulação de controles por meio de código. Alterar as propriedades é uma tarefas relativamente fácil, porém é mais interessante a adição e remoção destes controles.

O exemplo de código abaixo adiciona um controle TextBox dentro de um UserForm:

Private Sub Adiciona_TextBox()    
    'declara no novo controle
    Dim novoTextBox As Control
    'instancia o novo controle do tipo textbox e o adiciona ao UserForm
    Set novoTextBox = Me.Controls.Add("Forms.TextBox.1", "NovoTextBox", True)
    'seta algumas propriedades
    With novoTextBox
        .Width = 72
        .Height = 18
        .Top = 20
        .Left = 20
        .ZOrder (0)
    End With
End Sub

Após a adiçao, é fácil pegar o controle com um Me.Controls(“NovoTextBox”) para trabalhar com suas propriedades. Obviamente outros controles podem ser adicionados. Uma lista dos possíveis pode ser vista abaixo:

CheckBox: Forms.CheckBox.1
ComboBox: Forms.ComboBox.1
CommandButton: Forms.CommandButton.1
Frame: Forms.Frame.1
Image: Forms.Image.1
Label: Forms.Label.1
ListBox: Forms.ListBox.1
MultiPage: Forms.MultiPage.1
OptionButton: Forms.OptionButton.1
ScrollBar: Forms.ScrollBar.1
SpinButton: Forms.SpinButton.1
TabStrip: Forms.TabStrip.1
TextBox: Forms.TextBox.1
ToggleButton: Forms.ToggleButton.1

Abraços

Tomás Vásquez

Mudando o ícone do aplicativo com VBA

O VBA permite manipular diversas propriedades do aplicativo em que está hospedado.

Porém, quando avançamos no desenvolvimento, é interessante poder personalizar o aplicativo de modo completo. Suítes de desenvolvimento mais avançados como o Visual Studio e Delphi permite fazer isso facilmente. No VBA isso também é possível, porém com um pouco mais de trabalho.

O código abaixo troca o ícone do aplicativo para um determinado arquivo do tipo .ico:

Declare Function GetActiveWindow32 Lib "USER32" Alias _
        "GetActiveWindow" () As Integer
 
Declare Function SendMessage32 Lib "USER32" Alias _
        "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, _
        ByVal wParam As Long, ByVal lParam As Long) As Long
 
Declare Function ExtractIcon32 Lib "SHELL32.DLL" Alias _
        "ExtractIconA" (ByVal hInst As Long, _
                        ByVal lpszExeFileName As String, _
                        ByVal nIconIndex As Long) As Long
 
Sub ChangeApplicationIcon()
 
    Dim Icon&
 
    'Troca o ícone
    Const NewIcon$ = "c:\temp\app.ico"
 
    Icon = ExtractIcon32(0, NewIcon, 0)
    SendMessage32 GetActiveWindow32(), &H80, 1, Icon
    SendMessage32 GetActiveWindow32(), &H80, 0, Icon
 
End Sub

O código faz referência a um arquivo .ico, porém, é possível referenciar arquivos do tipo .dll e .exe que possuam ícones agregados como a calculadora do Windows. Para testar, troque o valor “C:\temp\app.ico” para “calc.exe”.

Atenção: Se executar o aplicativo no contexto do VBA, clicando em F5, o ícone alterado será o do próprio Visual Basic Editor.

Abraços

Tomás Vásquez

Fonte: http://j-walk.com/ss/

Transpor dados no VBA – Invertendo Linhas e Colunas

Transpor Dados
Transpor Dados

Muito útil em seu formato tradicional no Excel, a função de transposição de dados permite trocar facilmente linhas por colunas de uma área de dados no Excel.

Para desenvolvedores VBA essa necessidade é um pouco rara, mas não menos importante, principalmente quando manipulamos muitos dados em arrays e controles. Bom, surgiu a necessidade e encontrei um código muito bem feito que efetua a tarefa.

A função recebe um Array de Variants de 2 dimensões como um argumento e retorna o mesmo já transposto.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Function Array2DTranspose(avValues As Variant) As Variant
    Dim lThisCol As Long, lThisRow As Long
    Dim lUb2 As Long, lLb2 As Long
    Dim lUb1 As Long, lLb1 As Long
    Dim avTransposed As Variant
    If IsArray(avValues) Then
        On Error GoTo ErrFailed
        lUb2 = UBound(avValues, 2)
        lLb2 = LBound(avValues, 2)
        lUb1 = UBound(avValues, 1)
        lLb1 = LBound(avValues, 1)
        ReDim avTransposed(lLb2 To lUb2, lLb1 To lUb1)
        For lThisCol = lLb1 To lUb1
            For lThisRow = lLb2 To lUb2
                avTransposed(lThisRow, lThisCol) = avValues(lThisCol, lThisRow)
            Next
        Next
    End If
    Array2DTranspose = avTransposed
    Exit Function
ErrFailed:
    Debug.Print err.description
    Debug.Assert False
    Array2DTranspose = Empty
    Exit Function
    Resume
End Function

Perfeita para trabalhar com dados, principalmente aqueles retornados em Recordsets ADO ou DAO.

Abraços e bom profeito!

Tomás Vásquez