Se connecter avec
S'enregistrer | Connectez-vous

Copier des lignes vers une autre feuille si une condition est remplie

Dernière réponse : dans Programmation

Bonsoir le forum,

Débutant en vba , je cherche à créer une petite macro qui me permettrait de copier certaines lignes d'une feuille vers une autre feuille d'une même classeur, si un certaine condition est remplie.

Le code que j'ai ""bricolé"" me sort une erreur de compilation : Projet ou bibliothèque introuvable.

Est-ce que au premier coup d'œil ce code de newbie vous parait comporter des erreurs flagrantes?

Je cherche à copier les lignes vers une feuille nomée vo à partir d'une feuille nommée Base.

Merci d'avance pour vos conseils.


  1. Sub Bouton4_Clic()
  2. 'Avec la feuille base
  3. With Worksheets("Base")
  4. 'On déclare ligne vo comme un entier
  5. Dim ligne_vo As Integer
  6.  
  7. ligne_vo = 1 'on initialise la ligne de copie à 1
  8.  
  9. For Each cel In Worksheet("Base").Column("H").Rows 'pour chaque cellule dans la colonne H de la feuille Base
  10. If cel <> "" Then 'si cette cellule contient une date (si elle est non vide en fait) ALORS
  11. Row.Copy Destination:=vo.Rows(ligne_vo, 1) 'on copie la ligne vers la feuille vo en partant de la ligne vo
  12. ligne_vo = ligne_vo + 1 'on ajoute 1 à la valeur de la ligne vo pour remplir la ligne suivante
  13. End If
  14. Next cel 'on passe à la ligne suivante
  15. End With
  16. End Sub
Lassé par la pub ? Créez un compte
Expert Programmation

Salut le nouveau forumeur,

Ligne 3, tu utilise une instruction With qui permet de condenser le code. Mais nulle part tu n'utilises la notation condensée. Je t'invite à la supprimer. Primo c'est inutile, secundo, cela rend le code plus difficile à lire et à relire. Débutant s'abstenir, donc.

Ligne 9. Tu confonds Collection et Type. Worksheet("Base") n'existe pas. Par contre, il existe un Worksheet qui s'appelle Base dans la collection Worksheets.

Toujours ligne 9. Le reste est pas mal, sauf le commentaire. Le code proposé, c'est pour chaque ligne dans la colonne H de la feuille Base. Pour coller au commentaire :
  1. For Each cel In Worksheets("Base" ).Column("H" ).Cells
Par ailleurs, je ne vois pas la définition de la variable cel. Il manque donc au début de ta procédure
  1. Dim cel As Range
Peut-être manque-t-il celle ligne au début de ton module :
  1. Option Explicit


Ligne 10, je te propose pour plus de clarté, de ne pas faire confiance aux propriétés par défaut, et d'écrire explicitement ce que tu veux :
  1. If cel.Value <> "" Then
  2. If cel.Text <> "" Then
  3. ...


Ligne 11, quand tu auras utilisé l'option explicite, tu t'apercevras que vo n'est pas déclarée !

Ah, une autre chose, quand on vient pleurnicher* parce qu'on a une erreur, on donne le message de l'erreur (ok :o  ) et la ligne où l'erreur est survenue :/ 

*
Spoiler
Volontairement condescendant, j'assume !

----------------------------

Bon, à par ça, je trouve ton pseudo vraiment nul.... :D 

Bonsoir Zeb, le forum,

Tout d'abord, merci pour ta réponse qui me parait très claire.

Je vais essayer le code avec tes indications.

C'est vrai que ce code doit te paraitre bizzare (voir nul) mais j'apprends de moi même pour ma satisfaction personnelle.

Me faire corriger par des gens avertis m'aide justement à voir les erreurs grossières que je peux faire.

En tout cas , merci pour ton aide.

Et bravo pour votre forum.

Je travaille là dessus et reviens vers toi/vous pour d'autre questions à n'en pas douter.

Merci


ps: pour with, tu veux dire que ca permet de ""coder"" de manière plus "compacte"?

Re le forum

Après quelques modifications le code fonctionne.

J'ai compris quelques unes des grosses erreurs que j'ai fait.

Merci pour ton aide.

Voici , le code modifié, qu'en penses -tu?

  1. Sub Bouton4_Clic()
  2.  
  3.  
  4. Dim ligne_a_deplacer As Integer
  5. Dim cel As Range
  6. Dim vo
  7.  
  8. ligne_a_deplacer = Sheets("vo").Range("a" & Sheets("vo").Rows.Count).End(xlUp).Row
  9.  
  10. With Sheets("Base")
  11. For Each cel In .Range("h2:h" & .Range("h" & .Rows.Count).End(xlUp).Row)
  12. If IsDate(cel) = True Then
  13. .Rows(cel.Row).Copy Destination:=Sheets("vo").Cells(ligne_a_deplacer, 1)
  14. ligne_a_deplacer = ligne_a_deplacer + 1
  15.  
  16.  
  17. End If
  18. Next
  19. End With
  20. End Sub
Expert Programmation

Pas mal :) 

Mais je n'aime pas (ce n'est que mon avis) :
  • La déclaration de variable sans type. vo est une feuille de calcul, son type est donc Worksheet.
  • L'instruction With. Le code est plus compact mais moins lisible. J'invite les novices et débutants à ne pas l'utiliser.
  • L'imprécision de la collection Sheets. Puisqu'on parle de feuilles de calcul, utilisons Worksheets.
  • Les constructions de coordonnées avec des chaînes de caractères. Si cela semble facile pour les lignes, que dire des colonnes ! Au contraire, je préconise l'utilisation de la fonction Cells qui accepte des coordonnées numériques.
  • Les tautologies et autres calculs inutiles.
    Sheets(xxx).Rows.Count == 65536
    Quoiqu'il arrive.
  • Les tests booléens égalent à vrai ou faux :
    1. ' // Bien
    2. If <condition> Then ...
    3. If Not <condition> Then ...
    Et non pas
    1. ' // Mal
    2. If <condition> = True Then ...
    3. If <condition> = False Then ...


    Pour le reste, pas de critique :) 
    Lassé par la pub ? Créez un compte