Insérer formule dans une cellule et reporter le résultat dans cellule vide

Bonjour et tout d'abord, je souhaite à tous et à toutes une excellente année 2021.

J'ai besoin de mettre à jour mes tableaux pour l'année 2021.

Maintenant que j'habite le Pérou, j'ai besoin que les dépenses et tout le tralala soient à la fois en dollars et en soles (monnaie péruvienne).

Donc, le processus est le suivant:

1) Je peux inscrire dans le 1e tableau, Compte Forfait Essentiel ScotiaBank, la date, choisir dans la catégorie : Vir. Ch. => Soles, une description et un montant dans la colonne "Retraits".

Les valeurs s'inscrivent aux bons endroits dans le 2e tableau, Suivi des dépenses en soles. Excellent !

2) Dans ce même tableau, je dois pouvoir convertir les montants de Dollars en Soles et vice versa.

Évidemment, la manière facile est de créer la formule simple =SOMME(Y11*W11) et la mettre en AA11. La même chose en AE: =SOMME(AC11*W11).

3) Voilà où ça ne va pas. Parfois, je dois aussi être capable d'inscrire une valeur "à la main" dans Y ou AA, AC ou AE et que les calculs se fassent de la même manière.

Mais si je fais ainsi, les formules foutent le camp. J'ai essayé de mettre ces formules dans une autre cellule, exemple dans Z et que le résultat soit copié dans Y. C'est impossible dans Excel parce que, pour ce faire, les cellules Y, AA, AC et AE doivent être vides.

4) La solution pourrait être dans le VBA que j'ai récupéré sur le Net. Mais, dans ce domaine je ne connais pas grand chose. Je ne peux que me laisser guider.

Alors, est-ce que un de vous aurait une petite idée comme résoudre cette impasse ?

Merci beaucoup pour votre aide,

Camaalot

Option Explicit

'--- Dim vOldValue As Variant

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim chqLR As Long, solLR As Long, celLR As Long, visLR As Long, MCrdLR As Long

'--- If vOldValue <> "" Then Exit Sub    --- évite création nouvelle ligne en cas de simple correction

If Target.Row < 10 Or Target.Row > 106 Then Exit Sub

chqLR = Range("C" & 106).End(xlUp).Row
solLR = Range("Q" & 106).End(xlUp).Row
celLR = Range("AK" & 106).End(xlUp).Row
visLR = Range("AY" & 106).End(xlUp).Row

If Target.Column = 5 Or Target.Column = 7 Or Target.Column = 9 Then
    '--- compte Forfait essentiel ScotiaBank
    If Range("I" & Target.Row) = "" Then Exit Sub

    If UCase(Range("E" & Target.Row)) = UCase("Vir. Ch. => Soles") Then
        '--- vers Suivi des dépenses en soles
        Range("Q" & solLR + 1) = Range("C" & Target.Row)
        Range("S" & solLR + 1) = Range("E" & Target.Row)
        Range("U" & solLR + 1) = Range("G" & Target.Row)
        Range("AC" & solLR + 1) = Range("I" & Target.Row)

    ElseIf UCase(Range("E" & Target.Row)) = UCase("Vir. Ch. => Céli") Then
        '--- vers Compte Céli ScotiaBank
        Range("AK" & celLR + 1) = Range("C" & Target.Row)
        Range("AM" & celLR + 1) = Range("E" & Target.Row)
        Range("AO" & celLR + 1) = Range("G" & Target.Row)
        Range("AS" & celLR + 1) = Range("I" & Target.Row)

    ElseIf UCase(Range("E" & Target.Row)) = UCase("Visa - Paiement") Then
        '--- vers Visa Desjardins
        Range("AY" & visLR + 1) = Range("C" & Target.Row)
        Range("BA" & visLR + 1) = Range("E" & Target.Row)
        Range("BC" & visLR + 1) = Range("G" & Target.Row)
        Range("BK" & visLR + 1) = Range("I" & Target.Row)
    End If

ElseIf Target.Column = 37 Or Target.Column = 41 Or Target.Column = 45 Then
    '--- compte Céli ScotiaBank
    If Range("AK" & Target.Row) = "" Then Exit Sub

    If UCase(Range("AG" & Target.Row)) = UCase("Vir. Céli => Ch.") Then
        '--- vers compte Forfait essentiel ScotiaBank
        Range("C" & chqLR + 1) = Range("AE" & Target.Row)
        Range("E" & chqLR + 1) = Range("AG" & Target.Row)
        Range("G" & chqLR + 1) = Range("AI" & Target.Row)
        Range("K" & chqLR + 1) = Range("AK" & Target.Row)

    End If

End If

End Sub

