VBA formule à decaler

bonjour,

Je souhaiterais pouvoir automatiquement décaler une formule qui calcule un pourcentage entre 2 cellules situées sur une même ligne.

Ex : A1=M1/T1-1

Décalage à chaque fois que j utilise la macro de façon automatique de M1 à la colonne précédente L1 (T1 en S1)

Puis quand à la nouvelle exécution de la macro L1 en K1 (S1 en R1).
etc…

Chaque fois en fait décalage de la colonne de 1 pour le numérateur et dénominateur de la formule.

merci d’avance pour votre aide,

Salut Vincegt,

Dans quelles circonstances cette macro doit-elle se déclencher ?
Le résultat doit-il s'afficher dans une MsgBox, dans une cellule particulière ?
Pourquoi pas des formules ?

Bref, comme toujours...


A+

Bonsoir,

en pj fichier (j'ai du effacer des données confidentielles).

En gros chaque semaine je reçois des données de ventes et je souhaite les comparer avec ce qui a été fait un an plus tôt et vs semaine précédente.

Jusqu'à maintenant je décale mois même les éléments de la formule et je souhaiterais savoir comment faire pour quand les données de la nouvelle semaine seront complétées elles se comparent à la semaine équivalente de l'année précédente et à la semaine précédente (et ainsi de suite) via une macro.

Formules à automatiser sont en C22 et D22.

Ex quand S38 disponible :

C22 = U22/BW22-1 doit devenir C22 = T22/BV22 et D22 =U22/V22-1 doit devenir T22/U22-1

Quand S39 dispo :

C22 = T22/BV22 doit devenir C22 = S22 / BU22-1 et D22 = T22/U22-1 doit devenir S22/T22-1

Ainsi de suite...

fichier en pj.

Merci d'avance pour l'aide,

Cdt

Salut Vincegt,

voilà ton fichier à ma sauce...

- j'ai supprimé les volées de semaine du "futur" qui n'apportent rien (j'imagine...!?) à tes analyses ;
- en colonne [F:F] se trouvera dorénavant la semaine en attente d'être encodée ;
- quand la colonne est complète, la macro se charge de :
* insérer une nouvelle colonne avec calcul des semaines ;
Cette insertion ne se produira que pour dégager l'espace d'encodage de la semaine suivante
* créer la formule Jour -1 en [D22].
* de rechercher la semaine à - 1 an avec, éventuellement un message de non-existence, et de créer la formule en [C22].
- ici, pour l'exemple, il y a un retard d'encodage de plusieurs semaines (il peut y avoir des vacances, des oublis, absence de rapport de ventes,...) ; la macro détecte le retard et insère autant de fois que nécessaire au fur et à mesure de l'encodage pour résorber le retard.

Cette façon de faire optimise l'espace (pas de semaines inutiles) et évite (théoriquement) les erreurs de numérotation des semaines.

Private Sub Worksheet_Change(ByVal Target As Range)
'
Dim dDate As Date, iYear%, iWeek%, iCol1%, iCol2%
'
If Not Intersect(Target, Range("F6:F21")) Is Nothing And WorksheetFunction.CountA(Range("F6:F21")) = 16 Then
    If DateAdd("d", 7, fctDateSem(CInt(Cells(2, 6)), CInt(Cells(3, 6)))) <= fctDateSem(Year(Date), WorksheetFunction.IsoWeekNum(Date)) Then
        Call InsertWeek
        dDate = DateAdd("yyyy", -1, fctDateSem(CInt(Cells(2, 7)), CInt(Cells(3, 7))))
        iWeek = WorksheetFunction.IsoWeekNum(dDate)
        iYear = Year(dDate)
        On Error Resume Next
        iCol1 = Rows(2).Find(what:=iYear, lookat:=xlWhole, LookIn:=xlValues, searchdirection:=xlNext).Column
        If iCol1 > 0 Then iCol2 = Range(fctCol(iCol1) & 3).Resize(1, Cells(3, Columns.Count).End(xlToLeft).Column).Find _
            (what:=iWeek, lookat:=xlWhole, LookIn:=xlValues, searchdirection:=xlNext).Column
        On Error GoTo 0
        [D22].FormulaLocal = "=G22/H22"
        If iCol2 > 0 Then
            [C22].FormulaLocal = "=G22/" & fctCol(iCol2) & "22"
        Else
            [C22] = 0
            MsgBox "La semaine " & iWeek & " de l'année " & iYear & " n'a pas été trouvée !", vbCritical + vbOKOnly, "Info"
        End If
    End If
End If
'
End Sub
2vincegt.xlsm (43.85 Ko)


A+

Merci pour la réponse mais c'est pas exactement ma demande.

Je souhaiterais que les colonnes des futures semaines restent (pour MAJ de graphs auto).

Là la macro insère effectivement des colonnes mais ma question était sur la formule en C22 et D22 qui ne se mettent pas à jour avec décalage comme je l'ai expliqué.

Salut Vincegt,

OK pour les MAJ de graphs auto.

Sinon, si, si, les formules se mettaient à jour.
Cela dit, ton fichier n'est pas top : n° de semaines en double, une 53e semaine de 2021 qui n'existe pas. C'était aussi pour éliminer ces soucis de cohérence que j'avais "trafiqué" ton fichier.

Mais, bon, moi ou un autre, on va te refaire ça dès que possible !


A+

Bonjour tout le monde,

Juste pour le fun, uniquement en formules. Je rejoins Curulis, présentation pas top pour en tirer quelque chose.

Pour avoir la même chose que C22 :

=DECALER(E22;0;EQUIV(VRAI;INDEX($F$22:$DG$22<>"";0);))/DECALER(E22;0;EQUIV(ANNEE(AUJOURDHUI())-1;$F$2:$DG$2;0)+EQUIV(DECALER(E22;-19;EQUIV(VRAI;INDEX($F$22:$DG$22<>"";0);));$F$3:$DG$3;0))-1

Pour D22 :

=DECALER(E22;0;EQUIV(VRAI;INDEX($F$22:$DG$22<>"";0);))/DECALER(E22;0;EQUIV(VRAI;INDEX($F$22:$DG$22<>"";0);)+1)-1

Merci pour les formules,

c'est exactement ça que je voulais :)

Top

Bonjour,

Cool.

Rechercher des sujets similaires à "vba formule decaler"