Comment enlever une ligne lorsque la date de realisation est validee

Bonjour,

Je souhaite avoir de l'aide pour réaliser la fonction suivante

Mon fichier comprend 2 feuilles

La 1ere recense les activités , la seconde classe les activités réalisées.

je voudrais que lorsque l'activité ( 1ere feuille ) est validée ( date de réalisation ) que cette derniere soit supprimée de la 1ere feuille et se retrouve dans la seconde.

Ci joint le fichier pour plus de compréhension

Merci de votre aide

Cordialement,

PATOLIVIER

19base-suivi.xlsx (28.20 Ko)

Bonjour PATOLIVIER, le forum

Un essai:

Sub essai()

Dim i As Integer, dl As Integer, dl2 As Integer

 dl = Sheets("Activités en cours").Range("B" & Rows.Count).End(xlUp).Row
dl2 = Sheets("Activités réalisées").Range("B" & Rows.Count).End(xlUp).Row + 1

With Sheets("Activités en cours")
 For i = 2 To dl
   If .Range("H" & i) = "" Then
   Else
      .Range("B" & i).Copy Sheets("Activités réalisées").Range("B" & dl2)
      dl2 = dl2 + 1
      .Rows(i).Delete
   End If
 Next i
End With

End Sub

CTRL + E pour lancer la macro

Cordialement,

Bonjour xorsankukai

Juste une interrogation (bien que je n'aie pas testé la macro).

Es-tu sûr qu'il ne faille pas faire plutôt

For i = dl To 2 step -1

car quand tu effaces la ligne i, la boucle for risque de sauter une ligne (la ligne suivante à celle effacée)

C'est juste une interrogation car j'ai souvent rencontré ce cas.

Re xorsankukai,

comme dit Steelson (salut), faut faire le job de bas en haut quand y'a suppression de ligne ; y'a aussi cela :

   If .Range("H" & i) = "" Then
   Else
      .Range("B" & i).Copy Sheets("Activités réalisées").Range("B" & dl2)
      dl2 = dl2 + 1
      .Rows(i).Delete
   End If

comme y'a rien entre Then et Else, mets plutôt :

   If .Range("H" & i) <> "" Then
      .Range("B" & i).Copy Sheets("Activités réalisées").Range("B" & dl2)
      dl2 = dl2 + 1
      .Rows(i).Delete
   End If

(il suffit d'inverser le sens du test : différent au lieu de égal)

dhany

bonjour Steelson, Dhany,

Merci pour vos remarques pertinentes,

Je commets souvent la même erreur lorsqu'il s'agit d"effacement, , toujours commencer par le bas ! (ça ne rentre pas dans ma petite tête )

Cependant, si je metsFor i = dl to 2 Step-1, la macro ne fonctionne pas...

Sub essai()

Dim i As Integer, dl As Integer, dl2 As Integer

 dl = Sheets("Activités en cours").Range("B" & Rows.Count).End(xlUp).Row
dl2 = Sheets("Activités réalisées").Range("B" & Rows.Count).End(xlUp).Row + 1

With Sheets("Activités en cours")
 For i = dl To 2 Step -1
   If .Range("H" & i) <> "" Then
      .Range("B" & i).Copy Sheets("Activités réalisées").Range("B" & dl2)
      dl2 = dl2 + 1
      .Rows(i).Delete
   End If
 Next i
End With

End Sub

Je loupe quelque chose ? J'ai beau le tourner dans tous les sens, je ne comprends pas ce qui cloche.

(Pour le deuxième point, j'avais bien remarqué, mais j'ai oublié de rectifier.... )

Merci à vous

regarde mieux la colonne H

Cependant, si je metsFor i = dl to 2 Step-1, la macro ne fonctionne pas...

Je loupe quelque chose ? J'ai beau le tourner dans tous les sens, je ne comprends pas ce qui cloche.

ce n'est pas lié au step mais à :

If .Range("H" & i) = ""

ou bien

If .Range("H" & i) = 0

??

Re,

regarde mieux la colonne H

If .Range("H" & i) = 0

Je m'étais focalisé sur la boucle...

Encore merci Steelson et dhany ,

Pan pan cul cul ...

Bonjour PATOLIVIER, le forum,

je te retourne ton fichier modifié :

16base-suivi.xlsm (27.76 Ko)

fais tous les tests nécessaires.


Alt F11 pour voir le code VBA, puis revenir sur Excel

si besoin, tu peux demander une adaptation.

merci de me dire si ça te convient.

dhany


@xorsankukai

(relis bien le titre du sujet et l'énoncé )

dhany

Pan pan cul cul ...

Spoiler
pan pan cucul

@Dhany:

m'est avis qu'c'est mieux de faire le job sans boucle For !

Pour l'instant, je ne sais pas faire sans,

relis bien le titre du sujet et l'énoncé

Autant pour moi, j'aurai du utiliser l'évènement change de la feuille ,

Je ne peux que m'incliner devant ta version, la route du vba est longue et sinueuse...mais je ne désespère pas...j'avance lentement...

P'tite question:

Peux-tu m'expliquer: End(3)(2).Row et Cells(lg1, 2).Resize(, 6).Copy ?

Merci,

sois patient, car la réponse va être assez longue à rédiger !

Peux-tu m'expliquer: End(3)(2).Row et Cells(lg1, 2).Resize(, 6).Copy ?

Ah ben voilà, tout de suite les gros mots du VBA ... dhany aussi pan pan cul cul

c'est pa'c'que tu préfères Power Query, comme jmd ?

@xorsankukai

.Cells(Rows.Count, 2).End(3)(2).Row : idem que .Cells(Rows.Count, "B").End(xlUp).Row + 1


pour Cells(lg1, 2).Resize(, 6).Copy :

Cells(lg1, 2) : cellule de la ligne lg1, colonne B ; .Resize(, 6) redimensionnée à 6 colonnes,

donc de B à G ; as-tu noté que pour ma copie, j'ai volontairement évité la colonne A ?

en sais-tu la raison ?


j'répondrai au reste plus tard car j'suis super débordé !

dhany

Merci Dhany pour l'explication ,

j'ai volontairement évité la colonne A ?

en sais-tu la raison ?

J'ai noté qu'il y avait une formule en colonne A et une MFC, je suppose que c'est lié ?

Moi qui pensais avoir à faire à un exercice simple , je me rends compte qu'il s'est très vite compliqué,

J'vais me prendre une p'tite aspirine....

tu as trouvé la bonne raison, bravo !

tu peux aller faire une pause bien méritée !

dhany

ajout : j'espère que tu as vu qu'c'était pour la 2ème feuille "Activités réalisées".

(faut pas écraser les formules & MFC de la colonne A de cette feuille !)

dhany

tu as trouvé la bonne raison, bravo !

j'espère que tu as vu qu'c'était pour la 2ème feuille "Activités réalisées"

tu peux aller faire une pause bien méritée !

@xorsankukai

d'après moi, le demandeur veut que la copie soit effectuée sur le moment, pas après-coup ; c'est pour ça que j'ai proposé une solution avec Worksheet_Change() ; et c'est aussi pour ça qu'une boucle For pour balayer toutes les lignes est inutile.

sinon, tu peux facilement simuler un For i = 1 To 10 .. Next i ainsi :

Sub Essai()
  Dim i As Byte 'i est initialisé à 0 par défaut
  Do
    i = i + 1
  Loop Until i = 10
End Sub

ça fera bien la boucle 10× mais attention : en sortie de boucle, i = 10 alors que pour For : i = 11

dhany

Rechercher des sujets similaires à "comment enlever ligne lorsque date realisation validee"