Récupérer des données dans une cellule suivante
Bonjour,
j'ai un tableau avec des dates, et en fonction de la ligne (je mets des croix dans la semaine choisie) il me sort la date de début : ça c'est fait.
Mais je voudrais, en fonction de la durée (en semaine) qu'excel me donne la date correspondant à la date du tableau, N semaines plus tard.
Dans un deuxième temps, je voudrais réitérer cette manœuvre mais avec la période suivante...
Je vous joints un tableau test, se sera plus simple à comprendre...
Merci de votre aide
Bonjour Arturo83,
Votre solution fonctionne bien, mais en VBA...
Si je veux l'adapter sur un autre tableau, par exemple mettre ce récapitulatif sur une autre feuille, changer des dispositions dans le tableau du haut, je vais être super embêté, je n'y connais rien en VBA.
De plus, il compte le nbre de semaine, mais lorsqu'il y a 1 croix, =1, 2 croix =1 3 croix =2...
Si on met une croix en G16, sans autre dans la ligne, il renvoie bien la date du début de période 1 en D5, mais en F5, il renvoie la date du vendredi suivant (15/10) alors qu'il devrait renvoyer le 8/10.
3ème petit soucis, si j'ai plus de 2 périodes, je serais totalement incapable de rajouter des lignes au tableau du haut...
Je cherche des solutions simples que je puisse adapter dans toutes les situations, je suis conscient du temps que vous avez consacré à cette programmation en tiens à vous en remercier, mais en l'état, je ne pourrais pas le retranscrire dans les tableaux que j'ai.
Je vais essayer encore et encore avec Equiv, index et recherche et essayer d'autres formules de "base".
D'ailleurs, mon gros soucis, j'ai du mal expliquer, c'est qu'une fois la période1 trouvée, je voudrais qu'il repère la période suivante (la première semaine avec croix après la semaine sans croix)...
Merci de votre aide
Voilà une modif.
J'ai modifié la présentation de tableau des résultats, j'y ai mis une recherche sur 10 périodes, vous pouvez en mettre autant que vous voulez et recopiant une des lignes à la suite. le programme fera le reste.
J'ai déplacé le tableau à la ligne 100 ce qui vous laisse de la marge pour augmenter le tableau du dessus.
il me reste à faire disparaître les "#VALEUR" quand il n' y a pas de périodes trouvées, mais là je n'ai pas le temps, je regarderai plus tard.
Cdlt
Alors, là ! c'est au top !!!
M E R C I !!
J'ai même réussi à augmenter la zone de nom clients sans que cela n'interfère dans le tableau !
Est ce que sans la partie VBA cela pourrait fonctionner?
Beau travail !!!
C'est très bien !!!
Merci
Est ce que sans la partie VBA cela pourrait fonctionner?
Non. Puisque au lieu d'écrire un tas de formules à rallonge, un bout de code fait le travail, donc il faut recopier le code si vous voulez travailler sur un autre fichier.
Le code est réparti en 2 endroits:
- Une partie dans le module de la feuille 1 pour détecter toutes modifications sur cette feuille, et qui va appeler les fonctions personnalisées.
- L'autre partie dans un module standard qui est la création de ces fonctions personnalisées.
Le code dans le module de la feuille 1:
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo Sortie
Application.EnableEvents = False
Range("D5").FormulaR1C1 = "=IF(deb_periode1(R2C6)=0,"""",deb_periode1(R2C6))"
Range("F5").FormulaR1C1 = "=IF(Fin_Periode1(R2C6)=0,"""",Fin_Periode1(R2C6))"
DerLig = Range("C99").End(xlUp).Row
For i = 6 To DerLig
Range("D" & i).FormulaR1C1 = "=IF(Deb_Periode2(R2C6,R[-1]C7)=0,"""",Deb_Periode2(R2C6,R[-1]C7))"
Range("F" & i).FormulaR1C1 = "=IF(Fin_Periode2(R2C6,R[-1]C7)=0,"""",Fin_Periode2(R2C6,R[-1]C7))"
Next i
Sortie:
Application.EnableEvents = True
End Suble code dans le module standard:
Public Lig As Long, Col As Long
Function Deb_Periode1(Lig As Long) As Date
DerCol = Range("ZZ100").End(xlToLeft).Column
With Range(Cells(Lig, "C"), Cells(Lig, DerCol))
Set x = .Find("x")
If Not x Is Nothing Then
Col = x.Column
Deb_Periode1 = Cells(100, Col)
Else
Deb_Periode1 = 0
End If
End With
End Function
Function Fin_Periode1(Lig As Long) As Long
DerCol = Range("ZZ100").End(xlToLeft).Column
With Range(Cells(Lig, "B"), Cells(Lig, DerCol))
Set x = .Find("x")
If Not x Is Nothing Then
Prem_Col = x.Column
Col = x.Column
Do
Col = Col + 1
Loop While Cells(Lig, Col) <> ""
Fin_Periode1 = Cells(101, Col - 1)
Else
Fin_Periode1 = 0
End If
End With
End Function
Function Deb_Periode2(Lig As Long, Col_Deb As Long) As Date
DerCol = Range("ZZ100").End(xlToLeft).Column
If Col_Deb > 0 Then
With Range(Cells(Lig, Col_Deb + 1), Cells(Lig, DerCol))
Set x = .Find("x")
If Not x Is Nothing Then
Col = x.Column
Deb_Periode2 = Cells(100, Col)
Else
Deb_Periode2 = 0
End If
End With
End If
End Function
Function Fin_Periode2(Lig As Long, Col_Deb As Long) As Long
DerCol = Range("ZZ100").End(xlToLeft).Column
If Col_Deb > 0 Then
With Range(Cells(Lig, Col_Deb + 1), Cells(Lig, DerCol))
Set x = .Find("x")
If Not x Is Nothing Then
Prem_Col = x.Column
Col = x.Column
Do
Col = Col + 1
Loop While Cells(Lig, Col) <> ""
Fin_Periode2 = Cells(101, Col - 1)
Else
Fin_Periode2 = 0
End If
End With
End If
End FunctionPour accéder au code, faire ALT + F11.
Cdlt
Impec !
ça a l'air tellement simple !
et en regardant toutes ces lignes, ça se complique !!!
Merci du temps passé sur mon soucis, je vais l'appliquer à mon fichier ... et essayer
Merci
Bonjour,
Voilà comme promis le correctif (Suppression des affichages "#VALEUR")
Cdlt
Impecc !!
Merci pour tout !!