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 :

Erreur 1004, mauvaise référence


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 8
    Par défaut Erreur 1004, mauvaise référence
    Bonjour, ceci est mon premier post sur ce forum et je débute tout juste en VBA

    Il y a un tableau Excel de plusieurs milliers de lignes généré manuellement via une base de données.
    Dans la 15ème colonne, les cellules sont soit vides, soit contiennent "Annul". Voilà ce que je cherche à faire :

    SI elles contiennent "Annul",[par exemple ligne 20] ALORS
    incrémenter une variable contenant le nombre d'annulations, qu'on affichera quand la macro aura parcouru tout le document.

    Je souhaite aussi supprimer toute la ligne contenant "Annul" ainsi que la ligne du dessous (sous certaines conditions), mais je ne sais pas le faire.

    Voilà ce que j'ai fait pour le moment, mais il y a des erreurs :
    "Erreur d'exécution '1004': Erreur définie par l'application ou par l'objet"

    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
    Sub supprimer_annulations()
     
        Dim classeur As String
        Dim feuille As String
        Dim ligne As Integer
        Dim nombredannul As Integer
     
        classeur = ActiveWorkbook.Name
        feuille = ActiveSheet.Name
        ligne = 0
        nombredannul = 0
     
        While Application.Workbooks(classeur).Worksheets(feuille).Cells(ligne, 1).Value <> ""
            ligne = ligne + 1
            If Application.Workbooks(classeur).Worksheets(feuille).Cells(ligne, 15) = "Annul" Then
                nombredannul = nombredannul + 1
            Else
                nombredannul = nombredannul
            End If
     
        Wend
     
        MsgBox nombredannul
     
     
    End Sub

    Voilà, si certains d'entre vous pouvaient m'aider ça erait très sympa

  2. #2
    Membre éprouvé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 78
    Par défaut
    surement car ligne = 0 , ya pas de ligne 0 sur excel fuat démarrer ligne à 1.

    un filtre sur ta colonne 15 directement c'est peut etre plus rapide pour ce que tu veux faire

  3. #3
    Membre Expert
    Inscrit en
    Septembre 2007
    Messages
    1 142
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 142
    Par défaut
    Bonjour,

    Comme ceci cela devrait fonctionner :
    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
    Sub supprimer_annulations()
     
        Dim classeur As String
        Dim feuille As String
        Dim ligne As Integer
        Dim nombredannul As Integer
     
        classeur = ActiveWorkbook.Name
        feuille = ActiveSheet.Name
        ligne = 1
        nombredannul = 0
        With Application.Workbooks(classeur).Worksheets(feuille)
           While .Cells(ligne, 1).Value <> ""
               ligne = ligne + 1
               If .Cells(ligne, 15) = "Annul" Then
                   nombredannul = nombredannul + 1
               End If
           Wend
        End With
        MsgBox nombredannul
     
     
    End Sub

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 8
    Par défaut
    Merci beaucoup à vous deux !
    En effet, il ne fallait pas commencer la ligne à 0, erreur de débutant

    Mais ça ne va toujours pas j'ai l'impression, la MsgBox m'affiche 168 alors que quand je filtre les cellules de la colonne 15 sur "Annul", je n'ai que 138 occurrences, idem quand je compte les cellules non vides en sélectionnant toute la colonne


    C'est vrai que je pourrai obtenir ça plus simplement qu'avec une macro, mais le but premier de la macro n'est pas de compter le nombre de lignes concernées mais de les supprimer, ainsi que celles immédiatement en dessous, sous certaines conditions (ce que je ne sais pas encore faire)

    Le comptage est juste un moyen de contrôler que la macro fonctionne correctement.



    Une idée de pourquoi la macro compte plus d' "Annul" que les filtres ?



    EDIT Le nombre d'annulations est correct j'avais un filtre...

    Merci pour votre aide en tous cas !

  5. #5
    Membre Expert
    Inscrit en
    Septembre 2007
    Messages
    1 142
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 142
    Par défaut
    Bonjour,

    Pour supprimer la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
               If .Cells(ligne, 15) = "Annul" Then
                   nombredannul = nombredannul + 1
                   Rows(ligne).delete
               End If
    Maintenant, si tu as des conditions, il faut savoir lesquelles pour les coder. ;-)

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 8
    Par défaut
    Bonjour Anasecu, merci de ta réponse !

    Les conditions pour supprimer cecs lignes ainsi que celle du dessus sont les suivantes :
    Les deux lignes doivent être rigoureusement identiques à l'exception de la colonne I (9), (qui contient des montants, dont je dois vérifier que l'un est l'opposé de l'autre).

    Si cette condition n'est pas respectée, alors les lignes concernées ne doivent pas être supprimées et apparaître en rouge.

    Voilà ce que j'ai pour le moment :

    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
    Sub supprimer_annulations()
     
        Dim classeur As String
        Dim feuille As String
        Dim ligne As Integer
        Dim nombredannul As Integer
     
        classeur = ActiveWorkbook.Name
        feuille = ActiveSheet.Name
        ligne = 1
        nombredannul = 0
     
        With Application.Workbooks(classeur).Worksheets(feuille)
     
            While .Cells(ligne, 1).Value <> ""
                ligne = ligne + 1
     
                If .Cells(ligne, 15) = "Annul" And .Cells(ligne, 9) = -.Cells(ligne - 1, 9) Then 'vérif que le montant passé en annulation est l'exact opposé du montant annulé
                    .Rows(ligne - 1).Delete 'suppression de la ligne au dessus de celle avec "Annul"
                    .Rows(ligne - 1).Delete 'suppression de la ligne "Annul", qui porte alors le même numéro que la ligne qui vient d'être supprimée
                    ligne = ligne - 2 'Pour suivre la variation de numéro de ligne entraîné par les suppressions
                    nombredannul = nombredannul + 1
                    '
                    'Si la deuxième condition (après le AND) n'est pas respectée, alors ne pas supprimer les lignes ne respecant pas cette condition
                    'et mettre ces lignes en rouge
                    '
                End If
     
            Wend
        End With
     
        MsgBox "Le tableau comporte " & nombredannul & " annulation(s)"
     
     
    End Sub

    Ce qu'il me manque :
    -il y a une erreur ligne 18 (je pense que c'est le signe "-" devant le ".Cells", sais-tu comment indiquer que je souhaite vérifier que Cell(X) = -Cell(Y) stp ?
    -Ecrire les conditions supplémentaires qui doivent être vérifiées pour supprimer les lignes : comment faire sans écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If... AND... AND... AND... AND... Then
    qui à mon avis serait très lourd et redondant ?
    -Faire ressortir par une couleur quelconque les lignes avec "Annul" mais qui ne respectent pas les conditions de suppression

    Voilà ce que j'aimerais faire svp, si quelqu'un peut aider un jeune débutant en VBA en plein désarroi ça serait super

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 8
    Par défaut
    Nom : Capture.PNG
Affichages : 225
Taille : 37,1 Ko

    Voilà un extrait du tableau à traiter, ça sera plus clair

    J'ai colorié les lignes avec "Annul" ainsi que celles du dessus (où j'ai écrit "dessus")

    Les lignes doivent être supprimées SEULEMENT SI elles sont coloriées et SEULEMENT SI la quantité dans la colonne B est identique dans les deux lignes.

    Ainsi, les lignes 5&6, 7&8, 17&18 doivent être supprimées, mais pas les lignes 11&12.


    Voilà le code que j'ai écrit pour le moment, mais il y a une erreur :

    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
    Sub supprimer_annulations()
     
        Dim classeur As String 'nom du classeur
        Dim feuille As String 'nom de la feuille
        Dim ligne As Single 'numéro de ligne
        Dim nombredannul As Single 'nom de lignes avecc "Annul
        Dim x As Single 'montant à annuler
        Dim y As Single 'montant annulé
     
        classeur = ActiveWorkbook.Name
        feuille = ActiveSheet.Name
        ligne = 1 'le numéro de ligne commence à 1 ete  pas à 0
        nombredannul = 0 'on initialise le nombre d'annulation à zéro, et on l'incrémentera au fur et à mesure
     
     
        With Application.Workbooks(classeur).Worksheets(feuille)
     
            While .Cells(ligne, 1).Value <> "" 'le tbl est d'un seul bloc donc tant que la case Ax n'est pas vide, on continue de parcourir le tbl
                ligne = ligne + 1
     
                x = .Cells(ligne, 6).Value       'montant dans la ligne "Annul"
                y = .Cells(ligne - 1, 6).Value   'montant dans la ligne "dessus"
     
                If .Cells(ligne, 15) = "Annul" And x = y Then 'vérif que les quantités de titres annulées sont les mêmes que celles à annuler
                    .Rows(ligne - 1).Delete 'suppression de la ligne au dessus de celle avec "Annul"
                    .Rows(ligne - 1).Delete 'suppression de la ligne "Annul", qui porte alors le même numéro que la ligne qui vient d'être supprimée
                    ligne = ligne - 2 'Pour suivre la variation de numéro de ligne entraîné par les suppressions
                    nombredannul = nombredannul + 1
     
    '
    'Si la deuxième condition (après le AND) n'est pas respectée, alors ne pas supprimer les lignes ne respecant pas cette condition
    'et mettre ces lignes en rouge
    '
                End If
     
            Wend
        End With
     
        MsgBox "Le tableau comporte " & nombredannul & " annulation(s)"
     
     
    End Sub

    L'erreur m'est indiquée à la ligne 22. Je pense que c'est le "ligne-1" qui pose problème, car lorsque je le remplace par "ligne+1" le programme s'exécute (mais ce n'est pas ce que je veux exactement bien sûr).

    Mais je ne comprend pas, car lors de l'allocation d'une valeur à la variable y, la variable "ligne-1" est toujours >1.
    En effet, ligne est initialisée à 1, puis dans la boucle while, elle est incrémentée également.


    Quelqu'un peut m'expliquer svp ?


    Merci !



    PS : Pour faire la copie de ce tableau, j'ai supprimé quelques colonnes, donc le numéro des colonnes dans le code n'est pas celui qui apparaît dans l'image, mais ça ne devrait pas poser de problème à sa compréhension (données confidentielles que je n'ai pas le droit de divulguer sur internet)

Discussions similaires

  1. [XL-2007] Références sous windows 7 erreur 1004
    Par peofofo dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 03/11/2009, 13h48
  2. [VB-E] Erreur 1004 dans une boucle For
    Par lycaon dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 02/11/2006, 22h41
  3. [VBA][EXCEL]Erreur '1004' avec "Application.Run"
    Par Ania dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 16/01/2006, 10h50
  4. [Excel] Erreur 1004 avec un search
    Par Invité dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 23/12/2005, 13h54
  5. Insérer une image : Erreur 1004
    Par dp_favresa dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 26/10/2005, 14h01

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