× Aidez la recherche contre le COVID-19 avec votre ordi ! Rejoignez l'équipe PC Astuces Folding@home
 > Tous les forums > Forum Bureautique
 Report résultat formule Excel
Ajouter un message à la discussion
Page : [1] 
Page 1 sur 1
fredboiss
  Posté le 19/02/2015 @ 09:50 
Aller en bas de la page 
Nouvel astucien

Bonjour à tous,

Pour créer un convertisseur d'unités, je voudrais entrer une valeur en A1 et que la conversion se fasse en A2. Par exemple pour des m³ transformés en litres je vais mettre en A2 : =SI(A1>0;A1*1000;"").

Sauf que je veux rendre ça réversible ET ne pas perdre les formules. Excel n'étant pas mon domaine de prédilection, je m'étais donc imaginé dans ma petite tête que je pouvais utiliser :

Problème : en entrant une valeur en A1, pas de résultat en A2 et mention "FAUX" en C2 :

Comment faire pour reporter le calcul de C2 en A2 sans utiliser par exemple A2=C2 pour garder A2 vierge de toute formule ?

Merci d'avance de vos solutions.



Modifié par fredboiss le 19/02/2015 10:56
Publicité
fredboiss
 Posté le 19/02/2015 à 10:53 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Nouvel astucien

A moins que quelqu'un ait une solution pour entrer une valeur en A1 ou A2 sans effacer les formules présentes dans ces cellules ...

pouyou
 Posté le 19/02/2015 à 11:34 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Bonjour,

Voici une solution,

Tu arranges tes cellules comme tu le souhaites, ceci n'est qu'un exemple. Je ne pense pas que la formule que tu avais imaginé fonctionne dans une feuille de calcul mais peut-être bien dans une macro?

=Si(A2>0;A1=A2/1000;"") ici tu demandes que si la condition est rencontrée le résultat de =A2/1000 se place en A1.

pouyou

fredboiss
 Posté le 19/02/2015 à 11:54 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Nouvel astucien

J'y avais pensé mais vu que j'ai une trentaine d'unités, ça me fait doubler le nombre de lignes ou de colonnes selon la présentation qui sera choisie au final.

Mais s'il n'y a pas d'autres solutions, je finirai par faire ça.

En fait on peut aussi considérer la question plus globalement : comment reporter le résultat d'un calcul dans une cellule en laissant cette même cellule vide ?

Merci de t'être penché la-dessus.

ferrand
 Posté le 19/02/2015 à 13:08 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Bonjour,

Tu ne peux pas avoir à la fois une formule dans une cellule et y saisir des valeurs qui se substitueront à la formule ! Ça tombe sous le sens.

On peut obtenir ce que tu recherches avec une macro qui, automatiquement t'introduirait la formule quand elle s'avère nécessaire, à chaque fois (plusieurs sujets de ce type ont déjà été traités), ou même ferait la conversion et affecterait le résultat.

Mais c'est tout de même plus simple d'utiliser normalement les formules !

fredboiss
 Posté le 19/02/2015 à 16:15 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Nouvel astucien

Plus simple, oui, mais moins marrant !

En imaginant que j'ai envie de me prendre un peu la tête, comment faire avec des macros, sachant que je n'en ai jamais utilisé ?

ferrand
 Posté le 19/02/2015 à 23:16 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Bon ! Pour t'amuser alors !

Tu veux utiliser le moins de cellules possibles. Donc sur ta feuille tu mets en A1 : litres, et en B1 : .

L'idée est que si tu tapes un nombre dans la colonne A représentant des litres, la valeur en m³ s'affiche dans la colonne B (sur la même ligne).

Inversement, tu tapes un nombre de m³ en colonne B et la valeur en litres s'affiche en colonne A.

Pour obtenir cela, tu fais un clic droit sur l'onglet de ta feuille, puis tu cliques sur Visualiser le code.

Cette commande ouvre l'éditeur VBA et simultanément le module attaché à la feuille (qui se présente comme une page blanche).

Tu vas copier la macro ci-dessous et la coller sur cette page :

