XL 2019 Affecter une valeur à une cellule en fonction de la valeur de la cellule précédente

AlexC

XLDnaute Nouveau
Bonjour à tous,

Je suppose que ma question est assez basique mais je n'arrive pas à trouver de réponse satisfaisante sur internet...
Comme indiquer dans le titre j'aimerais affecter une valeur à une cellule en fonction de la valeur de la cellule précédente. Par exemple, si une cellule contient la lettre "E", j'aimerais que les 5 cellules qui suivent contiennent elles aussi la lettre "E". Si une cellule contient la lettre "D", j'aimerais que les 20 cellules qui suivent contiennent la lettre "D".

Existe-t-il une formule pour réaliser cela ?

Merci d'avance et bonne journée :)
 
Solution
Bonjour AlexC, GALOUGALOU,

Voyez le fichier joint et cette macro dans le code de la feuille :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count > 1 Then Exit Sub 'si sélections multiples
Dim a, b, i As Variant
a = Array("D", "E") 'à adapter
b = Array(20, 5) 'à adapter
i = Application.Match(Target, a, 0)
If IsNumeric(i) Then Target.Resize(, b(i - 1)) = a(i - 1)
End Sub
On peut entrer des lettres en minuscules.

A+

GALOUGALOU

XLDnaute Accro
bonjour alexc bonjour le forum
c'est un site d'entraide et pour simplifier l'intervention des aidants, un classeur anonymisé serait souhaitable.
précision à la demande : les cellules qui suivent, lesquelles, en colonne ou en ligne ?
cordialement
galougalou
 

GALOUGALOU

XLDnaute Accro
re
en supposant que votre onglet se nomme Feuille1
Sheets("Feuil1").Select
li = Sheets("Feuil1").Cells(36000, 1).End(xlUp).Row

en supposant que la lettre E se trouve colonne a ( Cells(36000, 1))
en supposant que la lettre e est saisie en majuscule (attention à la casse)
If Range("A" & J) = "E" Then Rows(J).Range("B1:F1") = "E"
col de recherche/ lettre cherchée ecriture E en colonne b/f

Enrichi (BBcode):
Sub poser_lettre_E()
Dim J As Long
Sheets("Feuil1").Select
li = Sheets("Feuil1").Cells(36000, 1).End(xlUp).Row
  For J = li To 1 Step -1
     If Range("A" & J) = "E" Then Rows(J).Range("B1:F1") = "E"
  Next J
End Sub

Sub poser_lettre_D()
Dim J As Long
Sheets("Feuil1").Select
li = Sheets("Feuil1").Cells(36000, 1).End(xlUp).Row
  For J = li To 1 Step -1
     If Range("A" & J) = "D" Then Rows(J).Range("B1:U1") = "D"
  Next J
End Sub
cordialement
galougalou
 

Pièces jointes

  • ECRIRE E ET D.xlsm
    18.1 KB · Affichages: 10

AlexC

XLDnaute Nouveau
De plus, il faudrait que cela puisse s'effectuer peu importe la position du D et du E dans mon classeur, or j'ai l'impression que cela n'est pas possible avec votre formule…

Pour vous apporter peut-être un peu plus de précisions, je réalise un calendrier/plan de charge. Les E et les D symbolisent donc des activités qui vont s'étendre dans le temps, par exemple D commencera le 31/03 et durera 20 jours ouvrés, quant à E elle commencera le 14 avril et durera 5 jours ouvrés.
Au début j'avais seulement mis un D et un E en debut d'activité et trouvé sur ce forum une solution avec une MFC pour que la période de 20 ou 5 jours soient colorée. Mais maintenant il faut que je calcule une charge associée à ces activités. Mon tableau est un calendrier journalier donc je dois calculer une charge journalière. Or je sais que l'activité D prend 5JH/mois tandis que l'activité E prend 3JH/mois, je voulais donc créer une formule de pour avoir un "si la colonne contient un E, alors charge = 0,6 (pour 3JH diviser sur 5J d'activités).

Il y a peut-être une autre solution pour faire ça sans avoir besoin de mettre des E ou des D dans toutes les cellules, je reste ouverte à d'autres propositions :)
 

job75

