Views

...

Important:

Quaisquer soluções e/ou desenvolvimento de aplicações pessoais, ou da empresa, que não constem neste Blog podem ser tratados como consultoria freelance.

E-mails

Deixe seu e-mail para receber atualizações...

eBook Promo

Mostrando postagens com marcador Advanced. Mostrar todas as postagens
Mostrando postagens com marcador Advanced. Mostrar todas as postagens

VBA Advanced - Reddick VBA - Naming and Coding Conventions


Bem poucas pessoas que programam em VBA conhecem o assunto que vamos introduzir aqui. Sim, vou apenas introduzir o assunto, deixando para você o exercício do aprofundamento.

É fato que muitos utilizam as várias técnicas de transcrição de código apenas por observarem os códigos de outros, ou mesmo por terem sido ensinados assim, mas findam por desconhecer o motivo de preceder certa variável com algumas letras, ou nomear um objeto sempre com o mesmo prefixo. Pois bem, hoje entenderá um pouco mais sobre isso e aprenderá que houveram pessoas totalmente voltadas a desenvolver essas técnicas para nós.

Encare este artigo apenas como a cereja no bolo, algo que se não comer, o privará do toque final da sobremesa, estou escrevendo a respeito do RVBA.

O objetivo do VBA Reddick (RVBA) é mantermos uma convenção ao nomear objetos no VBA (Visual Basic for Applications). Manter tais convenções é importante em qualquer projeto de programação.

A utilização destes padrões transmitem automaticamente informações pertinentes ao significado dos objetos. Estas convenções tentam fornecer uma maneira de padronizar tais significados em toda uma equipe de programadores VBA (e alguns diriam toda uma geração). 

As convenções RVBA cobrem todas as implementações da linguagem VBA, independentemente do aplicativo host (CAD, Office, CorelDraw, etc...).

Estas convenções refletem o trabalho de muitas pessoas, incluindo Charles Simonyi, que inventou as notações húngaras nas quais o RVBA baseia-se. Leszynski Stan, o co-autor das várias versões de convenções. Muitos outros também têm contribuído para o desenvolvimento e distribuição de tais convenções, tais como Paul Litwin e Ken Getz que fizeram contribuições substanciais ao longo dos anos.

Muitos programadores preferem usar o que é chamado de notação húngara (assim chamado porque o criador deste método era de origem húngara Charles Simonyi, primeiro na Xerox PARC e, posteriormente, um arquiteto de software de nível superior na Microsoft). Na notação húngara, cada nome de variável começa com letras que identificam o seu tipo de dados. Por exemplo, uma variável do tipo Integer seria nomeado intCounter, onde o prefixo int indica que este é um tipo inteiro. Introduzido pela primeira vez em 1992, o RVBA foi publicado em um grande número de livros e revistas. São usados por milhares de programadores ao redor do mundo para nomear objetos dentro de seu código VBA.

Estas convenções servem como diretriz: Se não concordar com uma parte específica das convenções, basta substituí-la com aquilo que acha que funciona melhor para você. No entanto, tenha em mente que as futuras gerações de programadores podem precisar compreender seus códigos.

Como a ideia deste breve artigo é a de ser conciso, as convenções são apresentadas sem as racionalizações de como foram obtidas, embora cada uma delas tenha uma história considerável.

Sempre poderá acompanhar as mais recentes atualizações neste documento.

Uma Introdução à notação húngara

As convenções RVBA baseiam-se nas convenções da notação húngara para a construção dos nomes dos objetos. O objetivo da notação húngara é transmitir informações sobre o objeto de forma concisa e eficiente. Acostumarmos com a notação húngara pode levar algum tempo, mas uma vez adquirido tal hábito, rapidamente torna-se nossa segunda natureza. 

O formato de um nome de objeto com a notação húngara é: 

[prefixos]tag[NomeBase[Sufixos]]

Os colchetes indicam partes opcionais do nome do objeto. Estes componentes têm os seguintes significados:

Prefixos
Modifica a tag para indicar informações adicionais. Os Prefixos são minúsculos. Geralmente são escolhidos a partir de uma lista padrão de prefixos, que será informada mais adiante neste artigo.

