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

  • Initiateur de la discussion Initiateur de la discussion AlexC
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

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+
Sans fichier joint je ne peux rien faire.

Il est facile de joindre un fichier allégé, anonymisé et représentatif du problème.

Bonjour, j'ai anonymisé le fichier, je vous le joins donc.

Malheureusement, oui il est nécessaire de recopier les formules car la "date d'ouverture" dans l'onglet 1 est susceptible d'etre modifiée, et cela doit changer le calendrier automatiquement.

J'espère que le fichier va pouvoir vous etre utile,

Merci d'avance
 

Pièces jointes

Bonjour AlexC,

Les formules de vos MFC n'étaient pas correctes, je les ai modifiées en utilisant cette fonction VBA :
VB:
Function MFC(c As Range, lettre$, n As Byte, feries As Range) As Byte
Dim F As Worksheet, tablo, col%, dat As Date, nn%
Set F = c.Parent
tablo = F.Cells(c.Row, 1).Resize(, c.Column) 'matrice, plus rapide
For col = UBound(tablo, 2) To 1 Step -1
    dat = F.Cells(6, col) 'date en ligne 6
    If Weekday(dat, 2) < 6 And Application.CountIf(feries, dat) = 0 Then
        nn = nn + 1
        If nn > n Then Exit Function
        If tablo(1, col) = lettre Then MFC = 1: Exit Function
    End If
Next
End Function
Formule de la MFC pour la lettre "E" =MFC(C6;"E";5;Références!$B$4:$B$16)

Voyez le fichier joint, en colonnes NF et NG j'ai aussi calculé les sommes pour les valeurs 0,25 et 0,6.

Edit : pour les MFC j'ai coché les cases "Interrompre si Vrai", le calcul est plus rapide.

A+
 

Pièces jointes

Dernière édition:
Whaou super !

Est-ce que je peux calculer ma somme dans les lignes qui étaient prévues pour avoir une charge journalière et mensuelle ou je peux seulement utiliser la méthode que vous avez utilisé dans les colonnes NF et NG ?
 
Vous pouvez faire des calculs sur "Total Charge Journalière", "Total Charge Mensuelle" paraît inutile.

Sur le fichier (1) précédent les MFC se recalculent en 3,3 secondes chez moi.

Sur ce fichier (2) le recalcul se fait en 0,6 seconde grâce au Dictionary sur les jours fériés :
VB:
Public d As Object 'mémorise la variable

Function MFC(c As Range, lettre$, n As Byte, feries As Range) As Byte
Dim tablo, tabdat, col%, dat&, nn%
If d Is Nothing Then Dico
tablo = c.Parent.Cells(c.Row, 1).Resize(, c.Column) 'matrice, plus rapide
tabdat = c.Parent.Cells(6, 1).Resize(, c.Column).Value2 'dates en ligne 6
For col = UBound(tablo, 2) To 1 Step -1
    dat = Val(tabdat(1, col))
    If Weekday(dat, 2) < 6 And Not d.exists(dat) Then
        nn = nn + 1
        If nn > n Then Exit Function
        If tablo(1, col) = lettre Then MFC = 1: Exit Function
    End If
Next
End Function

Sub Dico()
Dim c As Range
Set d = CreateObject("Scripting.Dictionary")
For Each c In [Références!B2:B16]
    d(c.Value2) = ""
Next
End Sub
Le Dictionary est mis à jour quand on modifie l'année en A1 (liste de validation) :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, [A1]) Is Nothing Then Dico 'mise à jour du Dictionary
End Sub
A+
 

Pièces jointes

Bonjour AlexC, le forum,

Dans ce fichier (3) j'ai complètement revu et modifié les MFC.

Il n'y en a plus qu'une pour toutes les lettres et la ligne "Total Charge Journalière" est calculée :
VB:
Public d As Object 'mémorise la variable

Function MFC(cel As Range, feries As Range) As Double
Dim a, b, c, maxi%, tablo, tabdat, col%, dat&, nn%, i As Variant
a = Array("E", "D", "P") 'modifiable
b = Array(5, 20, 20) 'modifiable
c = Array(0.6, 0.25, 0.25) 'modifiable
maxi = Application.Max(b)
If d Is Nothing Then Dico
tablo = cel.Parent.Cells(cel.Row, 1).Resize(, cel.Column) 'matrice, plus rapide
tabdat = cel.Parent.Cells(6, 1).Resize(, cel.Column).Value2 'dates en ligne 6
For col = UBound(tablo, 2) To 1 Step -1
    dat = Val(tabdat(1, col))
    If Weekday(dat, 2) < 6 And Not d.exists(dat) Then
        nn = nn + 1
        If nn > maxi Then Exit Function
        If tablo(1, col) <> "" Then
            i = Application.Match(tablo(1, col), a, 0)
            If IsNumeric(i) Then If nn <= b(i - 1) Then MFC = c(i - 1)
            Exit Function
        End If
    ElseIf nn = 0 Then
        Exit Function 'si samedi, dimanche ou jour férié
    End If
Next
End Function

Function Charge_Journaliere(r As Range, feries As Range)
For Each r In r
    Charge_Journaliere = Charge_Journaliere + MFC(r, feries)
Next
End Function

Sub Dico()
Dim c As Range
Set d = CreateObject("Scripting.Dictionary")
For Each c In [Références!B2:B16]
    d(c.Value2) = ""
Next
End Sub
J'ai aussi mis un SpinButton en A1.

Le recalcul du tableau (quand on modifie l'année) prend 1,5 seconde chez moi.

A+
 

Pièces jointes

Bonjour,

Je suis désolée je n'avais pas vu votre réponse ! Mais un seul mot : WHAOU ! Je n'aurais jamais été capable de faire ça ! Vraiment merci énormément !!

J'adore ce forum ! 🙂

Bonne journée, prenez soin de vous !

Alex
 
Je ne savais même pas qu'on pouvait faire cela 😛

J'ai une petite question à vous poser sur la VBA, à cet endroit :
a = Array("E", "D", "P") 'modifiable
b = Array(5, 20, 20) 'modifiable
c = Array(0.6, 0.25, 0.25) 'modifiable

Etant donné que P correspond à une charge de 0,4 j'ai modifié c de la manière suivante :
c = Array(0.6, 0.25, 0.4) 'modifiable

Mais rien ne change dans les calculs... savez-vous pourquoi par hasard ?
 
Bonjour AlexC,
Mais rien ne change dans les calculs... savez-vous pourquoi par hasard ?
Il ne suffit pas de modifier la macro, il faut agir sur la feuille pour qu'elle se recalcule.

Avec c = Array(0.6, 0.25, 0.25) on obtient FT35 = 2 - FU35 = 2,5 etc...

Modifiez avec c = Array(0.6, 0.25, 0.4) puis revalidez A1 => FT35 = 2,15 - FU35 = 2,65.

Bien sûr le calcul doit être en mode Automatique.

A1
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Retour