Comprendre le langage VBA d'un Macro

Forum pour toutes vos questions à propos d'Excel (avec ou sans macros) ...
Brahmi Mohamed
Nouveau venu
Nouveau venu
Messages : 4
Inscrit le : 11 juillet 2018
Version d'Excel : 2013

Message par Brahmi Mohamed » 11 juillet 2018, 15:20

Bonjour,

Je suis nouveau dans les macros VBA, je souhaite comprendre le langage de la macro ci-dessous, je sais qu'il s'agit là d'une boucle while wend, ce que je veux savoir, ça signifie quoi (Application.Goto Reference:="calcal" et Application.Goto Reference:="valcal") .

D'avance merci :)

Sub PRD4()
'
' PRD4 Macro
' Macro recorded 6/7/2006 by MARC HULIN
Calculate
While Range("check") > 0.000001
Application.Goto Reference:="calcal"
Selection.Copy
Application.Goto Reference:="valcal"
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False

Application.CutCopyMode = False

Calculate
Wend
Sheets("SP DATA").Select
End Sub
MFerrand
Fanatique d'Excel
Fanatique d'Excel
Messages : 15356
Appréciations reçues : 237
Inscrit le : 20 juillet 2015
Version d'Excel : 2010 FR

Message par MFerrand » 11 juillet 2018, 15:38

Bonjour,

Cette macro repose sur un bonne partie de code enregistré, je pense donc qu'il est d'abord à réécrire, et je ne perdrai pas mon temps à le commenter en l'état. Désolé sur ce point ! :)

Pour le reste, il fait appel à des noms qui sont vraisemblablement des noms de plages : check, calcal, valcal. Il serait donc bon d'avoir le fichier qui va avec pour le vérifier.
Mais s'il est quasi sûr que ce sont des noms de plage, le fichier serait utile pour savoir comment est lancée la macro : directement par l'utilisateur, ou par une autre macro, ainsi que pour voir la justification du premier Calculate (est-ce que le fichier est en calcul manuel ?) [le second est logique, car agit sur le contenu de la cellule qui détermine la poursuite ou l'arrêt de la boucle While... Wend].

Le copier-coller en valeurs peut être évité en effectuant une affectation de valeurs de la plage source à la plage cible, plus efficace.

Cordialement.
1 membre du forum aime ce message.
Brahmi Mohamed
Nouveau venu
Nouveau venu
Messages : 4
Inscrit le : 11 juillet 2018
Version d'Excel : 2013

Message par Brahmi Mohamed » 11 juillet 2018, 15:58

Merci pour votre réponse rapide et clair,

effectivement il s'agit des noms de plages , je n'arrive pas à joindre le fichier il est volumineux, comment je fait ?

merci
MFerrand
Fanatique d'Excel
Fanatique d'Excel
Messages : 15356
Appréciations reçues : 237
Inscrit le : 20 juillet 2015
Version d'Excel : 2010 FR

Message par MFerrand » 11 juillet 2018, 16:08

Passe par : https://www.cjoint.com/
et tu mettras le lien dans un post.

Cordialement.
Avatar du membre
eriiic
Passionné d'Excel
Passionné d'Excel
Messages : 7497
Appréciations reçues : 82
Inscrit le : 7 février 2010
Version d'Excel : 2010fr

Message par eriiic » 11 juillet 2018, 16:13

Bonjour,

Tu sais que l'aide est très bien faite ?
Positionne le curseur sur Goto, fait F1 et tu sauras tout sur cette méthode.
Sans oublier de lire les Remarques qui donne souvent la particularité intéressante en cas de difficulté.

Ainsi tu auras une réponse immédiate à 90% de tes questions.
eric
En essayant continuellement, on finit par réussir.
Donc plus ça rate, plus on a de chances que ça marche.
(les Shadoks)

En plus du merci (si si, ça se fait !!!), penser à mettre en résolu. Merci
Brahmi Mohamed
Nouveau venu
Nouveau venu
Messages : 4
Inscrit le : 11 juillet 2018
Version d'Excel : 2013

Message par Brahmi Mohamed » 11 juillet 2018, 16:21

MFerrand
Fanatique d'Excel
Fanatique d'Excel
Messages : 15356
Appréciations reçues : 237
Inscrit le : 20 juillet 2015
Version d'Excel : 2010 FR

Message par MFerrand » 11 juillet 2018, 19:04

Vu ton fichier ! Mes commentaires plus tard... Requis pour repas :)
Avatar du membre
dhany
Membre impliqué
Membre impliqué
Messages : 2976
Appréciations reçues : 305
Inscrit le : 3 octobre 2017
Version d'Excel : 2007 FR

Message par dhany » 11 juillet 2018, 19:47

Bonjour Brahmi, le forum,

je te retourne ton fichier modifié : https://mon-partage.fr/f/NLekOVJN/

Alt F11 pour voir la macro PRD4() optimisée et commentée
Alt F11 pour retourner sur ta feuille Excel

sur ta feuille de calcul : Ctrl F3 ➯ fenêtre "Gestionnaire de noms" :
Screen.jpg
Screen.jpg (75.79 Kio) Vu 74 fois
attention : tu as plein de noms définis non valides, dont 5 autres "valcal" !  ::( :cry:

note : les noms invalides sont ceux qui ont #REF! dans la 2ème colonne "Valeur"

dhany
MFerrand
Fanatique d'Excel
Fanatique d'Excel
Messages : 15356
Appréciations reçues : 237
Inscrit le : 20 juillet 2015
Version d'Excel : 2010 FR

Message par MFerrand » 12 juillet 2018, 01:27

Re,

J'ai un peu pris mon temps mais c'était pas à la minute... :wink:
Je dirai volontiers tout d'abord que le concepteur de ce fichier est très certainement plus compétent que moi en matière de calculs financiers, d'autant que ce type de calcul n'est vraiment pas ce qui peut me motiver, au point que j'ignore quasiment tout des fonctions financières d'Excel. :lole: mais ce n'était pas l'objet de ta question.

Par contre, quel que soit l'objet de la construction d'un classeur, et même si nos machines actuelles peuvent supporter des fichiers de plus en plus lourds, je garde une préférence marquée pour des classeurs légers et dès qu'on approche du Mo je pense systématiquement à le scinder... Pas toujours possible lorsqu'on a affaire à une grosse base de données par exemple, mais c'est au moins pour moi une raison pour l'isoler...
Ce classeur comporte une foule de calculs en cascade, le calcul itératif y est activé, et je n'en ai pas trouvé la raison exacte. Il est vrai que je ne suis pas remonté trop loin dans les calculs en chaîne, et me suis contenté de la feuille CRE_Calculation, sans aller voir au-delà les autres feuilles dans lesquelles des formules de cette feuille vont puiser.
Si le signataire de l'enregistrement macro sur lequel tu souhaitais être éclairé est le concepteur ou fait partie des concepteurs de ce fichier, il pourra certainement te donner des éclaircissements plus prrécis. Même s'il ne fait pas partie des concepteurs, il doit être en mesure de te donner les raisons de l'existence de cette macro.
Car si t'expliquer ce que fait le code peut l'être sans difficulté, t'indiquer pourquoi on lui fait faire ce qu'il fait est une autre chose ! ;;)

Mon sentiment est que les calculs pouvaient s'avérer relativement longs, et que cette macro visait à tester si on était arrivé au terme, en ajoutant que je ne suis pas persuadé de l'efficacité d'une telle méthode. Je ne le formule que comme hypothèse restant à confirmer...
Si eriiic qui est déjà intervenu sur ce fil pour te fournir un conseil relatif à la consultation de l'aide, repasse par ici, peut-être pourra-t-il donner un avis sur les calculs effectués dans ce classeur, son avis en la matière est toujours pertinent...

Sur l'environnement de la macro, pour en venir plus précisément aux explications que tu souhaitais, elle intervient sur la feuille Macro dans laquelle calcal représente la cellule E4, laquelle récupère la valeur de CRE_Calculation!D56, valcal représente la cellule E5 (sur laquelle on copie en boucle la valeur de E4, et check la cellule C6, curieux détour car la C6 ne fait que récupérer la valeur de E6, dont on aurait pu se contenter, et noter que E6 (donc C6) ne prendra que la valeur 1 (si écart entre E4 et E5 supérieur à 1/100000) ou 0 (égalité, en tenant compte des écarts infinitésimaux suceptibles d'être générés par les modalités de calcul d'Excel)

Cette macro est un aboutissement de versions antérieures ne comportant pas de boucle. Globalement, elle lance un calcul du classeur et si la valeur de check (C6) n'est pas 0 (ce qui devrait être le cas au démarrage), on entre dans une boucle jusqu'à ce que la valeur de C6 soit à 0, au sein de laquelle on copie la valeur de E4 pour la placer en E5 et on relance un calcul. Ce qui laisse supposer que le calcul itératif est susceptible de produire des résultats qui vont varier (on continue tant qu'ils varient) et lorsqu'ils se stabilisent, on aura égalité entre E4 et E5, et C6=0.

Si l'on examine maintenant le code ligne par ligne :

Code : Tout sélectionner

    Calculate
équivaut à Application.Calculate, et relance le calcul de tous les classeurs ouverts, mais on peut supposer qu'à ce moment on ne travaille que sur ce classeur qui entre donc en cours de calcul.

Code : Tout sélectionner

    While Range("check") > 0.000001
initialise une boucle While... Wend : tant que la valeur de la cellule est supérieure à 1/100000... Mais on a vu que cette valeur ne peut être que 1 ou 0, il aurait donc été plus conforme d'écrire : tant qu'elle est égale à 1...
Cependant, encore, cette boucle est une instruction désuète remplacée depuis au moins 25 ans par Microsoft par la boucle Do... Loop qui peut faire exactement la même chose en offrant des façons différentes de le faire. Et ici on a visiblement intérêt à ce que la boucle puisse être exécutée au moins une fois, et donc que le test de sortie soit fait sur la 2e instruction de boucle, ce qu'on ne peut faire avec While... Wend. On aurait donc :

Code : Tout sélectionner

    Do
        '....
    Loop While Range("check") = 1

Code : Tout sélectionner

        Application.Goto Reference:="calcal"
        Selection.Copy
        Application.Goto Reference:="valcal"
        Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
         False, Transpose:=False
        Application.CutCopyMode = False
        Calculate
Code exécuté en boucle : on sélectionne calcal (E4), on copie, on sélectionne valcal (E5), on colle en valeur, et on élimine le scintillement autour de la cellule copiée, puis on relance le calcul.
L'opération de copier-coller aurait pu et dû être plus simplement écrite ainsi :

Code : Tout sélectionner

    Range("calcal").Copy
    Range("valcal").PasteSpecial xlPasteValues
Mais le copier-coller n'ayant rien non plus de nécessaire, on pouvait donc se contenter de :

Code : Tout sélectionner

        [valcal] = [calcal]
        Calculate
à l'intérieur de la boucle. Moins de code et plus rapide.
La dernière ligne active la feuille SP DATA.

La macro réécrite après examen de l'ensemble des éléments examinés :

Code : Tout sélectionner

Sub PRD4()
    Calculate
    Do
        [valcal] = [calcal]
        Calculate
    Loop While [check] = 1
    Sheets("SP DATA").Select
End Sub
Comme je l'ai dit, j'ai un peu de mal à croire à l'efficacité d'une telle macro, mais je réserve mon jugement en raison des effets éventuels que pourrait avoir le calcul itératif...

Cordialement.
Brahmi Mohamed
Nouveau venu
Nouveau venu
Messages : 4
Inscrit le : 11 juillet 2018
Version d'Excel : 2013

Message par Brahmi Mohamed » 15 juillet 2018, 10:28

Merci à vous tous d'avoir pris le temps d'analyser le fichier, vos éclaircissement sont parfait... :)

merci beaucoup et bon courage
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message
  • Langage VBA et Langage algo
    par sva » 24 mai 2018, 23:49 » dans Excel - VBA
    9 Réponses
    103 Vues
    Dernier message par dhany
    26 mai 2018, 02:36
  • Comprendre une macro tableau vba
    par Jeanba » 5 mai 2017, 11:11 » dans Excel - VBA
    1 Réponses
    75 Vues
    Dernier message par Jean-Eric
    5 mai 2017, 14:26
  • Fonctions en langage VBA
    par Didier295 » 20 août 2013, 08:53 » dans Excel - VBA
    2 Réponses
    463 Vues
    Dernier message par Didier295
    20 août 2013, 10:39
  • Condition en langage VBA
    par marlene65 » 7 novembre 2016, 12:02 » dans Excel - VBA
    3 Réponses
    100 Vues
    Dernier message par melch
    7 novembre 2016, 14:54
  • Traduction en langage VBA
    par ALF45 » 10 janvier 2015, 18:35 » dans Excel - VBA
    3 Réponses
    380 Vues
    Dernier message par ALF45
    10 janvier 2015, 19:04
  • definition en francais du langage VBA
    par THIERRYH » 10 novembre 2013, 22:30 » dans Excel - VBA
    1 Réponses
    460 Vues
    Dernier message par Yvouille
    11 novembre 2013, 06:33