| ||||||||
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é | ||||||||
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 ... | |||||||
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
| |||||||
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. | |||||||
![]() ![]() | 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 ! | |||||||
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é ? | |||||||
![]() ![]() | 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 : m³. 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) Voilà, c'est tout. Tu fermes l'éditeur et tu testes. Un modèle prêt, le cas échéant : http://cjoint.com/?EBtxAHXOP2U | |||||||
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 | |||||||
Astucien | Bonjour en reprenant le VBA de Ferrand que je salue au passage ;-) voilà pour deux, à vous la suite http://cjoint.com/?EBukYNrZpTd
Modifié par gilbert_rgi le 20/02/2015 10:40 | |||||||
Publicité | ||||||||
Astucien | une autre méthode
| |||||||
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 | |||||||
Astucien | fredboiss a écrit : Voir dans les options la sécurité des macros !!!!! | |||||||
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 ???? | |||||||
![]() ![]() | 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+ | |||||||
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. | |||||||
![]() ![]() | 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) 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... | |||||||
![]() ![]() | 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) 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é | ||||||||
![]() ![]() | 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. | |||||||
|
Les bons plans du moment PC Astuces | Tous les Bons Plans | |||||||||||||||
|