IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

tester présence objet avant accès par son nom


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 23
    Par défaut 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 141
    Par défaut La clé existe-t-elle dans la collection VBA ?
    Bonjour Jean-François :

    Citation Envoyé par jfchappuis Voir le message
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

    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 ci-dessous.

  3. #3
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 23
    Par défaut Merci
    MattChess, je vous remercie d'avoir construit la solution. Moi qui m'attendait à ce que quelqu'un m'indique une piste à suivre, je suis plus que comblé.

    C'est bête, mais il fallait tout simplement penser à créer sa propre routine de contrôle avec un Error resume Next dans cette routine.

    Merci encore de vos conseils.

    Jean-François

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 05/10/2013, 12h36
  2. Réponses: 2
    Dernier message: 24/11/2008, 10h53
  3. Appeler un objet crée dynamiquement par son nom
    Par gomit85 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 17/05/2008, 17h11
  4. Récupérer objet par son nom dans une chaîne
    Par peijnoob dans le forum C#
    Réponses: 7
    Dernier message: 14/02/2008, 16h47
  5. Recherche d'un objet 'window' par son nom
    Par herve91 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 14/02/2007, 16h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo