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 :

Macro dont la deuxième exécution ne fonctionne pas [XL-365]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    ""
    Inscrit en
    Mai 2019
    Messages
    201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : ""

    Informations forums :
    Inscription : Mai 2019
    Messages : 201
    Par défaut Macro dont la deuxième exécution ne fonctionne pas
    Bonjour le forum

    Je rencontre un soucis que je ne parviens pas le résoudre.

    J'ai repris une macro que j'avais dans un autre fichier et qui me permettait de masquer des lignes selon le contenu d'une cellule de la ligne.

    Je parviens à exécuter la macro modifiée pour supprimer la ligne.
    Mais si je dupplique la macro, ça ne fonctionne plus. (ça me dit la méthode 'Union' de l'objet '_Global a échoué puis Set p = Union(p, cel.MergeArea) est surligné à la ligne 29)
    Note: dans le fichier initial, la cellule de test pouvait être fusionnée. Ce n'est plus le cas dans ce fichier, plus de cellules fusionnées

    la macro en question :
    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
    Dim p As Range, plage As Range
     
           numcol = Application.IfError(Application.Match("Code OF", Rows(1), 0), 0)
            If numcol > 0 Then
              Set plage = Columns(numcol)
            Else
              MsgBox "Erreur : Pas de colonne 'Code OF'"
              Exit Sub
            End If
                With plage
                  For Each cel In plage.Cells
                     If cel = "AD-DEBUT" Or cel = "HNONP" Then If p Is Nothing Then Set p = cel Else Set p = Union(p, cel.MergeArea)
                  Next
                End With
             p.EntireRow.Delete
     
      Sheets("Temps salariés").Select
        Range("A2").Select
     
               numcol = Application.IfError(Application.Match("Salarié (code)", Rows(1), 0), 0)
    If numcol > 0 Then
       Set plage = Columns(numcol)
    Else
       MsgBox "Erreur : Pas de colonne 'Salarié (code)'"
       Exit Sub
    End If
        With plage
            For Each cel In plage.Cells
                If cel = "MACHINSEUL" Then If p Is Nothing Then Set p = cel Else Set p = Union(p, cel.MergeArea)
            Next
        End With
      p.EntireRow.Delete
     
      Sheets("Temps salariés").Select
        Range("A2").Select
     
               numcol = Application.IfError(Application.Match("Salarié (code)", Rows(1), 0), 0)
    If numcol > 0 Then
       Set plage = Columns(numcol)
    Else
       MsgBox "Erreur : Pas de colonne 'Salarié (code)'"
       Exit Sub
    End If
        With plage
            For Each cel In plage.Cells
                If cel <> "MACHINSEUL" Then If p Is Nothing Then Set p = cel Else Set p = Union(p, cel.MergeArea)
            Next
        End With
      p.EntireRow.Delete
    Si quelqu’un saurait m'aider à corriger la macro

  2. #2
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 241
    Par défaut
    Bonjour,

    Dans que vaut "p"? Avant le premier For ...Next, Ne manquerait-il pas la recherche de ce fameux "p"?

    Cdlt

  3. #3
    Membre confirmé
    Homme Profil pro
    ""
    Inscrit en
    Mai 2019
    Messages
    201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : ""

    Informations forums :
    Inscription : Mai 2019
    Messages : 201
    Par défaut
    Bonjour Arturo, merci de ton aide,

    Je ne sais pas, en tout cas la macro de base semble ne pas le définir en amont non plus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub Masquer_D()
        Dim p As Range, plage As Range
        Application.ScreenUpdating = False
        Set plage = Range("Descriptif!N1:N250")
        With plage
            For Each cel In plage.Cells
                If cel = "0" Then If p Is Nothing Then Set p = cel Else Set p = Union(p, cel.MergeArea)
            Next
        End With
     p.EntireRow.Hidden = True 'ligne a débloquer
     Application.ScreenUpdating = True
    End Sub
    Et cette macro fonctionne parfaitement

  4. #4
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 241
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set plage = Columns(numcol)
    plage = la colonne entière, mais vos données ne prennent pas toute la colonne, Non?
    définissez une plage avec une adresse de début et de fin

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2010
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 194
    Par défaut
    Bonjour le file,

    voir mes commentaires dans le code:

    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
    Dim p As Range, plage As Range
     
           numcol = Application.IfError(Application.Match("Code OF", Rows(1), 0), 0) '<-- numcol Non dimensionné !
            If numcol > 0 Then
              Set plage = Columns(numcol) '<-- Plage est dimensionné à Range et vous lui donnez un objet Column !
            Else
              MsgBox "Erreur : Pas de colonne 'Code OF'"
              Exit Sub
            End If
                With plage
                  For Each cel In plage.Cells '<-- si on est ici et que VBA n'a rien dit c'est que la ligne "Set plage = Columns(numcol)" à été interprété comme une collection de Cells ou Ranges et comme plage est dimensionné à range cells ne sert à rien !!! De plus la variable Cel n'est elle pas dimensionné non plus !!!
                     If cel = "AD-DEBUT" Or cel = "HNONP" Then If p Is Nothing Then Set p = cel Else Set p = Union(p, cel.MergeArea) ' <-- "AD-DEBUT" et "HNONP c'est quoi ? des valeurs possible de cel ? non de non on spécifi la propriété de l'objet que l'on utilise !!!
                  Next
                End With
             p.EntireRow.Delete ' <-- ce n'est pas parce que le contenu de p est supprimé que p passe à nothing !!!
     
      Sheets("Temps salariés").Select
        Range("A2").Select
     
               numcol = Application.IfError(Application.Match("Salarié (code)", Rows(1), 0), 0)
    If numcol > 0 Then
       Set plage = Columns(numcol)
    Else
       MsgBox "Erreur : Pas de colonne 'Salarié (code)'"
       Exit Sub
    End If
        With plage
            For Each cel In plage.Cells
                If cel = "MACHINSEUL" Then If p Is Nothing Then Set p = cel Else Set p = Union(p, cel.MergeArea) 'Maintenant p est potentiellement pas à nothing mais pointant vers une plage qui n'existe plus !!!
            Next
        End With
      p.EntireRow.Delete
     
      Sheets("Temps salariés").Select
        Range("A2").Select
     
               numcol = Application.IfError(Application.Match("Salarié (code)", Rows(1), 0), 0)
    If numcol > 0 Then
       Set plage = Columns(numcol)
    Else
       MsgBox "Erreur : Pas de colonne 'Salarié (code)'"
       Exit Sub
    End If
        With plage
            For Each cel In plage.Cells
                If cel <> "MACHINSEUL" Then If p Is Nothing Then Set p = cel Else Set p = Union(p, cel.MergeArea)
            Next
        End With
      p.EntireRow.Delete
    Votre code fonctionne sur l'interpretation que VBA peu en faire ! Bref des variables non dimensionnées des objets mal utilisés, des propriétés d'objet non spécifiées... un vrais cocktail à erreur !!!

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

Discussions similaires

  1. [XL-2007] Macros qui cessent de s'exécuter
    Par fabal36 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 04/11/2013, 15h55
  2. La touche exécuter ne fonctionne pas
    Par MiiRou dans le forum Maple
    Réponses: 1
    Dernier message: 08/10/2011, 15h10
  3. [LV 2009] Mon exécutable ne fonctionne pas sous XP
    Par K-RK-S dans le forum LabVIEW
    Réponses: 6
    Dernier message: 25/08/2011, 15h13
  4. L'exécutable ne fonctionne pas sur un autre ordinateur
    Par alladum dans le forum Bases de données
    Réponses: 7
    Dernier message: 22/06/2009, 15h11
  5. Réponses: 6
    Dernier message: 14/05/2008, 16h46

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