Tag
Conjunto de caracteres curtos, geralmente mnemônicos, que indicam o tipo do objeto. O tag é minúsculo. Geralmente é selecionado a partir de uma lista padrão de etiquetas, dadas mais adiante neste artigo.

NomeBase
Uma ou mais palavras que indicam o que o objeto representa. Capitalize a primeira letra de cada palavra no nome base.

Sufixos
Insere informações adicionais sobre o significado do nome base. Capitalize a primeira letra de cada palavra nos sufixos. Eles são geralmente escolhidos a partir de uma lista padrão de sufixos, dada mais adiante neste artigo.

Observe que a única parte necessária do nome do objeto é a tag. Isto pode parecer pouco intuitivo, talvez sinta que o nome base é a parte mais importante do nome do objeto. No entanto, considere um procedimento genérico que funciona em qualquer situação. O fato de que a rotina opera num formulário é o importante, não o que essa rotina representa. Porque a rotina pode operar em vários formulários de muitos tipos diferentes, não precisa necessariamente ter um nome base. No entanto, se houver mais de um objeto de um tipo referenciado na rotina, deve haver um nome de base em todos, mas um dos nomes de objeto para diferenciá-los. 

Tabela 1: Tabela para variáveis VBA

Tag                 Object Type
bool {f, bln}        Boolean
byte {byt}          Byte
cur                   Currency
date {dtm}         Date
dec                   Decimal
dbl                    Double
int                     Integer
lng                    Long
obj                    Object
sng                   Single
str                    String
stf                    String (fixed length)
var                    Variant

Como sabe, você deve declarar explicitamente todas as variáveis, cada uma em uma linha por si só. Não use os antigos caracteres de declaração de variável como %, &, e $. Sempre deve declarar explicitamente as variáveis do tipo Variant, utilizando a cláusula Variant, mesmo que seja o padrão em VBA. Por exemplo:

Dim intTotal As Integer
Dim varField As Variant
Dim strName As String

Construindo Nomes das Propriedades

As propriedades de uma classe apresentam um problema particular: Devem incluir a  nomenclatura convencional para indicar o tipo? Para sermos coerentes com o resto das convenções de nomenclatura, sim, deveriam. No entanto, é permitido ter nomes de propriedades, sem as tags, especialmente se a classe ficar disponibilizada para os clientes que podem não estar familiarizados com essas convenções de nomenclatura.

Coleção Tags

Poderá lidar com um objeto de coleção com uma tag especial. Construa a tag usando o tipo de dados da coleção seguido pela letra s. Por exemplo, se você tinha uma coleção de Longs, a tag será lngs. Se fosse uma coleção de formulários, a tag para a coleção seria FRMs. Embora, em teoria, uma colecção de objetos possa conter diferentes tipos de dados, na prática, cada um dos tipos de dados do conjunto é o mesmo. Por exemplo:

intsEntries
frmsCustomerData
objsMisc

Constantes

Constantes sempre terão um tipo de dados no VBA. Porque o VBA escolherá esse tipo de dados, caso não o faça. Por isso, sempre especifique o tipo de dados de uma constante. Constantes declaradas na seção General Declarations de um módulo devem ter sempre uma palavra-chave de âmbito privado ou público, e ser prefixado pelo escopo de prefixos m ou g, respectivamente. Uma constante é indicada adicionando a letra c no final do tipo de dados para a constante. Por exemplo:

Const intcGray As Integer = 3

Private Const mdblcPi As Double = 3.14159265358979

Embora esta técnica seja o método recomendado para nomear constantes, caso esteja mais preocupado com a especificação de que está lidando com constantes ao invés do seu tipo de dados, pode usar a tag con instada. Por exemplo:

Const conPi As Double = 3.14159265358979

Tabelas

Tabela 2: Prefixos de Escopo

Prefixo        Tipo de objeto 
(none)           variável local, procedure-level lifetime, declarado com "Dim"
s                  Local variable, object lifetime, declarado com "Static"
m                 Privado (módulo) variável, object lifetime, declarado com "Private"
g                  Pública variável (global), object lifetime, declarado com "Público"


