{"id":2766,"date":"2013-01-03T22:43:29","date_gmt":"2013-01-03T20:43:29","guid":{"rendered":"http:\/\/www.auditsi.eu\/?p=2766"},"modified":"2015-01-24T23:53:19","modified_gmt":"2015-01-24T21:53:19","slug":"conversion-de-programmes-entre-les-langages-vba-et-delphi","status":"publish","type":"post","link":"https:\/\/www.auditsi.eu\/?p=2766","title":{"rendered":"Conversion de programmes entre les langages VBA et DELPHI"},"content":{"rendered":"<p style=\"text-align: justify;\">Dans le cadre de mon projet de d\u00e9veloppement d\u2019un <a title=\"Logiciel d'audit des comptes consolid\u00e9s\" href=\"http:\/\/www.auditsi.eu\/?page_id=2745\">logiciel d\u2019audit des comptes consolid\u00e9s<\/a>, je convertis en DELPHI des programmes que j\u2019avais initialement r\u00e9dig\u00e9s en VBA et notamment le <a title=\"Comptes consolid\u00e9s : calculer les pourcentages d\u2019int\u00e9r\u00eat \u00e0 l\u2019aide du calcul matriciel et du langage VBA d\u2019Excel (article publi\u00e9 dans la RFC)\" href=\"http:\/\/www.auditsi.eu\/?p=1399\">programme de calcul des pourcentages d\u2019int\u00e9r\u00eat<\/a>.<\/p>\n<p style=\"text-align: justify;\">Cette op\u00e9ration de conversion se pratique de la m\u00eame mani\u00e8re que la traduction d\u2019un texte d\u2019une langue \u00e0 l\u2019autre : elle n\u00e9cessite la connaissance de la grammaire (la syntaxe) et du vocabulaire (les mots clefs). En mati\u00e8re informatique, la conversion n\u00e9cessite la ma\u00eetrise approfondie des deux langages. En effet, si de prime abord la ressemblance de ces deux langages est frappante, des subtilit\u00e9s, v\u00e9ritables chausse-trapes, compliquent quelque peu la donne.<\/p>\n<div id=\"attachment_2768\" style=\"width: 494px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/www.auditsi.eu\/?attachment_id=2768\" rel=\"attachment wp-att-2768\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-2768\" class=\"size-full wp-image-2768\" src=\"https:\/\/www.auditsi.eu\/wp-content\/uploads\/2013\/01\/Matrice-inverse-sous-EXCEL.png\" alt=\"Matrice inverse sous EXCEL : deux codes pour un m\u00eame r\u00e9sultat !\" width=\"484\" height=\"256\" srcset=\"https:\/\/www.auditsi.eu\/wp-content\/uploads\/2013\/01\/Matrice-inverse-sous-EXCEL.png 499w, https:\/\/www.auditsi.eu\/wp-content\/uploads\/2013\/01\/Matrice-inverse-sous-EXCEL-300x158.png 300w\" sizes=\"auto, (max-width: 484px) 100vw, 484px\" \/><\/a><p id=\"caption-attachment-2768\" class=\"wp-caption-text\">Matrice inverse sous EXCEL : deux codes pour un m\u00eame r\u00e9sultat !<\/p><\/div>\n<p style=\"text-align: justify;\">Je vais prendre pour exemple la proc\u00e9dure de calcul de la matrice inverse sous EXCEL extraite du programme de calcul des pourcentages d\u2019int\u00e9r\u00eat. Cette proc\u00e9dure r\u00e9dig\u00e9e en VBA (cf extrait n\u00b01) est convertie sous DELPHI (extrait n\u00b02).<\/p>\n<p style=\"text-align: justify;\"><em>Extrait n\u00b01 : proc\u00e9dure \u00ab AfficheMatrice \u00bb r\u00e9dig\u00e9e en VBA :<\/em><\/p>\n<pre class=\"lang:default decode:true\">Sub AfficheMatrice()\r\n    Dim d\u00e9tenteur As Integer\r\n    Dim d\u00e9tenu As Integer\r\n       \r\n    classeurAppli.Sheets.Add after:=Worksheets(Worksheets.Count)\r\n   \r\n    With classeurAppli.Sheets(classeurAppli.Sheets.Count)\r\n        .Cells(1, 1).Value = \"Matrice I-M\"\r\n        For d\u00e9tenteur = 1 To Nbentit\u00e9s\r\n            For d\u00e9tenu = 1 To Nbentit\u00e9s\r\n                If d\u00e9tenteur = 1 Then\r\n                    .Cells(1, d\u00e9tenu + 1).Value = Entit\u00e9s(d\u00e9tenu)\r\n                    .Cells(3 + Nbentit\u00e9s, d\u00e9tenu + 1).Value = Entit\u00e9s(d\u00e9tenu)\r\n                End If\r\n                If d\u00e9tenu = 1 Then\r\n                    .Cells(d\u00e9tenteur + 1, 1).Value = Entit\u00e9s(d\u00e9tenteur)\r\n                    .Cells(d\u00e9tenteur + Nbentit\u00e9s + 3, 1).Value = Entit\u00e9s(d\u00e9tenteur)\r\n                End If\r\n                .Cells(d\u00e9tenteur + 1, d\u00e9tenu + 1).Value = MatriceImoinsD\u00e9tentions(d\u00e9tenteur, d\u00e9tenu)\r\n            Next d\u00e9tenu\r\n        Next d\u00e9tenteur\r\n        .Cells(3 + Nbentit\u00e9s, 1).Value = \"Matrice (I-M)^-1\"\r\n       \r\n        .Range(\"B\" &amp; 4 + Nbentit\u00e9s &amp; \":\" &amp; R\u00e9fColonne(Nbentit\u00e9s) &amp; Nbentit\u00e9s * 2 + 3).FormulaArray = \"=minverse(B2:\" &amp; R\u00e9fColonne(Nbentit\u00e9s) &amp; Nbentit\u00e9s + 1 &amp; \")\"\r\n        'FormulaArray \u00e9quivaut \u00e0 Ctrl+Maj+Entr\u00e9e\r\n        For d\u00e9tenu = 2 To Nbentit\u00e9s\r\n            PourcentagesInt\u00e9r\u00eat(d\u00e9tenu) = Cells(4 + Nbentit\u00e9s, d\u00e9tenu + 1)\r\n        Next d\u00e9tenu\r\n    End With\r\nEnd Sub<\/pre>\n<p style=\"text-align: justify;\"><em>Extrait n\u00b02 : proc\u00e9dure \u00ab AfficheMatrice \u00bb r\u00e9dig\u00e9e sous DELPHI :<\/em><\/p>\n<pre class=\"lang:default decode:true \">procedure AfficheMatrice;\r\nvar\r\n  detenteur : Integer;\r\n  detenu : Integer;\r\nbegin\r\n  cellule:=classeurexcelresultat.sheets[feuilleresultat];\r\n  cellule.Cells[1, 1].Value := 'Matrice I-M';\r\n  For detenteur := 1 To Nbentites do\r\n  begin\r\n    For detenu := 1 To Nbentites do\r\n    begin\r\n      If detenteur = 1 Then\r\n      begin\r\n        cellule.Cells[1, detenu + 1].Value := Entites[detenu-1];\r\n        cellule.Cells[3 + Nbentites, detenu + 1].Value := Entites[detenu-1];\r\n      End;\r\n      If detenu = 1 Then\r\n      begin\r\n        cellule.Cells[detenteur + 1, 1].Value := Entites[detenteur-1];\r\n        cellule.Cells[detenteur + Nbentites + 3, 1].Value := Entites[detenteur-1];\r\n      End;\r\n      cellule.Cells[detenteur + 1, detenu + 1].Value := MatriceImoinsDetentions[detenteur-1, detenu-1];\r\n    end;\r\n  end;\r\n  cellule.Cells[3 + Nbentites, 1].Value := 'Matrice (I-M)^-1';\r\n  cellule.Range['B' + inttostr(4 + Nbentites) + ':' + RefColonne(Nbentites) + inttostr(Nbentites * 2 + 3)].FormulaArray := '=inversemat(B2:' + RefColonne(Nbentites) + inttostr(Nbentites + 1) + ')';\r\n  \/\/FormulaArray \u00e9quivaut \u00e0 Ctrl+Maj+Entr\u00e9e\r\n  For detenu := 2 To Nbentites do\r\n  begin\r\n    PourcentagesInteret[detenu-2] := cellule.Cells[4 + Nbentites, detenu + 1];\r\n  end;\r\nEnd;<\/pre>\n<p style=\"text-align: justify;\">Au premier coup d\u2019\u0153il, on remarque la grande similitude des deux codes :<\/p>\n<ul>\n<li>M\u00eame architecture (langages structur\u00e9s),<\/li>\n<li>Mots clefs semblables (boucles For To Next pour l\u2019un, For To End pour l\u2019autre&#8230;),<\/li>\n<li>Interactions avec EXCEL \u00e0 l\u2019aide de mots clefs identiques : .Cells, . Range\u2026<\/li>\n<\/ul>\n<p style=\"text-align: justify;\">Hormis quelques principes d\u2019\u00e9criture diff\u00e9rents (affectation d\u2019une valeur \u00e0 une variable \u00e0 l\u2019aide de = en VBA, := sous DELPHI, l\u2019usage des parenth\u00e8ses dans les variables tableaux en VBA et des crochets sous DELPHI\u2026), l\u2019on peut noter quelques subtilit\u00e9s \u00e0 conna\u00eetre pour le programmeur qui s\u2019aventure dans la transposition de programmes et notamment :<\/p>\n<ul>\n<li>L\u2019indice inf\u00e9rieur des variables tableaux est z\u00e9ro en VBA alors qu\u2019il est de un sous DELPHI (le lecteur attentif aura remarqu\u00e9 dans le code que la restitution de donn\u00e9es contenues dans les variables tableaux en VBA est r\u00e9dig\u00e9e ainsi : Entit\u00e9s(d\u00e9tenu) alors qu\u2019elle est retranscrite ainsi sous DELPHI : Entites[detenu-1]. L\u2019instruction OPTION BASE 1 permet d\u2019\u00e9tablir l\u2019indice inf\u00e9rieur \u00e0 un en VBA (toutefois cette option n\u2019a pas \u00e9t\u00e9 utilis\u00e9e \u00e0 l\u2019origine).<\/li>\n<li>En VBA, les formules EXCEL sont r\u00e9dig\u00e9es \u00e0 l\u2019aide des instructions en version anglaise alors que sous DELPHI, on recourt au fran\u00e7ais, il en est ainsi par exemple pour le calcul de la matrice inverse :<\/li>\n<\/ul>\n<p style=\"padding-left: 90px;\"><span style=\"font-size: small;\">&#8211; Code VBA : &#8220;=minverse(B2:&#8221; &amp; R\u00e9fColonne(Nbentit\u00e9s) &amp; Nbentit\u00e9s + 1 &amp; &#8220;)&#8221;<\/span><\/p>\n<p style=\"padding-left: 90px;\"><span style=\"font-size: small;\">&#8211; Code DELPHI : &#8216;=inversemat(B2:&#8217; + RefColonne(Nbentites) + inttostr(Nbentites + 1) + &#8216;)&#8217;;<\/span><\/p>\n<p style=\"text-align: justify;\">Il en est de m\u00eame pour les formats de nombre sous EXCEL (la d\u00e9cimale not\u00e9e par le point en VBA et la virgule sous DELPHI).<\/p>\n<p style=\"text-align: justify;\">Pour r\u00e9sumer, la conversion de programmes d\u2019un langage \u00e0 l\u2019autre ne pose pas de difficult\u00e9s insurmontable mais n\u00e9cessite rigueur et concentration.<\/p>\n<div style=\"padding-bottom:20px; padding-top:10px;\" class=\"hupso-share-buttons\"><!-- Hupso Share Buttons - https:\/\/www.hupso.com\/share\/ --><a class=\"hupso_counters\" href=\"https:\/\/www.hupso.com\/share\/\"><img decoding=\"async\" src=\"https:\/\/static.hupso.com\/share\/buttons\/lang\/fr\/share-small.png\" style=\"border:0px; padding-top:2px; float:left;\" alt=\"Share Button\"\/><\/a><script type=\"text\/javascript\">var hupso_services_c=new Array(\"twitter\",\"facebook_like\",\"facebook_send\",\"email\",\"print\",\"linkedin\");var hupso_counters_lang = \"fr_FR\";var hupso_image_folder_url = \"\";var hupso_twitter_via=\"BenoitRiviere14\";var hupso_url_c=\"\";var hupso_title_c=\"Conversion%20de%20programmes%20entre%20les%20langages%20VBA%20et%20DELPHI\";<\/script><script type=\"text\/javascript\" src=\"https:\/\/static.hupso.com\/share\/js\/counters.js\"><\/script><!-- Hupso Share Buttons --><\/div>","protected":false},"excerpt":{"rendered":"<p>Dans le cadre de mon projet de d\u00e9veloppement d\u2019un logiciel d\u2019audit des comptes consolid\u00e9s, je convertis en DELPHI des programmes que j\u2019avais initialement r\u00e9dig\u00e9s en VBA et notamment le programme de calcul des pourcentages d\u2019int\u00e9r\u00eat. Cette op\u00e9ration de conversion se pratique de la m\u00eame mani\u00e8re que la traduction d\u2019un texte d\u2019une langue \u00e0 l\u2019autre : &#8230;<\/p>\n<p><a href=\"https:\/\/www.auditsi.eu\/?p=2766\" class=\"more-link\">Continue reading &lsquo;Conversion de programmes entre les langages VBA et DELPHI&rsquo; &raquo;<\/a><\/p>\n<div style=\"padding-bottom:20px; padding-top:10px;\" class=\"hupso-share-buttons\"><!-- Hupso Share Buttons - https:\/\/www.hupso.com\/share\/ --><a class=\"hupso_counters\" href=\"https:\/\/www.hupso.com\/share\/\"><img src=\"https:\/\/static.hupso.com\/share\/buttons\/lang\/fr\/share-small.png\" style=\"border:0px; padding-top:2px; float:left;\" alt=\"Share Button\"\/><\/a><script type=\"text\/javascript\">var hupso_services_c=new Array(\"twitter\",\"facebook_like\",\"facebook_send\",\"email\",\"print\",\"linkedin\");var hupso_counters_lang = \"fr_FR\";var hupso_image_folder_url = \"\";var hupso_twitter_via=\"BenoitRiviere14\";var hupso_url_c=\"\";var hupso_title_c=\"Conversion%20de%20programmes%20entre%20les%20langages%20VBA%20et%20DELPHI\";<\/script><script type=\"text\/javascript\" src=\"https:\/\/static.hupso.com\/share\/js\/counters.js\"><\/script><!-- Hupso Share Buttons --><\/div>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"ngg_post_thumbnail":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[39,218,48,215],"tags":[618,927,1642,1633,1131,387,1135,219,669,1132,1134,1130,1133,1641],"class_list":["post-2766","post","type-post","status-publish","format-standard","hentry","category-cas-pratiques","category-delphi","category-excel","category-vba","tag-calcul-matriciel","tag-decimales","tag-delphi","tag-excel","tag-for-to-end","tag-for-to-next","tag-inversemat","tag-langage-de-programmation","tag-minverse","tag-mots-clefs","tag-option-base","tag-transposition","tag-variable-tableau","tag-vba"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_likes_enabled":false,"_links":{"self":[{"href":"https:\/\/www.auditsi.eu\/index.php?rest_route=\/wp\/v2\/posts\/2766","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.auditsi.eu\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.auditsi.eu\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.auditsi.eu\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.auditsi.eu\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2766"}],"version-history":[{"count":17,"href":"https:\/\/www.auditsi.eu\/index.php?rest_route=\/wp\/v2\/posts\/2766\/revisions"}],"predecessor-version":[{"id":5767,"href":"https:\/\/www.auditsi.eu\/index.php?rest_route=\/wp\/v2\/posts\/2766\/revisions\/5767"}],"wp:attachment":[{"href":"https:\/\/www.auditsi.eu\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2766"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.auditsi.eu\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2766"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.auditsi.eu\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2766"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}