Connaître la ligne sur laquelle je suis dans un for each line
Bonjour à tous,
Je voudrais copier un ligne en dessous d'elle-même si ma condition est respectée mais je ne sais pas sur laquelle je suis.
Le but est dans un fichier avec une colonne date, heure d'arrivée et heure de fin, exporté de notre système de pointage, j'ai certaines heures supérieures à 24 si le pointage a lieu après minuit.
J'ai donc fait un filtre sur les heures >= "24:00:00"
deux lignes sont concernées la 14 et la 17
Si le deux heures (arrivée et départ) sont après minuit, pas de problème, j'enlève 24 aux heures et j'ajoute 1 à la date
TPOINTAGE_TUHD_N°_____TPOINTAGE_Date____TPOINTAGE_Code___TPOINTAGE_HeureArrivée___TPOINTAGE_HeureDépart
35_________________________07-11-18_____________FO__________________24:39:28____________________25:27:11
35_________________________08-11-18_____________FO__________________23:22:14____________________24:08:22
For Each Ligne In rMaPlage.Rows
sHeure = Mid(Ligne.Cells(5).Value, 1, 1)
If Mid(Ligne.Cells(5).Value, 1, 1) = "T" Then
GoTo Suivant
End If
If Ligne.Cells(4).Value >= dHeure24 And Ligne.Cells(5).Value >= dHeure24 Then
Ligne.Cells(4).Value = Ligne.Cells(4).Value - dHeure24
Ligne.Cells(5).Value = Ligne.Cells(5).Value - dHeure24
Ligne.Cells(2).Value = Ligne.Cells(2).Value + 1
Else
Dim lLigne As Long
lLigne = Ligne.Row
lligne = ActiveCell.Row
'Ligne.Selection.Copy
Selection.Insert Shift:=xlDown
Range("E17").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "1/1/1900 23:59"
Range("D18").Select
ActiveCell.FormulaR1C1 = "0:00:00"
Range("E18").Select
End If
Suivant:
NextFO 23:22:14 24:08:22
Résultat après mon if
TPOINTAGE_TUHD_N°_____TPOINTAGE_Date____TPOINTAGE_Code___TPOINTAGE_HeureArrivée___TPOINTAGE_HeureDépart
35_________________________08-11-18_____________FO__________________00:39:28____________________01:27:11
35_________________________08-11-18_____________FO__________________23:22:14____________________24:08:22
La ligne 17 passe dans mon else car l'heure de début est < 24:00:00
là je coince car je ne sais pas comment lui dire de copier ma ligne concernée.
résultat attendu: copy et insert ligne 17 en ligne 18
TPOINTAGE_TUHD_N°_____TPOINTAGE_Date____TPOINTAGE_Code___TPOINTAGE_HeureArrivée___TPOINTAGE_HeureDépart
35_________________________08-11-18_____________FO__________________00:39:28____________________01:27:11
35_________________________08-11-18_____________FO__________________23:22:14____________________23:00:00
35_________________________09-11-18_____________FO__________________00:00:00____________________00:08:22
voici le code
For Each Ligne In rMaPlage.Rows
sHeure = Mid(Ligne.Cells(5).Value, 1, 1)
'test si je ne suis pas sur le titre
If Mid(Ligne.Cells(5).Value, 1, 1) = "T" Then
GoTo Suivant 'skip à la ligne suivant
End If
If Ligne.Cells(4).Value >= dHeure24 And Ligne.Cells(5).Value >= dHeure24 Then
Ligne.Cells(4).Value = Ligne.Cells(4).Value - dHeure24
Ligne.Cells(5).Value = Ligne.Cells(5).Value - dHeure24
Ligne.Cells(2).Value = Ligne.Cells(2).Value + 1
Else
Dim lligne As Long
lligne = Ligne.Row????erreur
'j'ai essayé plusieurs commande mais rien ne fonctionne, activecell.row me donne 1 c'est à dire la ligne de titre.
lligne = ActiveCell.Row ??????
Ligne.Selection.Copy ???? erreur compilation
End If
Suivant:
Next
Bonjour et
Ouf, ton code n'est pas lisible, tu devrais penser à utiliser les balises de code proposées par le forum pour le faire apparaitre clairement, je t'invite également à mettre des tabulations suivant les conventions de code, ça le rendrait plus lisible, pour nous et pour toi
Ensuite, je vois que tu as beaucoup de soucis avec : For Each Ligne In rMaPlage.Rows
Ce que j'aurais fait à ta place c'est :
For i = rMaPlage.Row To rMaPlage.Row + rMaPlage.Rows.Count - 1
'Ton code
Range("a" & i) 'etc etc...
Next i
Ce sera plus simple pour toi, et comme ton numéro de ligne sera directement contenu dans i, tu pourras directement l'utiliser, tu peux renommer i en "lig" ou" ligne" si tu le souhaites
Salut,
Ta demande n'est vraiment pas claire et tu n'as pas joint ton fichier ou du moins un fichier modèle.
Afin de séparer les codes du reste du texte, tu peux utiliser les balises ''Codes'' (passe ton curseur sur les différentes options possibles au-dessus du texte que tu écris).
Une plage concernée par un ''For Each xxxxx / Next'' concerne très souvent plusieurs lignes et plusieurs colonnes. Dans le fichier ci-joint, je te montre comment ma macro trouve deux fois la ligne 2 et 2 fois la ligne 3 en passant en revue la plage concernée.
Sub Essai()
Dim i As Integer, Cellule As Range, MaPlage As Range
Set MaPlage = Range("B2:C3")
For Each Cellule In MaPlage
MsgBox ("La cellule " & Cellule.Address & " se trouve sur la ligne " & Cellule.Row)
Next
End Sub
Cordialement.
merci pour les infos, cela fonctionne avec vos propositions.
désolée, c'est la première fois que je poste sur le site.
j'essaierai de faire mieux la prochaine fois.