Option Explicit
Dim NbPtPTr As Integer 'Petit Transporteur
Dim NbPtGTr As Integer 'Grand Transporteur
Dim NbPtCLg As Integer 'Chasseur Léger
Dim NbPtCLd As Integer 'Chasseur Lourd
Dim NbPtCro As Integer 'Croiseur
Dim NbPtVBa As Integer 'Vaisseau de Bataille
Dim NbPtVCo As Integer 'Vaisseau de Colonisation
Dim NbPtRec As Integer 'Recycleur
Dim NbPtSEs As Integer 'Sonde d'Espionnage
Dim NbPtBom As Integer 'Bombardier
Dim NbPtDes As Integer 'Destructeur
Dim NbPtTra As Integer 'Traqueur
Dim NbTotalVaisseaux As Integer
Dim NbTotalPoints As Integer
Dim NbVaisseaux As Integer
Dim NbPoints As Integer
Dim LigneCourante As Long
'Initialise les variables publiques à partir des valeurs
'entrées dans la feuille "Données" du classeur Excel :
Private Sub initialisation()
With Worksheets("Données" )
NbTotalVaisseaux = .Cells(1, 2)
NbTotalPoints = .Cells(2, 2)
NbPtPTr = .Cells(5, 2)
NbPtGTr = .Cells(5, 3)
NbPtCLg = .Cells(5, 4)
NbPtCLd = .Cells(5, 5)
NbPtCro = .Cells(5, 6)
NbPtVBa = .Cells(5, 7)
NbPtVCo = .Cells(5, 8)
NbPtRec = .Cells(5, 9)
NbPtSEs = .Cells(5, 10)
NbPtBom = .Cells(5, 11)
NbPtDes = .Cells(5, 12)
NbPtTra = .Cells(5, 13)
End With
LigneCourante = 2 '1ère ligne de la feuille résultat
'Effacement des données précédentes
Worksheets("Résultats" ).Range("A2", "N65536" ).Select
Selection.Delete
Worksheets("Résultats" ).Range("A2" ).Select
End Sub
Sub IterationVaisseaux()
Dim PTr As Integer 'Petit Transporteur
Dim GTr As Integer 'Grand Transporteur
Dim CLg As Integer 'Chasseur Léger
Dim CLd As Integer 'Chasseur Lourd
Dim Cro As Integer 'Croiseur
Dim VBa As Integer 'Vaisseau de Bataille
Dim VCo As Integer 'Vaisseau de Colonisation
Dim Rec As Integer 'Recycleur
Dim SEs As Integer 'Sonde d'Espionnage
Dim Bom As Integer 'Bombardier
Dim Des As Integer 'Destructeur
Dim Tra As Integer 'Traqueur
Dim ToutEcrire As Boolean
initialisation 'des données d'entrée
If Worksheets("Données" ).Cells(1, 6) = "Tout" Then ToutEcrire = True
For PTr = 0 To NbTotalVaisseaux
For GTr = 0 To NbTotalVaisseaux
For CLg = 0 To NbTotalVaisseaux
For CLd = 0 To NbTotalVaisseaux
For Cro = 0 To NbTotalVaisseaux
For VBa = 0 To NbTotalVaisseaux
For VCo = 0 To NbTotalVaisseaux
For Rec = 0 To NbTotalVaisseaux
For SEs = 0 To NbTotalVaisseaux
For Bom = 0 To NbTotalVaisseaux
For Des = 0 To NbTotalVaisseaux
For Tra = 0 To NbTotalVaisseaux
If LimitesDepassees(PTr, GTr, CLg, CLd, Cro, VBa, VCo, Rec, SEs, Bom, Des, Tra) Then
Exit For
ElseIf ToutEcrire Or (NbVaisseaux = NbTotalVaisseaux And NbPoints = NbTotalPoints) Then
Call EcrireResultats(PTr, GTr, CLg, CLd, Cro, VBa, VCo, Rec, SEs, Bom, Des, Tra)
End If
Next Tra
Tra = 0
If LimitesDepassees(PTr, GTr, CLg, CLd, Cro, VBa, VCo, Rec, SEs, Bom, Des, Tra) Then Exit For
Next Des
Des = 0
If LimitesDepassees(PTr, GTr, CLg, CLd, Cro, VBa, VCo, Rec, SEs, Bom, Des, Tra) Then Exit For
Next Bom
Bom = 0
If LimitesDepassees(PTr, GTr, CLg, CLd, Cro, VBa, VCo, Rec, SEs, Bom, Des, Tra) Then Exit For
Next SEs
SEs = 0
If LimitesDepassees(PTr, GTr, CLg, CLd, Cro, VBa, VCo, Rec, SEs, Bom, Des, Tra) Then Exit For
Next Rec
Rec = 0
If LimitesDepassees(PTr, GTr, CLg, CLd, Cro, VBa, VCo, Rec, SEs, Bom, Des, Tra) Then Exit For
Next VCo
VCo = 0
If LimitesDepassees(PTr, GTr, CLg, CLd, Cro, VBa, VCo, Rec, SEs, Bom, Des, Tra) Then Exit For
Next VBa
VBa = 0
If LimitesDepassees(PTr, GTr, CLg, CLd, Cro, VBa, VCo, Rec, SEs, Bom, Des, Tra) Then Exit For
Next Cro
Cro = 0
If LimitesDepassees(PTr, GTr, CLg, CLd, Cro, VBa, VCo, Rec, SEs, Bom, Des, Tra) Then Exit For
Next CLd
CLd = 0
If LimitesDepassees(PTr, GTr, CLg, CLd, Cro, VBa, VCo, Rec, SEs, Bom, Des, Tra) Then Exit For
Next CLg
CLg = 0
If LimitesDepassees(PTr, GTr, CLg, CLd, Cro, VBa, VCo, Rec, SEs, Bom, Des, Tra) Then Exit For
Next GTr
GTr = 0
If LimitesDepassees(PTr, GTr, CLg, CLd, Cro, VBa, VCo, Rec, SEs, Bom, Des, Tra) Then Exit For
Next PTr
End Sub
Private Function CalculNbVaisseaux(PTr As Integer, GTr As Integer, CLg As Integer, CLd As Integer, Cro As Integer, _
VBa As Integer, VCo As Integer, Rec As Integer, SEs As Integer, Bom As Integer, Des As Integer, Tra As Integer)
CalculNbVaisseaux = PTr + GTr + CLg + CLd + Cro + VBa + VCo + Rec + SEs + Bom + Des + Tra
End Function
Private Function CalculNbPoints(PTr As Integer, GTr As Integer, CLg As Integer, CLd As Integer, Cro As Integer, _
VBa As Integer, VCo As Integer, Rec As Integer, SEs As Integer, Bom As Integer, Des As Integer, Tra As Integer)
CalculNbPoints = PTr * NbPtPTr + GTr * NbPtGTr + CLg * NbPtCLg + CLd * NbPtCLd + Cro * NbPtCro + VBa * NbPtVBa
CalculNbPoints = CalculNbPoints + VCo * NbPtVCo + Rec * NbPtRec + SEs * NbPtSEs + Bom * NbPtBom + Des * NbPtDes + Tra * NbPtTra
End Function
'Cette fonction indique si le nombre de vaisseaux calculé ou le nombre de points calculé
'est dépassé. Revoie TRUE si une de ces deux limites est dépassée
Private Function LimitesDepassees(PTr As Integer, GTr As Integer, CLg As Integer, CLd As Integer, Cro As Integer, _
VBa As Integer, VCo As Integer, Rec As Integer, SEs As Integer, Bom As Integer, Des As Integer, Tra As Integer) As Boolean
NbVaisseaux = CalculNbVaisseaux(PTr, GTr, CLg, CLd, Cro, VBa, VCo, Rec, SEs, Bom, Des, Tra)
NbPoints = CalculNbPoints(PTr, GTr, CLg, CLd, Cro, VBa, VCo, Rec, SEs, Bom, Des, Tra)
If NbVaisseaux > NbTotalVaisseaux Or NbPoints > NbTotalPoints Then LimitesDepassees = True
End Function
Private Sub EcrireResultats(PTr As Integer, GTr As Integer, CLg As Integer, CLd As Integer, Cro As Integer, _
VBa As Integer, VCo As Integer, Rec As Integer, SEs As Integer, Bom As Integer, Des As Integer, Tra As Integer)
With Worksheets("Résultats" )
.Cells(LigneCourante, 1) = PTr
.Cells(LigneCourante, 2) = GTr
.Cells(LigneCourante, 3) = CLg
.Cells(LigneCourante, 4) = CLd
.Cells(LigneCourante, 5) = Cro
.Cells(LigneCourante, 6) = VBa
.Cells(LigneCourante, 7) = VCo
.Cells(LigneCourante, 8) = Rec
.Cells(LigneCourante, 9) = SEs
.Cells(LigneCourante, 10) = Bom
.Cells(LigneCourante, 11) = Des
.Cells(LigneCourante, 12) = Tra
.Cells(LigneCourante, 13) = NbVaisseaux
.Cells(LigneCourante, 14) = NbPoints
End With
LigneCourante = LigneCourante + 1
End Sub |