Spiegazioni sulluso di Dictionary
Hai un problema con Excel? 
di scossa (utente non iscritto) data: 16/04/2014 22:23:11
cit. lepat: "... non riesco a capire la linea If e <> "" Then dic(e) = dic(e) + 1 "
Non so se ho capito bene qual'è il tuo dubbio, comunque ci provo.
Intanto bisogna precisare che la sintassi dic(e) è la forma abbreviata di dic.item(e)
L'istruzione
- - se la chiave e non esiste nel dizionario, allora viene aggiunta ed il valore del rispettivo item viene incrementato di 1
- - se la chiave e esiste già nel dizionario, allora il valore del rispettivo item viene incrementato di 1
Ricordo che, in un oggetto della classe Dictionary, la chiave (key) è univoca.
| scossa's web site |
Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw) |
di scossa data: 16/04/2014 22:31:20
Esprimo meglio:
L'istruzione opera in due modi diversi, in dipendenza dell'esistenza o meno della chiave nel dizionario:
- - se la chiave e non esiste nel dizionario, allora la chiave viene aggiunta ed il valore del rispettivo item viene incrementato di 1
- - se la chiave e esiste già nel dizionario, allora il valore del rispettivo item viene incrementato di 1
| scossa's web site |
Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw) |
di lepat (utente non iscritto) data: 17/04/2014 07:40:47
grazie scossa, già la precisazione che la sintassi dic(e) è la forma abbreviata di dic.item(e) mi chiarisce un po' di più, comunque duro fatica a capire completamente, è possibile riscrivere il codice in modo meno compatto ma più comprensibile ? possono essere usate alternative al metodo item ?
di scossa data: 17/04/2014 09:30:30
cit. lepat: " ... è possibile riscrivere il codice in modo meno compatto ma più comprensibile ?"
Premessa: al contrario della classe Collection per la quale la chiave è facoltativa, nella classe Dictionary la chiave è obbligatoria, quindi non possono esserci valori duplicati.
Questo significa che se si applica il metodo .Add per aggiungere una chiave, bisogna preventivamente sincerarsi che quellla chiave non esista già.
Il codice sotto dovrebbe essere sufficientemente "prolisso":
| scossa's web site |
Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw) |
Sub conta2() ' nel foglio 1
Dim myDir As String, fn As String, dic As Object
Dim a As Variant, e As Variant
Set dic = CreateObject("Scripting.Dictionary")
dic.CompareMode = TextCompare
With Sheets(1)
a = .Range("a1", .Range("a" & Rows.Count).End(xlUp)).Value
End With
If IsArray(a) Then
For Each e In a
If e <> "" Then
If Not dic.Exists(e) Then 'se la chiave e non esiste già
dic.Add Key:=e, Item:=0 'aggiungi un elemento a Dic con key e ed item 0
End If
dic.Item(e) = dic.Item(e) + 1 'se la chiave esiste assegna all'item con chiave e un nuovo valore
End If
Next
End If
Sheets(1).Cells(3).Resize(dic.Count, 2).Value = _
Application.Transpose(Array(dic.keys, dic.Items))
Set dic = Nothing
End Sub
|
di Grograman (utente non iscritto) data: 17/04/2014 10:58:02
Non so a cosa mai potrà servirmi, ma mi sto studiando i vostri codici
Sopratutto perchè ho visto che la mia libreria preferita ha al suo interno l'oggetto "Dictionary"
Devo solo capire bene come utilizzare/distinguere items e keys
Sub Conta_Library()
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''''' ATTENZIONE RICHIEDE L'ATTIVAZIONE DELLA LIBRERIA MICROSOFT SCRIPTING RUNTIME '''''
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'' Per l'attivazione andare su "Strumenti", "Riferimenti", cercare e spuntare il nome ''
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Dim oDic As Dictionary
Dim vDati As Variant, vEl As Variant
Set oDic = New Dictionary
With Worksheets(1)
vDati = .Range("a1", .Range("a" & .Rows.Count).End(xlUp)).Value
End With
With oDic
.CompareMode = TextCompare 'h t t p :/ /ms dn. mic rosoft.com/ en-us /library/office/gg278481(v=office.15).aspx
For Each vEl In vDati
If vEl <> "" Then
If Not .Exists(vEl) Then
.Add vEl, 0
End If
.Item(vEl) = .Item(vEl) + 1
End If
Next vEl
Worksheets(1).Cells(1, 3).Resize(.Count, 1) = Application.Transpose(.Keys)
Worksheets(1).Cells(1, 4).Resize(.Count, 1) = Application.Transpose(.Items)
End With
Set oDic = Nothing
End Sub |
di lepat (utente non iscritto) data: 17/04/2014 12:22:35
grazie scossa, ci avevo provato anch'io ma mi mancava
dic.Item(e) = dic.Item(e) + 1 |
di lepat (utente non iscritto) data: 17/04/2014 12:29:42
cit.
Non so a cosa mai potrà servirmi .....
l'uso di dictionary non è essenziale, ma ma se provi a risolvere in altro modo ti accorgi che ti occorre un codice più lungo, il problema è che non è proprio un metodo intuitivo.
di Grograman (utente non iscritto) data: 17/04/2014 13:26:17
Quindi tu lo usi ad esempio in sostituzione di una collection per avere un elenco univoco?
Ad esempio per alimentare combobox e simili?
di scossa data: 17/04/2014 13:52:53
cit.: "Quindi tu lo usi ad esempio in sostituzione di una collection per avere un elenco univoco?"
Esatto, rispetto alla Collection è più performante, anche se - al contrario della classe Collection che è nativa - richiede un riferimento (early binding o late binding) alla libreria di Scripting.
| scossa's web site |
Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw) |
di Grograman (utente non iscritto) data: 17/04/2014 14:33:51
Grazie come al solito
A questo punto finisce dritto dritto nei codici degli appunti e alla prima occasione utile lo risplovero e riciclo!
Vuoi Approfondire?