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 :

Exécution macro selon présence ou non d'une valeur dans colonne [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 123
    Par défaut Exécution macro selon présence ou non d'une valeur dans colonne
    Bonjour

    J'ai créé un code qui permet
    > Atteindre une colonne nommée "Colonne_Nom"
    > Rechercher la cellule contenant le libellé "Nom3"
    > Selectionner la ligne entière
    > Appliquer le format "Standard" à toute la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub Macro3()
    'Atteindre Colonne
        Application.Goto Reference:="Colonne_Nom"
    'Recherche Nom
            Cells.Find(What:="Nom3", After:=ActiveCell, LookIn:=xlFormulas, LookAt _
            :=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
            True, SearchFormat:=False).Activate
    'Selection Ligne
        ActiveCell.EntireRow.Select
    'Format Cellule
        Selection.NumberFormat = "General"
    End Sub
    Tout fonctionne bien sauf que selon le tableau que j'importe, la cellule contenant le libellé "Nom3" n'existe pas forcément.
    Et alors dans ce cas ma macro est interrompue.

    Je suppose qu'il faut placer un "if" dans le code mais j'avoue ne pas connaître la procédure.
    D'avance merci pour votre aide.
    Cordialement.
    StSym

  2. #2
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    'soir !

    En fait c'est le cas typique de la mauvaise utilisation de la méthode Find avec un Activate pour conclure,
    certainement un code généré par l'Enregistreur de macros !
    Là le réflexe est de placer le curseur texte dans le code sur Find puis d'appuyer sur la touche
    et enfin corriger le code en suivant celui de l'exemple de l'aide (niveau débutant !) …

    ______________________________________________________________________________________________________
    Je suis Paris, Charlie, la Côte d'Ivoire, la Turquie, …

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 123
    Par défaut
    Bonsoir Marc-L

    Tout d'abord merci pour ta réponse rapide.

    En effet ma macro a été générée en partie par l'enregistreur.
    J'ai suivi ton conseil de passer par F1

    J'ai testé le code suivant proposé :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    With Worksheets(1).Range("a1:a500")
        Set c = .Find(2, lookin:=xlValues)
        If Not c Is Nothing Then
            firstAddress = c.Address
            Do
                c.Value = 5
                Set c = .FindNext(c)
            Loop While Not c Is Nothing And c.Address <> firstAddress
        End If
    End With
    Il fonctionne bien mais la macro s'arrête à

    "Loop While Not c Is Nothing And c.Address <> firstAddress"

    Je vais essayer de savoir pourquoi.

    Merci pour ton conseil et pour ton aide

    Cordialement.

    StSym

  4. #4
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    Coquille de l'aide ! Mais bon, en cherchant à comprendre la logique,
    ce n'est pas compliqué de corriger la ligne n°8 par Loop Until c.Address = firstAddress

    Dans ton cas tu as juste à tester si le résultat n'est pas vide pour modifier le format de la ligne :

    If Not c is Nothing Then c.EntireRow.NumberFormat = "General"

    Et oui, un bon code n'utilise pas ces affreux ralentisseurs d'Activate & Select !

    La variable c devant être déclarée en Range et être libérée à la fin si elle n'est pas vide par Set c = Nothing

    Sinon il y a aussi Application.Match correspondant à la fonction de feuille de calculs EQUIV (là voir l'aide d'Excel)
    affectée si besoin à une variable de type Variant et à tester avec IsError ou encore IsNumeric

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 123
    Par défaut
    Bonjour Marc-L

    Grâce à tes conseils, je suis arrivé à une solution qui fonctionne.
    Avec toutes les pistes que tu as citées, je vois que j'en ai encore beaucoup à explorer.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub NewTest02()
    Dim c As Range
    With Worksheets("Test").Range("Colonne_Nom")
        Set c = .Find("Nom3", LookIn:=xlValues)
            If Not c Is Nothing Then
                firstAddress = c.Address
                Do
                    If Not c Is Nothing Then c.EntireRow.NumberFormat = "General"
                    Set c = .FindNext(c)
                Loop Until c.Address = firstAddress
            End If
        Set c = Nothing
    End With
    End Sub
    Encore merci pour ton aide.
    Cordialement.
    StSym

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 02/09/2014, 09h56
  2. Exécution Macro au changement de largeur d'une colonne
    Par bravojr dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 20/09/2010, 14h22
  3. Performances variables selon présence ou non sur le réseau du PC ayant créé le report
    Par Gabriel.Entressangle dans le forum SAP Crystal Reports
    Réponses: 5
    Dernier message: 21/08/2007, 23h48
  4. [XSLT] Tester la non présence d'une valeur dans un fichier
    Par arnauann dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 23/01/2007, 15h29
  5. Réponses: 14
    Dernier message: 30/05/2006, 16h55

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