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 :

Retranscrire un code C en VBA


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Juillet 2007
    Messages
    502
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 502
    Par défaut Retranscrire un code C en VBA
    bonjour

    Voici un code en C, langage que j'ignore completement .
    il y a'til moyen de retranscrire en VBA ce code ????


    Code pascal : 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
    program Reducteur;
    {$APPTYPE CONSOLE}
    uses
      SysUtils;
    {
      Objectif : programme de calcul de systèmes réducteurs
      Le programme calcule le nombre de combinaisons nécessaires pour
      être sûr d'obtenir n numéros parmis m tirés sur une sélection de p numéros
    }
    type
      TCombinaison = record
        Necessaire : Boolean;
        Tirage : array[0..5] of byte; ‘taille de la combinaison
      end;
     
    function Combinaison(AValeurMax : Integer; ASelection : Integer) : Integer;
    var
      i : Integer;
      p : Integer;
      r : Int64;
    begin
      r := 1;
      p := AValeurMax;
      for i := 0 to Pred(ASelection) do begin
        r := p * r;
        Dec(p);
      end;
      p := ASelection;
      for i := 0 to Pred(ASelection) do begin
        r := r div p;
        Dec(p);
      end;
      Result := r;
    end;
     
    var
      i : integer;
      j,k,l : Integer;
      nb_numeros_tires : Integer;
      nb_numeros_selectionnes : Integer;
      nb_numeros_objectif : Integer;
      nb_numeros_max : Integer;
      combinaisons : array of TCombinaison;
      nb_combinaisons : Integer;
      nb_numero_communs : Integer;
      nb_combinaisons_selectionnee : Integer;
    begin
      nb_numeros_tires := 6;     // on part de cette base pour le loto
      nb_numeros_max := 49;
      nb_numeros_objectif := 3;
      for nb_numeros_selectionnes := nb_numeros_tires to nb_numeros_max do begin
        // calcul du nombre de combinaisons possibles
        nb_combinaisons := Combinaison(nb_numeros_selectionnes, nb_numeros_tires);
        SetLength(combinaisons, nb_combinaisons);
        System.Writeln(Format('Selection : %d '#7' Combinaisons : %d', [nb_numeros_selectionnes, nb_combinaisons]));
        // remplissage du tableau ‘faire une variable pour tableau de taille 3 à 10 max
        combinaisons[0].Tirage[0] := 1;
        combinaisons[0].Tirage[1] := 2;
        combinaisons[0].Tirage[2] := 3;
        combinaisons[0].Tirage[3] := 4;
        combinaisons[0].Tirage[4] := 5;
        combinaisons[0].Tirage[5] := 6;
        Combinaisons[0].Necessaire := True;   // Par défaut on garde tout
        if High(Combinaisons) > 0 then begin
          for i := 1 to High(Combinaisons) do begin
               for j := 0 to High(Combinaisons[i].Tirage) do begin
                     Combinaisons[i].Tirage[j] := Combinaisons[i-1].Tirage[j];
                end;
               j := High(Combinaisons[i].Tirage);
              Inc(Combinaisons[i].Tirage[j]);
              while Combinaisons[i].Tirage[j] > (nb_numeros_selectionnes + j -                   
                        High(Combinaisons[i].Tirage)) do begin
                       Inc(Combinaisons[i].Tirage[j-1]);
                      Dec(j);
               end;
              for j := 1 to High(Combinaisons[i].Tirage) do begin
                   if Combinaisons[i].Tirage[j] > (nb_numeros_selectionnes + j -     
                      High(Combinaisons[i].Tirage)) then begin
                    Combinaisons[i].Tirage[j] := Combinaisons[i].Tirage[j-1] + 1;
                   end;
              end;
            Combinaisons[i].Necessaire := True;
          end; ‘fin bcle I
        end; ‘fin du if
        // Recherche des combinaisons nécessaires
        nb_combinaisons_selectionnee := 0;
        for i := 0 to Pred(nb_combinaisons) do begin
          if Combinaisons[i].Necessaire then begin
            Inc(nb_combinaisons_selectionnee);
            for j := i + 1 to Pred(nb_combinaisons) do begin
              nb_numero_communs := 0;
              for k := 0 to High(Combinaisons[i].Tirage) do begin
                for l := 0 to High(Combinaisons[j].Tirage) do begin
                  if Combinaisons[i].Tirage[k] = Combinaisons[j].Tirage[l] then begin
                    Inc(nb_numero_communs);
                    if nb_numero_communs = nb_numeros_objectif then break;
                  end;
                end;
                if nb_numero_communs = nb_numeros_objectif then break;
              end;
              if nb_numero_communs = nb_numeros_objectif then begin
                Combinaisons[j].Necessaire := False;
              end;
            end;
          end;
        end;
        // Affichage
        Writeln(Format('%d combinaisons necessaires', [nb_combinaisons_selectionnee]));
        for i := 0 to Pred(nb_combinaisons) do begin
          if Combinaisons[i].Necessaire then begin
            for j := 0 to High(Combinaisons[i].Tirage) do begin
              write(Format('%.2d ', [Combinaisons[i].Tirage[j]]));
            end;
            writeln('');
          end;
        end;
      end;
      system.Readln;
    end.

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 514
    Par défaut
    Bonsoir,

    A priori ca ressemble plus à du Pascal qu'à du C.
    Code pascal : 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
    program Reducteur;
    {$APPTYPE CONSOLE}
    uses
      SysUtils;
    {
      Objectif : programme de calcul de systèmes réducteurs
      Le programme calcule le nombre de combinaisons nécessaires pour
      être sûr d'obtenir n numéros parmis m tirés sur une sélection de p numéros
    }
    type
      TCombinaison = record
        Necessaire : Boolean;
        Tirage : array[0..5] of byte; ‘taille de la combinaison
      end;
     
    function Combinaison(AValeurMax : Integer; ASelection : Integer) : Integer;
    var
      i : Integer;
      p : Integer;
      r : Int64;
    begin
      r := 1;
      p := AValeurMax;
      for i := 0 to Pred(ASelection) do begin
        r := p * r;
        Dec(p);
      end;
      p := ASelection;
      for i := 0 to Pred(ASelection) do begin
        r := r div p;
        Dec(p);
      end;
      Result := r;
    end;
     
    var
      i : integer;
      j,k,l : Integer;
      nb_numeros_tires : Integer;
      nb_numeros_selectionnes : Integer;
      nb_numeros_objectif : Integer;
      nb_numeros_max : Integer;
      combinaisons : array of TCombinaison;
      nb_combinaisons : Integer;
      nb_numero_communs : Integer;
      nb_combinaisons_selectionnee : Integer;
    begin
      nb_numeros_tires := 6;     // on part de cette base pour le loto
      nb_numeros_max := 49;
      nb_numeros_objectif := 3;
      for nb_numeros_selectionnes := nb_numeros_tires to nb_numeros_max do begin
        // calcul du nombre de combinaisons possibles
        nb_combinaisons := Combinaison(nb_numeros_selectionnes, nb_numeros_tires);
        SetLength(combinaisons, nb_combinaisons);
        System.Writeln(Format('Selection : %d '#7' Combinaisons : %d', [nb_numeros_selectionnes, nb_combinaisons]));
        // remplissage du tableau ‘faire une variable pour tableau de taille 3 à 10 max
        combinaisons[0].Tirage[0] := 1;
        combinaisons[0].Tirage[1] := 2;
        combinaisons[0].Tirage[2] := 3;
        combinaisons[0].Tirage[3] := 4;
        combinaisons[0].Tirage[4] := 5;
        combinaisons[0].Tirage[5] := 6;
        Combinaisons[0].Necessaire := True;   // Par défaut on garde tout
        if High(Combinaisons) > 0 then begin
          for i := 1 to High(Combinaisons) do begin
               for j := 0 to High(Combinaisons[i].Tirage) do begin
                     Combinaisons[i].Tirage[j] := Combinaisons[i-1].Tirage[j];
                end;
               j := High(Combinaisons[i].Tirage);
              Inc(Combinaisons[i].Tirage[j]);
              while Combinaisons[i].Tirage[j] > (nb_numeros_selectionnes + j -                   
                        High(Combinaisons[i].Tirage)) do begin
                       Inc(Combinaisons[i].Tirage[j-1]);
                      Dec(j);
               end;
              for j := 1 to High(Combinaisons[i].Tirage) do begin
                   if Combinaisons[i].Tirage[j] > (nb_numeros_selectionnes + j -     
                      High(Combinaisons[i].Tirage)) then begin
                    Combinaisons[i].Tirage[j] := Combinaisons[i].Tirage[j-1] + 1;
                   end;
              end;
            Combinaisons[i].Necessaire := True;
          end; ‘fin bcle I
        end; ‘fin du if
        // Recherche des combinaisons nécessaires
        nb_combinaisons_selectionnee := 0;
        for i := 0 to Pred(nb_combinaisons) do begin
          if Combinaisons[i].Necessaire then begin
            Inc(nb_combinaisons_selectionnee);
            for j := i + 1 to Pred(nb_combinaisons) do begin
              nb_numero_communs := 0;
              for k := 0 to High(Combinaisons[i].Tirage) do begin
                for l := 0 to High(Combinaisons[j].Tirage) do begin
                  if Combinaisons[i].Tirage[k] = Combinaisons[j].Tirage[l] then begin
                    Inc(nb_numero_communs);
                    if nb_numero_communs = nb_numeros_objectif then break;
                  end;
                end;
                if nb_numero_communs = nb_numeros_objectif then break;
              end;
              if nb_numero_communs = nb_numeros_objectif then begin
                Combinaisons[j].Necessaire := False;
              end;
            end;
          end;
        end;
        // Affichage
        Writeln(Format('%d combinaisons necessaires', [nb_combinaisons_selectionnee]));
        for i := 0 to Pred(nb_combinaisons) do begin
          if Combinaisons[i].Necessaire then begin
            for j := 0 to High(Combinaisons[i].Tirage) do begin
              write(Format('%.2d ', [Combinaisons[i].Tirage[j]]));
            end;
            writeln('');
          end;
        end;
      end;
      system.Readln;
    end.

    Pour le retranscrire en vb pas d'autre choix que de le faire à la main mais ca devrait ressembler à ceci:

    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
    Type TCombinaison
        Necessaire As Boolean
        Tirage(0 To 5) As Byte 'taille de la combinaison
    End Type
     
    Function Combinaison(AValeurMax As Integer, ASelection As Integer) As Integer
        Dim i As Integer
        Dim p As Integer
        Dim r As Long
     
        r = 1
        p = AValeurMax
        For i = 0 To Pred(ASelection)
            r = p * r
            p = p - 1
        Next
        p = ASelection
        For i = 0 To Pred(ASelection)
            r = r \ p
            p = p - 1
        Next
        Result = r
     
        Dim j As Integer, k As Integer, l As Integer
        Dim nb_numeros_tires As Integer
        Dim nb_numeros_selectionnes As Integer
        Dim nb_numeros_objectif As Integer
        Dim nb_numeros_max As Integer
        Dim combinaisons() As TCombinaison
        Dim nb_combinaisons As Integer
        Dim nb_numero_communs As Integer
        Dim nb_combinaisons_selectionnee As Integer
     
        nb_numeros_tires = 6     ' on part de cette base pour le loto
        nb_numeros_max = 49
        nb_numeros_objectif = 3
     
        For nb_numeros_selectionnes = nb_numeros_tires To nb_numeros_max
     
            ' calcul du nombre de combinaisons possibles
            nb_combinaisons = Combinaison(nb_numeros_selectionnes, nb_numeros_tires)
     
            ReDim combinaisons(0 To nb_combinaisons) 'SetLength(combinaisons, nb_combinaisons)
            'System.Writeln(Format('Selection : %d '#7' Combinaisons : %d', (nb_numeros_selectionnes, nb_combinaisons)))
     
            ' remplissage du tableau ‘faire une variable pour tableau de taille 3 à 10 max
            combinaisons(0).Tirage(0) = 1
            combinaisons(0).Tirage(1) = 2
            combinaisons(0).Tirage(2) = 3
            combinaisons(0).Tirage(3) = 4
            combinaisons(0).Tirage(4) = 5
            combinaisons(0).Tirage(5) = 6
            combinaisons(0).Necessaire = True   ' Par défaut on garde tout
     
            If High(combinaisons) > 0 Then
                For i = 1 To High(combinaisons)
                    For j = 0 To High(combinaisons(i).Tirage)
                        combinaisons(i).Tirage(j) = combinaisons(i - 1).Tirage(j)
                    Next
                    j = High(combinaisons(i).Tirage)
                    combinaisons(i).Tirage(j) = combinaisons(i).Tirage(j) + 1
                    Do While combinaisons(i).Tirage(j) > (nb_numeros_selectionnes + j _
                                                            - High(combinaisons(i).Tirage))
                        combinaisons(i).Tirage(j - 1) = combinaisons(i).Tirage(j - 1) + 1
                        j = j - 1
                    Loop
                    For j = 1 To High(combinaisons(i).Tirage)
                        If combinaisons(i).Tirage(j) > (nb_numeros_selectionnes + j _
                                                        - High(combinaisons(i).Tirage)) Then
                            combinaisons(i).Tirage(j) = combinaisons(i).Tirage(j - 1) + 1
                        End If
                    Next
                    combinaisons(i).Necessaire = True
                Next
            End If
     
            ' Recherche des combinaisons nécessaires
            nb_combinaisons_selectionnee = 0
            For i = 0 To Pred(nb_combinaisons)
                If combinaisons(i).Necessaire Then
                    nb_combinaisons_selectionnee = nb_combinaisons_selectionnee + 1
                    For j = i + 1 To Pred(nb_combinaisons)
                        nb_numero_communs = 0
                        For k = 0 To High(combinaisons(i).Tirage)
                            For l = 0 To High(combinaisons(j).Tirage)
                                If combinaisons(i).Tirage(k) = combinaisons(j).Tirage(l) Then
                                    nb_numero_communs = nb_numero_communs + 1
                                    If nb_numero_communs = nb_numeros_objectif Then Exit For
                                End If
                            Next
                            If nb_numero_communs = nb_numeros_objectif Then Exit For
                        Next
                        If nb_numero_communs = nb_numeros_objectif Then
                            combinaisons(j).Necessaire = False
                        End If
                    Next
                End If
            Next
     
            ' Affichage
            'Writeln(Format('%d combinaisons necessaires', (nb_combinaisons_selectionnee)))
            For i = 0 To Pred(nb_combinaisons)
                If combinaisons(i).Necessaire Then
                    For j = 0 To High(combinaisons(i).Tirage)
                        'write(Format('%.2d ', (Combinaisons(i).Tirage(j))))
                    Next
                    'writeln('')
                End If
            Next
      Next
    End Function
    Note que les fonctions Pred et High ne sont pas définies.

    Cordialement,

    Tirex28/

  3. #3
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 122
    Par défaut
    Salut
    C'est bien du pascal en effet.
    Pour Hight l'équivalent est UBound. Pour Pred il retranche 1 a la valeur passé en parametre, il suffit donc de le remplacer par exemple dans les boucle for
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for IntVal = 0 to MaVariable -1
    A++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  4. #4
    Membre éclairé
    Inscrit en
    Juillet 2007
    Messages
    502
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 502
    Par défaut
    bonjour
    j'avoue , je suis perdu

    pour faire simple
    je voudrais lancer le code par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub CommandButton1_Click()
    lancerlecode
    End Sub
    et afficher dans un textbox les combinaisons

    j'ai l'erreur suivante

    erreur compilation
    impossible de definir un type public defini par utilisateur à l'intereieur d'un module objet

  5. #5
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 514
    Par défaut
    Bonsoir,

    erreur compilation
    impossible de definir un type public defini par utilisateur à l'intereieur d'un module objet
    Déplace la définition du type dans un module standard.

    Cordialement,

    Tirex28/

  6. #6
    Membre éclairé
    Inscrit en
    Juillet 2007
    Messages
    502
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 502
    Par défaut
    bonjour

    voila ou j'en suis avec l'adaption du code en pascal vers du vba .

    la on je coince c''est la partie de la declaration
    pascal

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    type
      TCombinaison = record
        Necessaire : Boolean;
        Tirage : array[0..5] of byte; ‘taille de la combinaison
      end;

    plutot sur Tcombinaison =record
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. retranscription de code vbs vers vba
    Par kev0631 dans le forum Général VBA
    Réponses: 1
    Dernier message: 24/04/2007, 18h46
  2. Réponses: 1
    Dernier message: 03/08/2006, 12h34
  3. [XSLT][>HTML] Retranscrire du code tel quel
    Par gedeon555 dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 02/08/2006, 15h21
  4. Utiliser du code SQL dans VBA
    Par a2line dans le forum Requêtes et SQL.
    Réponses: 25
    Dernier message: 30/05/2006, 14h53
  5. Acceder a du code .net via VBA
    Par cedrox dans le forum Access
    Réponses: 1
    Dernier message: 04/05/2006, 11h42

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