Conversion de programmes entre les langages VBA et DELPHI

Dans le cadre de mon projet de développement d’un logiciel d’audit des comptes consolidés, je convertis en DELPHI des programmes que j’avais initialement rédigés en VBA et notamment le programme de calcul des pourcentages d’intérêt.

Cette opération de conversion se pratique de la même manière que la traduction d’un texte d’une langue à l’autre : elle nécessite la connaissance de la grammaire (la syntaxe) et du vocabulaire (les mots clefs). En matière informatique, la conversion nécessite la maîtrise approfondie des deux langages. En effet, si de prime abord la ressemblance de ces deux langages est frappante, des subtilités, véritables chausse-trapes, compliquent quelque peu la donne.

Matrice inverse sous EXCEL : deux codes pour un même résultat !

Matrice inverse sous EXCEL : deux codes pour un même résultat !

Je vais prendre pour exemple la procédure de calcul de la matrice inverse sous EXCEL extraite du programme de calcul des pourcentages d’intérêt. Cette procédure rédigée en VBA (cf extrait n°1) est convertie sous DELPHI (extrait n°2).

Extrait n°1 : procédure « AfficheMatrice » rédigée en VBA :

Sub AfficheMatrice()
    Dim détenteur As Integer
    Dim détenu As Integer
       
    classeurAppli.Sheets.Add after:=Worksheets(Worksheets.Count)
   
    With classeurAppli.Sheets(classeurAppli.Sheets.Count)
        .Cells(1, 1).Value = "Matrice I-M"
        For détenteur = 1 To Nbentités
            For détenu = 1 To Nbentités
                If détenteur = 1 Then
                    .Cells(1, détenu + 1).Value = Entités(détenu)
                    .Cells(3 + Nbentités, détenu + 1).Value = Entités(détenu)
                End If
                If détenu = 1 Then
                    .Cells(détenteur + 1, 1).Value = Entités(détenteur)
                    .Cells(détenteur + Nbentités + 3, 1).Value = Entités(détenteur)
                End If
                .Cells(détenteur + 1, détenu + 1).Value = MatriceImoinsDétentions(détenteur, détenu)
            Next détenu
        Next détenteur
        .Cells(3 + Nbentités, 1).Value = "Matrice (I-M)^-1"
       
        .Range("B" & 4 + Nbentités & ":" & RéfColonne(Nbentités) & Nbentités * 2 + 3).FormulaArray = "=minverse(B2:" & RéfColonne(Nbentités) & Nbentités + 1 & ")"
        'FormulaArray équivaut à Ctrl+Maj+Entrée
        For détenu = 2 To Nbentités
            PourcentagesIntérêt(détenu) = Cells(4 + Nbentités, détenu + 1)
        Next détenu
    End With
End Sub

Extrait n°2 : procédure « AfficheMatrice » rédigée sous DELPHI :

procedure AfficheMatrice;
var
  detenteur : Integer;
  detenu : Integer;
begin
  cellule:=classeurexcelresultat.sheets[feuilleresultat];
  cellule.Cells[1, 1].Value := 'Matrice I-M';
  For detenteur := 1 To Nbentites do
  begin
    For detenu := 1 To Nbentites do
    begin
      If detenteur = 1 Then
      begin
        cellule.Cells[1, detenu + 1].Value := Entites[detenu-1];
        cellule.Cells[3 + Nbentites, detenu + 1].Value := Entites[detenu-1];
      End;
      If detenu = 1 Then
      begin
        cellule.Cells[detenteur + 1, 1].Value := Entites[detenteur-1];
        cellule.Cells[detenteur + Nbentites + 3, 1].Value := Entites[detenteur-1];
      End;
      cellule.Cells[detenteur + 1, detenu + 1].Value := MatriceImoinsDetentions[detenteur-1, detenu-1];
    end;
  end;
  cellule.Cells[3 + Nbentites, 1].Value := 'Matrice (I-M)^-1';
  cellule.Range['B' + inttostr(4 + Nbentites) + ':' + RefColonne(Nbentites) + inttostr(Nbentites * 2 + 3)].FormulaArray := '=inversemat(B2:' + RefColonne(Nbentites) + inttostr(Nbentites + 1) + ')';
  //FormulaArray équivaut à Ctrl+Maj+Entrée
  For detenu := 2 To Nbentites do
  begin
    PourcentagesInteret[detenu-2] := cellule.Cells[4 + Nbentites, detenu + 1];
  end;
End;

Au premier coup d’œil, on remarque la grande similitude des deux codes :

  • Même architecture (langages structurés),
  • Mots clefs semblables (boucles For To Next pour l’un, For To End pour l’autre…),
  • Interactions avec EXCEL à l’aide de mots clefs identiques : .Cells, . Range…

Hormis quelques principes d’écriture différents (affectation d’une valeur à une variable à l’aide de = en VBA, := sous DELPHI, l’usage des parenthèses dans les variables tableaux en VBA et des crochets sous DELPHI…), l’on peut noter quelques subtilités à connaître pour le programmeur qui s’aventure dans la transposition de programmes et notamment :

  • L’indice inférieur des variables tableaux est zéro en VBA alors qu’il est de un sous DELPHI (le lecteur attentif aura remarqué dans le code que la restitution de données contenues dans les variables tableaux en VBA est rédigée ainsi : Entités(détenu) alors qu’elle est retranscrite ainsi sous DELPHI : Entites[detenu-1]. L’instruction OPTION BASE 1 permet d’établir l’indice inférieur à un en VBA (toutefois cette option n’a pas été utilisée à l’origine).
  • En VBA, les formules EXCEL sont rédigées à l’aide des instructions en version anglaise alors que sous DELPHI, on recourt au français, il en est ainsi par exemple pour le calcul de la matrice inverse :

– Code VBA : “=minverse(B2:” & RéfColonne(Nbentités) & Nbentités + 1 & “)”

– Code DELPHI : ‘=inversemat(B2:’ + RefColonne(Nbentites) + inttostr(Nbentites + 1) + ‘)’;

Il en est de même pour les formats de nombre sous EXCEL (la décimale notée par le point en VBA et la virgule sous DELPHI).

Pour résumer, la conversion de programmes d’un langage à l’autre ne pose pas de difficultés insurmontable mais nécessite rigueur et concentration.

Share Button
The following two tabs change content below.
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

Laisser un commentaire

Votre adresse e-mail 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.