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+

AlexC

XLDnaute Nouveau
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

  • Calendrier des charges.xlsm
    124.6 KB · Affichages: 9

job75

XLDnaute Barbatruc
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

  • Calendrier des charges(1).xlsm
    129.9 KB · Affichages: 9
Dernière édition:

AlexC

XLDnaute Nouveau
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 ?
 

job75

XLDnaute Barbatruc
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

  • Calendrier des charges(2).xlsm
    126.6 KB · Affichages: 8

job75

XLDnaute Barbatruc
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

  • Calendrier des charges(3).xlsm
    135.8 KB · Affichages: 20

AlexC

XLDnaute Nouveau
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
 

AlexC

XLDnaute Nouveau
Je ne savais même pas qu'on pouvait faire cela :p

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 ?
 

job75

XLDnaute Barbatruc
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
 

Discussions similaires

Statistiques des forums

Discussions
312 215
Messages
2 086 329
Membres
103 183
dernier inscrit
karelhu35