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

Fermé
bdadvi94 Messages postés 14 Date d'inscription mardi 16 février 2016 Statut Membre Dernière intervention 8 mars 2016 - 16 févr. 2016 à 11:12
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 - 17 févr. 2016 à 14:21
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

jordane45 Messages postés 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024 4 717
Modifié par jordane45 le 16/02/2016 à 11:44
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
bdadvi94 Messages postés 14 Date d'inscription mardi 16 février 2016 Statut Membre Dernière intervention 8 mars 2016
16 févr. 2016 à 12:15
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
bdadvi94 Messages postés 14 Date d'inscription mardi 16 février 2016 Statut Membre Dernière intervention 8 mars 2016
16 févr. 2016 à 12:15
Peux-tu s'il-te-plaît m'expliquer vite fait le code
Sh.Cells.Find("*", Range("A1"), , , xlByRows, xlPrevious).Row


Merci :p
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310
Modifié par jordane45 le 16/02/2016 à 13:47
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
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310
17 févr. 2016 à 11:38
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
bdadvi94 Messages postés 14 Date d'inscription mardi 16 février 2016 Statut Membre Dernière intervention 8 mars 2016
16 févr. 2016 à 13:45
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
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310
Modifié par michel_m le 16/02/2016 à 13:50
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
bdadvi94 Messages postés 14 Date d'inscription mardi 16 février 2016 Statut Membre Dernière intervention 8 mars 2016
16 févr. 2016 à 13:53
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
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310 > bdadvi94 Messages postés 14 Date d'inscription mardi 16 février 2016 Statut Membre Dernière intervention 8 mars 2016
17 févr. 2016 à 09:00
Bon!
et bien,reste avec le While,
0
bdadvi94 Messages postés 14 Date d'inscription mardi 16 février 2016 Statut Membre Dernière intervention 8 mars 2016
17 févr. 2016 à 09:18
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
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310 > bdadvi94 Messages postés 14 Date d'inscription mardi 16 février 2016 Statut Membre Dernière intervention 8 mars 2016
17 févr. 2016 à 11:33
Hé oui....
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310
Modifié par michel_m le 17/02/2016 à 14:29
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