Dicionário de Dados em VBA - documentação de sintaxe completa
Autor: Brazil SFE | Publicado: 2017-02-14T09:51:00-08:00


Dicionário de Dados em VBA - documentação de sintaxe completa





Dicionário de Dados&nbsp;são coleções aprimoradas.&nbsp;Gosto de&nbsp;usá-los em qualquer lugar onde tenha uma coleção, exceto quando uso uma coleção de Classes.&nbsp;Infelizmente, eu não encontrei uma única fonte que documenta o objeto inteiro.&nbsp;Então, para minha própria documentação, &nbsp;decidi utilizar isso.&nbsp;Ao final do artigo veja&nbsp;a lista de fontes usadas neste artigo.





Vantagens dos objetos do dicionário sobre as coleções

A propriedade CompareMode especifica a sensibilidade a maiúsculas e minúsculas para Chaves.
Um método para determinar se um objeto existe no Dicionário.
Um método para extrair todas as chaves numa matriz.
Um método para extrair todos os itens numa matriz.
Um método para alterar um valor Chave.
Um método para remover todos os itens do Dicionário.
As chaves do dicionário não estão limitadas ao tipo de dados String.




Observação: uma diferença importante entre o objeto de coleção e o objeto de dicionário é o comportamento da propriedade de item.&nbsp;Se usar a propriedade Item para fazer referência a uma chave inexistente em uma coleção, receberá um erro.&nbsp;Se usar a propriedade Item para fazer referência a uma chave inexistente em um dicionário, essa chave será adicionada ao dicionário.&nbsp;Use o método Exists para determinar se uma chave está ou não presente em um dicionário.




Sintaxe


Crie um objeto de dicionário em qualquer versão do XL

Isso usa um exemplo de ligação tardia que eu prefiro para simplificar a implantação para outros PCs.




Dim&nbsp;dicMyDictionary&nbsp;as Object

Set&nbsp;dicMyDictionary = CreateObject("Scripting.Dictionary")






Definir a sensibilidade das teclas




dicMyDictionary.CompareMode = vbBinaryCompare 'Case Sensitive

dicMyDictionary.CompareMode = vbTextCompare 'Case Insensitive





Adicionar Item




dicMyDictionary.Add ItemKey, myItem











Adicionar ou alterar item

Isso às vezes é chamado de "Silent Add" método.&nbsp;Se uma chave não existir, ela será adicionada.




dicMyDictionary(ItemKey) = myItem

-or-

Set&nbsp;dicMyDictionary(ItemKey) = myObject








Determinar se existe um item

Se você não quiser o recurso "Silent Add", use isso antes de tentar alterar itens.




If&nbsp;dicMyDictionary.Exists(ItemKey)&nbsp;Then&nbsp;...








Obter Número de Itens




Debug.Print = dicMyDictionary.Count








Obter um item por chave




MyItem = dicMyDictionary(ItemKey)

- or -

Set MyObject = dicMyDictionary(ItemKey)








Obter um item por número

Nota!&nbsp;Os itens do dicionário começam por 0




MyItem = dicMyDictionary.Items()(ItemNumber)

- or -

Set MyObject = dicMyDictionary.Items()(ItemNumber)








Obter uma chave por número




MyKey = dicMyDictionary.Keys()(ItemNumber)








Carregar todos os itens em uma matriz




Dim&nbsp;vArray&nbsp;as Variant

vArray = dicMyDictionary.Items()








Carregar todas as chaves em uma matriz




Dim&nbsp;vArray&nbsp;as Variant

vArray = dicMyDictionary.Keys()








Remover um item




dicMyDictionary.Remove(ItemKey)








Remover todos os itens




dicMyDictionary.RemoveAll










Usos



Eliminar duplicatas

Os dicionários são perfeitos para criar listas exclusivas usando sua função "adicionar silenciosamente".






Função&nbsp;GetDistinct (&nbsp;ByVal&nbsp;oTarget&nbsp;como Range&nbsp;)&nbsp;como Variant



&nbsp;&nbsp; &nbsp;&nbsp;Dim&nbsp;vArray&nbsp;como Variant

