tester présence objet avant accès par son nom
Bonjour,
Dans le cadre de la mise à jour croisée de deux listes de pendances dans deux fichiers xls distincts (Master and Slave), je bute sur un problème.
Je liste mes pendances dans le Master et les met dans une collection d'objets personnalisés. La classe contient le no de ligne(property Row) ou se trouve la pendance et le numéro de la pendance (Property Key).
Ensuite, je parcours le Range XL des pendances dans le slave et je lis le no de ligne dans la collection des objets.
Code:
1 2 3 4 5 6 7 8 9 10 11
| With objPendenz
.FremdNr = rngSource.Cells(l, 9)
.Row = rngSource.Row
End With
collPendenz.Add objPendenz, objPendenz.FremdNr
....
lngMasterRow = collPendenz.Item(rngTarget.Cells(l, 2)).Row |
Mon problème est lorsque la pendance est supprimée du master, j'obtiens l'erreur d'exécution 5, ce qui est normal.
Existe-t-il un moyen de tester si un objet est présent dans la collection.
J'ai cherché dans les diverses méthodes et n'ai rien trouvé.
Il est clair que si aucun moyen n'existe, je suis bon pour adapter ma gestion d'erreurs et d'implémenter quelques étiquettes, ce que je voudrai éviter, l'erreur 5 étant suffisamment générique pour programmer quelques bon bugs.
Merci d'avance
La clé existe-t-elle dans la collection VBA ?
Bonjour Jean-François :
Citation:
Envoyé par
jfchappuis
Existe-t-il un moyen de tester si un objet est présent dans la collection.
- IsInCollection(collPendenz, strKey) est une solution générique non itérative pour tester si une clé existe dans la collection.
- GetPendenz(collPendenz, strKey) est une solution spécifique plus optimisée pour le contexte.
1. Module principal définissant MasterToSlave()
Ouvrir Excel. La feuille est vide. Ouvrir le Visual Basic Editeur (Alt+F11).
VBE menu "Insérer" > "Module"
Dans la fenêtre d'Edition de Module1, copier-coller :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| Option Explicit
Public Const indSheetMaster = 1 ' Source: Master
Public Const rowMasterPendenz = 1 ' le no de ligne
Public Const colMasterPendenz = 9 ' le numéro de la pendance (Property Key)
Public Const indSheetSlave = 2 ' Target: Slave
Public Const rowSlavePendenz = 1 ' le no de ligne
Public Const colSlavePendenz = 2 ' le numéro de la pendance
Function IsInCollection(ByVal collList As Collection, ByVal strKey As String) As Boolean
Dim lngRow As Integer, objItem As Object
On Error Resume Next
Set objItem = collList(strKey)
IsInCollection = Err.Number = 0
On Error GoTo 0
End Function
Function GetPendenz(ByVal collList As Collection, ByVal strKey As String) As Pendenz
On Error Resume Next
Set GetPendenz = collList(strKey)
If Err.Number <> 0 Then
Set GetPendenz = Nothing
End If
On Error GoTo 0
End Function
Sub MasterToSlave()
Dim objPendenz As Pendenz, pzObj As Pendenz, rngSource As Range, rngTarget As Range
Dim lngMasterRow As Integer, strKey As String, collPendenz As Collection
Set rngSource = Worksheets(indSheetMaster).Range("A1:A9")
Set rngTarget = Worksheets(indSheetSlave).Range("A1:A9")
Set objPendenz = New Pendenz
With objPendenz
.FremdNr = rngSource.Cells(rowMasterPendenz, colMasterPendenz)
.Row = rngSource.Row
End With
Set collPendenz = New Collection
collPendenz.Add objPendenz, key:=CStr(objPendenz.FremdNr)
' je parcours le Range XL des pendances dans le slave
strKey = CStr(rngTarget.Cells(rowSlavePendenz, colSlavePendenz))
If IsInCollection(collPendenz, strKey) Then ' Check if the key exists
' je lis le no de ligne dans la collection des objets
lngMasterRow = collPendenz(strKey).Row ' Second access
End If
Set pzObj = GetPendenz(collPendenz, strKey) ' Get the item at strKey
If Not pzObj Is Nothing Then ' Check if the item exists
lngMasterRow = pzObj.Row ' Direct access from the item
End If
collPendenz.Remove strKey ' Simulate the deletion of the Pendenz at strKey
Set objPendenz = Nothing
Set pzObj = GetPendenz(collPendenz, strKey)
If pzObj Is Nothing Then
Debug.Print "Cannot find the key " + strKey
End If
Set collPendenz = Nothing
End Sub |
2. Module de Classe définissant la classe Pendenz
VBE menu "Insérer" > "Module de Classe"
Renommez "Class1" en "Pendenz" et dans sa fenêtre d'Edition copier-coller :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| Option Explicit
Private m_FremdNr As Integer
Private m_Row As Integer
Public Property Get FremdNr() As Integer
FremdNr = m_FremdNr
End Property
Public Property Let FremdNr(ByVal value As Integer)
m_FremdNr = value
End Property
Public Property Get Row() As Integer
Row = m_Row
End Property
Public Property Let Row(ByVal value As Integer)
m_Row = value
End Property |
3. Feuilles Master et Slave
Dans cette maquette, on a deux feuilles dans le même .xls pour simplifier :
- "Master" en Worksheet 1 : Cells(1, 9) = 5 ' en I1
- "Slave" en Worksheet 2 : Cells(1, 2) = 5 ' même valeur numérique en B1.
4. Point d'arrêt dans MasterToSlave()
Dans la fenêtre d'Edition du Module1, mettre un point d'arrêt sur la première ligne de MasterSlave() :
Code:
Set rngSource = Worksheets(indSheetMaster).Range("A1:A9")
5. Test de MasterToSlave()
Dans la fenêtre d'Exécution immédiate (Ctlr+G) du VBE, copier-coller et valider par ENTER :
Cannot find the key 5
6. Debug de MasterToSlave()
Avancez en pas à pas détaillé (F8) [Step Into].
On passera dans la partie Then de chacun des trois If suivants :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| ' je parcours le Range XL des pendances dans le slave
strKey = CStr(rngTarget.Cells(rowSlavePendenz, colSlavePendenz))
If IsInCollection(collPendenz, strKey) Then ' Check if the key exists
' je lis le no de ligne dans la collection des objets
lngMasterRow = collPendenz(strKey).Row ' Second access
End If
Set pzObj = GetPendenz(collPendenz, strKey) ' Get the item at strKey
If Not pzObj Is Nothing Then ' Check if the item exists
lngMasterRow = pzObj.Row ' Direct access from the item
End If
collPendenz.Remove strKey ' Simulate the deletion of the Pendenz at strKey
Set objPendenz = Nothing
Set pzObj = GetPendenz(collPendenz, strKey)
If pzObj Is Nothing Then
Debug.Print "Cannot find the key " + strKey
End If |
___________
Si la discussion est résolue, vous pouvez cliquer sur le bouton :resolu:
En bas de ce message s'il vous a apporté des éléments de réponse pertinents, pensez également à voter en cliquant sur le bouton vert http://www.developpez.net/forums/ima.../vote1left.gif ci-dessous.