Comprendre le langage VBA d'un Macro

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

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.

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

Passe par : https://www.cjoint.com/

et tu mettras le lien dans un post.

Cordialement.

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

Vu ton fichier ! Mes commentaires plus tard... Requis pour repas

Bonjour Brahmi, le forum,

sur ta feuille de calcul : Ctrl F3 ➯ fenêtre "Gestionnaire de noms" :

screen

attention : tu as plein de noms définis non valides, dont 5 autres "valcal" !

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

dhany

Re,

J'ai un peu pris mon temps mais c'était pas à la minute...

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. 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 :

    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.

    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 :

    Do
        '....
    Loop While Range("check") = 1
        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 :

    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 :

        [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 :

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.

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

merci beaucoup et bon courage

@Brahmi

merci pour ton retour ! bon courage à toi aussi pour la suite de ton projet !

dhany

Rechercher des sujets similaires à "comprendre langage vba macro"