&nbsp;&nbsp; &nbsp;&nbsp;Dim&nbsp;dicMyDictionary&nbsp;como objeto

&nbsp;&nbsp; &nbsp;&nbsp;Dim&nbsp;v&nbsp;como variante



&nbsp;&nbsp; &nbsp;&nbsp;Definir&nbsp;dicMyDictionary = CreateObject ("Scripting.Dictionary")

&nbsp;&nbsp; &nbsp;&nbsp;VArray = oTarget

&nbsp;&nbsp; &nbsp;&nbsp;Para Cada&nbsp;v&nbsp;em&nbsp;vArray

&nbsp;&nbsp; &nbsp;&nbsp;DicMyDictionary (v) = v

&nbsp;&nbsp; &nbsp;&nbsp;Próximo



&nbsp;&nbsp; &nbsp;&nbsp;GetDistinct = dicMyDictionary.Items ()



Função final














Pesquisa de tabela de código

Se pretendemos fazer referência a uma tabela repetidamente e "aleatoriamente" (em oposição a "sequencialmente"), colocar a tabela em um dicionário é fácil e rápido, bem como fácil e rápido de usar.




Função Pública&nbsp;Tbl2Dic (&nbsp;ByVal&nbsp;oTarget&nbsp;As Range&nbsp;) As&nbsp;Object



Dim&nbsp;dicMyDictionary&nbsp;As ObjectDim&nbsp;lRow&nbsp;As LongDim&nbsp;lCols&nbsp;As Long



Definir&nbsp;dicMyDictionary = CreateObject ("Scripting.Dictionary")LCols = oTarget.Columns.Count - 1Para&nbsp;lRow = 1&nbsp;Para&nbsp;oTarget.Rows.CountCom&nbsp;oTarget.Cells (lRow, 1)Definir&nbsp;dicMyDictionary (.Value) = .Offset (0, 1) .Resize (1, lCols)Terminar&nbsp;comPróximo

Definir&nbsp;Tbl2Dic = dicMyDictionaryFunção final&nbsp;



Exemplos:

'&nbsp;Obter a coluna 2 da tabela de 2 colunas denominada "Estados" onde coluna 1 = "VA"

Dim&nbsp;dicStates como objeto

Definir&nbsp;dicStates = Tbl2Dic ([Estados])

&nbsp;&nbsp; &nbsp;&nbsp;Debug.print dicStates ("VA")




'&nbsp;Obter a coluna 3 a partir da tabela de 3 colunas denominada "Estados" onde a coluna 1 = "VA"&nbsp;&nbsp;&nbsp;


Dim&nbsp;dicStates como objeto

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Definir&nbsp;dicStates = Tbl2Dic ([Estados])

&nbsp;&nbsp; &nbsp;&nbsp;Debug.print dicStates ("VA") (1,2)
















Classe Container

Eu uso dicionários para armazenar objetos de classe na memória porque os dicionários podem conter qualquer coisa.












Public&nbsp;dicWorksheets as Object



Sub&nbsp;InitMyClass ()



Dim&nbsp;MyWorksheet&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;A&nbsp;s&nbsp;clsWorksheet

Dim&nbsp;oWks&nbsp;como&nbsp;planilha



Se&nbsp;dicWorksheets&nbsp;não é nada então&nbsp;_

&nbsp;&nbsp;&nbsp;Definir&nbsp;dicWorksheets = CreateObject ("Scripting.Dictionary")



Para cada&nbsp;oWks neste ThisWorkbook.Worksheets

Set&nbsp;MyWorksheet =&nbsp;Novo&nbsp;clsWorksheet

&nbsp;&nbsp; &nbsp;&nbsp;Definir&nbsp;MyWorksheet.Worksheet = oWks

&nbsp;&nbsp; &nbsp;&nbsp;Definir&nbsp;dicWorksheets (oWks.Name) = MyWorksheet

Próximo



Função final





Envie seus comentários&nbsp;e sugestões&nbsp;e compartilhe este artigo!



brazilsalesforceeffectiveness@gmail.com



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;