Private Sub Worksheet_Change(ByVal Target As Range)
Dim c%, k
Set Target = Target.Cells(1, 1)
With Target
If .Column < 3 And .Row > 1 Then
c = .Column
If c = 1 Then
k = 0.001
Else
k = 1000
c = -1
End If
Application.EnableEvents = False
If .Value = "" Then
.Offset(0, c).ClearContents
ElseIf IsNumeric(.Value) Then
.Offset(0, c).Value = .Value * k
End If
Application.EnableEvents = True
End If
End With
End Sub

Voilà, c'est tout. Tu fermes l'éditeur et tu testes.

Un modèle prêt, le cas échéant : http://cjoint.com/?EBtxAHXOP2U

fredboiss
 Posté le 20/02/2015 à 09:12 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Nouvel astucien

Bonjour Ferrand, ça c'est une super info, merci beaucoup !

Alors puisque tu connais apparemment bien le sujet, comment modifier cette macro pour qu'elle fonctionne sur plusieurs lignes ?

J'avais pris un cas simple avec uniquement une conversion de volume.

Mais mon cas exact est une conversion d'unités Europe / USA avec 15 lignes.

Je voudrais utiliser un tableau comme ci-dessous mais j'ai passé plus d'une heure hier soir à m'arracher les cheveux sans succès avec tes lignes de codes ...

Le but n'est pas de demander la macro complète (ça c'est mon boulot), mais plutôt la façon de faire pour travailler ligne par ligne.

Je me suis dit qu'on pouvait peut-être faire une macro par ligne mais je n'ai rien trouvé à ce sujet.

Même si tu ne connais pas les coefficients de conversion, as-tu un exemple pour 2 lignes (j'imagine que le reste n'est que répétition) ?



Modifié par fredboiss le 20/02/2015 09:13
gilbert_rgi
 Posté le 20/02/2015 à 10:37 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Bonjour

en reprenant le VBA de Ferrand que je salue au passage ;-)

voilà pour deux, à vous la suite

http://cjoint.com/?EBukYNrZpTd

Private Sub Worksheet_Change(ByVal Target As Range)
Dim c%, k
Set Target = Target.Cells(1, 1)
With Target
' première condition
If .Column < 3 And .Row = 2 Then
c = .Column
If c = 1 Then
k = 0.001
Else
k = 1000
c = -1
End If
GoTo suite
End If
' seconde condition
If .Column < 3 And .Row = 3 Then
c = .Column
If c = 1 Then
k = 0.5
Else
k = 2
c = -1
End If
GoTo suite
End If

suite:
Application.EnableEvents = False
If .Value = "" Then
.Offset(0, c).ClearContents
ElseIf IsNumeric(.Value) Then
.Offset(0, c).Value = .Value * k
End If
Application.EnableEvents = True

End With
End Sub



Modifié par gilbert_rgi le 20/02/2015 10:40
Publicité
gilbert_rgi
 Posté le 20/02/2015 à 11:32 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

une autre méthode

Private Sub Worksheet_Change(ByVal Target As Range)
Dim c%, k
Set Target = Target.Cells(1, 1)
With Target

If .Column < 3 Then
c = .Column
ligne = .row
Select Case (ligne)
Case 2
If c = 1 Then
k = 0.001
Else
k = 1000
c = -1
End If
Case 3
If c = 1 Then
k = 0.5
Else
k = 2
c = -1
End If
Case 4
' mettre ici la condition pour la ligne 4
Case 5
' mettre ici la condition pour la ligne 5 etc.....
End Select


Application.EnableEvents = False
If .Value = "" Then
.Offset(0, c).ClearContents
ElseIf IsNumeric(.Value) Then
.Offset(0, c).Value = .Value * k
End If
Application.EnableEvents = True
End If
End With
End Sub

fredboiss
 Posté le 20/02/2015 à 11:38 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Nouvel astucien

hum ... comment dire ... j'avais tout bien fait, je tatonnais pour bien définir les colonnes mais grosso modo ça allait bien jusqu'à ce que je fasse une boulette !

En fait, pour appliquer le code à mon classeur, j'ai voulu enregistrer au lieu de fermer.

Comme tout bon débutant qui se respecte, je n'ai pas lu le message d'avertissement qui disait de cliquer sur NON pour conserver les macros, et ... j'ai cliqué sur oui

