Créer un dictionnaire de listes dans vba
J'ai travaillé en Python antérieures où il est vraiment bon d'avoir un dictionnaire de listes (c'est à dire une clé correspond à une liste de trucs). J'ai du mal à réaliser la même chose en vba. Dire que j'ai les données suivantes dans une feuille excel:
Flanged_connections 6
Flanged_connections 8
Flanged_connections 10
Instrument Pressure
Instrument Temperature
Instrument Bridle
Instrument Others
Piping 1
Piping 2
Piping 3
Maintenant je veux lire les données et de les stocker dans un dictionnaire dont les clés sont Flanged_connections
Instrument
et Piping
et les valeurs sont celles qui leur correspondent dans la deuxième colonne. Je veux que les données à ressembler à ceci:
'key' 'values':
'Flanged_connections' '[6 8 10]'
'Instrument' '["Pressure" "Temperature" "Bridle" "Others"]'
'Piping' '[1 2 3]'
et ensuite être en mesure d'obtenir la liste en faisant dict.Item("Piping")
avec la liste [1 2 3]
comme résultat. J'ai donc commencé à penser à faire quelque chose comme:
For Each row In inputRange.Rows
If Not equipmentDictionary.Exists(row.Cells(equipmentCol).Text) Then
equipmentDictionary.Add row.Cells(equipmentCol).Text, <INSERT NEW LIST>
Else
equipmentDictionary.Add row.Cells(equipmentCol).Text, <ADD TO EXISTING LIST>
End If
Next
Cela semble un peu fastidieux à faire. Est-il une meilleure approche? J'ai essayé de chercher de l'aide de tableaux en vba et il semble un peu différente de celle de java, c++ et python, avec stuft comme redim preserve
et l'aime. Est-ce le seul moyen de travailler avec des tableaux en vba?
Ma solution:
@Varocarbas' commentaire que j'ai créé un dictionnaire de collections. C'est la façon la plus simple à mon esprit pour comprendre ce qu'il se passe, même si cela peut ne pas être la plus efficace. Les autres solutions serait probablement travailler aussi bien (pas testé par moi). C'est ma proposition de solution et il offre la sortie appropriée:
'/--------------------------------------\'
'| Sets up the dictionary for equipment |'
'\--------------------------------------/'
inputRowMin = 1
inputRowMax = 173
inputColMin = 1
inputColMax = 2
equipmentCol = 1
dimensionCol = 2
Set equipmentDictionary = CreateObject("Scripting.Dictionary")
Set inputSheet = Application.Sheets(inputSheetName)
Set inputRange = Range(Cells(inputRowMin, inputColMin), Cells(inputRowMax, inputColMax))
Set equipmentCollection = New Collection
For i = 1 To inputRange.Height
thisEquipment = inputRange(i, equipmentCol).Text
nextEquipment = inputRange(i + 1, equipmentCol).Text
thisDimension = inputRange(i, dimensionCol).Text
'The Strings are equal - add thisEquipment to collection and continue
If (StrComp(thisEquipment, nextEquipment, vbTextCompare) = 0) Then
equipmentCollection.Add thisDimension
'The Strings are not equal - add thisEquipment to collection and the collection to the dictionary
Else
equipmentCollection.Add thisDimension
equipmentDictionary.Add thisEquipment, equipmentCollection
Set equipmentCollection = New Collection
End If
Next
'Check input
Dim tmpCollection As Collection
For Each key In equipmentDictionary.Keys
Debug.Print "--------------" & key & "---------------"
Set tmpCollection = equipmentDictionary.Item(key)
For i = 1 To tmpCollection.Count
Debug.Print tmpCollection.Item(i)
Next
Next
Noter que cette solution suppose que tous les équipements sont triés!
source d'informationauteur Krøllebølle
Vous devez vous connecter pour publier un commentaire.
Tableaux en VBA sont plus ou moins, comme partout ailleurs, avec diverses particularités:
Sheets
tableau dans un Classeur) sont 1. Bien que, comme l'a justement souligné par @TimWilliams, défini par l'utilisateur des tableaux sont en fait basée sur 0. Le tableau ci-dessous définit un tableau de chaîne d'une longueur de 11 (10 indique la position supérieure).Autre que cela et les particularités concernant les notations, vous ne trouverez pas de problème avec VBA tableaux.
Sujet de ce que vous demandez, vous pouvez créer un dictionnaire en VBA et inclure une liste (ou le VBA équivalent:
Collection
), vous avez ici un exemple de code:Vous pouvez avoir des dictionnaires dans les dictionnaires. Pas besoin d'utiliser des tableaux ou des collections, sauf si vous avez un besoin spécifique.
Je ne suis pas familier avec le C++ et Python (été un long temps), donc je ne peux pas vraiment parler des différences avec VBA, mais je peux dire que le fait de travailler avec des Tableaux en VBA n'est pas particulièrement compliqué.
Dans mon humble avis, la meilleure façon de travailler avec des tableaux dynamiques dans VBA est à la Dimension d'un grand nombre, et de la réduire lorsque vous avez fini d'ajouter des éléments. En effet, Redim Preserve, où vous redimensionner le tableau tout en sauvegardant les valeurs, a une ÉNORME incidence sur les performances. Vous ne devez JAMAIS utiliser Redim Preserve à l'intérieur d'une boucle, l'exécution serait lente et douloureuse
Adapter le morceau de code suivant, donné à titre d'exemple: