amélioration_programme

kakachi

XLDnaute Junior
Bonsoir le forum ,

Je me tourne vers vous afin d'optimiser mon programme VBA.

le problème que j'ai actuellement avec mon programme est, dès que j'appuie sur le bouton de commande " afficher les combinaisons", le tableau intitulé "COMBINAISONS" disparait et la couleur de fond aussi.Seuls les valeurs restent.

J'aimerai aussi, que le programme prenne uniquement les valeurs définies dans le tableau "a2:d7".
Si je rajoute une valeur , par exemple,dans la cellule "A8", le programme prendra en compte cette valeur .Je souhaite juste que la macro utilise les valeurs définies dans le tableau "a2:d7".

Afin d'optimiser mon programme, j'aimerai que:

1=>le programme prenne uniquement les valeurs définies dans le tableau "a2:d7".

2=>le tableau "COMBINAISONS" et la couleur de fond ne disparaissent pas quand j'appuie sur le bouton de commande " Afficher les combinaisons "


Merci pour ceux qui voudront bien m'aider !!!

Bonne nuit!!

kakach
 

Pièces jointes

  • test_combinatoire.xls
    49.5 KB · Affichages: 39
  • test_combinatoire.xls
    49.5 KB · Affichages: 51
  • test_combinatoire.xls
    49.5 KB · Affichages: 54
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : amélioration_programme

Bonjour,

Testez le code suivant:
Code:
Sub combin()

Dim i As Long, J As Long, K As Long, L As Long, Ligne As Long
Dim G1 As Long, G2 As Long, G3 As Long, G4 As Long

G1 = Range("A65536").End(xlUp).Row: If G1 > 7 Then G1 = 7
G2 = Range("B65536").End(xlUp).Row: If G2 > 7 Then G2 = 7
G3 = Range("C65536").End(xlUp).Row: If G3 > 7 Then G3 = 7
G4 = Range("D65536").End(xlUp).Row: If G4 > 7 Then G4 = 7

Range("E2:H65536").ClearContents

Ligne = 2
For i = 2 To G1
  For J = 2 To G2
    For K = 2 To G3
      For L = 2 To G4
            Range("E" & Ligne) = Range("A" & i)
            Range("F" & Ligne) = Range("B" & J)
            Range("G" & Ligne) = Range("C" & K)
            Range("H" & Ligne) = Range("D" & L)
            Ligne = Ligne + 1
     Next L
    Next K
  Next J
Next i
End Sub
 
Dernière édition:

dra72

XLDnaute Occasionnel
Re : amélioration_programme

Bonjour,

Peut-être comme ceci:

Code:
Sub combin()

Dim i As Long, J As Long, K As Long, L As Long, Ligne As Long
Dim G1 As Long, G2 As Long, G3 As Long, G4 As Long

G1 = Range("A8").End(xlUp).Row
G2 = Range("B8").End(xlUp).Row
G3 = Range("C8").End(xlUp).Row
G4 = Range("D8").End(xlUp).Row

Range("E2:H65536").ClearContents

Ligne = 2
For i = 2 To G1
  For J = 2 To G2
    For K = 2 To G3
      For L = 2 To G4
            Range("E" & Ligne) = Range("A" & i)
            Range("F" & Ligne) = Range("B" & J)
            Range("G" & Ligne) = Range("C" & K)
            Range("H" & Ligne) = Range("D" & L)
            Ligne = Ligne + 1
     Next L
    Next K
  Next J
Next i
 
   
End Sub
 

dra72

XLDnaute Occasionnel
Re : amélioration_programme

Bonjour mapomme,

Un petit problème avec ton code:

Si tu as une valeur par exemple en A8 et rien en A7, il retiendra comme dernière ligne 7 au lieu de 6.
Maintenant à kakachi de voir si le cas peut se présenter.

Cordialement
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : amélioration_programme

Bonjour,
Très juste! On part du haut et on descend. Le cas où une colonne est vide n'est pas géré. Le cas où des cellules vides s'intercalent entre des cellules renseignées n'est pas géré.

Edit (9h38) : pour tenir compte des 2 cas cités ci-dessus (colonne vide ou cellule vide intercalée)
Code:
Sub combin()

Dim i As Long, J As Long, K As Long, L As Long, Ligne As Long
Dim G1 As Long, G2 As Long, G3 As Long, G4 As Long, Nonvide

G1 = Range("A1").End(xlDown).Row: If G1 > 7 Then G1 = 7
Nonvide = Nonvide + Evaluate("COUNTIF(" & Range("A2:A" & G1).Address & ",""<>"""""")")

G2 = Range("B1").End(xlDown).Row: If G2 > 7 Then G2 = 7
Nonvide = Nonvide + Evaluate("COUNTIF(" & Range("B2:B" & G2).Address & ",""<>"""""")")

G3 = Range("C1").End(xlDown).Row: If G3 > 7 Then G3 = 7
Nonvide = Nonvide + Evaluate("COUNTIF(" & Range("C2:C" & G3).Address & ",""<>"""""")")

G4 = Range("D1").End(xlDown).Row: If G4 > 7 Then G4 = 7
Nonvide = Nonvide + Evaluate("COUNTIF(" & Range("D2:D" & G4).Address & ",""<>"""""")")

If Nonvide <> 24 - Evaluate("COUNTIF(" & Range("A2:D7").Address & ","""")") Then
    MsgBox " présence de colonnes vides ou cellules vides intercalées ==> STOP!"
    Exit Sub
End If

Range("E2:I65536").ClearContents

Ligne = 2
For i = 2 To G1
  For J = 2 To G2
    For K = 2 To G3
      For L = 2 To G4
            Range("E" & Ligne) = Range("A" & i)
            Range("F" & Ligne) = Range("B" & J)
            Range("G" & Ligne) = Range("C" & K)
            Range("H" & Ligne) = Range("D" & L)
            Ligne = Ligne + 1
     Next L
    Next K
  Next J
Next i
End Sub
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 493
Messages
2 088 957
Membres
103 990
dernier inscrit
lamiadebz