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 :

Gestion d’erreur sur des recherches dans un tableau de variables (array)


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 124
    Points : 80
    Points
    80
    Par défaut Gestion d’erreur sur des recherches dans un tableau de variables (array)
    Lol !!

    Voici un classique probable

    Il s’agit de lancer des recherches sur toutes les chaines d’un tableau de variable

    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
    Sub testTableau2()  
     
    Dim i As Integer
    Dim tableau As Variant
     
    tableau = Array("tre", "ba", "erfge", "fgbfb", "ljffj", "gjhj") 'voici les chaînes concernées (au pif)
     
    Do
    Do
     
    MsgBox (tableau(i) & "=" & i)
     
           On Error GoTo erreur
     
           Cells.Find(What:=tableau(i), After:=ActiveCell, LookIn:=xlValues, _
           LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
           MatchCase:=False).Activate
    ‘ça bug ici
     
          MsgBox ("La recherche du mot   " & tableau(i) & " vient de fonctionner")
     
         i = i + 1
     
    Loop Until i = 6
     
    erreur:
     
         MsgBox ("La recherche du mot   " & tableau(i) & " a échouer")
     
         i = i + 1
    Loop Until i = 6
     
    End Sub
    Avec le message « Variable objet non définie » si la recherche échoue plus de 2 fois .
    Je pense qu’il faut que je définisse une nouvelle variable objet avec dim
    Suivi d’un Set pour référencer .(Incroyable n’est-ce-pas ? )

    Le problème est que je comprend mal la philosophie d’excel .Je ne sais jamais définir un objet parce qu’il y en a trop (pareil pour les propriétes) .J’en connais quelques un(e) et c’est tout .
    Et au final c’est toujours sur le même style de bug que je tombe

    Merci d’éclairer ma lanterne ….

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 514
    Points : 824
    Points
    824
    Par défaut
    Bonsoir,

    Si Find trouve une cellule correspondante aux critères Find renvoie cette cellule c'est a dire un objet. Dans le cas contraire Find renvoie la valeur Nothing c'est a dire le contenu d'une variable objet(de quelque type que ce soit) qui n'a pas ete initialise avec Set.

    Si Find ne trouve rien l'instruction:

    Cells.Find(criteres).Activate

    Equivaut donc a:

    Nothing.Activate

    D'ou l'erreur.

    Tu peux effectuer ta recherche de la manière suivante:

    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
    Sub TestTableau3()
        Dim i As Integer, tableau As Variant, Result As Range
        tableau = Array("tre", "ba", "erfge", "fgbfb", "ljffj", "gjhj") 'voici les chaînes concernées (au pif)
     
        For i = LBound(tableau) To UBound(tableau)
            Set Result = Cells.Find(What:=tableau(i), After:=ActiveCell, LookIn:=xlValues, _
                LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)
            If Not Result Is Nothing Then
                Result.Activate
                MsgBox ("La recherche du mot   " & tableau(i) & " vient de fonctionner")
            Else
                MsgBox ("La recherche du mot   " & tableau(i) & " vient de fonctionner")
            End If
            Set Result = Nothing
        Next
    End Sub

    Vois tu la lumière?

    Cordialement,

    Tirex28/

  3. #3
    Expert éminent

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Points : 9 197
    Points
    9 197
    Par défaut
    @tirex
    On peut faire une boucle for each aussi, ce qui simplifie la lecture puisqu'on évite les ubound/lbound

    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
    Sub TestTableau3()
        Dim x As Variant
        Dim tableau As Variant
        Dim Result As Range
        tableau = Array("tre", "ba", "erfge", "fgbfb", "ljffj", "gjhj") 'voici les chaînes concernées (au pif)
     
        For each x in tableau
            Set Result = Cells.Find(What:=tableau(i), After:=ActiveCell, LookIn:=xlValues, _
                LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)
            If Not Result Is Nothing Then
                Result.Activate
                MsgBox ("La recherche du mot   " & tableau(i) & " vient de fonctionner")
            Else
                MsgBox ("La recherche du mot   " & tableau(i) & " vient de fonctionner")
            End If
            Set Result = Nothing
        Next
    End Sub

    @aA189
    Deux petits trucs très utiles :
    F1 : tu peux utiliser F1 sur n'importe quel mot connu du langage. Par exemple, tu essaie d'utiliser Find. un clic sur Find, puis F1.
    Lorsque l'aide apparait, il te faut t'astreindre à la lire. En effet, c'est dedans que tout se trouve. Et particulièrement dans les paragraphes "Remarques" ou "Notes"
    F2 : tu as des problèmes avec les Propriétés / Objets / ... ?
    Reprenons l'exemple de Find. Tu veux savoir ce qu'on peut faire avec Find. Quelles méthodes/Propriétés on peut mettre.
    F2
    En haut à gauche, tu choisis la bibliothèque Excel
    En dessous, tu écris Find (Valide avec Entrée]
    Tu vois apparaitre le mot Find dans la liste en dessous (Excel ---Range---Find)
    Un clic dessus te le retrouve dans l'arborescence des objets (les deux colonnes en dessous.
    Tu as toujours accès à l'aide.
    Mais tu vois immédiatement qu'il s'agit d'une méthode (logo) d'un objet Range, et la définition de la syntaxe (immédiatement en dessous) t'indique qu'il renvoie un objet Range.
    Si tu veux en obtenir l'aide, tu recommence avec le F1, direcctement depuis cette fenêtre.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 124
    Points : 80
    Points
    80
    Par défaut
    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
    Sub TestTableau3()
        Dim i As Integer
        Dim x As Variant
        Dim tableau As Variant
        Dim Result As Range
        tableau = Array("tre", "ba", "erfge", "fgbfb", "ljffj", "gjhj") 'voici les chaînes concernées (au pif)
     
        For Each x In tableau
            Set Result = Cells.Find(What:=tableau(i), After:=ActiveCell, LookIn:=xlValues, _
                LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)
            If Not Result Is Nothing Then
                Result.Activate
                MsgBox ("La recherche du mot   " & tableau(i) & "a reussi")
            Else
                MsgBox ("La recherche du mot   " & tableau(i) & " a échouer")
            End If
            Set Result = Nothing
        Next
    End Sub
    ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set Result = Cells.Find(What:=tableau(i), After:=ActiveCell, LookIn:=xlValues, _
                LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)
    Non ! La méthode “Cells” de l’objet global a échoué ! Avec un set de poser je ne vois jamais la lumière ….

    “If Not Result Is Nothing” .J’aurais pas penser à ça tout seul (tordu d’aller chercher le contraire)

    if Result = Nothing then ….. end if
    est plus simple et spontané mais ne marche pas

  5. #5
    Expert éminent

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Points : 9 197
    Points
    9 197
    Par défaut
    c'est pas "=" mais "Is" puisqu'il s'agit d'objet et que tu veut savoir "s'il est de nature"

  6. #6
    Membre éclairé

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 514
    Points : 824
    Points
    824
    Par défaut
    Bonjour,

    @Maxence

    Tout a fait d'accord, par habitude je n'utilise For Each que pour les collections et pas pour les tableaux.

    @A189

    Désolé j'ai oublié la gestion de l'erreur eventuelle comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    On Error Resume Next
            Set Result = Cells.Find(What:=tableau(i), After:=ActiveCell, LookIn:=xlValues, _
                LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)
    On Error GoTo 0
    Bon weekend,

    Tirex28

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 124
    Points : 80
    Points
    80
    Par défaut

    Merci à tout les deux .

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 08/08/2012, 14h52
  2. Réponses: 12
    Dernier message: 05/06/2012, 10h36
  3. [XL-97] Rechercher des valeurs dans un tableau
    Par PIEPLU dans le forum Excel
    Réponses: 2
    Dernier message: 25/04/2012, 14h53
  4. Réponses: 7
    Dernier message: 09/02/2009, 14h28
  5. Réponses: 9
    Dernier message: 04/04/2007, 11h16

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