condition VBA

vincent noah

XLDnaute Junior
Bonjour à tous , heureux de vous retrouver !!

voici un extrait de mon code:
VB:
Sub combinaisons()
Dim lin&, col&, rc&, m%, n%, o%, p%, q%, tir$()
lin = 1
col = 0
rc = Rows.Count
ReDim tir(1 To rc, 0)
    For m = 1 To 20
        For n = m + 1 To 20
            For o = n + 1 To 20
                For p = o + 1 To 20
                    For q = p + 1 To 20

voila j'ai une petite difficulté à trouver l'expression exacte VBA pour ne pas faire apparaître la combinaison qui contient par exemple le n° 1 et ( 7,6,9,10) . etc .
j'ai bien compris qu'il faut que je combine toutes les possibilités parmi m ,n ,o, p, q (2 parmi 10
) donc trop long .
ne pourrez t'on pas faire plus court du genre : if not :parmi (m , n, o, p, q ) il y'a (1 et 7 )ou (1 et 6) ou (1et9) ou (1et 10) then
?
voila je bloque là dessus pourtant cela me semble simple :mad:

j'espère était clair. merci de votre aide

bonne soirée.
 

Eric 45

XLDnaute Occasionnel
Bonsoir à toutes et tous
Bonsoir vincent noah

Je ne sais pas si j'ai bien compris. Quand tu dis :
"ne pas faire apparaître la combinaison qui contient par exemple le n° 1 " cela veut dire : m=1, n=1, o=1,.... si oui tu peux soit mettre des "if" après le "for" soit cela :
Code:
Sub combinaisons_02()
Dim lin&, col&, rc&, m%, n%, o%, p%, q%, tir$()
lin = 1
col = 0
rc = Rows.Count

Dim tablo
tablo = Array(2, 5, 6, 9)

ReDim tir(1 To rc, 0)
    For m = 1 To 20
NomEtiquette1:
        If Not IsError(Application.Match(m, tablo, 0)) Then m = m + 1: GoTo NomEtiquette1
        For n = m + 1 To 20
NomEtiquette2:
            If Not IsError(Application.Match(n, tablo, 0)) Then n = n + 1: GoTo NomEtiquette2
            '.......
                '.......
        Next
    Next
End Sub
J'ai opté dans "tablo" pour 2, 5, 6 et 9, mais à toi d'adapter.

Eric
 

vincent noah

XLDnaute Junior
bonsoir Eric,
VB:
Sub combinaisons()
Dim lin&, col&, rc&, m%, n%, o%, p%, q%, tir$()
lin = 1
col = 0
rc = Rows.Count
Dim tablo
tablo = Array(2, 5, 6, 9)

ReDim tir(1 To rc, 0)
    For m = 1 To 20
NomEtiquette1:
        If Not IsError(Application.Match(m, tablo, 0)) Then m = m + 1: GoTo NomEtiquette1
        For n = m + 1 To 10
NomEtiquette2:
            For o = n + 1 To 10
                 If Not IsError(Application.Match(n, tablo, 0)) Then n = n + 1: GoTo NomEtiquette2
                For p = o + 1 To 10
NomEtiquette3:
                    For q = p + 1 To 10
             If Not IsError(Application.Match(o, tablo, 0)) Then o = o + 1: GoTo NomEtiquette3
                       
                          tir(lin, col) = m & " " & n & " " & o & " " & p & " " & q
                            lin = lin + 1
                            If lin > rc Then
                                col = col + 1
                                lin = 1
                                ReDim Preserve tir(1 To rc, col)
                          
                        End If '***
                  Next q
                Next p
            Next o
        Next n
    Next m
    Range(Cells(1, 1), Cells(rc, col + 1)).Value = tir
End Sub

merci de t'as proposition mais çà ne fonctionne pas je m'attend a rentrer ex :1 avec 2 ne doit pas être retenue dans une même combinaison et 1 avec 5 ne doit pas être retenue etc...
en résumé 1 facteur de 2 , 5, 6 ,9


A+
 

vincent noah

XLDnaute Junior
re bonsoir ,
je vais essayer d’Être plus clair avec cet exemple :
VB:
Sub combinaisons()
Dim lin&, col&, rc&, m%, n%, o%, p%, q%, tir$()
lin = 1
col = 0
rc = Rows.Count
ReDim tir(1 To rc, 0)
    For m = 1 To 20
        For n = m + 1 To 20
            For o = n + 1 To 20
                For p = o + 1 To 20
                    For q = p + 1 To 20
'' à cettte ligne je commence les conditions suivantes :
if not (( m=1 and n=5 or m=1 and o=5 or m=1 and p=5 or m=1 and q=5)) then
if not (( n=1 and o=5 or n=1 and p=5 or n=1 and q=5 )) then
if not (( o=1 and p=5 or o=1 and q=5 )) then
if not (( p=1 and q=5 )) then

voilà la condition uniquement pour le couple 1 et 5
il reste le couple 1 et6 le couple 1 et9 etc ...
d où mon souhait de simplifier le code.
A+
 
Dernière édition:

vincent noah

XLDnaute Junior
Bonjour ,
Eric je ne comprend pas pourquoi tu veux une condition n=1 or ? cela ne fonctionne pas
car si le numéros 1 est présent dans une combinaison ex: 1 3 17 19 20 celles si ne sera pas affiché et pourtant elle le devrait .

voilà j'espère que tu a compris un peu mieux ...
 

vincent noah

XLDnaute Junior
Bonjour Dranreb.
c'est pas facile à comprendre je sais alors pour résumer :
voici une partie du code qui génère les combinaisons de 5 parmi 20 sans doublons .
VB:
Sub combinaisons()
Dim lin&, col&, rc&, m%, n%, o%, p%, q%, tir$()
lin = 1
col = 0
rc = Rows.Count
ReDim tir(1 To rc, 0)
    For m = 1 To 20
        For n = m + 1 To 20
            For o = n + 1 To 20
                For p = o + 1 To 20
                    For q = p + 1 To 20

donc le pb est que parmi toutes ses combinaisons je ne souhaite pas voir les combinaisons qui contiennent certains couples exemple:
le code va générer la première combinaison 1 2 3 4 5 .
je veux que mon code s'exécute en ayant pour condition :
si la combinaison ne comporte pas les couples ( 1 ,6) (1;9) et (1;20)
ma question est la suivante ne pourrais t'on pas avoir une condition en une ligne du genre 1 facteur de (9,6,20) ?
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Oui mais seul m peut être à 1. n, lui commence à m + 1, donc 2 au minimum, alors ce n'est pas nécessaire de vérifier s'il est à 1. Pareil pour o, p, q.
Donc il y aurait juste à faire If m > 1 Or TCond(n) And TCond(o) And TCond(p) And TCond(q) Then
Avec TCond(2 to 20) initialisé au départ For x = 2 to 20: TCond(x) = True: Next x
Puis pour ceux qu'il ne faut pas avec m = 1: TCond(5) = False etc.
 

vincent noah

XLDnaute Junior
re , bonjour ,
j'ai modifier le code comme ceux-ci: mais ne fonctionne pas :mad:
t= array (m,n,o,p,q)
j'ai une petite question
comment la fonction application. Match peut s'appliquer à plusieurs variable ?
exemple :
variable = (5,2,9)
If Not IsError(Application.Match(variable , t, 0)) Then ?

Merci
 

job75

XLDnaute Barbatruc
Bonjour vincent noah, Eric 45, Bernard,

Au lieu de vous polariser sur ce qui est interdit travaillez sur ce qui est permis :
Code:
Sub Combinaisons()
Dim a, ub%, Ncombi&, rc&, tablo$(), col%, m%, n%, o%, p%, q%, lig&
'---nombres exlus 2 5 6 9---
a = Array(1, 3, 4, 7, 8, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20)
ub = UBound(a)
Ncombi = Application.Combin(ub + 1, 5) 'nombre de combinaisons
rc = Rows.Count
ReDim tablo(1 To rc, 1 To Int(Ncombi / rc) + 1)
col = 1
For m = 0 To ub
  For n = m + 1 To ub
    For o = n + 1 To ub
      For p = o + 1 To ub
        For q = p + 1 To ub
          lig = lig + 1
          tablo(lig, col) = a(m) & " " & a(n) & " " & a(o) & " " & a(p) & " " & a(q)
          If lig = rc Then lig = 0: col = col + 1
Next q, p, o, n, m
Cells.ClearContents
[A1].Resize(IIf(col = 1, lig, rc), col) = tablo
Columns.AutoFit 'ajustement largeur
End Sub
A+
 

vincent noah

XLDnaute Junior
bonjour job75,
t'as proposition ne fonctionne pas car il ne s'agit pas d'exclure quelques numéros mais des couples de numéros précis .
exemple le couple ( 1 avec 6 )) doit être exclu le( 12 avec 16 )aussi etc...
c'est là toute la difficulté .


A+
 
Dernière édition:

Statistiques des forums

Discussions
312 297
Messages
2 086 972
Membres
103 414
dernier inscrit
Congelus