Tabela 3: Outros Prefixos mais usados

Prefixos         Tipo de objeto
c                     Contar de algum tipo de objeto
h                     Identificador para um objeto do Windows
r                      Parâmetro passado por referência


Para saber mais, acesse aqui:





Mas o que dizer do MCS (Microsoft Consulting Services)?
vou aproveitar o ensejo que já estamos falando sobre documentação e disponibilizar um superconjunto das convenções de codificação Visual Basic encontrado na "Guia do programador" do Visual Basic.

Convenções de nomenclatura de objetos para objetos padrão

Prefixo  Tipo de Objeto             Exemplo
ani         Animation button             aniMailBox
bed        Pen Bedit                       bedFirstName
cbo        Combo box and drop down list box      cboEnglish
chk        Checkbox                      chkReadOnly
clp         Picture clip                    clpToolbar
cmd (3d) Command button (3D)    cmdOk (cmd3dOk)
com       Communications            comFax
ctr         Control (when specific type unknown)  ctrCurrent
dat        Data control                   datBiblio
dir         Directory list box            dirSource
dlg        Common dialog control   dlgFileOpen
drv        Drive list box                  drvTarget
fil          File list box                    filSource
frm        Form                             frmEntry
fra (3d)  Frame (3d)                     fraStyle (fra3dStyle)
gau       Gauge                           gauStatus
gpb       Group push button          gpbChannel
gra        Graph                            graRevenue
grd        Grid                               grdPrices
hed       Pen Hedit                       hedSignature
hsb       Horizontal scroll bar         hsbVolume
img       Image                             imgIcon
ink        Pen Ink                           inkMap
key       Keyboard key status        keyCaps
lbl         Label                              lblHelpMessage
lin         Line                                linVertical
lst         List box                          lstPolicyCodes
mdi       MDI child form                 mdiNote
mpm     MAPI message               mpmSentMessage
mps      MAPI session                 mpsSession
mci       MCI                               mciVideo
mnu      Menu                             mnuFileOpen
opt (3d) Option Button (3d)           optRed (opt3dRed)
ole       OLE control                     oleWorksheet
out       Outline control                 outOrgChart
pic       Picture                            picVGA
pnl3d   3d Panel                          pnl3d
rpt       Report control                   rptQtr1Earnings
shp     Shape controls                  shpCircle
spn     Spin control                       spnPages
txt       Text Box                           txtLastName
tmr      Timer                                tmrAlarm
vsb      Vertical scroll bar               vsbRate


Convenção de nomenclatura de objetos para objetos de banco de dados


Prefixo  Tipo de Objeto             Exemplo
db          ODBC Database             dbAccounts
ds          ODBC Dynaset object     dsSalesByRegion
fdc         Field collection     

     
  

  

fdcCustomer
fd           Field object         

     


    

fdAddress
ix           Index object         

     


   

ixAge
ixc         Index collection     

     


  

ixcNewAge
qd          QueryDef object      

      
qdSalesByRegion
qry (suffix) Query (see NOTE)        SalesByRegionQry
ss          Snapshot object      

       
ssForecast
tb           Table object         

     


   

tbCustomer
td           TableDef object      

     


 

tdCustomers


Tags: VBA, RVBA, Reddick, Reddick VBA, naming, coding, convention, conventions, advanced, Charles Simonyi, Leszynski Stan, Paul Litwin, Ken Getz, notação húngara, MCS, Microsoft Consulting Services, MCS, Microsoft Consulting Services

VBA Advanced - Compreendendo o Early Binding e o Late Binding - Early Binding & Late Binding

Inline image 1
Sim, o desenvolvimento da linguagem VBA nos permite abordagens distintas. E é bom que isso ocorra, pois nos possibilita variância, adequação, e certa liberdade na escolha do caminho que percorreremos em busca de uma solução plausível para o nosso cliente.

Falaremos sobre 2 métodos de programação que dizem respeito ao uso de objetos no VBA, os quais são definidos na fase de declaração das variáveis:

Early Binding (Ligação Atual)  
No método Early Binding as variáveis são declaradas com o tipo de dados assumirão antes de serem invocadas.

Late Binding (Ligação Tardia)
No método Late Binding as variáveis são declaradas como objeto e assumem seu tipo na primeira vez que uma atribuição é feita ao mesmo.

Suponhamos que fôssemos automatizar uma aplicação MS Outlook a partir do MS Excel:
Primeiramente precisamos ter acesso ao Modelo de Objetos (object model) do Outlook.

Segundo, para manipularmos um objeto do Outlook, precisamos vê-lo e isso só é possível através de 2 métodos, isso mesmo, conhecendo os métodos Early Binding e Late Binding.

Para "encapsularmos" o Outlook (Client) na nossa aplicação Excel (Host). O OB (Object model) armazenado no arquivo OLB (Object Library) precisa estar vinculado ao Excel.

CheckBinding
Podemos fazer isso através do menu Ferramentas no VBE, especificamente em Referências. A caixa de diálogo Referências será mostrada com uma lista de arquivos com os quais podemos nos ligar. É provável que a lista seja bastante longa e cheia de opções que você nunca vai usar.

Inline image 2

A ligação (bindingOLB é chamada ligação inicial (early binding). É early (cedo) porque expomos o modelo de objeto durante o momento do design e não no tempo de execução. 

No exemplo acima pode observar a versão do Microsoft Outlook 9.0 Object Library. A parte 9.0 do nome será diferente se você estiver usando uma versão diferente do Outlook. Incidentalmente, o nome do arquivo OLB que aloja esta biblioteca é msoutl9.olb. Você pode ver o caminho onde ele é armazenado na parte inferior da caixa de diálogo.

Apenas selecionar uma referência nesta caixa diálogo não fará absolutamente nada. Algumas vezes simplesmente seleciono a referência e fecho a caixa de diálogo apenas para encontrar o erro de compilação: Tipo definido pelo usuário não definido (User Defined Type not Defined). Quando você receber esse erro, a primeira coisa que deve verificar é que tenha definido a referência corretamente.

Uma vez que tenha passado por este processo, pode criar um procedimento como este:

Sub CheckBinding()

    Dim olApp As Outlook.Application

    Set olApp = New Outlook.Application

    MsgBox olApp.Name

End Sub

A ligação (binding) tardia (Late) tem o mesmo efeito que o Early Binding. A diferença é que você efetua a ligação da biblioteca em tempo de execução (run-time). Não precisa usar as Referências previamente, mas sim as funções GetObject ou CreateObject. O código abaixo faz a mesma coisa que o CheckBinding acima, mas usa o Late Binding.

Sub CheckBindingLB()

    Dim olApp As Object

    Set olApp = CreateObject("Outlook.Application")

    MsgBox olApp.Name

End Sub

Na maioria dos exemplos que usamos aqui o CreateObject será muito útil. É usado quando precisamos criar uma nova instância do Outlook e usamos o GetObject se quisermos fazer referência a uma instância já em execução do Outlook.

Para enviarmos um e-mail, criarmos uma tarefa, ou diversas outras atividades, não importa se usamos uma instância nova ou existente. Usaríamos o GetObject se desejássemos mostrar algo no Outlook, por exemplo, um calendário. Nesse caso, não iríamos querer dois Outlooks executando só para exibir um calendário.

O código a seguir usa Late Binding para exibir a pasta do calendário na instância existente do Outlook, criando uma instância, se não houver uma.

Sub DisplayCalendar()

    Dim olApp As Object
    Dim olNs As Object

    On Error Resume Next
    Set olApp = GetObject(, "Outlook.Application")

    If Err.Number = 429 Then
        Set olApp = CreateObject("Outlook.application")
    End If

    On Error GoTo 0

    Set olNs = olApp.GetNamespace("MAPI")

    If olApp.ActiveExplorer Is Nothing Then
        olApp.Explorers.Add _
            (olNs.GetDefaultFolder(9), 0).Activate
    Else
        Set olApp.ActiveExplorer.CurrentFolder = _
            olNs.GetDefaultFolder(9)
        olApp.ActiveExplorer.Display
    End If

    Set olNs = Nothing
    Set olApp = Nothing

End Sub

Detalhando

Talvez para os que estão iniciando no VBA exista muita coisa acontecendo no código acima. E saiam já daqui! Não viram que o tópico é Advanced? Brincadeiras à parte, vamos olhar para as seções pertinentes uma de cada vez:

 Dim olApp As Object
 Dim olNs As Object

Na seção de declarações de variáveis usamos o tipo de dados Object. Com a Early Binding usamos Outlook.Application para dimensionar (Dim) a variável "olApp". Mas, sem um conjunto de referência, o VBA não saberá o que significa Outlook.Application porque ainda não expusemos o modelo de objeto. Portanto, quaisquer objetos que utilizarmos a partir do modelo de objeto do Outlook, devem ser declarados com o tipo genérico Object.

On Error Resume Next

Set olApp = GetObject(, "Outlook.Application")

If Err.Number = 429 Then
   Set olApp = CreateObject("Outlook.application")
End If

On Error GoTo 0

A função GetObject gerará um erro se não houver uma instância do Outlook, por isso usamos On Error Resume Next para ignorá-lo. Em seguida, testamos um erro específica, o qual se tiver ocorrido usaremos CreateObject. Redefiniremos o tratamento de erros com On Error GoTo 0, de modo a não disfarçarmos quaisquer erros no final do procedimento.

Porquê 2 métodos?

Ambos os métodos têm vantagens e desvantagens. A Late Binding é mais lenta do que a Early Binding porque ocorre durante o tempo de execução. Quando fazemos o trabalho durante o design, o código será executado mais rapidamente. Quando você está escrevendo o código usando a Late Binding, perde algumas conveniências. Mais especificamente, não ver o Intellisense mostrando as propriedades e métodos de objetos quando os digita. Além disso, o navegador de objetos (F2) não apresenta nenhum dos objetos do Outlook. E por fim, não terá a vantagem de usar constantes internas na Late Binding. Veja o código abaixo:

olNs.GetDefaultFolder (9)

O código ficaria assim numa ligação prévia:

olNs.GetDefaultFolder (olFolderCalendar)

olFolderCalendar é definido numa constante dentro do modelo de objeto do Outlook que não será exposto, se você não tiver definido uma referência. Embutidos constantes podem tornar o código muito mais legível e mais fácil de depurar.

Tudo parece fazer muito sentido e ser muito bom para a Early Binding, mas a Late Binding tem uma vantagem muito grande que não pode ser negligenciada. Ao se efetuar a Late Binding, não importa qual seja a versão do Outlook instalada, o VBA vai usar o nome da classe fornecido com GetObject ou o CreateObect ("Outlook.Application" no nosso caso) e encontrará o modelo de objeto correto para referência.

Ao discutir a Early Binding acima, vai notar que definir uma referência ao Microsoft Outlook 9.0 Object Library porque eu estou usando o Outlook 2000. Se fosse enviar um procedimento para alguém que estava usando uma versão anterior do Outlook, o código seria um fracasso, porque não teriam essa biblioteca objeto específica instalada. 

Para tirar o máximo proveito do ambiente de desenvolvimento VBA e ainda escrever um código robusto, devemos escrever o código com Early Binding, mas mudá-lo no final, antes de distribuí-lo. Mesmo que escreva apenas para uso pessoal, não faz sentido não convertê-lo no final. Algum dia terá um computador diferente ou enviará este código para o seu irmão e não vai funcionar porque eles vão ter uma versão anterior.

Referências:
Dick´s Clickshttp://www.dicks-clicks.com


Tags: VBA, Advanced, Early Binding, Late Binding, OLB, Object Library, MS Outlook,  Object Model, Object Library, msoutl9.olb, Microsoft Outlook 9.0 Object Library, GetObject, CreateObject, CheckBinding, 

eBooks VBA na AMAZOM.com.br

LinkWithinBrazilVBAExcelSpecialist

Related Posts Plugin for WordPress, Blogger...

Vitrine