bonjour
je reprends la discussion de oscar.cesar sur son code pascal en vers du vba.

je rappelle le code initial:

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
 
 
 
 
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.


j'ai essayé de recoder en vba par rapport à mes petites connaissances et avec les conseils du forum mais j'avoue que cela est pas simple

voila ou j'en suis

actuellement j'ai une erreur execution depassement de pile ?


voici le code

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
 
  'Type TCombinaison
          Dim Necessaire As Boolean
         Dim AValeurMax As Integer
         Dim ASelection As Integer
         Dim Tirage(0 To 5) As Byte 'taille de la combinaison
   'end type
 
 
 
 
 
 
Function Combinaison(AValeurMax, ASelection) As Integer
 
 
 
    Dim i As Integer
    Dim p As Integer
    Dim r As Long
 
    r = 1
    p = AValeurMax
    'For i = 0 To Pred(ASelection)
       For i = 0 To (ASelection - 1)
        r = p * r
        p = p - 1
    Next
    p = ASelection
    'For i = 0 To Pred(ASelection)
        For i = 0 To (ASelection - 1)
        r = r \ p
        p = p - 1
    Next
    Result = r
 
 'end fonction
 
 
 
 
 
 
    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 = 4     ' on part de cette base pour le loto 6
    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 UBound(combinaisons) > 0 Then
            For i = 1 To UBound(combinaisons)
                For j = 0 To UBound(combinaisons(i).Tirage)
                    combinaisons(i).Tirage(j) = combinaisons(i - 1).Tirage(j)
                Next
                j = UBound(combinaisons(i).Tirage)
                combinaisons(i).Tirage(j) = combinaisons(i).Tirage(j) + 1
                Do While combinaisons(i).Tirage(j) > (nb_numeros_selectionnes + j _
                                                        - UBound(combinaisons(i).Tirage))
                    combinaisons(i).Tirage(j - 1) = combinaisons(i).Tirage(j - 1) + 1
                    j = j - 1
                Loop
                For j = 1 To UBound(combinaisons(i).Tirage)
                    If combinaisons(i).Tirage(j) > (nb_numeros_selectionnes + j _
                                                    - UBound(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 (nb_combinaisons - 1)
            If combinaisons(i).Necessaire Then
                nb_combinaisons_selectionnee = nb_combinaisons_selectionnee + 1
                For j = i + 1 To (nb_combinaisons - 1)
                    nb_numero_communs = 0
                    For k = 0 To UBound(combinaisons(i).Tirage)
                        For l = 0 To UBound(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 (nb_combinaisons - 1)
            If combinaisons(i).Necessaire Then
                For j = 0 To UBound(combinaisons(i).Tirage)
                    'write(Format('%.2d ', (Combinaisons(i).Tirage(j))))
                Next
                'writeln('')
            End If
        Next
  Next
 
 
 
 
 
 
'End Sub
End Function
 
Private Sub CommandButton1_Click()
 
Call Combinaison(AValeurMax, ASelection)
End Sub


merci pour le coup de main .