Prever: VBA Excel - Auto-Documentando suas Aplicações


Você que é desenvolvedor de aplicações com o MS Excel, tais como MIS, Dashboards,ou mesmo BSC possivelmente tem inúmeras soluções desenvolvidos por aí, sem que nem todas estejam documentadas.

Como faríamos isso utilizando um código simples e rápido?
Existem documentadores comerciais por aí, mas com o código abaixo poderá, pelo menos, listar todos os seus Módulos e Processos dentro destes das suas respectivas aplicações.

Crie um novo módulo, talvez com o nome de 'mdl_x_DocApplication' e cole nele o código abaixo:


CÓDIGO:

'=============================================================================================
' Microsoft® Office Excel - DashBoard®, Developed by A&A - In Any Place®.
'
' CopyLeft© A&A - In Any Place, all Lefts Reserved.
'
' Cheque se existe referência ao "Microsoft Visual Basic for Applications Extensibility x.xx"
'=============================================================================================

Option Explicit

Const vbext_pp_none As Long = 0
Const vbext_pk_Proc As Long = 0

Dim x As Long
Dim objList()

Sub RetProject()
    ' Author:                     Date:               Contact:                 URL:
    ' André Bernardes             22/09/2010 15:26    bernardess@gmail.com https://sites.google.com/site/vbabernardes/blogs
    ' Lista todos os módulos, e processos (functions & procedures) neles.

    Dim oBJCT As Object
    Dim Wb As Workbook
    
    Let x = 2
    
    For Each Wb In Workbooks
        For Each oBJCT In Workbooks(Wb.Name).VBProject.VBComponents

            If Workbooks(Wb.Name).VBProject.Protection = vbext_pp_none Then

                Call LoadRoutines(Wb.Name, oBJCT.Name)

            End If

        Next
    Next

    With Sheets.Add
        Let .[A1].Resize (, 3).Value = Array ("Aplicação", "Módulo", "Processos (Functions & Subs)")
        Let .[A2].Resize (UBound (objList, 2), UBound(objList, 1)).Value = Application.Transpose (objList)

        .Columns("A:C").Columns.AutoFit
    End With
End Sub


Agora só precisará utilizar a SUB que carregará todo o conteúdo da sua aplicação (planilha)


CÓDIGO:

Sub LoadRoutines(nWBook As String, vbCmp As String)
    ' Author:                     Date:               Contact:                 URL:
    ' André Bernardes             23/11/2010 15:28    bernardess@gmail.com https://sites.google.com/site/vbabernardes/blogs
    ' Retorna detalhes para a SUB 'RetProject'.
    ' Listening: .

    Dim vbCode As Object
    Dim StartRow As Long

    On Error Resume Next
    
    Set vbCode = Workbooks(nWBook).VBProject.VBComponents(vbCmp).vbCode
    
    With vbCode
        Let StartLine = .CountOfDeclarationLines + 1

        Do Until StartLine >= .CountOfLines

            ReDim Preserve aList (1 To 3, 1 To x - 1)

            Let aList(1, x - 1) = nWBook
            Let aList(2, x - 1) = vbCmp
            Let aList(3, x - 1) = .ProcOfLine(StartRow, vbext_pk_Proc)
            Let x = x + 1
            Let StartLine = StartRow + .ProcCountLines(.ProcOfLine(StartRow, vbext_pk_Proc), vbext_pk_Proc)

            If Err Then Exit Sub
        Loop
    End With

    Set vbCode = Nothing
End Sub



Esse código é prático porque pode acrescentar documentação na sua própria planilha. Se desejar pode mantê-la ali mesmo, talvez escondida, e solicitar que esta seja atualizada todas as vezes que for fechada, por exemplo. Ainda mais, poderá ampliar a análise de outros objetos e classes na aplicação.

Boa diversão!


Tags: Excel, auto, document, auto-documentação

André Luiz Bernardes
A&A® - Work smart, not hard.

VBA Excel - Inserindo icone em suas aplicações

Digamos que você tenha diversas planilhas abertas no nosso computador neste momento.

Cada uma delas com conteúdos totalmente distintos. Não seria bom se você pudesse identificá-las somente olhando para os seus ícones na barra do Windows? Como podemos fazer isso?

Na verdade não requer prática, nem tão pouco experiência, basta que siga os passos abaixo:

Crie um novo módulo com um nome como: mdl_Functions_Icon

