DELPHI, EXCEL / Les langages de programmation compilés alliés à EXCEL : outils puissants de traitement de données à disposition de la profession comptable

Dans de précédents articles, j’évoquais l’usage du langage VBA et de logiciels tels qu’EXCEL ou ACCESS dans nos missions d’audit en vue de faciliter la mise en forme et l’analyse de données. Cependant, d’autres langages de programmation structurés, tels DELPHI (déclinaison orientée objet du langage Pascal) ou le C++ (successeur du C également orienté objet) existent. A la différence du VBA qui est un langage interprété, DELPHI et C++ sont des langages compilés[1].

Indéniablement, la création d’applications, mettant en œuvre des formules pour lesquelles l’inaltérabilité et/ou la confidentialité doivent rester de mise (par exemple, calculatrices ou outils de calcul de primes, de RFA, d’impôts… à destination des clients et mettant en avant les compétences du cabinet), requière l’usage de langages de programmation compilés tels que ceux évoqués plus avant. En effet, l’utilisateur n’a pas accès au code-source du programme (contrairement aux développements en VBA) mais seulement à son exécutable (*.exe, *.com), il ne peut donc pas en modifier le fonctionnement (sauf à se lancer dans des opérations de décompilation fort ardues).

Les langages compilés assurent, de la même manière que le VBA, des passerelles avec des applications tierces, telles EXCEL, ACCESS ou WORD (mais la liste est beaucoup plus longue). Ainsi, il est aisé de prendre le contrôle d’EXCEL, d’ouvrir des feuilles de calcul et de les modifier avec quelques lignes de codes. La liaison opérée entre les processus de traitements programmés et des tableurs ou SGBDR étendent de manière infinie le champ du possible en matière de traitement de données. C’est ce que je vous propose de découvrir avec l’exemple qui suit.

Pour résumer, les langages compilés offrent les avantages suivants par rapport aux langages compilés : rapidité d’exécution, sécurité et confidentialité des processus de traitement.

L’exemple ci-après reprend un extrait du code-source du logiciel d’audit des comptes sur lequel je travaille : cet extrait récupère les balances générales enregistrées dans différents onglets d’un classeur EXCEL (classeur intitulé ‘BG.xlsx’) et les reprend en comparatif N/N-1/N-2… Cet exemple montre comment à l’aide d’un langage évolué comme DELPHI, il est possible de traiter des données comptables ou financières issues de feuilles de calcul EXCEL. Ce code aurait pu être développé sous VBA, cependant il n’aurait pas offert les mêmes gages de sécurité et la même rapidité d’exécution. Au passage, l’on remarquera les similitudes de syntaxe des appels aux fonctions EXCEL entre DELPHI et VBA.

begin

  CheminFichier:='E:\Projets DELPHI\Lecture BG\';

  //Ouverture d'une nouvelle session Excel

  SessionExcel:=createOleObject('Excel.Application');

  //Session visible

  SessionExcel.Visible:=true;

  //Définition des variables de session

  ClasseursExcel:=SessionExcel.Workbooks;

  //Ouverture du classeur BG

  NomFichier:=CheminFichier+'BG.xlsx';

  ClasseurExcel:=ClasseursExcel.open(NomFichier);

  //Préparation de la feuille de récapitulation des balances

  //---La feuille récapitulant toutes les balances est la plus à gauche du classeur BG

  FeuilleRécap:=ClasseurExcel.WorkSheets[1];

  //---Vide la récap pluriannuelle

  //------Compte le nombre de lignes occupées...

  l:=FeuilleRécap.usedrange.rows.count;

  //------...et les efface

  feuillerécap.range['A'+inttostr(premlignebg)+':F'+inttostr(premlignebg+l)].rows.delete;

  //Lit les balances générales (en commençant par N) et les recopie dans l'onglet Récap

  //---Compte le nombre d'onglets du classeur

  j:=ClasseurExcel.WorkSheets.count;

  //---Lit les balances les unes après les autres

  if j>1 then //si nombre d'onglets > à un

  begin

    for i:=1 to j-1 do //de la balance N à...

    begin

      FeuilleBG:=ClasseurExcel.WorkSheets[i+1];

      l:=0;  //Numéro de ligne en cours de traitement de la BG

      l2:=0; //Numéro de ligne en cours de traitement de la récap

      repeat

        inc(l);

        //Lecture du numéro de compte

        s1:=feuillebg.cells[premlignebg+l-1,1].value;

        if s1<>'' then //si le numéro de compte est renseigné, alors lecture de la ligne

        begin

          //Convertit le numéro de compte sur 10 positions ; exemple 1013000 => 1013000000

          s1:=convertitcompte10pos(s1);

          if i=1 then //balance N

          begin

            //Numéro de compte

            feuillerécap.cells[premlignebg+l-1,1].value:=s1;

            //Libellé de compte

            feuillerécap.cells[premlignebg+l-1,2].value:=feuillebg.cells[premlignebg+l-1,2].value;

            //Solde du compte

            feuillerécap.cells[premlignebg+l-1,3+(i-1)].value:=feuillebg.cells[premlignebg+l-1,3].value;

          end

            else

          begin //balances N-1...

            inc(l2);

            //Lecture du numéro de compte de la récap

            s2:=feuillerécap.cells[premlignebg+l2-1,1].value;

            if s1<s2 then //Compte inexistant en N => insertion d'une nouvelle ligne et du compte

            begin

              //Insertion ligne

              feuillerécap.rows[premlignebg+l2-1].insert;

              //Numéro de compte = s1

              feuillerécap.cells[premlignebg+l2-1,1].value:=s1;

              //Libellé compte

              feuillerécap.cells[premlignebg+l2-1,2].value:=feuillebg.cells[premlignebg+l-1,2].value;

            end;

            //Solde du compte

            feuillerécap.cells[premlignebg+l2-1,3+(i-1)].value:=feuillebg.cells[premlignebg+l-1,3].value;

          end;

        end;

      until (s1='') or (l>10000) or (l2>10000);  //si numéro de compte vide ou nb ligne > 10000 => on arrête

    end;

  end;

  //Sauvegarde et fermeture du classeur

  ClasseurExcel.save;

  ClasseurExcel.close;

  //Fermeture de la session Excel

  SessionExcel.Quit;

  SessionExcel:=unassigned;

end;

[1] Les langages interprétés nécessitent une compilation (c’est-à-dire une conversion du code-source du programme en code-machine directement interprétable par le microprocesseur) à chaque utilisation du logiciel tandis que les langages compilés opèrent cette compilation une seule fois. L’opération de compilation, préalable à l’exécution des instructions, nécessite du temps processeur et rend donc l’exécution des programmes développés en langage interprété moins rapide que ceux rédigés en langage compilé.

Share Button
The following two tabs change content below.
Benoît RIVIERE
Après seize années passées en cabinet d’expertise-comptable et de commissariat aux comptes (où j’ai exercé comme expert-comptable et chef de mission audit), j’ai pris le poste de directeur comptable d’un groupe de distribution automobile en novembre 2014. Au cours de ma carrière, j’ai acquis une expérience significative en audit et en exploitation des systèmes d’information (analyse de données, automatisation des tâches, programmation informatique) au service de la production des comptes annuels et consolidés. C’est cette expérience personnelle et ma passion pour l’informatique que je partage sur ce blog. Mon CV / Réalisations personnelles et projets informatiques / Ma collection / Me contacter

Un commentaire

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.