Faire référence à un classeur en particulier en VBA

bdadvi94 Messages postés 15 Statut Membre -  
michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour, ceci est mon premier post sur ce forum et je débute tout juste en VBA :)

Je cherche à savoir comment faire référence à une feuille particulière d'un fichier particulier dans une macro :

Il y a un tableau Excel de plusieurs milliers de lignes généré par 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)

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"

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

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 serait super sympa :D

4 réponses

  1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
     
    Bonjour,

    Essayes ceci :
    Sub supprimer_annulations()
    Dim Wb As Workbook
    Dim Sh As Worksheet
    
    Dim nombredannul As Long
    Dim nbLignes As Long
    
    Set Wb = ActiveWorkbook
    Set Sh = Wb.ActiveSheet
    
    nbLignes = Sh.Cells.Find("*", Range("A1"), , , xlByRows, xlPrevious).Row
    
    For L = nbLignes To 1 Step -1
      If Sh.Cells(L, 15) = "Annul" Then
        nombredannul = nombredannul + 1
        
        '------------------------------------------
        'ici.. tu pourrais mettre la suppression..
        '------------------------------------------
        
      End If
    Next
    
    MsgBox nombredannul
    
    End Sub
    


    Cordialement, 
    Jordane                                                                 
    0
    1. bdadvi94 Messages postés 15 Statut Membre
       
      Salut, c'est super ça marche aussi :)
      En fait ce qui ne marchait pas dans mon essai est que le numéro de ligne commençait à 0 au lieu de 1.
      0
    2. bdadvi94 Messages postés 15 Statut Membre
       
      Peux-tu s'il-te-plaît m'expliquer vite fait le code
      Sh.Cells.Find("*", Range("A1"), , , xlByRows, xlPrevious).Row


      Merci :p
      0
  2. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Bonjour,

    dommage que tu nous fasses des mystères avec cette énigme:
    ainsi que la ligne du dessous (sous certaines conditions)

    car cela fera peut-^tre tout refaire!...

    combien de lignes "annul" aurais tu , environ?
    des milliers de lignes : cest à dire 5000 10000,50000 ?
    car cela fera peut-^treaussi tout refaire!...

    en attendant
    Sub annuler_lig()
    Dim Nbre As Integer, Cptr As Integer, Lig As Integer
    
    Application.ScreenUpdating = False
    With ActiveSheet
        Nbre = Application.CountIf(.Columns("o"), "annul")
        For Cptr = 1 To Nbre
            Lig = .Columns("O").Find("annul", .Cells(Cells.Rows.Count, "O")).Row
            Rows(Lig).Delete
        Next
    End With
    MsgBox Nbre & " lignes annulées"
    End Sub
    


     Michel

    EDIT : Ajout du LANGAGE dans les balises de code (la coloration syntaxique).
    Explications disponibles ici : ICI

    Merci d'y penser dans tes prochains messages.
    0
    1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      AAAAAH ! Jordane est TOUT CONTENT!

      Il a trouvé une image à colorier et a pu faire joujou, le pitchou

      il aura droit à un bonbon pour la peine
      0
  3. bdadvi94 Messages postés 15 Statut Membre
     
    Bonjour Michel, merci de ta réponse.

    Le tableau traiter fait environ 5000 lignes, et le nombre de lignes avec "Annul" est de 138.

    Les conditions pour supprimer cecs lignes ainsi que celle du dessus est la suivante :
    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 :

    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


    On me renvoie une erreur qui concerne la ligne de code en gras. Je pense que l'erreur vient du "-.Cells(...)" car si j'enlève le signe "-" je n'ai plus d'erreur.

    Saurais-tu m'aider là dessus s'il te plaît ? C'est la dernière ligne droite (j'espère !) :)

    PS : Merci pour ton code mais je n'y comprends pas grand chose, je suis vraiment novice en VBA, toutes mes connaissances se résument à ce qui apparaît dans mon code :p
    0
    1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      autrement dit ma proposition t' as paru nulle ?

      boucler sur 5000 lignes plutôt que 138: BRAVO!
      Et le tout sans figer l'écran: SPLENDIDE !
      0
    2. bdadvi94 Messages postés 15 Statut Membre
       
      Non pas du tout haha, et je t'en remercie beaucoup !
      Mais je ne connais pas ces instructions avec les variables nbre et lig

      Je ne te demande pas de tout m'expliquer, sauf si le coeur t'en dit, mais j'aime mieux comprendre à 100% le code que je met dans mes macros !

      J'ai cru comprendre que c'était pour compter le nombre de lignes dans le tableau, mais ça fonctionne très bien (en tous cas ça en a l'air) avec le "while", car le tableau est constitué d'un seul bloc. Donc quand il rencontre une case vide en colonne A, la boucle s'arrête.
      0
      1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320 > bdadvi94 Messages postés 15 Statut Membre
         
        Bon!
        et bien,reste avec le While,
        0
    3. bdadvi94 Messages postés 15 Statut Membre
       
      Bonjour,

      Si j'ai bien compris ce que tu dis, les instructions
      Nbre = Application.CountIf(.Columns("o"), "annul")
      For Cptr = 1 To Nbre
      Lig = .Columns("O").Find("annul", .Cells(Cells.Rows.Count, "O")).Row

      permettent de ne boucler que sur les lignes comportant "annul" ? :)
      0
      1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320 > bdadvi94 Messages postés 15 Statut Membre
         
        Hé oui....
        0
  4. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    voilà le code aves les commentaires explicatifs
    Option Explicit
    '-------------
    Sub annuler_lig()
    'déclaration des variables
    Dim Nbre As Integer, Cptr As Integer, Lig As Integer

    'fige le défilement de l'écran: indispensable, confort des yeux, rapidité _
    a écrire dans pratiquement toutes macros
    Application.ScreenUpdating = False
    'with -end with: on travaille dans le bloc "feuille active" (évite les select chronophages)
    With ActiveSheet
    'nombre de fois où est inscrit "annul"
    Nbre = Application.CountIf(.Columns("o"), "annul")
    'on ne boucle que sur ces lignes: rapidité, allègement du code
    For Cptr = 1 To Nbre
    'Cells.Rows.Count, "O": dernière ligne de la feuille(1million et des poussières): la ligne suivante repart ainsi à 1
    'on cherche la 1° ligne contenant "annul"
    Lig = .Columns("O").Find(what:="annul", after:=.Cells(Cells.Rows.Count, "O")).Row
    'détruit la ligne
    .Rows(Lig).Delete 'j'avais oublié le point devant 'rows"
    ' la ligne étant détruite, le prochain "next" trouvera la nouvelle 1° ligne avec "Annul"
    Next
    End With
    MsgBox Nbre & " lignes annulées"
    End Sub

    'outre la rapidité, ce système avec "find" évite de chercher la dernière ligne de la feuille et de remonter bêtement jusqu'en haut
    ' "option explicit" oblige à déclarer les variables utilisées et surtout, détecte toute faute de frappe(ca je sais bien faire) _
    dans le code, et interdit le déroulement de la macro; très précieux quand on teste un code _
    bref! indispensable

    en espérant les 100% ;o)--
     Michel
    0