Microsoft 365 Macro évenementielle et test de résultat

cedricodelavega

XLDnaute Nouveau
Bonjour,
Je viens de me créer un fichier de cash flow, a peu près automatisé selon des critères modifiables et ajustables.
Afin de peaufiner cet outil, je voudrai arriver à lancer une macro événementielle :
- Dès que la cellule B22 ou D22, ou D27 est modifiée, je voudrai lancer une procédure de test sur les cellules K34 à AE34. (Cette ligne correspond à un prix de vente hypothétique (qui est précalculé dans la ligne 35)), et ce prix de vente, génère une VAN située en I38.
Je voudrai que la procédure affiche le prix de vente cellule par cellule, jusqu'à trouver la meilleure VAN possible.

Grosso modo, la procédure s'arrêterai une fois que le test de la cellule précédente (de la ligne 34) donne une meilleur VAN (i38) que le test de la cellule suivante (située sur la ligne 34). (Je ne sais pas si c'est très clair?)
J'ai eu beau essayer d'enregistrer une macro manuelle, et de la coller à une macro évènementielle, mais je manque cruellement de grammaire en langage VBA.
Je vous remercie d'avance pour vos lumières !!
 

Pièces jointes

  • TABLEAU CF - VTEST MACRO EVENEMENTIELLE.xlsm
    46.9 KB · Affichages: 13

Staple1600

XLDnaute Barbatruc
Bonjour le fil, cedrico, sylvanu

[juste pour infos&pour varier les plaisirs&passer le temps pendant la tempête Ciara]
Une variante d'écriture pour détecter les cellules.
VB:
'syntaxe avec Instr
Sub Worksheet_Change(ByVal T As Range)
    If Target.Count > 1 Then Exit Sub
    If InStr(1, "$B$22$D$22$D$27", T.Address, 1) Then
    MsgBox "Test"
    End If
End Sub
'syntaxe avec If Or
Sub old_Worksheet_Change(ByVal Target As Range)
    If Target.Count > 1 Then Exit Sub
    ValA = Target.Address
    If ValA = "$B$22" Or ValA = "$D$22" Or ValA = "$D$27" Then
    MsgBox "Test"
End If
End Sub
Ca peut toujours servir (ou pas) ;)
[/juste pour infos&pour varier les plaisirs&passer le temps pendant la tempête Ciara]
 

cedricodelavega

XLDnaute Nouveau
Le mieux est que vous puissiez me fournir un fichier avec toutes le tableau rempli ( avec des données bidon mais réalistes ) je vous ferais un exemple.
La méthode sans macro est dans votre cas la meilleure solution à mes yeux.
le tableau fourni initialement est rempli pour une durée d'occupation de 12 ans (durée du crédit); avec les "vrais chiffres".

Dans l'idée d'automatisation, j'ai écrit un début de macro que je n'arrive pas à finaliser, mais dans l'idéal, il faudrait que cela fasse cela :


VB:
Test 0 = VAN < 0


test1 :
Range("L34").Select
    Application.CutCopyMode = False
    ActiveCell.FormulaR1C1 = "=R[1]C"