Du coup, plus aucune macro ne fonctionne, même en recréant le fichier, en repartant de zéro, en utilisant ton fichier, plus rien ...

J'ai beau refaire la page sur Visual Basic, il n'y a plus aucun effet sur la feuille Excel

gilbert_rgi
 Posté le 20/02/2015 à 11:44 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

fredboiss a écrit :

hum ... comment dire ... j'avais tout bien fait, je tatonnais pour bien définir les colonnes mais grosso modo ça allait bien jusqu'à ce que je fasse une boulette !

En fait, pour appliquer le code à mon classeur, j'ai voulu enregistrer au lieu de fermer.

Comme tout bon débutant qui se respecte, je n'ai pas lu le message d'avertissement qui disait de cliquer sur NON pour conserver les macros, et ... j'ai cliqué sur oui

Du coup, plus aucune macro ne fonctionne, même en recréant le fichier, en repartant de zéro, en utilisant ton fichier, plus rien ...

J'ai beau refaire la page sur Visual Basic, il n'y a plus aucun effet sur la feuille Excel

Voir dans les options

la sécurité des macros !!!!!

gilbert_rgi
 Posté le 20/02/2015 à 11:53 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

options / centre de gestion et de confidentialité

paramètres du centre de gestion et de confidentialité

paramètres des macros

cocher les bonnes cases ;-))

peut-être ????

ferrand
 Posté le 20/02/2015 à 15:29 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Bonjour,

Tu aurais dû commencer par indiquer exactement le type de conversion que tu entendais faire ! Car cela modifie sensiblement le problème posée !

Passer d'une unité de mesure à une sous-unité dans le même système et vice-versa se règle avec un coefficient multiplicateur (type : k pour passer de la 1re unité à la 2e, et 1/k pour passer de la 2e à la 1re)... Ce n'est pas toujours le cas lors de conversion d'un système de mesure dans un autre !

Exemple : pour convertir des degrés Farenheit en Celsius : Tc = 9/5*(Tf-32) ; l'inverse : Tf = 9/5*Tc+32. Il y a bien réversibilité d'un coefficient de conversion mais il ne met pas en relation Tc et Tf, mais Tc et (Tf-32)...

Autre cas : la conversion de mètres-cube par heure en pieds-cube par minute. Là on a une double conversion simultanée : mètres-cube/pieds-cube et heure/minute...

Il te faut donc pour chaque conversion établir la formule la réalisant (qui ne peut être intégré directement à la macro car il faudrait alors distinguer les 30 cas de ton tableau)...

Ton tableau occupe 15 ligne sur 4 colonnes : les colonnes A et C sont utilisées pour la saisie et B et D pour indiquer l'unité dans laquelle est exprimée la quantité de la colonne qui précède. Je suggère donc que en colonne E tu mettes la formule pour convertir la quantité en A en unités col.D [que la macro pourra afficher en C lors d'une saisie en A] ; et en colonne F la formule pour convertir la quantité en C en unités col.B [que la macro pourra afficher en A lors d'une saisie en C].

Une fois les formules établies en col. E et F, tu pourras masquer ces 2 colonnes.

A partir de là, il faut recomposer la macro pour l'adapter à la forme de ton tableau et au nouveau dispositif. Je vois ça, avec les explications pour te permettre de la modifier, mais pas le temps tout de suite...

A+

fredboiss
 Posté le 20/02/2015 à 15:35 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Nouvel astucien

Je n'ai même pas encore eu le temps de rétablir les macros, donc pas de soucis, je dormirai bien ce week-end si tu ne m'as pas répondu

C'est vrai que je n'avais pas songé à la conversion de température mais toutes les autres conversions peuvent se faire par K ou 1/K selon le sens de conversion.

Donc en gros, si as du temps à passer là-dessus, je t'en serai vraiment reconnaissant, mais ne vas pas te pourrir le week-end, ça ne vaut pas le coup.

Merci.

ferrand
 Posté le 20/02/2015 à 21:45 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Je fais donc suite à mon post précédent. Pour plus de commodité d'utilisation on va nommer la plage utile pour les conversions, soit : A1:D15. Je l'ai appelée Convers, tu peux changer ce nom, si c'est le cas il faudra le faire aussi dans les macros. Si tu étends ultérieurement la plage de conversion vers le bas, ou si tu modifie son emplacement (en lui conservant la même structure fonctionnelle bien sûr), il suffira de modifier la référence correspondant au nom pour que l'ensemble continue de fonctionner.

Les macros que l'on va utiliser sont particulières, on les désigne sous l'appellation de procédures évènementielles car elles s'exécutent lorsqu'un évènement survient, soit automatiquement sans que l'utilisateur intervienne pour la lancer. S'agissant de procédures d'évènements survenant dans une feuille donnée, ces macros doivent figurer dans un module spécifique attachée à la feuille (chaque feuille de calcul dispose d'un tel module). Pour une vue d'ensemble (qui reste sommaire toutefois), les macros ordinaires vont habituellement dans des modules standards (qu'il faut créer avec la commande Insertion > Module) et les procédures d'évènements concernant l'ensemble du classeur iront dans un module attaché au classeur, que tu trouveras dans l'éditeur VBA sous l'appellation ThisWorkbook.

Reprenon le problème : un première précaution à prendre est de s'assurer que dans la zone de conversion les interventions de l'utilisateur ne concernent qu'une cellule à la fois, de façon qu'on puisse gérer les conversions une par une. Il y a plusieurs façons pour obtenir ce résultat mais dans ta configuration le plus simple est sans doute de veiller à ce qu'on ne puisse sélectionner simultanément plusieurs cellules dans cette zone.

On va donc utiliser pour cela l'évènement Sélection d'une cellule ou d'une plage dans la feuille. La macro suivante réagira lorsque la sélection de l'utilisateur affecte la zone de conversion :

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, Range("Convers")) Is Nothing Then
If Target.Cells.Count > 1 Then Target.Cells(1, 1).Select
Application.CutCopyMode = False
End If
End Sub

Lorsque l'utilisateur procède à une sélection, cela déclenche l'exécution de cette procédure, lancée avec un argument Target, qui représente la plage sélectionnée.

On teste si Target concerne la plage de conversion Convers : la méthode Intersect renvoie la plage d'intersection des deux plages indiquées, si cette dernière plage n'existe pas sa valeur est Nothing, dans ce cas on ne fait rien. Du fait que Intersect renvoie un objet (une plage si elle existe), la syntaxe du test est un peu particulière puisqu'on s'assure pour intervenir que cette plage d'intersection n'est pas (Not) inexistante (Nothing). Si c'est le cas, on fait deux choses :

- si la plage sélectionnée (Target) comporte plusieurs cellules, on réduit la sélection à sa cellule supérieure gauche (si une seule cellule sélectionnée, rien ne change) ;

- la 2e chose est d'empêcher un collage, qui pourrait affecter plusieurs cellules à partir de la sélection d'une seule cellule...

Je suis souvent intervenu pour que la commande concernée (Application.CutCopyMode = False) soit supprimée des macros enregistrées, où elle apparaît dès qu'on enregistre une opération de copier-coller, parce que là elle est (sauf rares exceptions) inutile (donc encombrante inutilement). Ici, si l'on a effectué un copier juste avant, la commande vide le presse-papier, ce qui empêche de coller.

On peut maintenant passer à la conversion proprement dite...

ferrand
 Posté le 20/02/2015 à 22:12 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

L'évènement utilisé est la modification du contenu d'une cellule (Change). On teste de la même façon que précédemment que la cellule affectée est dans la plage de conversion. Si c'est le cas on teste si la cellule est bien destinée à accueillir une valeur à convertir, soit si elle est dans la colonne A ou la colonne C (col. 1 ou 3) : Target.Column Mod 2 va renvoyer 1 si la colonne est de rang impair ou 0 si elle est de rang pair (l'expression ne pouvant renvoyer que 2 valeur (assimilable à Vrai ou Faux) on n'est pas obligé d'ajouter = 1 à la suite de l'expression dans ce test conditionnel).

Si donc cette condition est vérifiée, si la cellule modifiée est en colonne A ou C, on va définir selon le cas la cellule cible ou affecter le résultat de la conversion de la valeur saisie et la cellule source où prélever ce résultat de la conversion. Plus précisément, ces différentes cellules étant sur la même ligne, c'est le décalage colonne de la source et de la cible par rapport à la saisie qu'on va définir (valeur affectée à 2 variables : cc et cs) pour n'avoir plus qu'une ligne de commande à utiliser ensuite. Dans le cas où l'on a non pas saisi une valeur mais effacé la cellule, la cellule cible sera elle aussi effacée.