Dentro do módulo cole o código abaixo:



CÓDIGO: 

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

Function ChangeApplicationIcon()
    ' Author:                     Date:               Contact:                 URL:
    ' André Bernardes             22/11/2010 13:43    bernardess@gmail.com     https://sites.google.com/site/vbabernardes/
    ' Carrega o icone identificando a planilha.
    ' Listening:

    Dim Icon& ' Pegue o ícone de outro aplicativo como abaixo:
    
    Const NewIcon$ = "C:\PlanIcons\DashBoard.ico"  ' Um arquivo .ICO em um diretório: '
    
    Let Icon = ExtractIcon32(0, NewIcon, 0)
    
    SendMessage32 GetActiveWindow32(), &H80, 1, Icon
End Function



Na pasta de inicialização da sua planilha faça uma chamada a esta função, como demonstrado abaixo:


CÓDIGO: 

Private Sub Workbook_Open()
    ' Author:                     Date:               Contact:                 URL:
    ' André Bernardes             27/09/2010 09:07    bernardess@gmail.com     https://sites.google.com/site/vbabernardes/
    ' Abre a planilha para acesso a dados.
    ' Listening: Don´t Give Hate a Chance - Jamiroquai.

    Let Application.ScreenUpdating = False
    Let Application.Caption = ".: DashBoard®"
    Let Application.StatusBar = "A&A - In Any Place®"

    Call ChangeApplicationIcon

    Sheets("Dashboard").Select
    ActiveSheet.Outline.ShowLevels RowLevels:=1
    
    frmSplash.Show

    Sheets("Menu").Select

    Let Application.ScreenUpdating = True
End Sub


Pronto!

Todas as suas aplicações podem ter ícones distintos, identificando-as mais facilmente até mesmo para seus clientes.


Tags: Bernardes, VBA, Office, Excel, worksheets, sheets, ws, insert, inserindo, pasta


André Luiz Bernardes
A&A® - Work smart, not hard.

VBA - Retirando os acentos de Planilhas, Textos, Apresentações, bases de dados, etc...

VBA - Retirando os acentos de Planilhas, Textos, Apresentações, bases de dados, etc...

Essa versão foi atualizada. Clique na imagem abaixo para ver o código atualizado para a versão Office 365 a partir de 2024:

CLIQUE AQUI PARA ACESSAR O CÓDIGO ATUALIZADO!


  Clique aqui e nos contate via What's App para avaliarmos seus projetos 

Envie seus comentários e sugestões e compartilhe este artigo!
brazilsalesforceeffectiveness@gmail.com

 Série de Livros nut Project 

DONUT PROJECT: VBA - Projetos e Códigos de Visual Basic for Applications (Visual Basic For Apllication) eBook - DONUT PROJECT 2024 - Volume 03 - Funções Financeiras - André Luiz Bernardes eBook - DONUT PROJECT 2024 - Volume 02 - Conectando Banco de Dados - André Luiz Bernardes eBook - DONUT PROJECT 2024 - Volume 01 - André Luiz Bernardes

eBook - PT - Série DONUT PROJECT - Volume 07 - VBA TOP 50 Códigos Mais Importantes - Access — André Luiz BernardeseBook - PT - Série DONUT PROJECT - Volume 07 - VBA TOP 50 Códigos Mais Importantes - Excel — André Luiz Bernardes eBook - PT - Série DONUT PROJECT - Volume 07 - VBA TOP 50 Códigos Mais Importantes - Outlook — André Luiz Bernardes eBook - PT - Série DONUT PROJECT - Volume 08 - VBA TOP 50 Códigos Mais Importantes - Project — André Luiz Bernardes eBook - PT - Série DONUT PROJECT - Volume 08 - VBA TOP 50 Códigos Mais Importantes - Word — André Luiz BernardeseBook - PT - Série DONUT PROJECT - Volume 08 - VBA TOP 50 Códigos Mais Importantes - Project — André Luiz Bernardes 

VBA Access - Excluindo fontes de dados conectadas.





Quando criamos aplicações de automação com o MS Access não é raro precisarmos efetuar conexões em diversas bases de dados como: planilhas MS Excel, arquivos Texto, ou outras tabelas MS Access, sites da Web, etc...

Essas conexões geralmente precisam ser refeitas e/ou excluídas. Como fazê-lo?

Demonstro abaixo, parte de códigos com variantes para aplicar ao seu gosto...Boa diversão!

