{"id":1188,"date":"2020-04-26T15:04:58","date_gmt":"2020-04-26T15:04:58","guid":{"rendered":"https:\/\/www.budus.it\/Blog\/?p=1188"},"modified":"2020-04-26T15:04:59","modified_gmt":"2020-04-26T15:04:59","slug":"vba-gestione-di-un-dizionario","status":"publish","type":"post","link":"https:\/\/www.budus.it\/Blog\/vba-gestione-di-un-dizionario\/","title":{"rendered":"VBA: Gestione di un Dizionario"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">No, non si tratta dell&#8217;oggetto <strong><strong>Scripting.Dictionary<\/strong> &#8211;<\/strong> del quale, peraltro, vi consiglio l&#8217;uso, se potete &#8211; il cui utilizzo \u00e8 ampiamente documentato in rete ma, bens\u00ec, una <em>mia ristrettissima implementazione<\/em>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In pratica, senza dover caricare librerie aggiuntive (operazione che mi sembra abbia una pessima portabilit\u00e0, tende a dare problemi appena si cambia PC con magari una versione Windows diversa), ho preferito crearmi io qualcosa di basato su quanto il linguaggio VBA offre.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p class=\"wp-block-paragraph\">Iniziamo quindi dalla dichiarazione del tipo:<\/p>\n\n\n\n<pre class=\"wp-block-cedaro-code line-numbers\"><code class=\"\">Type Dizionario\n    Chiave          As String\n    Valore          As String\nEnd Type<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Banale, vero ?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Semplicemente un&#8217;accoppiata Chiave\/Valore, tipica dei Dizionari.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Come tutti &#8211; o quasi &#8211; i Dizionari &#8211; che conosco io &#8211; la mia implementazione ha le seguenti caratteristiche:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>Le chiavi sono <strong>Case Sensitive<\/strong>; una chiave di nome &#8220;pippo&#8221; \u00e8 diversa da &#8220;Pippo&#8221;, tanto per intenderci.<\/li><li>Non \u00e8 possibile aggiungere pi\u00f9 volte la medesima chiave (salvo non abbia minuscole\/MAIUSCOLE diverse, appunto, vedi regola [1]).<\/li><li>Le chiavi sono nell&#8217;ordine con le quali vengono inserite.<\/li><li>\u00c8 possibile modificare i valori delle chiavi.<\/li><li>\u00c8 possibile eliminare le chiavi.<\/li><li>Il valore delle chiavi \u00e8 una stringa; nulla per\u00f2 vi impedisce di modificare la mia implementazione e utilizzare qualsiasi altra cosa il linguaggio consenta.<\/li><\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Ok, veniamo alla funzione che serve per modificare il dizionario (Aggiungere, Modificare e Togliere chiavi):<\/p>\n\n\n\n<pre class=\"wp-block-cedaro-code line-numbers\"><code class=\"\">Sub DizionarioModifica( _\n    vDizionario() As Dizionario, _\n    sChiave As String, _\n    sValore As String, _\n    Optional bModifica As Boolean = False, _\n    Optional bElimina As Boolean = False)\n    Dim lDictSize   As Long: lDictSize = 0\n    Dim lIndex      As Long: lIndex = 0\n    \n    If sChiave = \"\" _\n    And bElimina = False Then Exit Sub\n    \n    On Error Resume Next\n    lDictSize = UBound(vDizionario)\n    \n    If lDictSize = 0 Then\n        If bElimina = True Then Exit Sub\n        \n        lDictSize = 1\n        ReDim Preserve vDizionario(lDictSize)\n        vDizionario(lDictSize - 1).Chiave = sChiave\n        vDizionario(lDictSize - 1).Valore = sValore\n    Else\n        ' PRIMA SI ACCERTA CHE LA CHIAVE NON SIA GIA' PRESENTE.\n        For lIndex = 0 To lDictSize\n            If vDizionario(lIndex).Chiave = sChiave Then\n                If bElimina = True Then\n                    If lIndex &lt; lDictSize - 1 Then\n                        vDizionario(lIndex).Chiave = vDizionario(lIndex + 1).Chiave\n                        vDizionario(lIndex).Valore = vDizionario(lIndex + 1).Valore\n                        sChiave = vDizionario(lIndex + 1).Chiave\n                    Else\n                        lDictSize = lDictSize - 2\n                    End If\n                Else\n                    If bModifica = False Then Exit Sub\n                    \n                    vDizionario(lIndex).Valore = sValore\n                    Exit Sub\n                End If\n            End If\n        Next\n        \n        lDictSize = lDictSize + 1\n        \n        ReDim Preserve vDizionario(lDictSize)\n        If bElimina = True Then Exit Sub\n        vDizionario(lDictSize - 1).Chiave = sChiave\n        vDizionario(lDictSize - 1).Valore = sValore\n    End If\nEnd Sub<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">La sub-routine &#8220;DizionarioModifica&#8221; accetta nell&#8217;ordine l&#8217;<em>array dizionario<\/em>, la <em>chiave<\/em> da gestire, l&#8217;eventuale <em>valore<\/em> e, opzionalmente, i flag booleani <em>bModifica<\/em> e <em>bElimina<\/em> che servono rispettivamente per abilitare la modifica del valore o l&#8217;eliminazione della chiave.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dopodich\u00e9 abbiamo la funzione per cercare una chiave all&#8217;interno del dizionario:<\/p>\n\n\n\n<pre class=\"wp-block-cedaro-code line-numbers\"><code class=\"\">Function DizionarioCerca( _\n    vDizionario() As Dizionario, _\n    sChiave As String, _\n    ByRef sValore As String) As Boolean\n    DizionarioCerca = False\n    Dim lDictSize   As Long: lDictSize = 0\n    Dim l As Long\n    \n    On Error Resume Next\n    lDictSize = UBound(vDizionario)\n    \n    If lDictSize = 0 Then Exit Function\n    \n    For l = 0 To UBound(vDizionario) - 1\n        If vDizionario(l).Chiave = sChiave Then\n            sValore = vDizionario(l).Valore\n            DizionarioCerca = True\n            Exit Function\n        End If\n    Next l\nEnd Function<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Questa funzione &#8220;DizionarioCerca&#8221; ritorna un valore booleano <strong>True<\/strong> se ha successo, altrimenti, <strong>False<\/strong>; la ricerca prevede che venga passato l&#8217;<em>array del dizionario<\/em>, la <em>chiave da cercare<\/em> e una <em>variabile contenitore stringa<\/em> che ha il compito di ricevere l&#8217;eventuale valore individuato.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Perdonatemi, non consente di sapere se c&#8217;\u00e8 una o pi\u00f9 chiavi che hanno un determinato valore: per i miei scopi la cosa non serviva e non l&#8217;ho implementata. Ma, prendendo spunto, non credo sar\u00e0 troppo difficile colmare la cosa.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Incollo un codice di test che ho usato per verificare tutto funzionasse come previsto:<\/p>\n\n\n\n<pre class=\"wp-block-cedaro-code line-numbers\"><code class=\"\">Sub test()\n    Dim vDizionario() As Dizionario\n    Dim sValore As String\n    \n    If DizionarioCerca( _\n        vDizionario, _\n        \"sChiave\", _\n        sValore) = False Then\n        Debug.Print \"Chiave non trovata.\"\n    Else\n        Debug.Print \"sValore = \" &amp; sValore\n    End If\n    \n    DizionarioModifica vDizionario, \"sChiave\", \"sValore\"\n    DizionarioModifica vDizionario, \"sChiave\", \"sValore\"\n    DizionarioModifica vDizionario, \"sChiave\", \"sValore1\", True\n    DizionarioModifica vDizionario, \"sChiave2\", \"sValore1\", True\n    DizionarioModifica vDizionario, \"sChiave2\", \"sValore2\", True\n    DizionarioModifica vDizionario, \"sChiave3\", \"sValore3\"\n    DizionarioModifica vDizionario, \"sChiave3\", \"sValore4\"\n    DizionarioModifica vDizionario, \"sChiave\", \"sValore\", True, True\n    DizionarioModifica vDizionario, \"sChiave\", \"sValore\"\n    DizionarioModifica vDizionario, \"sChiave3\", \"sValore\", True\n    \n    Dim l As Long\n    For l = 0 To UBound(vDizionario) - 1\n        Debug.Print vDizionario(l).Chiave &amp; \" = \" &amp; vDizionario(l).Valore\n    Next l\n    \n    If DizionarioCerca( _\n        vDizionario, _\n        \"sChiave2\", _\n        sValore) = False Then\n        Debug.Print \"Chiave non trovata.\"\n    Else\n        Debug.Print \"sValore = \" &amp; sValore\n    End If\n    If DizionarioCerca( _\n        vDizionario, _\n        \"sChiave4\", _\n        sValore) = False Then\n        Debug.Print \"Chiave non trovata.\"\n    Else\n        Debug.Print \"sValore = \" &amp; sValore\n    End If\n    Debug.Print \"END\"\nEnd Sub\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>No, non si tratta dell&#8217;oggetto Scripting.Dictionary &#8211; del quale, peraltro, vi consiglio l&#8217;uso, se potete &#8211; il cui utilizzo \u00e8 ampiamente documentato in rete ma, bens\u00ec, una mia ristrettissima implementazione. In pratica, senza dover caricare librerie aggiuntive (operazione che mi sembra abbia una pessima portabilit\u00e0, tende a dare problemi appena si cambia PC con magari &hellip; <a href=\"https:\/\/www.budus.it\/Blog\/vba-gestione-di-un-dizionario\/\" class=\"more-link\">Leggi tutto<span class=\"screen-reader-text\"> &#8220;VBA: Gestione di un Dizionario&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[57,6],"tags":[242,167],"class_list":["post-1188","post","type-post","status-publish","format-standard","hentry","category-development","category-software","tag-vba","tag-visual-basic"],"_links":{"self":[{"href":"https:\/\/www.budus.it\/Blog\/wp-json\/wp\/v2\/posts\/1188","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.budus.it\/Blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.budus.it\/Blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.budus.it\/Blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.budus.it\/Blog\/wp-json\/wp\/v2\/comments?post=1188"}],"version-history":[{"count":2,"href":"https:\/\/www.budus.it\/Blog\/wp-json\/wp\/v2\/posts\/1188\/revisions"}],"predecessor-version":[{"id":1190,"href":"https:\/\/www.budus.it\/Blog\/wp-json\/wp\/v2\/posts\/1188\/revisions\/1190"}],"wp:attachment":[{"href":"https:\/\/www.budus.it\/Blog\/wp-json\/wp\/v2\/media?parent=1188"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.budus.it\/Blog\/wp-json\/wp\/v2\/categories?post=1188"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.budus.it\/Blog\/wp-json\/wp\/v2\/tags?post=1188"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}