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

  • Auteur de la discussion Autodidacte_vba
  • Date de début

Autodidacte_vba

Nouveau membre
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.


Code:
Sub Bouton4_Clic()
'Avec la feuille base
With Worksheets("Base")
'On déclare ligne vo comme un entier
Dim ligne_vo As Integer
 
ligne_vo = 1 'on initialise la ligne de copie à 1
 
    For Each cel In Worksheet("Base").Column("H").Rows 'pour chaque cellule dans la colonne H de la feuille Base
        If cel <> "" Then 'si cette cellule contient une date (si elle est non vide en fait) ALORS
            Row.Copy Destination:=vo.Rows(ligne_vo, 1) 'on copie la ligne vers la feuille vo en partant de la ligne vo
            ligne_vo = ligne_vo + 1 'on ajoute 1 à la valeur de la ligne vo pour remplir la ligne suivante
        End If
    Next cel 'on passe à la ligne suivante
End With
End Sub
 

zeb

Modérateur
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 :
Code:
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
Code:
Dim cel As Range
Peut-être manque-t-il celle ligne au début de ton module :
Code:
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 :
Code:
If cel.Value <> "" Then
If cel.Text <> "" Then
...

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 :/

*
Volontairement condescendant, j'assume !
----------------------------

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

Autodidacte_vba

Nouveau membre
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"?
 

Autodidacte_vba

Nouveau membre
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?

Code:
Sub Bouton4_Clic()


Dim ligne_a_deplacer As Integer
Dim cel As Range
Dim vo

ligne_a_deplacer = Sheets("vo").Range("a" & Sheets("vo").Rows.Count).End(xlUp).Row

With Sheets("Base")
    For Each cel In .Range("h2:h" & .Range("h" & .Rows.Count).End(xlUp).Row)
        If IsDate(cel) = True Then
        .Rows(cel.Row).Copy Destination:=Sheets("vo").Cells(ligne_a_deplacer, 1)
        ligne_a_deplacer = ligne_a_deplacer + 1
       
                       
        End If
     Next
End With
End Sub
 

zeb

Modérateur
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. [fixed]Sheets(xxx).Rows.Count == 65536[/fixed]Quoiqu'il arrive.
■ Les tests booléens égalent à vrai ou faux :
Code:
' // Bien
If <condition> Then ...
If Not <condition> Then ...
Et non pas
Code:
' // Mal
If <condition> = True Then ...
If <condition> = False Then ...

Pour le reste, pas de critique :)
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 134
Messages
6 718 054
Membres
1 586 393
Dernier membre
mathhh28
Partager cette page
Haut