2011-09-26 20 views
8

Sono sorpreso di quanto sia stato difficile farlo, ma immagino sia una soluzione rapida, quindi chiederò qui (ricerche su google e documentazione ma nessuna delle due ha aiutato). Ho del codice che aggiunge elementi a una collezione usando le chiavi. Quando mi imbatto in una chiave che esiste già nella collezione, voglio semplicemente impostarla aggiungendo un numero al valore corrente.Impostazione della proprietà Item di una raccolta in VBA

Ecco il codice:

If CollectionItemExists(aKey, aColl) Then 'If key already has a value 
    'add value to existing item 
    aColl(aKey).Item = aColl(aKey) + someValue 
Else 
    'add a new item to the collection (aka a new key/value pair) 
    mwTable_ISO_DA.Add someValue, aKey 
End If 

La prima volta che aggiungo la coppia chiave/valore nella collezione, sto aggiungendo un numero intero come valore. Quando mi imbatto nuovamente nella chiave, cerco di aggiungere un altro numero intero al valore, ma questo non funziona. Non penso che il problema risieda in alcun tipo di disadattamento dell'oggetto o qualcosa di simile. Il messaggio di errore che attualmente ottengo è

Runtime Error 424: oggetto richiesto

+0

Questa risposta a una domanda precedente e correlata dovrebbe anche rispondere alla tua domanda: http://stackoverflow.com/questions/5709444/modify-value-by-key/5710063 # 5710063. La versione breve è che le raccolte non funzionano come gli array; non puoi riassegnare un "elemento". Le risposte che altri ti hanno già dato sono buoni modi alternativi per ottenere quello che vuoi. – jtolle

risposta

12

Non puoi modificare i valori una volta che sono stati aggiunti a una raccolta. Quindi questo non è possibile:

aColl.Item(aKey) = aColl.Item(aKey) + someValue 

Invece, si può prendere l'oggetto di raccolta, modificare il suo valore, e aggiungerlo indietro.

temp = aColl.Item(aKey) 
aColl.Remove aKey 
aColl.Add temp + someValue, aKey 

Questo è un po 'noioso, ma posizionare queste tre linee in un Sub e tutto è pronto.

Le raccolte sono più amichevoli quando vengono utilizzate come contenitori per oggetti (al contrario di contenitori per variabili "primitive" come intero, doppio, ecc.). Non è possibile modificare il riferimento all'oggetto contenuto nella raccolta, ma è possibile manipolare l'oggetto collegato a tale riferimento.

Su una nota a margine, penso che tu abbia frainteso la sintassi relativa a Item. Non puoi dire: aColl(aKey).Item. La sintassi corretta è aColl.Item(aKey) o, in breve, aColl(aKey) poiché Item è il metodo predefinito dell'oggetto Collection. Tuttavia, preferisco utilizzare la forma completa ed esplicita ...

0

Credo che è necessario rimuovere la coppia chiave-valore esistente e quindi aggiungere nuovamente il tasto per la collezione ma con il nuovo valore

8

Dictionaries sono più versatili e più efficienti rispetto a Collections. Se si è andato questo itinerario è possibile eseguire un semplice test sul Exists Dizionario direttamente sotto, e quindi aggiornare il valore della chiave

Patrick Matthews ha scritto un eccellente articolo sul dictionaries v collections

Sub Test() 
    Dim MyDict 
    Set MyDict = CreateObject("scripting.dictionary") 
    MyDict.Add "apples", 10 
    If MyDict.exists("apples") Then MyDict.Item("apples") = MyDict.Item("apples") + 20 
    MsgBox MyDict.Item("apples") 
End Sub 
+1

Il dizionario è migliore della raccolta per tutto tranne una cosa: il dizionario non conserva l'ordine. Nella maggior parte delle mie applicazioni, l'ordine * è * importante; Sono stato fregato una o due volte dal Dizionario per questo! –

Problemi correlati