Esta primeira função é muito rápida, ela checa se o objeto que desejamos excluir está disponível para deleção:


CÓDIGO: 

Function CheckExistTbl(tblName As String) As Integer
    ' Author:                     Date:               Contact:                 URL:
    ' André Bernardes             09/11/2010 09:45    bernardess@gmail.com     https://sites.google.com/site/vbabernardes/
    ' Application: 
    ' Detecta a tabela e a deleta.

    Dim i As Integer ' Counter.
    
    Let CheckExistTbl = False

    For i = 0 To CurrentData.AllTables.Count - 1

        If CurrentData.AllTables(i).Name = tblName Then
            Let CheckExistTbl = True
        End If
    
    Next i
End Function



Por exemplo: 



CÓDIGO: 

If CheckExistTbl(strConectionTbl01) Then
   DoCmd.DeleteObject acTable, strConectionnTbl01
Endif



Abaixo demonstro uma das inúmeras técnicas para se conectar dados à sua aplicação MS Access, neste caso efetuo conexões a outras bases MS Access.




CÓDIGO: 

Function ConectAll(nBase As String, strConection As String)
    ' Author:                     Date:               Contact:                 URL:
    ' André Bernardes             09/11/2010 09:31    bernardess@gmail.com     https://sites.google.com/site/vbabernardes/
    ' Application: 
    ' Efetua as conexões.

    Dim dbsTemp As Database
    Dim strMenu As String
    Dim strInput As String
    Dim nTbl01 As String
    Dim nTbl02 As String
    Dim nTbl03 As String

    ' Tabelas
    nTbl01 = "tbl_01x"
    nTbl02 = "tbl_02y"
    nTbl03 = "tbl_03k"

    Set dbsTemp = CurrentDb

    ' Deleta os objetos pré-existentes.
    If CheckExistTbl(strConection & nTbl01) Then
        Call Banner("Desconectando tabela:" & strConection & nTbl01)
        DoCmd.DeleteObject acTable, strConection & nTbl01

        Call Banner("Desconectando tabela:" & strConection & nTbl02)
        DoCmd.DeleteObject acTable, strConection & nTbl02

        Call Banner("Desconectando tabela:" & strConection & nTbl03)
        DoCmd.DeleteObject acTable, strConection & nTbl03
    End If

    ' Conecta o grupo de tabelas respectivas ao mês de análise.
    Call Banner("Conectando a tabela: " & strConection & nTbl01)
    ConnectOutput dbsTemp, strConection & nTbl01, ";DATABASE=" & nBase, nTbl01

    Call Banner("Conectando a tabela: " & strConection & nTbl02)
    ConnectOutput dbsTemp, strConection & nTbl02, ";DATABASE=" & nBase, nTbl02

    Call Banner("Conectando a tabela: " & strConection & nTbl03)
    ConnectOutput dbsTemp, strConection & nTbl03, ";DATABASE=" & nBase, nTbl03
End Function


 Perceba no código acima a utilização das funções explanadas anteriormente.

Abaixo observaremos a simples e suave conexão da fonte de dados com o banco de dados atual:


CÓDIGO: 

Sub ConnectOutput(dbsTmp As Database, strTbl As String, strConnect As String, strSourceTbl As String)
    ' Author:                     Date:               Contact:                 URL:
    ' André Bernardes             09/11/2010 08:01    bernardess@gmail.com     https://sites.google.com/site/vbabernardes/
    ' Application:
    ' Efetua as conexões.

    Dim tblLinked As TableDef

    Set tblLinked = dbsTmp.CreateTableDef(strTbl)

    Let tblLinked.Connect = strConnect
    Let tblLinked.SourceTableName = strSourceTbl

    dbsTmp.TableDefs.Append tblLinked
End Sub


Outra técnica também eficiente, seria utilizar o código abaixo:

CÓDIGO: 

    Dim d_b As Database

    On Error GoTo ProcessingErrorMsg:

    Set d_b = CurrentDb()

    d_b.TableDefs.Delete "tbl_Bernardes"

    Exit Sub

ProcessingErrorMsg:

    Select Case Err.Number
             Case 3265 'Table
                    Resume Next
             Case Else
                    MsgBox Err.Number & " - Descrição: " & Err.Description, vbExclamation, Err.Source
    End Select



Referências: Furniture Designer Brisbane 


Tags800, DAO Error, error, erro, List, tips, VBA, erros


diHITT - Notícias