'---Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    '---If Target.Cells.Count = 1 Then vOldValue = Target.Value
'--- End Sub

Bonjour,

Votre idée de la cellule intermédiaire semble la meilleure. Supposons que la cellule de saisie soit en Z1, alors si elle est remplie, elle a la priorité :

=SI(Z1<>"";Z1;Y11*W11)

Cdlt,

Merci 3GB pour la réponse.

Suivant votre suggestion, une question me vient en tête.

Je m'explique :

Dans W11 il y a la valeur S/ 2,8398 et dans Y11, la valeur 50$. Si, dans Z11, on utilise la formule =SI(Z1<>"";Z1;Y11*W11), on retrouvera dans Z11 la valeur S/ 14.99.

Maintenant, J'ai besoin que la valeur de Z11 soit reportée dans AA11 sans qu'il y ait de formule dans AA11.

Pourquoi? Parce que si j'ai besoin d'entrer une valeur manuellement, la formule que j'aurai entré dans cette celulle sera supprimée.

J'espère avoir été clair, si non, Je tenterai de l'être.

Merci

Camaalot

Bonjour,

Désolé, j'ai mis Z1 dans la formule au lieu de Z11.

Si j'ai bien compris, il faut cette formule en AA11 :

=SI(Z11<>"";Z11;W11*Y11)

Si Z11 est remplie, AA11 affiche sa valeur. Sinon, par défaut, AA11 affiche le produit de W11 et Y11. Les 3 cellules en W, Y et Z sont des saisies (surtout Z11). C'est donc dans Z11 qu'on rentre la valeur manuellement (c'est notre cellule de secours, notre cellule intermédiaire permettant de modifier la valeur "normale" de AA11) et AA11 conserve ainsi sa formule.

En tout cas, il ne faut pas supprimer la formule en AA11, il faut la conserver et l'adapter ou alors passer par une autre solution avec une macro mais c'est à mon avis une moins bonne solution, pour ne pas dire une mauvaise.

Enfin, Z11 ici est un exemple, vous pouvez très bien décider que cette cellule soit O11 ou AI11 ou BP11...

Cdlt,

Bonjour 3GB,

Je m'excuse d'avoir tardé à répondre. travail oblige.

Merci beaucoup pour votre suggestion. Bien que j'avais réfléchi à une solution semblable, la vôtre en est une "version améliorée". Excellent!

1) Après avoir réfléchi, je me suis rendu compte que : =SI(Z11<>"";Z11;Y11*W11) ou =SI(AD11<>"";AD11;AC11*W11) dans AE11, (ce qui est la même chose mais dans une cellule différente,) met bien à jour la valeur de AE11 si une valeur se retrouve dans AD11.

Au départ, j’avais pensé à modifier le VBA en conséquence mais, vous me dite :

En tout cas, il ne faut pas supprimer la formule en AA11, il faut la conserver et l'adapter ou alors passer par une autre solution avec une macro mais c'est à mon avis une moins bonne solution, pour ne pas dire une mauvaise.

Pourquoi se serait une moins bonne solution, pour ne pas dire une mauvaise?

2) Par contre, un nouveau problème a surgi. La valeur dans AC11 ne correspond plus à la nouvelle valeur dans AE11. Pourquoi? Il faut que le taux de change CAD-PEN soit réactualisé.

Alors, appliquant votre suggestion à AE11, j’ai réfléchi et j’en suis venu à cette conclusion : (voir le nouveau fichier joint.)

a) Le VBA est modifié de cette façon :

[…]

    If UCase(Range("E" & Target.Row)) = UCase("Vir. Ch. => Soles") Then
        '--- vers Suivi des dépenses en soles
        Range("Q" & solLR + 1) = Range("C" & Target.Row)
        Range("S" & solLR + 1) = Range("E" & Target.Row)
        Range("U" & solLR + 1) = Range("G" & Target.Row)
        Range("AC" & solLR + 1) = Range("I" & Target.Row)  '--- changé pour Range("AB" & solLR + 1) = Range("I" & Target.Row)

[...]

b) Dans AC11, je mets =SI(AD11<>"";AE11/W11;AB11). De cette manière, AC11 prend la valeur de AB11 et s’il y a quelque chose dans AD11, AC11 fait une nouvelle opération en divisant AE11 (la nouvelle valeur en soles par W11 (le taux de change actualisé).

Voilà. Je pense que tout fonctionne bien. Si vous voulez vérifier et corriger, libre à vous de le faire. Je serai ravi de voir vos nouvelles suggestions.

Je vous remercie et vous souhaite une excellente journée,

Camaalot

Bonjour Camaalot,

Aucun problème, je comprends bien .

Pour vous répondre :

1) J'ai dit que ce serait une mauvaise solution car il faut régler les problèmes avec les outils appropriés (on ne chasse pas une mouche avec un bazooka ). Ici, le problème peut se régler très facilement avec une formule lisible, alors il ne faut pas s'en priver. Avec VBA, il faut tout cadrer (surtout avec une macro évènementielle qui "échappe à notre contrôle" puisqu'elle est déclenchée automatiquement, qu'il y ait intention ou pas), on doit maintenir le code, toujours ajouter des rectifications, des conditions supplémentaires et malgré ça, on est jamais à l'abri d'erreurs, moins faciles à déboguer qu'un simple #VALEUR directement accessible sur la feuille excel...

J'ai tendance à penser que VBA est à utiliser pour automatiser certaines actions, souvent répétitives et régulières, qui ne peuvent être réalisées simplement avec les seuls outils d'excel.

2) C'est compliqué pour moi de vous répondre car il faudrait vraiment que je m'imprègne de votre fichier, ce qui n'est pas simple justement quand on en connait pas l'utilisation précise. D'autant plus qu'on est pas loin de la circularité avec des changements qui sont susceptibles d'en entrainer d'autres. Ca me demanderait un peu de temps.

D'ailleurs, je ne comprends pas bien l'interdépendance puisqu'on dirait qu'il s'agit de comptes distincts (Mais je crois que j'ai compris, l'évènement sert à gérer les transactions internes ?, et éviter les doubles saisies en devises différentes, ce qui expliquerait tout).

En tout cas, si ça marche, tant mieux, c'est l'essentiel !

Je vous remercie de votre retour et vous souhaite une très bonne fin de journée également (ici, on est déjà en fin de soirée).

Cdlt,

Bonsoir,

J'entends bien votre point sur le VBA. Je suis d'accord qu'il est bien facile de le faire avec des formules.

J'explique un peu mieux le but de ce fichier. C'est un fichier de gestion de comptes en banques. Comme je disais, j'ai un compte en banque en dollars canadiens mais, je vis au Pérou.

Évidemment, mes dépenses sont en soles, monnaie locale mais, mes revenus en dollars canadiens.

Alors, pour bien gérer mes dépenses et ne pas me retrouver dans des situations fâcheuses, il est nécessaire que je sache combien valent chaque transaction dans chacune des monnaies.

Voilà pourquoi je fais tout ce tralala et, comme vous le dites, est bien près des références circulaires.

Autre sujet que me chicote. Dans une cellule , exemple AE11, j'ai une valeur de 0,00$ et dans AG, j'ai =SI(ET(AA11="";AE11="");"";$AG$10-SOMME($AA$11:AA11)+SOMME($AE$11:AE11))

AG11 retourne la valeur de AG10. Je ne trouve pas comment je pourrais faire pour que AG:AG soit vide quand AA11 et AE11 affichent 0,00$.

J'ai essayé =SI(ET(AA11="0";AE11="0");"";$AG$10-SOMME($AA$11:AA11)+SOMME($AE$11:AE11)) et

=SI(ET(AA11="0,00$";AE11="00,0$");"";$AG$10-SOMME($AA$11:AA11)+SOMME($AE$11:AE11))

Rien n'y fait. J'ai toujours la valeur de AG10. ????

Merci et bonne nuit de repos,

Camaalot

Bonjour,

J'ai l'impression que la formule marche bien. C'est juste qu'en ligne 11 (sur votre dernier fichier), il y a une saisie donc AG11 n'est pas vide mais n'a pas pour autant la même valeur que AG10.

J'imagine que vous saisissez soit un dépôt soit un retrait et de toute manière, il s'agit de nombres positifs donc un de ces 2 formules pourrait mieux vous aller :

En gardant le solde initial et en y intégrant le total des opérations :

=SI(AA11+AE11=0;0;$AG$10-SOMME($AA$11:$AA11)+SOMME($AE$11:$AE11))

en prenant l'opération en cours et juste le solde précédent (dans ce cas, il ne faut pas avoir de lignes vides) :

=SI(AA11+AE11=0;0;$AG10-$AA11+$AE11)

Et si vous voulez que AG11 ne renvoie rien, il faut remplacer le 0 (2è argument du SI) par "".

Cdlt,

Bonjour,

Merci beaucoup pour les conseils.

J'ai beaucoup avancé dans ce projet.

Comme on dit au Canada: À la revoyure! Au revoir!

Bonne journée,

Camaalot

Merci, très bonne fin de journée à toi aussi et bonne continuation !

A la revoyure,

Cdlt,

Rechercher des sujets similaires à "inserer formule reporter resultat vide"