-> Ici, je voudrai que la macro regarde si la VAN obtenue en I38 (après le test 1) est supérieure à celle obtenue avec le test 0 (a priori, c'est vrai, puisqu'on part d'une VAN négative).
alors, SI I38 du test 1 est supérieure à celle du test 0, alors on continue, et on fait

Range("L34").Select
Selection.ClearContents

Puis on effectue le Test 2:
Test 2 =
Range("M34").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "=R[1]C"

-> Ici, je voudrai que la macro regarde si la VAN obtenue en I38 (après le test 2) est supérieure à celle obtenue avec le test 1. Alors, SI I38 du test 2 est supérieure à celle du test 1, alors on continue, et on fait
Range("M34").Select
Selection.ClearContents

Puis on effectue le test 3

Test 3:

Range("N34").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "=R[1]C"

etc etc.... jusqu'à ce que la VAN du test X soit inférieure à celle du test précédent...

Est ce que c'est plus clair ?
Et surtout, est ce que c'est traduisible en codage macro ?
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Bonjour à toi aussi cedrico... :rolleyes: (cf le message#17)

Petit conseil esthétique en passant
Utilises les balises BBCODE :
[CODE=vb]Texte Macro VBA[/CODE]
Ton message sera de suite plus lisible
VB:
Range("M34").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "=R[1]C"
Range("M34").Select
Selection.ClearContents
Range("N34").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "=R[1]C"
Range("N34").Select
Selection.ClearContents
Range("O34").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "=R[1]C"
Range("O34").Select
Selection.ClearContents
Range("P34").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "=R[1]C"
Range("P34").Select
Selection.ClearContents
Range("Q34").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "=R[1]C"
Range("Q34").Select
Selection.ClearContents
Range("R34").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "=R[1]C"
Range("R34").Select
Selection.ClearContents
Range("S34").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "=R[1]C"
Range("S34").Select
Selection.ClearContents
Range("T34").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "=R[1]C"
Range("T34").Select
Selection.ClearContents
Range("U34").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "=R[1]C"
Range("U34").Select
Selection.ClearContents
Range("V34").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "=R[1]C"
Range("V34").Select
Selection.ClearContents
Range("W34").Select
Selection.ClearContents
Range("W34").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "=R[1]C"
Range("W34").Select
Selection.ClearContents
Range("X34").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "=R[1]C"
Range("X34").Select
Selection.ClearContents
End Sub
 

cedricodelavega

XLDnaute Nouveau
Bonjour à toi aussi cedrico... :rolleyes: (cf le message#17)

Petit conseil esthétique en passant
Utilises les balises BBCODE :
[CODE=vb]Texte Macro VBA[/CODE]
Ton message sera de suite plus lisible
VB:
Range("M34").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "=R[1]C"
Range("M34").Select
Selection.ClearContents
Range("N34").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "=R[1]C"
Range("N34").Select
Selection.ClearContents
Range("O34").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "=R[1]C"
Range("O34").Select
Selection.ClearContents
Range("P34").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "=R[1]C"
Range("P34").Select
Selection.ClearContents
Range("Q34").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "=R[1]C"
Range("Q34").Select
Selection.ClearContents
Range("R34").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "=R[1]C"
Range("R34").Select
Selection.ClearContents
Range("S34").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "=R[1]C"
Range("S34").Select
Selection.ClearContents
Range("T34").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "=R[1]C"
Range("T34").Select
Selection.ClearContents
Range("U34").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "=R[1]C"
Range("U34").Select
Selection.ClearContents
Range("V34").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "=R[1]C"
Range("V34").Select
Selection.ClearContents
Range("W34").Select
Selection.ClearContents
Range("W34").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "=R[1]C"
Range("W34").Select
Selection.ClearContents
Range("X34").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "=R[1]C"
Range("X34").Select
Selection.ClearContents
End Sub


oups, je découvre à l'instant votre message. Et je crois que je viens d'en poster un sans balise...
(par la même occasion, je viens d'apprendre ce qu'est une balise...... :) )
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re Cedric, Bonjour Staple.
Le fichier joint fait exactement la même chose sans macro. Il suffit d'essayer de comprendre comment ça marche.
D'autant que votre macro ne fait que la moitié du boulot. A chaque calcul il faut regarder le VAN est voir si on est à l'optimum.
 

Pièces jointes

  • TABLEAU CF - VTEST MACRO EVENEMENTIELLE (6).xlsm
    59.4 KB · Affichages: 2

cedricodelavega

XLDnaute Nouveau
Re Cedric, Bonjour Staple.
Le fichier joint fait exactement la même chose sans macro. Il suffit d'essayer de comprendre comment ça marche.
D'autant que votre macro ne fait que la moitié du boulot. A chaque calcul il faut regarder le VAN est voir si on est à l'optimum.
Avant toute chose, merci pour votre aide Sylvanu, et Stapple,
Sylvanu, je viens de regarder a nouveau, et le calcul de la VAN que vous proposez n'intégre pas les flux passé ajouté a ceux de la vente.
C'est pour cette raison que je souhaite vérifier la cellule I38 a chaque test (car cette cellule détient la somme des flux actualisés + le produit de la vente actualisé aussi)
 

Staple1600

XLDnaute Barbatruc
Re

cedrico
Comme le disait sylvanu, ce serait plus simple de disposer d'un fichier exemple (sans données confidentielles) fourni par tes soins
Parce qu'en simplement lisant le code VBA de ta macro, j'ai du mal à voir ce tu veux faire ;)

PS: Tu peux éditer ton précédent message pour y ajouter les balises idoines. ;)