XLDnaute Barbatruc
Bonjour AlexC, GALOUGALOU,

Voyez le fichier joint et cette macro dans le code de la feuille :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count > 1 Then Exit Sub 'si sélections multiples
Dim a, b, i As Variant
a = Array("D", "E") 'à adapter
b = Array(20, 5) 'à adapter
i = Application.Match(Target, a, 0)
If IsNumeric(i) Then Target.Resize(, b(i - 1)) = a(i - 1)
End Sub
On peut entrer des lettres en minuscules.

A+
 

Pièces jointes

  • Prolonger(1).xlsm
    16.4 KB · Affichages: 11
Dernière édition:

job75

XLDnaute Barbatruc
Maintenant si vous voulez que des nombres soient entrés quand on tape des lettres :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count > 1 Then Exit Sub 'si sélections multiples
Dim a, b, c, i As Variant
a = Array("D", "E") 'à adapter
b = Array(20, 5) 'à adapter
c = Array(0.25, 0.6) 'à adapter
i = Application.Match(Target, a, 0)
If IsNumeric(i) Then Target.Resize(, b(i - 1)) = c(i - 1)
End Sub
Fichier (2).
 

Pièces jointes

  • Prolonger(2).xlsm
    16.6 KB · Affichages: 6
Dernière édition:

AlexC

XLDnaute Nouveau
@job75 le seul problème c'est que la macro ne fonctionne pas si mes E et mes D proviennent d'une formule…
Lorsque je saisi manuellement un E, il se transforme bien en 0,6, mais les E qui sont dans mon tableau proviennent de la formule suivante : =SI('Plan de charges Projet'!$C$46=HM$6;"E";""), et pour ceux-là, la macro ne s'applique pas... il y a-t-il une manipulation à faire pour résoudre cela ?

Merci beaucoup pour votre aide !
 

job75

XLDnaute Barbatruc
Il suffit d'entrer les formules que vous indiquez :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count > 1 Then Exit Sub 'si sélections multiples
Dim a, b, i As Variant
a = Array("=IF('Plan de charges Projet'!$C$46=HM$6,""D"","""")", "=IF('Plan de charges Projet'!$C$46=HM$6,""E"","""")")
b = Array(20, 5) 'à adapter
i = Application.Match(Target, a, 0)
If IsNumeric(i) Then Target.Resize(, b(i - 1)) = a(i - 1)
End Sub
Il faudrait peut-être mettre le caractère $ devant HM, à vous de voir.
 

AlexC

XLDnaute Nouveau
Super merci beaucoup !
Seul petit hic, ma formule change à chaque cellule…
Puisque je fais un plan de charge dans un calendrier le E ou le D doit s'inscrire dans la cellule correspondant à la date à laquelle à lieu l'action…
Est-ce que je peux mettre une sorte de formule générique ? C'est toujours le même principe sauf que le numéro de la ligne après le C change et pour "HM46" cela depend également de la ligne.. je ne peux pas vous partager mon fichier car il est confidentiel mais je vais vous joindre une capture d'écran, ce sera peut-être plus clair.
Capture d’écran (59).png

Exemple :
Dans FF11 : =SI('Plan de charges Projet'!$C$39=FF$6;"D";"")
Dans FG12 : =SI('Plan de charges Projet'!$C$39=FG$6;"D";"")
Dans FF12 : =SI('Plan de charges Projet'!$C$40=FF$6;"D";"")

Merci encore pour votre aide, vous me dépannez énormément @job75
 
Dernière édition:

job75

XLDnaute Barbatruc
Est-il indispensable de recopier les formules ?

On peut ne pas toucher à la formule et copier la valeur vers la droite :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count > 1 Or Not Target(1).HasFormula Then Exit Sub 'si sélections multiples ou pas de formule
Dim a, b, i As Variant
a = Array("D", "E")
b = Array(20, 5) 'à adapter
i = Application.Match(Target, a, 0)
If IsNumeric(i) Then Target.Offset(, 1).Resize(, b(i - 1) - 1) = a(i - 1)
End Sub
Edit : ajouté le test Not Target(1).HasFormula.
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
314 488
Messages
2 110 132
Membres
110 679
dernier inscrit
lpierr