Private Sub Worksheet_Change(ByVal Target As Range)
Dim cc%, cs%
If Not Intersect(Target, Range("Convers")) Is Nothing Then
If Target.Column Mod 2 Then
With Target
If .Column = 1 Then
cc = 2
cs = 4
Else
cc = -2
cs = 3
End If
Application.EnableEvents = False
If .Value = "" Then
.Offset(0, cc).ClearContents
ElseIf IsNumeric(.Value) Then
.Offset(0, cc).Value = .Offset(0, cs).Value
End If
Application.EnableEvents = True
End With
End If
End If
End Sub

Lors des modifications consécutives à la saisie, on interrompt la réaction à l'évènement (Application.EnableEvents = False) pour la rétablir ensuite (= True). Sans quoi on déclencherait des modifications automatiques successives sans fin...

Publicité
ferrand
 Posté le 20/02/2015 à 22:15 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Tu trouveras ces macros dans le module de Feuil2 : http://cjoint.com/?EBuwzmxNyC8

Pour tester, il te faudra préalablement mettre les formules de conversion en colonnes E et F.

Page : [1] 
Page 1 sur 1

Vous devez être connecté pour poster des messages. Cliquez ici pour vous identifier.

Vous n'avez pas de compte ? Créez-en un gratuitement !


Les bons plans du moment PC Astuces

Tous les Bons Plans
23,99 €Clé USB 3.0 Sandisk Ultra 128 Go à 23,99 €
Valable jusqu'au 05 Juin

Amazon propose la clé USB Sandisk Ultra d'une capacité de 128 Go à 23,99 €. Cette clé USB 3.0 est compatible USB 2.0 et offre de bons débits d'environ 100 Mo/s en lecture et en écriture. Le connecteur est rétractable pour éviter qu'il prenne la poussière.


> Voir l'offre
Gratuit3 mois d'abonnement à Amazon Music Unlimited gratuits
Valable jusqu'au 30 Juin

Amazon vous permet d'essayer son service de streaming musical pendant 3 mois gratuitement. Avec Amazon Music Unlimited, accédez à plus de 50 millions de titres, sans publicité et en illimité sur tous vos appareils : smartphone, tablette, PC/Mac, Fire, Alexa. Vous avez même la possibilité de télécharger vos playlists pour des écoutes hors connexion. A la fin de ces 3 mois, vous pourrez basculer vers l'offre payante à 9,99 € / mois ou bien arrêter sans frais le service. A noter l'existence d'une offre famille à 14,99 € / mois qui permet jusqu'à 6 utilisateurs d'écouter leur musique à tout moment et sur leurs appareils préférés. Vous pouvez annuler l'abonnement à tout moment.


> Voir l'offre
14,88 €Windows 10 Pro 32/64 bits OEM à 14,88 €
Valable jusqu'au 04 Juin

Le vendeur sérieux DIGITAL FR propose sur Amazon  la clé d'activation pour Windows 10 professionnel en français 32 bits / 64 bits à 14,88 €. Cette clé livrée par email fonctionne avec l'outil d'installation et de création de support de Microsoft que vous pouvez télécharger ici ou directement avec l'ISO de Windows 10 Pro. De quoi installer légalement Windows 10 Pro sur un PC. Pour en savoir plus sur l'achat et l'installation d'une clé OEM de Windows 10, suivez les indications de notre dossier pratique.


> Voir l'offre

Sujets relatifs
Probleme de resultat de formule Excel
Excel 2007 résultat formule dans une autre cellule
formule modifiée dans excel donne pas résultat
Excel : Formule qui ne donne pas le même résultat
Excel : formule ou résultat [RESOLU]
affichage du résultat d une formule excel(resolu)
report automatique date et compteur fichier excel.
report automatique date et compteur fichier excel.
Formule excel 2007
formule excel
Plus de sujets relatifs à Report résultat formule Excel
 > Tous les forums > Forum Bureautique