EDITION: Je viens de voir la réponse de sylvanu et son fichier.
Par conséquent, ne pas tenir compte de ce message
(ou alors juste pour ce qui concerne le balisage)
 

cedricodelavega

XLDnaute Nouveau
Rebonjour Staple,

La ligne 35 (qui est en blanc) contient les prix de vente de chaque année. Afin de comptabiliser le prix de vente de l'année 2021 dans la VAN, j'effectue l'opération suivante : L34=L35. Ainsi, je peux vérifier le montant de ma VAN si je vends mon bien en 2021.

Ensuite, pour vérifier quel est le montant de ma VAN si je vends en 2022, il faut que dans un premier temps j'annule l'opération faite en L34 (autrement dit la vente faite en 2021 donc je fais L34=0), puis que je fasse M34=M35 pour simuler une vente en 2022, et vérifier ma VAN (en I38)... et ainsi de suite jusqu'à ce que j'obtienne le meilleur montant de VAN (et donc l'année la plus favorable à la vente)

J'ai tenté d'enregistrer une macro en effectuant l'opération manuellement, mais je manque de vocabulaire de programmation pour finaliser cela. J'ai néanmoins tenté de décrire ce que je souhaitais que la macro fasse...

VB:
Test 0 = VAN < 0


test1 :
Range("L34").Select                                      (je selectionne la cellule L34, et je fais = L35)
    Application.CutCopyMode = False          (Ainsi, mon prix de vente apparait en L34)
    ActiveCell.FormulaR1C1 = "=R[1]C"        (et est comptabilisé dans la VAN en I38)

-> Ici, je voudrai que la macro regarde si la VAN obtenue en I38 (après le test 1) est supérieure à celle obtenue avec le test 0 (a priori, c'est vrai, puisqu'on part d'une VAN négative).
alors, SI I38 du test 1 est supérieure à celle du test 0, alors on continue, et on fait

Range("L34").Select
Selection.ClearContents

Puis on effectue le Test 2:
Test 2 =
Range("M34").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "=R[1]C"

-> Ici, je voudrai que la macro regarde si la VAN obtenue en I38 (après le test 2) est supérieure à celle obtenue avec le test 1. Alors, SI I38 du test 2 est supérieure à celle du test 1, alors on continue, et on fait
Range("M34").Select
Selection.ClearContents

Puis on effectue le test 3

Test 3:

Range("N34").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "=R[1]C"

etc etc.... jusqu'à ce que la VAN du test X soit inférieure à celle du test précédent...
 

Pièces jointes

  • TABLEAU CF - VTEST MACRO EVENEMENTIELLE.xlsm
    53 KB · Affichages: 1

cedricodelavega

XLDnaute Nouveau
Re

=>cedrico
Merci pour avoir balisé et téléversé ;)
Mais quand on cause VAN, moi je réponds HALEN
Donc je passe les clés ;) à sylvanu qui a plus l'air dans le VAN que moi ;)
Ahah !!
Evidemment, VAN HALEN !!
dans un autre style, il y a Tommy Emmanuel qui est pas mal du tout aussi !!
Mais du coup, savez vous si le test que je voudrai effectuer est transcriptible sous forme macro ?
 

cedricodelavega

XLDnaute Nouveau
Bonsoir Sylvanu, et Staple,

Après avoir retourné le problème dans tous les sens, je me rends compte que - comme me le conseillait sylvanu - il est préférable de passer par une série de formules.
Néanmoins, je me rends compte que mon problème était posé à l'envers, et que plus le temps passe, plus la vanne est positive, même si sa courbe fléchit et stagne au bout d'une douzaine d'année. (Forcément, puisque le taux d'actualisation impacte la van d'année en année...)
En prenant la situation a l'envers, cela m'a permis de mettre en place un tableau -comme me le suggérait sylvanu, qui me permet de découvrir à partir de quel moment la VAN est positive, ce qui en soi, reste une information importante en vue de prendre des décisions.

Je vous remercie infiniment pour votre aide qui m'a fait prendre le recul nécéssaire pour mieux poser mon problème.

Je vous souhaite une très bonne soirée.
Cordialement.
Cédrico
 

Discussions similaires

Statistiques des forums

Discussions
312 332
Messages
2 087 362
Membres
103 530
dernier inscrit
Chess01