IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

convertir une fonction VBA en JS


Sujet :

Macros et VBA Excel

  1. #1
    Membre chevronné
    Homme Profil pro
    CIP
    Inscrit en
    Avril 2024
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : CIP
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2024
    Messages : 200
    Par défaut convertir une fonction VBA en JS
    Bonjour a tous
    je cherche si quelqu'un saurait et pourrait me convertir une fonction vba en fonction JS
    j'avoue que je m'y perd un peu
    voici la fonction vba
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    Public Function Decompilation(code1)
        Dim TbL, i&, R, comm, F, coupe As Boolean
        TbL = Split(code1, vbCrLf)
        For i = 0 To UBound(TbL)
            coupe = False
            comm = ""
            If InStr(TbL(i), "'") And Left(Trim(TbL(i)), 1) <> "'" Then
                comm = commentaire(TbL(i))
                If Len(comm) > 0 Then TbL(i) = Split(TbL(i), comm)(0)
            End If
            'TbL(i) = ReplaceUnderscore(TbL(i))
            'remplissage provisoire des lignes vides pour les garder
            If TbL(i) = "" Then TbL(i) = "'/*/"
            TbL(i) = Replace(TbL(i), Chr(34) & """ : """ & Chr(34), Chr(34) & """ " & Chr(182) & " """ & Chr(34))
            If Left(Trim(TbL(i)), 1) <> "'" Then TbL(i) = ReplaceDP(TbL(i))
            R = 1 * Abs(i > 0)
            F = 0
     
            'dézipage des blocs
     
            Select Case True
                Case _
                     Left(Trim(TbL(i)), 13) = "Private Type " Or Left(Trim(TbL(i)), 11) = "Pblic Type " Or Left(Trim(TbL(i)), 5) = "Type " Or _
                     Left(Trim(TbL(i)), 13) = "Private Enum " Or Left(Trim(TbL(i)), 11) = "Pblic Enum " Or Left(Trim(TbL(i)), 5) = "Enum " Or _
                     Left(Trim(TbL(i - R)), 13) = "Private Type " Or Left(Trim(TbL(i - R)), 11) = "Pblic Type " Or Left(Trim(TbL(i - R)), 5) = "Type " Or _
                     Left(Trim(TbL(i - R)), 13) = "Private Enum " Or Left(Trim(TbL(i - R)), 11) = "Pblic Enum " Or Left(Trim(TbL(i - R)), 5) = "Enum " Or _
                     Right(Trim(TbL(i)), 10) = ": End Type" Or _
                     Right(Trim(TbL(i)), 10) = ": End Enum"
                    coupe = True
                Case _
                     Left(Trim(TbL(i)), 5) = "With " Or _
                     Trim(TbL(i)) Like "*: *End With*" Or _
                     Trim(TbL(i)) Like "*: *Next*" Or _
                     Trim(TbL(i)) Like "*: *Wend*" Or _
                     Left(Trim(TbL(i)), 4) = "For " Or _
                     Left(Trim(TbL(i)), 5) = "Case " Or _
                     Left(Trim(TbL(i)), 4) = "Sub " Or _
                     Left(Trim(TbL(i)), 3) = "Do " Or _
                     Trim(TbL(i)) Like "*As Long: *" Or _
                     Trim(TbL(i)) Like "*As LongPtr: *" Or _
                     Trim(TbL(i)) Like "*As String: *" Or _
                     Trim(TbL(i)) Like "*As Integer: *" Or _
                     Trim(TbL(i)) Like "*As Double: *" Or _
                     Trim(TbL(i)) Like "*As Boolean: *" Or _
                     Trim(TbL(i)) Like "*As Single: *" Or _
                     Trim(TbL(i)) Like "*As Variant: *" Or _
                     Trim(TbL(i)) Like "*&: *" Or _
                     Trim(TbL(i)) Like "*%: *" Or _
                     Trim(TbL(i)) Like "*[a-z]" & ": *" Or _
                     Trim(TbL(i)) Like "*[A-Z]" & ": *" Or _
                     Trim(TbL(i)) Like "*[0-9]" & ": *" Or _
                     Left(Trim(TbL(i)), 6) = "While " Or _
                     Left(Trim(TbL(i)), 3) = "If "
                    coupe = True
            End Select
            If Right(Trim(TbL(i)), 2) = " _" Then coupe = False:
            ' pour les cas ou cette condition serait entre guillemet donc a ne pas prendre en compte
            If Trim(TbL(i)) Like "*: "" *" Then coupe = False
            ' pour les cas ou cette condition serait entre guillemet donc a ne pas prendre en compte
            If Trim(TbL(i)) Like "*"": *""" Then coupe = False
            'If TbL(i) Like "*Then*If*Then*Else*" Then coupe = False
     
     
            'toutes les ligne sauf les commentaires
            If coupe And Left(Trim(TbL(i)), 1) <> "'" Then
     
                'prétraitrement des ligne If sous toutes sesformes
                If Left(Trim(TbL(i)), 3) = "If " Then
                    'décompilation de If consecutifs et fermeture de Bloc
                    If TbL(i) Like "* Then*If*Then *" Then
                        TbL(i) = Replace(TbL(i), " Then", " Then" & vbCrLf) & Application.Rept(vbCrLf & "End If", UBound(Split(TbL(i), "Then ")))
                        If TbL(i) Like "*Else*" Then TbL(i) = Replace(TbL(i), "Else", vbCrLf & "Else" & vbCrLf)
                    Else
                        If TbL(i) Like "*: *" And Not TbL(i) Like "* _*" Then TbL(i) = Replace(Replace(TbL(i), " Then", " Then" & vbCrLf), "Else", vbCrLf & "Else" & vbCrLf): F = 1
                    End If
                End If
     
                'remplace les separateur d'instructions par un saut de ligne
                TbL(i) = Replace(TbL(i), " : ", "||")
                TbL(i) = Replace(TbL(i), ": ", vbCrLf)
                TbL(i) = Replace(TbL(i), "||", " : ")
     
                If F = 1 Then TbL(i) = TbL(i) & vbCrLf & "End If"
            End If
     
     
     
            'remise en place du mommentaire
            If coupe Then TbL(i) = comm & vbCrLf & TbL(i) Else TbL(i) = TbL(i) & comm
            TbL(i) = Replace(TbL(i), Chr(34) & " " & Chr(182) & " " & Chr(34), Chr(34) & " : " & Chr(34))
     
        Next
     
     
        'regéneration du code vba (Unminifié)
        code1 = Join(TbL, vbCrLf)
        code1 = Replace(code1, vbCrLf & vbCrLf, vbCrLf)
        code1 = Replace(code1, "'/*/", "")
     
        '---------------------------------
        'pour le debugage
        Debug.Print Join(TbL, vbCrLf)
        'Application.OnTime Now + 0.000015, "'" & ThisWorkbook.FullName & "'!" & ThisWorkbook.CodeName & ".AddIndentEnvironnement"
        'Exit Function 'Arrêt provisoire pour tester le unzip dans la concole
        '---------------------------------
     
    End Function
    et voici la fonction js que j'ai tenté mais en vain même avec chatGpt de reproduire mais qui ne donne pas les même résultats
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    function decompilation(code1) {
      const CHR_182 = '\u00B6';
      let TbL = code1.split(/\r?\n/);
      let output = [];
     
      for (let i = 0; i < TbL.length; i++) {
        let line = TbL[i];
        let coupe = false;
        let comm = "";
        let F = 0;
     
        // commentaire
        if (line.includes("'") && line.trim()[0] !== "'") {
          let temp = commentaire(line);
          let idx = temp.indexOf("'");
          if (idx !== -1) {
            comm = line.slice(idx);
            line = line.slice(0, idx);
          }
        }
     
        if (line === "") line = "'/*/";
     
        line = line.replace(/"" : ""/g, '"" ' + CHR_182 + ' ""');
     
        if (line.trim()[0] !== "'") {
          line = replaceDP(line);
        }
     
        let R = (i > 0) ? 1 : 0;
        let prev = (i - R >= 0) ? TbL[i - R].trim() : "";
     
        const begins = s => line.trim().startsWith(s);
        const prevBegins = s => prev.startsWith(s);
        const ends = s => line.trim().endsWith(s);
        const like = (str, pattern) => new RegExp(pattern.replace(/\*/g, ".*")).test(str);
     
        if (
          begins("Private Type ") || begins("Pblic Type ") || begins("Type ") ||
          begins("Private Enum ") || begins("Pblic Enum ") || begins("Enum ") ||
          prevBegins("Private Type ") || prevBegins("Pblic Type ") || prevBegins("Type ") ||
          prevBegins("Private Enum ") || prevBegins("Pblic Enum ") || prevBegins("Enum ") ||
          ends(": End Type") || ends(": End Enum")
        ) {
          coupe = true;
        } else if (
          begins("With ") ||
          like(line.trim(), "*: *End With*") ||
          like(line.trim(), "*: *Next*") ||
          like(line.trim(), "*: *Wend*") ||
          begins("For ") || begins("Case ") || begins("Sub ") || begins("Do ") ||
          like(line.trim(), "*As Long: *") || like(line.trim(), "*As LongPtr: *") ||
          like(line.trim(), "*As String: *") || like(line.trim(), "*As Integer: *") ||
          like(line.trim(), "*As Double: *") || like(line.trim(), "*As Boolean: *") ||
          like(line.trim(), "*As Single: *") || like(line.trim(), "*As Variant: *") ||
          like(line.trim(), "*&: *") || like(line.trim(), "*%: *") ||
          like(line.trim(), "*[a-z]: *") || like(line.trim(), "*[A-Z]: *") ||
          like(line.trim(), "*[0-9]: *") ||
          begins("While ") || begins("If ")
        ) {
          coupe = true;
        }
     
        if (line.trim().endsWith(" _")) coupe = false;
        if (like(line.trim(), "*: \" *")) coupe = false;
        if (like(line.trim(), "*\": *\"")) coupe = false;
     
        if (coupe && line.trim()[0] !== "'") {
          if (begins("If ")) {
            if (like(line, "* Then.*If.*Then .*")) {
              const count = (line.match(/Then /g) || []).length;
              line = line.replace(/ Then/g, " Then\n") + "\n" + "End If\n".repeat(count).trim();
              if (line.includes("Else")) {
                line = line.replace(/Else/g, "\nElse\n");
              }
            } else if (line.includes(": ") && !line.includes("_")) {
              line = line.replace(/ Then/g, " Then\n").replace(/Else/g, "\nElse\n");
              F = 1;
            }
          }
     
          line = line.replace(/ : /g, "||").replace(/: /g, "\n").replace(/\|\|/g, " : ");
          if (F === 1) line += "\nEnd If";
        }
     
        if (coupe) {
          line = comm + "\n" + line;
        } else {
          line += comm;
        }
     
        line = line.replace(/" ± "/g, '" : "');
     
        TbL[i] = line;
      }
     
      let codeFinal = TbL.join("\n").replace(/\n{2,}/g, "\n");
      return codeFinal;
    }
    pour vous donner un exemple voici ce que j'injecte au deux fonctions
    Sub test()

    '3 if consécutifs
    If truc = 1 Then If chose = 2 Then If machin = 3 Then chose = 1 'commentaire

    '3 if consécutifs avec un else
    If truc = """ "" ' _ tutu ' "" """ Then If chose = 2 Then If machin = 3 Then chose = 1: bidule = 45 Else chose = 0 '3 if et 3 then impriqué inline

    For I = 1 To 10: tb(I) = I * 10: Next I 'une boucle bloc inline

    If toto = " 'tutu _''" Then tata = "titi'": _
    tata = 78 ' un commentaire
    End Sub
    et voici ce que me renvoie ma fonction vba
    Sub test()

    '3 if consécutifs
    'commentaire
    If truc = 1 Then
    If chose = 2 Then
    If machin = 3 Then
    chose = 1
    End If
    End If
    End If

    '3 if consécutifs avec un else
    '3 if et 3 then impriqué inline
    If truc = &quot;&quot;&quot; &quot;&quot; ± _ tutu ± &quot;&quot; &quot;&quot;&quot; Then
    If chose = 2 Then
    If machin = 3 Then
    chose = 1
    bidule = 45
    Else
    chose = 0
    End If
    End If
    End If

    'une boucle bloc inline
    For I = 1 To 10
    tb(I) = I * 10
    Next I

    If toto = &quot; ±tutu _±±&quot; Then tata = &quot;titi±&quot;: underbreak tata = 78 ' un commentaire
    End Sub
    et voici ce que me renvoie la fonction JS
    '/*/
    '3 if consécutifs
    If truc = 1 Then
    If chose = 2 Then
    If machin = 3 Then
    chose = 1'commentaire
    End If
    End If
    End If
    '/*/
    '3 if consécutifs avec un else
    If truc = &quot;&quot;&quot; &quot;&quot; ± _ tutu ± &quot;&quot; &quot;&quot;&quot; Then
    If chose = 2 Then
    If machin = 3 Then
    chose = 1
    bidule=45
    Else
    chose = 0'3 if et 3 then impriqué inline
    End If
    End If
    End If
    '/*/
    for i= 1 to 10
    tb(i)=i*10
    Next i 'une boucle bloc inline
    '/*/
    If toto=&quot; ±tutu _±±&quot; then tata=&quot;titi±&quot;
    underbreak tata=78 ' un commentaire
    '/*/
    '/*/
    donc la fonction js ne néttoie pas les ligne préservée par "*/*/
    elle ne replasse pas le commentaire au dessus du bloc restructuré

    merci d'avance pour les retours eventuels

  2. #2
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 570
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 570
    Par défaut
    Bonsoir,
    Ce que tu demandes est tout simplement impossible.

    Le JavaScript est un langage bien à part dont la structure est complètement différente de tous le autres l'agence.

    Alors que le c# par certains côtés ressemble au JS, la convertion Via un algorithme est totalement impossible ; alors que la migration de VB vers C# est totalement faisable.

    Le VB et le C# c'est un peut comme le français et l'anglais c'est juste l'inversion du sujet.

    J'ai pensé qu'il était possible d'avoir un convertisseur, j'ai tenté une conversation par bloc avec de classe et de collection.

    Le replacer comme tu le fais n'a pas beaucoup de chance d'aboutir a mon sens.

    Bon courage pour la suite.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    Type regles    VB() As String
        js() As String
        Nb As Long
    End Type
     
     
    Dim RG As regles
     
     
    Function ConvertVBAToJS(vbaCode As String) As String
        Dim jsCode As String
        Dim lignes() As String
        Dim i As Long
     
     
        If vbaCode = "" Then
            ConvertVBAToJS = ""
            Exit Function
        End If
     
     
        ChargerReglesConversion
        lignes = Split(vbaCode, vbCrLf)
        jsCode = "class Regles {" & vbCrLf & "    constructor() {" & vbCrLf
     
     
        For i = LBound(lignes) To UBound(lignes)
            jsCode = jsCode & IIf(i > LBound(lignes), vbCrLf, "") & "        " & ConvertirLigne(lignes(i))
        Next i
     
     
        jsCode = jsCode & vbCrLf & "    }" & vbCrLf & "}" & vbCrLf
        jsCode = jsCode & "let RG = new Regles();"
     
     
        ConvertVBAToJS = jsCode
    End Function
     
     
    Sub ChargerReglesConversion()
        Dim i As Long
        Dim donnees As Variant
     
     
        donnees = Array( _
            Array("Type ", ""), Array("End Type", ""), _
            Array("Dim ", ""), Array(" As String", " = []"), Array(" As Integer", " = 0"), _
            Array(" As Long", " = 0"), Array(" As Double", " = 0.0"), Array(" As Boolean", " = false"), _
            Array("If ", "if ("), Array(" Then", ") {"), Array("End If", "}"), Array("Else", "} else {"), _
            Array("ElseIf ", "} else if ("), Array("For ", "for ("), Array(" To ", "; i <= "), Array("Next", "}"), _
            Array("While ", "while ("), Array("Wend", "}"), Array("Sub ", "function "), Array("Function ", "function "), _
            Array("End Sub", "}"), Array("End Function", "}"), Array("True", "true"), Array("False", "false"), _
            Array("Nothing", "null"), Array("vbCrLf", "'\n'"), Array("vbTextCompare", "1"), Array("MsgBox", "alert"), _
            Array("InputBox", "prompt"), Array("Len(", ".length"), Array("UBound(", ".length - 1"), _
            Array("Split(", ".split("), Array("Trim(", ".trim("), Array("Replace(", ".replace("), _
            Array("InStr(", ".indexOf("), Array("Mid(", ".substring("), Array("Left(", ".substring(0, "), _
            Array("Right(", ".slice(-"), Array("Exit Function", "return"), Array("Exit Sub", "return"), _
            Array(" And ", " && "), Array(" Or ", " || "), Array(" Not ", "!"), Array("<>", "!="), Array(" & ", " + ") _
        )
     
     
        RG.Nb = UBound(donnees) + 1
        ReDim RG.VB(1 To RG.Nb)
        ReDim RG.js(1 To RG.Nb)
     
     
        For i = 0 To RG.Nb - 1
            RG.VB(i + 1) = donnees(i)(0)
            RG.js(i + 1) = donnees(i)(1)
        Next i
    End Sub
     
     
    Function ConvertirLigne(ligne As String) As String
        Dim resultat As String
        Dim i As Long
     
     
        ligne = Trim(ligne)
        If ligne = "" Then
            ConvertirLigne = ""
            Exit Function
        End If
     
     
        If Left(ligne, 1) = "'" Then
            ConvertirLigne = "//" & Mid(ligne, 2)
            Exit Function
        End If
     
     
        resultat = ligne
        For i = 1 To RG.Nb
            resultat = Replace(resultat, RG.VB(i), RG.js(i), 1, -1, vbTextCompare)
        Next i
     
     
        resultat = GererChaines(resultat)
        ConvertirLigne = AjouterPointVirgule(resultat)
    End Function
     
     
    Function GererChaines(texte As String) As String
        Dim res As String
        Dim i As Long
        Dim c As String
        Dim dansChaine As Boolean
     
     
        res = ""
        dansChaine = False
     
     
        For i = 1 To Len(texte)
            c = Mid(texte, i, 1)
            If c = """" Then
                res = res & IIf(dansChaine, "\""", """")
                dansChaine = Not dansChaine
            Else
                res = res & c
            End If
        Next i
     
     
        GererChaines = res
    End Function
     
     
    Function AjouterPointVirgule(texte As String) As String
        If texte = "" Then
            AjouterPointVirgule = ""
            Exit Function
        End If
     
     
        If InStr(texte, "function") > 0 Or InStr(texte, "if") > 0 Or InStr(texte, "for") > 0 _
            Or InStr(texte, "while") > 0 Or InStr(texte, "{") > 0 Or InStr(texte, "}") > 0 Then
            AjouterPointVirgule = texte
        ElseIf Right(texte, 1) <> ";" Then
            AjouterPointVirgule = texte & ";"
        Else
            AjouterPointVirgule = texte
        End If
    End Function
     
     
    Function RegX(code As String) As String
        Dim regex As Object
        Set regex = CreateObject("VBScript.RegExp")
        regex.IgnoreCase = True
        regex.Global = True
        regex.Pattern = "(function|if|for|while|{)"
     
     
        Dim result As String, lines() As String, line As String
        Dim indentLevel As Integer, i As Integer
     
     
        lines = Split(code, vbCrLf)
        indentLevel = 0
        result = ""
     
     
        For i = 0 To UBound(lines)
            line = Trim(lines(i))
            If line Like "*}*" Then indentLevel = indentLevel - 1
            If indentLevel < 0 Then indentLevel = 0
            result = result & String(indentLevel * 4, " ") & line & vbCrLf
            If line Like "*{*" Then indentLevel = indentLevel + 1
        Next i
     
     
        RegX = result
    End Function
    Sub test()
        Dim exemple As String
        exemple = "Type Regles" & vbCrLf & "    VB() As String" & vbCrLf & "    JS() As String" & vbCrLf & "    Nb As Long" & vbCrLf & "End Type"
        Debug.Print RegX(ConvertVBAToJS(TXT))
    End Sub
     
     
    Function TXT() As String
    TXT = TXT & "Type regles" & vbCrLf
    TXT = TXT & "    VB() As String" & vbCrLf
    TXT = TXT & "    JS() As String" & vbCrLf
    TXT = TXT & "    Nb As Integer" & vbCrLf
    TXT = TXT & "End Type" & vbCrLf
    TXT = TXT & "" & vbCrLf
    TXT = TXT & "Dim RG As regles" & vbCrLf
    TXT = TXT & "" & vbCrLf
    TXT = TXT & "Function ConvertVBAToJS(vbaCode As String) As String" & vbCrLf
    TXT = TXT & "    Dim jsCode As String, lignes() As String, i As Integer" & vbCrLf
    TXT = TXT & "    If vbaCode = """" Then ConvertVBAToJS = """": Exit Function" & vbCrLf
    TXT = TXT & "    ChargerReglesConversion" & vbCrLf
    TXT = TXT & "    lignes = Split(vbaCode, vbCrLf)" & vbCrLf
    TXT = TXT & "    For i = 0 To UBound(lignes)" & vbCrLf
    TXT = TXT & "        jsCode = jsCode & IIf(i > 0, vbCrLf, """") & ConvertirLigne(lignes(i))" & vbCrLf
    TXT = TXT & "    Next" & vbCrLf
    TXT = TXT & "    ConvertVBAToJS = jsCode" & vbCrLf
    TXT = TXT & "End Function" & vbCrLf
    TXT = TXT & "" & vbCrLf
    TXT = TXT & "Sub ChargerReglesConversion()" & vbCrLf
    TXT = TXT & "    Dim i As Integer" & vbCrLf
    TXT = TXT & "    Dim donnees As Variant" & vbCrLf
    TXT = TXT & "" & vbCrLf
    TXT = TXT & "    donnees = Array( _" & vbCrLf
    TXT = TXT & "        Array(""Dim "", ""let ""), Array("" As String"", "" = ''""), Array("" As Integer"", "" = 0""), _" & vbCrLf
    TXT = TXT & "        Array("" As Long"", "" = 0""), Array("" As Double"", "" = 0.0""), Array("" As Boolean"", "" = false""), _" & vbCrLf
    TXT = TXT & "        Array(""If "", ""if (""), Array("" Then"", "") {""), Array(""End If"", ""}""), Array(""Else"", ""} else {""), _" & vbCrLf
    TXT = TXT & "        Array(""ElseIf "", ""} else if (""), Array(""For "", ""for (""), Array("" To "", ""; i <= ""), Array(""Next"", ""}""), _" & vbCrLf
    TXT = TXT & "        Array(""While "", ""while (""), Array(""Wend"", ""}""), Array(""Sub "", ""function ""), Array(""Function "", ""function ""), _" & vbCrLf
    TXT = TXT & "        Array(""End Sub"", ""}""), Array(""End Function"", ""}""), Array(""True"", ""true""), Array(""False"", ""false""), _" & vbCrLf
    TXT = TXT & "        Array(""Nothing"", ""null""), Array(""vbCrLf"", ""'\n'""), Array(""vbTextCompare"", ""1""), Array(""MsgBox"", ""alert""), _" & vbCrLf
    TXT = TXT & "        Array(""InputBox"", ""prompt""), Array(""Len("", "".length""), Array(""UBound("", "".length - 1""), _" & vbCrLf
    TXT = TXT & "        Array(""Split("", ""vbaCode.split(""), Array(""Trim("", "".trim(""), Array(""Replace("", "".replace(""), _" & vbCrLf
    TXT = TXT & "        Array(""InStr("", "".indexOf(""), Array(""Mid("", "".substring(""), Array(""Left("", "".substring(0, ""), _" & vbCrLf
    TXT = TXT & "        Array(""Right("", "".slice(-""), Array(""Exit Function"", ""return""), Array(""Exit Sub"", ""return""), _" & vbCrLf
    TXT = TXT & "        Array("" And "", "" && ""), Array("" Or "", "" || ""), Array("" Not "", "" !""), Array(""<>"", ""!=""), Array("" & "", "" + "") _" & vbCrLf
    TXT = TXT & "    )" & vbCrLf
    TXT = TXT & "" & vbCrLf
    TXT = TXT & "    RG.Nb = UBound(donnees) + 1" & vbCrLf
    TXT = TXT & "    ReDim RG.VB(1 To RG.Nb)" & vbCrLf
    TXT = TXT & "    ReDim RG.JS(1 To RG.Nb)" & vbCrLf
    TXT = TXT & "" & vbCrLf
    TXT = TXT & "    For i = 0 To RG.Nb - 1" & vbCrLf
    TXT = TXT & "        RG.VB(i + 1) = donnees(i)(0)" & vbCrLf
    TXT = TXT & "        RG.JS(i + 1) = donnees(i)(1)" & vbCrLf
    TXT = TXT & "    Next" & vbCrLf
    TXT = TXT & "End Sub" & vbCrLf
    TXT = TXT & "" & vbCrLf
    TXT = TXT & "Function ConvertirLigne(ligne As String) As String" & vbCrLf
    TXT = TXT & "    Dim resultat As String, i As Integer" & vbCrLf
    TXT = TXT & "    ligne = Trim(ligne)" & vbCrLf
    TXT = TXT & "    If ligne = """" Then ConvertirLigne = """": Exit Function" & vbCrLf
    TXT = TXT & "    If Left(ligne, 1) = ""'"" Then ConvertirLigne = ""//"" & Mid(ligne, 2): Exit Function" & vbCrLf
    TXT = TXT & "    resultat = ligne" & vbCrLf
    TXT = TXT & "    For i = 1 To RG.Nb" & vbCrLf
    TXT = TXT & "        resultat = Replace(resultat, RG.VB(i), RG.JS(i), , , vbTextCompare)" & vbCrLf
    TXT = TXT & "    Next" & vbCrLf
    TXT = TXT & "    resultat = GererChaines(resultat)" & vbCrLf
    TXT = TXT & "    ConvertirLigne = AjouterPointVirgule(resultat)" & vbCrLf
    TXT = TXT & "End Function" & vbCrLf
    TXT = TXT & "" & vbCrLf
    TXT = TXT & "Function GererChaines(texte As String) As String" & vbCrLf
    TXT = TXT & "    Dim res As String, i As Integer, c As String, dansChaine As Boolean" & vbCrLf
    TXT = TXT & "    For i = 1 To Len(texte)" & vbCrLf
    TXT = TXT & "        c = Mid(texte, i, 1)" & vbCrLf
    TXT = TXT & "        If c = """""""" Then" & vbCrLf
    TXT = TXT & "            res = res & IIf(dansChaine, ""\"""""""""", """""""")" & vbCrLf
    TXT = TXT & "            dansChaine = Not dansChaine" & vbCrLf
    TXT = TXT & "        Else" & vbCrLf
    TXT = TXT & "            res = res & c" & vbCrLf
    TXT = TXT & "        End If" & vbCrLf
    TXT = TXT & "    Next" & vbCrLf
    TXT = TXT & "    GererChaines = res" & vbCrLf
    TXT = TXT & "End Function" & vbCrLf
    TXT = TXT & "" & vbCrLf
    TXT = TXT & "Function AjouterPointVirgule(texte As String) As String" & vbCrLf
    TXT = TXT & "    If texte = """" Then" & vbCrLf
    TXT = TXT & "        AjouterPointVirgule = """"" & vbCrLf
    TXT = TXT & "        Exit Function" & vbCrLf
    TXT = TXT & "    End If" & vbCrLf
    TXT = TXT & "    If InStr(texte, ""function"") > 0 Or InStr(texte, ""if"") > 0 Or InStr(texte, ""for"") > 0 _" & vbCrLf
    TXT = TXT & "        Or InStr(texte, ""while"") > 0 Or InStr(texte, ""{"") > 0 Or InStr(texte, ""}"") > 0 Then" & vbCrLf
    TXT = TXT & "        AjouterPointVirgule = texte" & vbCrLf
    TXT = TXT & "    ElseIf Right(texte, 1) <> "";"" Then" & vbCrLf
    TXT = TXT & "        AjouterPointVirgule = texte & "";""" & vbCrLf
    TXT = TXT & "    Else" & vbCrLf
    TXT = TXT & "        AjouterPointVirgule = texte" & vbCrLf
    TXT = TXT & "    End If" & vbCrLf
    TXT = TXT & "End Function" & vbCrLf
    TXT = TXT & "" & vbCrLf
    'TXT = TXT & "Sub test()" & vbCrLf
    'TXT = TXT & "    Dim exemple As String" & vbCrLf
    'TXT = TXT & "    exemple = ""Dim x As Integer"" & vbCrLf & ""x = 10"" & vbCrLf & ""If x > 5 Then"" & vbCrLf & ""MsgBox x"" & vbCrLf & ""End If""" & vbCrLf
    'TXT = TXT & "    Debug.Print ConvertVBAToJS(TXT)" & vbCrLf
    'TXT = TXT & "End Sub" & vbCrLf
    'TXT = TXT & "" & vbCrLf
     
     
    End Function
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    Private Function ConvertVBAToJS(vbaCode As String) As String 
        Dim lignes() As String
        Dim i As Integer
        Dim ligne As String
        Dim jsCode As String
     
     
        lignes = Split(vbaCode, vbCrLf)
        jsCode = ""
     
     
        For i = LBound(lignes) To UBound(lignes)
            ligne = Trim(lignes(i))
     
     
            If LCase(Left(ligne, 4)) = "sub " Or LCase(Left(ligne, 9)) = "function " Then
                Dim nom As String
                nom = Split(Split(ligne, " ")(1), "(")(0)
                jsCode = jsCode & "function " & nom & "() {" & vbCrLf
     
     
            ElseIf LCase(ligne) = "end sub" Or LCase(ligne) = "end function" Then
                jsCode = jsCode & "}" & vbCrLf
     
     
            ElseIf LCase(Left(ligne, 2)) = "if" Then
                ligne = Replace(ligne, "Then", "")
                ligne = Mid(ligne, 4)
                jsCode = jsCode & "if (" & ligne & ") {" & vbCrLf
     
     
            ElseIf LCase(ligne) = "else" Then
                jsCode = jsCode & "} else {" & vbCrLf
     
     
            ElseIf LCase(ligne) = "end if" Then
                jsCode = jsCode & "}" & vbCrLf
     
     
            ElseIf LCase(Left(ligne, 3)) = "dim" Then
                Dim varName As String
                varName = Split(ligne, " ")(1)
                varName = Split(varName, "(")(0)
                varName = Split(varName, " As")(0)
                jsCode = jsCode & "let " & varName & ";" & vbCrLf
     
     
            ElseIf InStr(ligne, "=") > 0 Then
                jsCode = jsCode & ligne & ";" & vbCrLf
     
     
            ElseIf LCase(Left(ligne, 5)) = "type " Then
                Dim nomType As String
                nomType = Trim(Mid(ligne, 6))
                jsCode = jsCode & "const " & nomType & " = {" & vbCrLf
     
     
            ElseIf LCase(ligne) = "end type" Then
                jsCode = jsCode & "};" & vbCrLf
     
     
            ElseIf ligne <> "" Then
                jsCode = jsCode & "// " & ligne & vbCrLf
            End If
        Next i
     
     
        ConvertVBAToJS = jsCode
    End Function
     
     
     
     
    Private Sub test()
     
        Debug.Print RegX(ConvertVBAToJS(TXT))
    End Sub

  3. #3
    Membre chevronné
    Homme Profil pro
    CIP
    Inscrit en
    Avril 2024
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : CIP
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2024
    Messages : 200
    Par défaut re
    Bonjour thumb down

    tout d abords merci pour ton retour et l’intérêt que tu porte a mon sujet

    mais on c'est mal compris

    je veux pas une conversion de la fonction elle même je veux une fonction JS qui fasse la même chose

    en fait on traduit l'intention

Discussions similaires

  1. Convertir une fonction Javascript en VBA ?
    Par mahdiweb dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 03/01/2023, 10h22
  2. Convertir une fonction sur VBA
    Par maymou27 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/06/2012, 12h18
  3. Convertir une fonction SI en language VBA
    Par el_meddeb dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 13/09/2011, 14h19
  4. [VBA-E] Une fonction Excel dans une fonction VBA
    Par laloune dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 14/07/2006, 10h21
  5. Réponses: 8
    Dernier message: 29/06/2006, 15h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo