Tableau d'un calcul de probabilités (2) [Résolu]

Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018
- - Dernière réponse : CerberusPau
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018
- 7 juil. 2013 à 11:26
Je reprends ma discussion précédente, dans laquelle j'avais fait trop d'erreurs.

29 juin 2013 à 18:37
Ma demande initiale

Bonjour à tous,

Je souhaite afficher toutes les combinaisons dans une feuille excel (2003), selon l'analyse combinatoire suivante:
8 machines fonctionnent (ou pas) dans un seul de leurs modes.
On connait la consommation pour chacun des modes.
On veut que le total ne dépasse pas une valeur cible (la combinaison sera en rouge dans le tableau).
Machines A à E selon 5 modes (01234)
> Soit 5*5*5*5*5 3125 combinaisons
Machines F et G selon 3 modes (012)
> Soit 3*3 9 combinaisons
Machine H selon 2 modes (01)
=> Soit 2 combinaisons..
Au total on a donc 3125*9*2= 56250 combinaisons!

Soit un "petit" tableau de 25 colonnes sur 56250 lignes...

Un monstre, comparé à un tableau de saisies par choix multiples de 27 colonnes et 6 lignes (qui marche très bien).
Seulement voilà, on souhaite quand même disposer d'une liste de toutes les combinaisons (tri et affichage des combinaisons inadéquates ensuite).

Avant de m'y atteler, j'aimerais savoir si quelqu'un parmi vous s'est aventuré dans un truc du genre pour qu'il me donne un avis : Je crains, mais grave, que le temps de calcul soit dément, surtout que je ne vois pas comment faire autrement qu'avec des For/Next imbriquées (bonjour le casse-tête!).

Désolé pour la longueur de cette demande que j'espère claire.

Merci d'avance
Cordialement
Rataxes64


dimanche 30 juin 2013 à 15:00
Réponse de Cheyenne

Bonjour,

As-tu pensé à la représentation binaire de l'état des modes pour chaque machine ?
Il suffit pour chaque machine de A à E de faire une liste de 0 à 31 en binaire et tu auras tous les états possibles.

Pour les machines F et G, même chose mais de 0 à 7.

Cheyenne



dimanche 30 juin 2013 à 17:29
Ma réponse corrigée

Bonjour,

Je n'ai encore jamais fait ça ...

Pour info, j'ai quand même bâti le fichier (ici) avec des boucles For...Next.

Avec un petit PC portable (1,66GHz / 1Go RAM) et les valeurs entrées, il me faut 5 bonnes minutes pour qu'Excel me rende la main... Et pour écourter tant soit peu le traitement, je n'ai listé que les combinaisons dont la valeur totale dépasse la valeur cible : Dans mon fichier. Ce qui fait quand même presque 10.000 lignes!

Alors, oui, cette piste m'intéresse, mais par où commencer ? Je suis allé voir , mais je n'ai pas su utiliser le code VB proposé par ShayW (vendredi 28 juin 2013 à 18:03:04)


Mon Code VB bâti en For... Next
Private Sub OK_Click()

Application.ScreenUpdating   = False

'Valeur du Mode par Machine (initialisation)
Dim a, b, c, d, e, f, g, h
a = 0   'L1000
b = 0   'L2000
c = 0   'L5000
d = 0   'L18000(1)
e = 0   'L18000(2)
f = 0   'N1
g = 0   'TR11
h = 0   'DL

'Etats Machines (initialisation)
Dim i, j, k, l, m, n, o, p
i 0   'i 1 à 5 (5 états L1000)
j 0   'j 1 à 5 (5 états L2000)
k 0   'k 1 à 5 (5 états L5000)
l 0   'l 1 à 5 (5 états L18000-1)
m 0   'm 1 à 5 (5 états L18000-2)
n 0   'n 1 à 3 (3 états N1)
o 0   'o 1 à 3 (3 états TR11)
p 0   'p 1 à 2 (2 états DL)

'N° de 1ère Colonne de valeur Ampère concernée
Dim q, r, s, t, u, v, w, x
q = 3
r = 7
s = 11
t = 15
u = 19
v = 23
w = 25
x = 27


'RAZ
'===
    'Efface tout pour les lignes au delà de 7
    If Range("A65536").End(xlUp).Row > 7 Then
        last = Range("A65536").End(xlUp).Row
        Range("A8:AA" & last).ClearContents
        Range("A8:AA" & last).Interior.ColorIndex = xlNone
        Range("A8:AA" & last).Borders.LineStyle = xlNone
        Range("A8:AA" & last).Font.Bold = False
    End If
    
'L1000
'For i 1 To 5
        a = 0
        If i > 1 Then a = Cells(5, q + i - 2).Value
        z = a
        If z > Range("B4").Value Then
            last = Range("A65536").End(xlUp).Row + 1
            If i > 1 Then
                Cells(last, q + i - 2).Value = "X"
                Range("A" & last).Value = "Scénrario" & last - 7 & ": " & z & "A"
                If last Mod 2 0 Then Range("A" & last & ":AA" & last).Interior.ColorIndex 15
                Exit For
            End If
        End If
'L2000
'For j 1 To 5
            b = 0
            If j > 1 Then b = Cells(5, r + j - 2).Value
            z = a + b
            If z > Range("B4").Value Then
                last = Range("A65536").End(xlUp).Row + 1
                If i > 1 Then Cells(last, q + i - 2).Value = "X"
                If j > 1 Then
                    Cells(last, r + j - 2).Value = "X"
                    Range("A" & last).Value = "Scénrario" & last - 7 & ": " & z & "A"
                    If last Mod 2 0 Then Range("A" & last & ":AA" & last).Interior.ColorIndex 15
                    Exit For
                    End If
            End If
            
'L5000
'For k 1 To 5
                c = 0
                If k > 1 Then c = Cells(5, s + k - 2).Value
                z = a + b + c
                If z > Range("B4").Value Then
                    last = Range("A65536").End(xlUp).Row + 1
                    If i > 1 Then Cells(last, q + i - 2).Value = "X"
                    If j > 1 Then Cells(last, r + j - 2).Value = "X"
                    If k > 1 Then
                        Cells(last, s + k - 2).Value = "X"
                        Range("A" & last).Value = "Scénrario" & last - 7 & ": " & z & "A"
                        If last Mod 2 0 Then Range("A" & last & ":AA" & last).Interior.ColorIndex 15
                        Exit For
                    End If
                End If
                
'L18000(1)
'For l 1 To 5
                    d = 0
                    If l > 1 Then d = Cells(5, t + l - 2).Value
                    z = a + b + c + d
                    If z > Range("B4").Value Then
                        last = Range("A65536").End(xlUp).Row + 1
                        If i > 1 Then Cells(last, q + i - 2).Value = "X"
                        If j > 1 Then Cells(last, r + j - 2).Value = "X"
                        If k > 1 Then Cells(last, s + k - 2).Value = "X"
                        If l > 1 Then
                            Cells(last, t + l - 2).Value = "X"
                            Range("A" & last).Value = "Scénrario" & last - 7 & ": " & z & "A"
                            If last Mod 2 0 Then Range("A" & last & ":AA" & last).Interior.ColorIndex 15
                            Exit For
                        End If
                    End If
                    
'L18000(2)
'For m 1 To 5
                        e = 0
                        If m > 1 Then e = Cells(5, u + m - 2).Value
                        z = a + b + c + d + e
                        If z > Range("B4").Value Then
                            last = Range("A65536").End(xlUp).Row + 1
                            If i > 1 Then Cells(last, q + i - 2).Value = "X"
                            If j > 1 Then Cells(last, r + j - 2).Value = "X"
                            If k > 1 Then Cells(last, s + k - 2).Value = "X"
                            If l > 1 Then Cells(last, t + l - 2).Value = "X"
                            If m > 1 Then
                                Cells(last, u + m - 2).Value = "X"
                                Range("A" & last).Value = "Scénrario" & last - 7 & ": " & z & "A"
                                If last Mod 2 0 Then Range("A" & last & ":AA" & last).Interior.ColorIndex 15
                                Exit For
                            End If
                        End If
                        
'N1
'For n 1 To 3
                            f = 0
                            If n > 1 Then f = Cells(5, v + n - 2).Value
                            z = a + b + c + d + e + f
                            If z > Range("B4").Value Then
                                last = Range("A65536").End(xlUp).Row + 1
                                If i > 1 Then Cells(last, q + i - 2).Value = "X"
                                If j > 1 Then Cells(last, r + j - 2).Value = "X"
                                If k > 1 Then Cells(last, s + k - 2).Value = "X"
                                If l > 1 Then Cells(last, t + l - 2).Value = "X"
                                If m > 1 Then Cells(last, u + m - 2).Value = "X"
                                If n > 1 Then
                                    Cells(last, v + n - 2).Value = "X"
                                    Range("A" & last).Value = "Scénrario" & last - 7 & ": " & z & "A"
                                    If last Mod 2 0 Then Range("A" & last & ":AA" & last).Interior.ColorIndex 15
                                    Exit For
                                End If
                            End If

'TR11
'For o 1 To 3
                                g = 0
                                If o > 1 Then g = Cells(5, w + o - 2).Value
                                z = a + b + c + d + e + f + g
                                If z > Range("B4").Value Then
                                    last = Range("A65536").End(xlUp).Row + 1
                                    If i > 1 Then Cells(last, q + i - 2).Value = "X"
                                    If j > 1 Then Cells(last, r + j - 2).Value = "X"
                                    If k > 1 Then Cells(last, s + k - 2).Value = "X"
                                    If l > 1 Then Cells(last, t + l - 2).Value = "X"
                                    If m > 1 Then Cells(last, u + m - 2).Value = "X"
                                    If n > 1 Then Cells(last, v + n - 2).Value = "X"
                                    If o > 1 Then
                                        Cells(last, w + o - 2).Value = "X"
                                        Range("A" & last).Value = "Scénrario" & last - 7 & ": " & z & "A"
                                        If last Mod 2 0 Then Range("A" & last & ":AA" & last).Interior.ColorIndex 15
                                        Exit For
                                    End If
                                End If
                                
'DL
'For p 1 To 2
                                    h = 0
                                    If p > 1 Then h = Cells(5, x + p - 2).Value
                                    z = a + b + c + d + e + f + g + h
                                    If z > Range("B4").Value Then
                                        last = Range("A65536").End(xlUp).Row + 1
                                        If i > 1 Then Cells(last, q + i - 2).Value = "X"
                                        If j > 1 Then Cells(last, r + j - 2).Value = "X"
                                        If k > 1 Then Cells(last, s + k - 2).Value = "X"
                                        If l > 1 Then Cells(last, t + l - 2).Value = "X"
                                        If m > 1 Then Cells(last, u + m - 2).Value = "X"
                                        If n > 1 Then Cells(last, v + n - 2).Value = "X"
                                        If o > 1 Then Cells(last, w + o - 2).Value = "X"
                                        If last / 2 0 Then Range("A" & last & ":AA" & last).Interior.ColorIndex 15
                                        If p > 1 Then
                                            Cells(last, x + p - 2).Value = "X"
                                            Range("A" & last).Value = "Scénrario" & last - 7 & ": " & z & "A"
                                            If last Mod 2 0 Then Range("A" & last & ":AA" & last).Interior.ColorIndex 15
                                           Exit For
                                        End If
                                    End If
                                Next p
                            Next o
                        Next n
                    Next m
                Next l
            Next k
        Next j
    Next i


'FINALISATION
'last Range("A65536").End(xlUp).Row
    If last > 7 Then
        'Style des lignes 8 à la dernière
        Range("A8:AA" & last).Borders.LineStyle = xlContinuous
        Range("A8:AA" & last).Font.Bold = True
        'Nombre de scénarii trouvés
        Range("A7").Value = last - 7 & " cas de" & Chr(10) & "surcharge"
        Range("B5").Select
        'Filtrage activé
        Range("C7:AA7").AutoFilter
    End If

End Sub


Désolé pour ce mic-mac, en vous remerciant d'avance de votre indulgence, et de vos réponses.

Cordialement
Rataxes64
Afficher la suite 

20/34 réponses

Meilleure réponse
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018
3
Merci
Bonjour,

Merci de ton attention, Cmarcotte.

Juste pour info, voici mon code "toiletté". Je suis en dessous de 3mn de traitement, sachant que je "gagne du temps" :
1) Sur les combinaisons qui sont supérieures à la cible, dès qu'elles le sont, car j'arrête alors leur "exploration" par Exit for (suite écartée).
2) Sur les combinaisons écartées et celles inférieures ou égales à la cible, puisque je n'ai pas "d'écriture" des "X" dans la feuille Excel à traiter.

Côté "langage", tu me dis:,
Tu pourrais envisager d'utiliser un langage compilé comme VB.net ou Caiguisé et un DataCridView pour l'affichage
Euh, pour passer de la 2CV à la Formule1, c'est pas une mince affaire. Mais du moment que je n'envisage pas les 24h du Mans avec ma 2CV...Je reste sagement à ma place d'utilisateur: Pas "développeur".

Option Explicit

'OPTIONS
'=======

'valeur dernière ligne
Dim last As Integer

'Valeur par Machine (initialisation)
Dim a As Integer
Dim b As Integer
Dim c As Integer
Dim d As Integer
Dim e As Integer
Dim f As Integer
Dim g As Integer
Dim h As Integer

'Etats Machines (initialisation)
Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim l As Integer
Dim m As Integer
Dim n As Integer
Dim o As Integer
Dim p As Integer

'N° de 1ère Colonne de la valeur d'ampèrage concernée
Dim q As Integer
Dim r As Integer
Dim s As Integer
Dim t As Integer
Dim u As Integer
Dim v As Integer
Dim w As Integer
Dim x As Integer

'Valeur totale de la combinaison à comparer avec la valeur cible (initialisation)
Dim z As Integer

'Valeurs de travail
Dim VE  'valeur existante du Mode
Dim VF  'nouvelle valeur du Mode
    
'Valeur cible
Dim Dispo As Integer



Private Sub NO_Click()
'Effacer la liste établie des surcharges au clic sur le bouton d'option rouge

    Call EffacerListe
 
End Sub

Sub EffacerListe()
'Efface la liste des surcharges

Application.ScreenUpdating = False

'RAZ
'===
    'Texte par défaut
    Cells(7, 1).Value = "Lister les" & Chr(10) & "surcharges ?"     'Texte d'invite à la création de la liste
    'Filtres par défaut (aucun)
    If Worksheets("Combinaisons").AutoFilterMode _
    Then Worksheets("Combinaisons").Cells(1, 1).AutoFilter          'Reset du filtrage (suppression)
    'Efface tout pour les lignes au delà de 7
    If Cells(65536, 1).End(xlUp).Row > 7 Then                       'Au delà de la ligne 7
        last = Cells(65536, 1).End(xlUp).Row                        'Dernière ligne non vide
        Range("A8:AB" & last).ClearContents                         'Valeurs
        Range("A8:AB" & last).Borders.LineStyle = xlNone            'Bordures
        Range("A8:AB" & last).Font.Bold = False                     'Police
        Range("A8:AB" & last).FormatConditions.Delete               'Format Conditionnel
        Range("B5").Select
    End If

End Sub

Private Sub OK_Click()
'Générer la liste des surcharges au clic sur le bouton d'option bleu

    Call GénérerListe

End Sub


Sub GénérerListe()
'Scrute les combinasons possibles et génère le liste des cas minima pour Total > Disponible

Application.ScreenUpdating = False

'DECLARATIONS
'a 0   'L1000
b = 0   'L2000
c = 0   'L5000
d = 0   'L18000(1)
e = 0   'L18000(2)
f = 0   'N1
g = 0   'TR11
h = 0   'DL

'Etats Machines (initialisation)
i 0   'i 1 à 5 (5 états L1000 : 0=Arrêt, 1=Vide, 2=Chargé, 3=Bloqué, 4=Perdu)
j 0   'j 1 à 5 (5 états L2000 : 0=Arrêt, 1=Vide, 2=Chargé, 3=Bloqué, 4=Perdu)
k 0   'k 1 à 5 (5 états L5000 : 0=Arrêt, 1=Vide, 2=Chargé, 3=Bloqué, 4=Perdu)
l 0   'l 1 à 5 (5 états L18000-1 : 0=Arrêt, 1=Vide, 2=Chargé, 3=Bloqué, 4=Perdu)
m 0   'm 1 à 5 (5 états L18000-2 : 0=Arrêt, 1=Vide, 2=Chargé, 3=Bloqué, 4=Perdu)
n 0   'n 1 à 3 (3 états N1 : 0=Arrêt, 1=Vide, 2=Chargé)
o 0   'o 1 à 3 (3 états TR11 : 0=Arrêt, 1=Vide, 2=Chargé)
p 0   'p 1 à 2 (2 états DL : 0=Arrêt, 1=Chargé)

'N° de 1ère Colonne de la valeur d'ampèrage concernée
q = 3
r = 7
s = 11
t = 15
u = 19
v = 23
w = 25


x = 27

z = 0 'Valeur totale de la combinaison à comparer avec la valeur cible (initialisation)

Dispo = Cells(4, 2).Value 'Valeur cible

'RAZ
'===
    'Efface tout pour les lignes au delà de 7
    If Cells(65536, 1).End(xlUp).Row > 7 Then                       'Au delà de la ligne 7
        last = Cells(65536, 1).End(xlUp).Row                        'Dernière ligne non vide
        Range("A8:AB" & last).ClearContents                         'Valeurs
        Range("A8:AB" & last).Borders.LineStyle = xlNone            'Bordures
        Range("A8:AB" & last).Font.Bold = False                     'Police
        Range("A8:AB" & last).FormatConditions.Delete               'Format Conditionnel
    End If
    
'L1000
'For i 1 To 5                                                  'Analyse en boucle selon les états de 0 à 5
        a = 0
        If i > 1 Then a = Cells(5, q + i - 1).Value                 'Pour état autre que 0 (Arrêt)
        z = a
        If z > Dispo Then                               'Si l valeur excède la cible...
            last = Cells(65536, 1).End(xlUp).Row + 1                'N° de la dernière ligne non vide
            If i > 1 Then
                Cells(last, q + i - 1).Value = "X"                  'La cellule en cours passe à "X"
                Cells(last, 1).Value = "Scénrario" & last - 7
                Cells(last).Value = z                               'La valeur globale est affichée
                Range("A" & last & ":AB" & last).FormatConditions.Delete    'Effacer un format conditionnel pré-existant
                Range("A" & last & ":AB" & last).FormatConditions.Add _
                    Type:=xlExpression, _
                    Formula1:="=MOD(LIGNE();2)"                     'Formatage conditionnel : Colorisation de 1 ligne sur 2
                Range("A" & last & ":AB" & last).FormatConditions(1).Interior.ColorIndex = 15   'Couleur : Grise
                Exit For                                            'On quite la boucle d'analyse sur cette valeur hors cible
            End If
        End If
'L2000
'For j 1 To 5                                              'On passe à la machine suivante... etc!
            b = 0
            If j > 1 Then b = Cells(5, r + j - 1).Value
            z = a + b                                               'Si la somme des valeurs excède la cibles (cette machine ET la (les) précédente(s)... etc!
            If z > Dispo Then
                last = Cells(65536, 1).End(xlUp).Row + 1
                If i > 1 Then Cells(last, q + i - 1).Value = "X"    'Prise en compte de la sélection de la (des) machine(s) précédente(s)... etc!
                If j > 1 Then
                    Cells(last, r + j - 1).Value = "X"
                    Cells(last, 1).Value = "Scénrario" & last - 7
                    Cells(last, 2).Value = z
                    Range("A" & last & ":AB" & last).FormatConditions.Delete
                    Range("A" & last & ":AB" & last).FormatConditions.Add _
                        Type:=xlExpression, _
                        Formula1:="=MOD(LIGNE();2)"
                    Range("A" & last & ":AB" & last).FormatConditions(1).Interior.ColorIndex = 15
                    Exit For
                    End If
            End If
            
'L5000
'For k 1 To 5
                c = 0
                If k > 1 Then c = Cells(5, s + k - 1).Value
                z = a + b + c
                If z > Dispo Then
                    last = Cells(65536, 1).End(xlUp).Row + 1
                    If i > 1 Then Cells(last, q + i - 1).Value = "X"
                    If j > 1 Then Cells(last, r + j - 1).Value = "X"
                    If k > 1 Then
                        Cells(last, s + k - 1).Value = "X"
                        Cells(last, 1).Value = "Scénrario" & last - 7
                        Cells(last, 2).Value = z
                        Range("A" & last & ":AB" & last).FormatConditions.Delete
                        Range("A" & last & ":AB" & last).FormatConditions.Add _
                            Type:=xlExpression, _
                            Formula1:="=MOD(LIGNE();2)"
                        Range("A" & last & ":AB" & last).FormatConditions(1).Interior.ColorIndex = 15
                        Exit For
                    End If
                End If
                
'L18000(1)
'For l 1 To 5
                    d = 0
                    If l > 1 Then d = Cells(5, t + l - 1).Value
                    z = a + b + c + d
                    If z > Dispo Then
                        last = Cells(65536, 1).End(xlUp).Row + 1
                        If i > 1 Then Cells(last, q + i - 1).Value = "X"
                        If j > 1 Then Cells(last, r + j - 1).Value = "X"
                        If k > 1 Then Cells(last, s + k - 1).Value = "X"
                        If l > 1 Then
                            Cells(last, t + l - 1).Value = "X"
                            Cells(last, 1).Value = "Scénrario" & last - 7
                            Cells(last, 2).Value = z
                            Range("A" & last & ":AB" & last).FormatConditions.Delete
                            Range("A" & last & ":AB" & last).FormatConditions.Add _
                                Type:=xlExpression, _
                                Formula1:="=MOD(LIGNE();2)"
                            Range("A" & last & ":AB" & last).FormatConditions(1).Interior.ColorIndex = 15
                            Exit For
                        End If
                    End If
                    
'L18000(2)
'For m 1 To 5
                        e = 0
                        If m > 1 Then e = Cells(5, u + m - 1).Value
                        z = a + b + c + d + e
                        If z > Dispo Then
                            last = Cells(65536, 1).End(xlUp).Row + 1
                            If i > 1 Then Cells(last, q + i - 1).Value = "X"
                            If j > 1 Then Cells(last, r + j - 1).Value = "X"
                            If k > 1 Then Cells(last, s + k - 1).Value = "X"
                            If l > 1 Then Cells(last, t + l - 1).Value = "X"
                            If m > 1 Then
                                Cells(last, u + m - 1).Value = "X"
                            Cells(last, 1).Value = "Scénrario" & last - 7
                            Cells(last, 2).Value = z
                                Range("A" & last & ":AB" & last).FormatConditions.Delete
                                Range("A" & last & ":AB" & last).FormatConditions.Add _
                                    Type:=xlExpression, _
                                    Formula1:="=MOD(LIGNE();2)"
                                Range("A" & last & ":AB" & last).FormatConditions(1).Interior.ColorIndex = 15
                                Exit For
                            End If
                        End If
                        
'N1
'For n 1 To 3
                            f = 0
                            If n > 1 Then f = Cells(5, v + n - 1).Value
                            z = a + b + c + d + e + f
                            If z > Dispo Then
                                last = Cells(65536, 1).End(xlUp).Row + 1
                                If i > 1 Then Cells(last, q + i - 1).Value = "X"
                                If j > 1 Then Cells(last, r + j - 1).Value = "X"
                                If k > 1 Then Cells(last, s + k - 1).Value = "X"
                                If l > 1 Then Cells(last, t + l - 1).Value = "X"
                                If m > 1 Then Cells(last, u + m - 1).Value = "X"
                                If n > 1 Then
                                    Cells(last, v + n - 1).Value = "X"
                                    Cells(last, 1).Value = "Scénrario" & last - 7
                                    Cells(last, 2).Value = z
                                    Range("A" & last & ":AB" & last).FormatConditions.Delete
                                    Range("A" & last & ":AB" & last).FormatConditions.Add _
                                        Type:=xlExpression, _
                                        Formula1:="=MOD(LIGNE();2)"
                                    Range("A" & last & ":AB" & last).FormatConditions(1).Interior.ColorIndex = 15
                                    Exit For
                                End If
                            End If

'TR11
'For o 1 To 3
                                g = 0
                                If o > 1 Then g = Cells(5, w + o - 1).Value
                                z = a + b + c + d + e + f + g
                                If z > Dispo Then
                                    last = Cells(65536, 1).End(xlUp).Row + 1
                                    If i > 1 Then Cells(last, q + i - 1).Value = "X"
                                    If j > 1 Then Cells(last, r + j - 1).Value = "X"
                                    If k > 1 Then Cells(last, s + k - 1).Value = "X"
                                    If l > 1 Then Cells(last, t + l - 1).Value = "X"
                                    If m > 1 Then Cells(last, u + m - 1).Value = "X"
                                    If n > 1 Then Cells(last, v + n - 1).Value = "X"
                                    If o > 1 Then
                                        Cells(last, w + o - 1).Value = "X"
                                        Cells(last, 1).Value = "Scénrario" & last - 7
                                        Cells(last, 2).Value = z
                                        Range("A" & last & ":AB" & last).FormatConditions.Delete
                                        Range("A" & last & ":AB" & last).FormatConditions.Add _
                                            Type:=xlExpression, _
                                            Formula1:="=MOD(LIGNE();2)"
                                        Range("A" & last & ":AB" & last).FormatConditions(1).Interior.ColorIndex = 15
                                        Exit For
                                    End If
                                End If
                                
'DL
'For p 1 To 2
                                    h = 0
                                    If p > 1 Then h = Cells(5, x + p - 1).Value
                                    z = a + b + c + d + e + f + g + h
                                    If z > Dispo Then
                                        last = Cells(65536, 1).End(xlUp).Row + 1
                                        If i > 1 Then Cells(last, q + i - 1).Value = "X"
                                        If j > 1 Then Cells(last, r + j - 1).Value = "X"
                                        If k > 1 Then Cells(last, s + k - 1).Value = "X"
                                        If l > 1 Then Cells(last, t + l - 1).Value = "X"
                                        If m > 1 Then Cells(last, u + m - 1).Value = "X"
                                        If n > 1 Then Cells(last, v + n - 1).Value = "X"
                                        If o > 1 Then Cells(last, w + o - 1).Value = "X"
                                        If p > 1 Then
                                            Cells(last, x + p - 1).Value = "X"
                                            Cells(last, 1).Value = "Scénrario" & last - 7
                                            Cells(last, 2).Value = z
                                            Range("A" & last & ":AB" & last).FormatConditions.Delete
                                            Range("A" & last & ":AB" & last).FormatConditions.Add _
                                                Type:=xlExpression, _
                                                Formula1:="=MOD(LIGNE();2)"
                                            Range("A" & last & ":AB" & last).FormatConditions(1).Interior.ColorIndex = 15
                                           Exit For
                                        End If
                                    End If
                                Next p
                            Next o
                        Next n
                    Next m
                Next l
            Next k
        Next j
    Next i


'FINALISATION
'last Cells(65536, 1).End(xlUp).Row                            'Dernière ligne non vide
    If last > 7 Then                                                'Si des lignes au delà de 7 existent
        'Style des lignes 8 à la dernière
        Range("A8:AB" & last).Borders.LineStyle = xlContinuous      'Bordures (cadre fin)
        Range("B8:AB" & last).Font.Bold = True                      'Police (gras)
        Range("B8:AB" & last).HorizontalAlignment = xlCenter        'Alignement (centré)
        'Texte des résultats (nombre de scénarii trouvés)
        Cells(7, 1).Value = last - 7 & " cas de" & Chr(10) & "surcharge"
        'Tri croissant
        Range("B8" & ":AB" & last).Sort Key1:=Range("B8"), Order1:=xlAscending, Header:=xlGuess, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
        DataOption1:=xlSortNormal                                   'Tri croissant des résultats
        'Filtrage activé
        If Not Worksheets("Combinaisons").AutoFilterMode _
        Then Worksheets("Combinaisons").Range("B7:C7").AutoFilter   'Filtrage activé (affichage =à... ou >à... par exemple))
        Cells(5, 2).Select                                          'Sélectionde la cellule du résultat d'une combinaison par choix sélectifs en ligne 6
    End If

End Sub


Les autres parties du codes sont hors sujet.


Cordialement
Rataxes64

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 187 internautes nous ont dit merci ce mois-ci

Commenter la réponse de CerberusPau
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018
3
Merci
Bonjour,

Effectivement,sacrifier des cellules, ou pire des coléoptères (ravi de te saluer à nouveau, ucfoutu) est inutile...

Donc, OK pour Timer, effectivement largement suffisant ici

Quant au "remplacement" de la série de boucle For/Next par Do/Loop... au mieux le même temps, souvent un peu plus...

Je crois qu'on ne fera pas mieux.

Merci encore pour votre disponibilité et vos bon conseils.
Rataxes64

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 187 internautes nous ont dit merci ce mois-ci

Commenter la réponse de CerberusPau
Messages postés
693
Date d'inscription
samedi 18 mai 2002
Statut
Membre
Dernière intervention
17 avril 2017
2
0
Merci
Bonjour,

Penses à typer tes variables en Integer, tu gagneras du temps car sans type VBA les considère comme des Variant et le traitement est plus long.
Attention Dim a as integer, b, c, d...
seule a est en Integer. Il faut tout typer.

Représentation "binaire" des modes, exemple :
ABCDE...............(décimal)
11111 tous actifs.. (31)
10011 ADE actifs....(19)
01100 BC actifs.....(12)
avec la conversion de 0 à 31 de décimal en binaire tu as ainsi toutes les combinaisons pour une machine. A toi de jouer..

Cheyenne
Commenter la réponse de cs_cheyenne
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018
0
Merci
Bonsoir et merci Cheyenne.

OK pour tout typer en integer

Pour la suite, je n'ai jamais fait ça, et n'ai donc aucune idée de ce que je dois faire...

Comment as-tu fait cette "conversion" ?

Comment utiliser ces valeurs? par des for/next aussi ?

Consentirais-tu à m'expliquer un peu (beaucoup!) plus STP?

Je ne voudrais pas rester sur un échec cuisant d'incompétence

Cordialement
Rataxes64
Commenter la réponse de CerberusPau
Messages postés
195
Date d'inscription
lundi 28 janvier 2013
Statut
Membre
Dernière intervention
13 janvier 2017
3
0
Merci
Bonjour,

Nul besoin de For/Next, dans Excel tu as une fonction de conversion décimal vers binaire DECBIN(nombre;nb_car). Voir aide dans Référence des fonctions / Ingénierie / Fonction DECBIN.

Il suffit de faire un tableau décimal dans une colonne (cachée ou pas) et d'appliquer la formule à chaque ligne dans une autre colonne.
Ou bien tu peux rentrer directement la formule :
Pour A à E
DECBIN(0;5) .... DECBIN(31;5)
Pour F et G
DECBIN(0;3) .... DECBIN(7;3)

Cheyenne
Commenter la réponse de ichiriac
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018
0
Merci
Bonjour,

Bonjour,

Tu dis,
Il suffit de faire un tableau décimal
.../...
Ou bien tu peux rentrer directement la formule :
Pour A à E
DECBIN(0;5) .... DECBIN(31;5)
.../...

Si j'ai bien compris, tu as trouvé 31 en faisant l"inverse :
=BINDEC(11111)

Dans l"Aide DECBIN,
=DECBIN(9; 4) Convertit le nombre décimal 9 en nombre binaire de 4 caractères (1001)

Une fois que j'ai mes 3 colonnes de valeurs
00000 à 11111 (pour le 5 modes),
000 à 111 (pour le3 modes) et
00 à 11 (pour le 2 modes),

J'en fais quoi STP?

Merci de ta réponse

Rataxes64
Commenter la réponse de CerberusPau
Messages postés
693
Date d'inscription
samedi 18 mai 2002
Statut
Membre
Dernière intervention
17 avril 2017
2
0
Merci
Re,
Si j'ai bien compris, tu as trouvé 31 en faisant l"inverse.
Pas du tout, pourquoi 31 ?, parce qu'en binaire cela fait 11111. Soit tous les modes A à E actifs
Il suffit par exemple de remplir dans la colone A les lignes 1 à 32 de 0 à 31. En B1 tu mets la formule DECBIN(A1;5) et tu étires ta formule jusqu'à la ligne 32. Ou plus simple tu sélectionnes B1:B32 tu mets la formuleDECBIN(A1;5) et tu valides par CRTL+ENTER, ainsi les 32 lignes sont remplies d'un coup !
J'en fais quoi STP?
Maintenant que toutes les possibilités de mode sont définies, c'est à toi et à toi seul de décider de ce que tu dois en faire !

Cheyenne
Commenter la réponse de cs_cheyenne
Messages postés
693
Date d'inscription
samedi 18 mai 2002
Statut
Membre
Dernière intervention
17 avril 2017
2
0
Merci
Re,

Apparemment tu n'utilises pas Option Explicit car 2 variables ne sont pas déclarée : last et z. last en long car tu récupères un n° de ligne qui peut aller jusqu'à 65536.

Il est inutile de définir a...h et i...p à 0.
Comme elles sont déclarées dans la procédure avant assignation elles sont forcément à 0.

Cheyenne
Commenter la réponse de cs_cheyenne
Messages postés
693
Date d'inscription
samedi 18 mai 2002
Statut
Membre
Dernière intervention
17 avril 2017
2
0
Merci
RE,

Oups, j'ai oublié le s à déclarée.

Apparemment tu n'utilises pas Option Explicit car 2 variables ne sont pas déclarées.

Il est très très très fortement conseillé de mettre Option Explicit dans chaque module de code à partir du moment où il y a utilisation de variables dans celui-ci.
Tu peux le faire faire automatiquement via les Options de l'éditeur en cochant "Déclaration des variables obligatoire".

Cheyenne
Commenter la réponse de cs_cheyenne
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018
0
Merci
Re,

OK.

Ma question était:
je ne vois pas comment faire autrement qu'avec des For/Next imbriquées

Dans mon code For...Nest, même en ayant suivi ton conseil, et typé "integer" partout, le traitement reste assez long.
Le but étant de l'accélérer en passant par ta proposition:
As-tu pensé à la représentation binaire de l'état des modes pour chaque machine ?

Tu m'as indiqué comment les récupérer.
Mais maintenant, comment vais-je pouvoir les utiliser pour obtenir "plus vite" ce que j'obtiens déjà avec les boucles For...Next de mon code?
Bref, comment intégrer tout ça?

Merci en tout cas de ta disponibilité.
Cordialement

Rataxes64
Commenter la réponse de CerberusPau
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018
0
Merci
Re,
Oui, tu as raison, c'est mon fichier de travail, et il y des points à corriger (surtout dans mes déclarations).
Je revérifie et corrige tout de suite.
(Et il ne faut PLUS que j'oublie Explicit!)

A+
Rataxes64
Commenter la réponse de CerberusPau
Messages postés
693
Date d'inscription
samedi 18 mai 2002
Statut
Membre
Dernière intervention
17 avril 2017
2
0
Merci
CerberusPau,

Envoie donc une copie de l'écran initial et du résultat final afin de mieux appréhender ce que tu souhaites faire. Inutile de donner une adresse pour récupérer le fichier Excel car aucun contributeur ne voudra l'ouvrir pour des raisons de sécurité.

J'ai copié et lancé le code. Je n'obtiens rien car au départ toutes les cellules sont vides.
Mais le code s'exécute relativement vite, environ 2 secondes.

Bonne soirée,

Cheyenne
Commenter la réponse de cs_cheyenne
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018
0
Merci
Re,

Ci-joint un Pdf de la copie d'écran (partielle) de mon fichier

de haut en bas
-> type de machine
-> type de mode
-> formules des formats conditionnels déportées
-> valeur de consommation du mode sélectionné
-> valeurs de consommation des modes
-> mode choisi ("X"))
Sur cette ligne:
Fond jaune : choix fait ou encore possible
Fond rouge : choix impossible (la valeur disponible globale serait dépassée)

Tableau des lignes grisées 1/2 résulta des combinaisons "interdites"

Note, j'ai reporté la première ligne grisée dans celle des choix (mis le "X" qui va bien) pour vérifier : Effectivement, le choix "L2000-Bloqué" fait bien partie de la combinaison "interdite" (case rouge).

Avec ces valeurs les modes renseignées, la liste comporte 9850 lignes détaillant les combinaisons interdites.

Voilà (temps de traitement 4,5mn avec mon code actuel.

Cordialement
Rataxes64
Commenter la réponse de CerberusPau
Messages postés
693
Date d'inscription
samedi 18 mai 2002
Statut
Membre
Dernière intervention
17 avril 2017
2
0
Merci
Bonsoir Rataxes64,

Ok, j'ai consulté le pdf. En fait je pensais que tu voulais avoir une représentation du nombre de combinaisons possibles avec 5 modes.
Je comprends maintenant mieux que tu ne saches pas quoi faire avec les "représentations binaires" des modes actifs ou pas.
Mais là, désolé, je ne vais pas pouvoir plus t'aider, car il faut connaitre les tenants et aboutissants qui amènent à afficher un X dans une cellule et là n'est pas le but de ce forum.

Par contre, ce que je peux te dire c'est d'essayer de mettre tes 9850 lignes dans un tableau en mémoire et de "piocher" dedans au lieu d'aller chercher la valeur de la cellule. Tu gagneras ainsi pas mal de temps.

Tu utilises dans les boucles Range("B4").Value,
le mieux est de mettre dès que faire ce peut et avant chaque boucle, cette valeur dans une variable (par exemple B4) et l'utiliser à chaque fois au lieu d'aller chercher la valeur du Range.

Pour inscrire le scénario code plutôt Cells(last, 1).Value au lieu de Range("A" & last).Value.

Tu peux aussi mettre toutes tes valeurs à inscrire dans un tableau, puis avant de sortir de la procédure copier l'ensemble du tableau dans ta feuille, énorme gain de temps.

Une fois cela fait dis-moi quel est le temps d'exécution. Il sera certainement divisé au moins par 2 ou 3, sinon plus.

Cordialement et bon courage pour la suite.

Cheyenne
Commenter la réponse de cs_cheyenne
Messages postés
693
Date d'inscription
samedi 18 mai 2002
Statut
Membre
Dernière intervention
17 avril 2017
2
0
Merci
Re,

Du fait que cette discussion n'est suivie par personne et afin de ne pas encombrer le forum je te suggère de continuer, si tu le veux bien, en utilisant la messagerie privée de ce site.

Si tu ne sais pas comment créer et surtout injecter un tableau dans une feuille en une seule passe, n'hésites pas à le dire, je t'enverrais un exemple de code.

Cheyenne
Commenter la réponse de cs_cheyenne
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018
0
Merci
Re,

OK, merci pour cette analyse.

1°)
Range("B4").Value,
le mieux est de mettreRange("B4").Value,
le mieux est de mettre (..) cette valeur dans une variable (par exemple B4)
C'est fait.
2°)
Cells(last, 1).Value, au lieu de Range("A" & last).Value
C'est fait.
3°)
mettre tes 9850 lignes dans un tableau en mémoire
Ben, non... comment je peux savoir à l'avance combien de lignes il fera? Attention que les VALEURS de consommation de chaque mode peuvent bien sûr varier, et que donc le nombre de combinaisons rejetées aussi -et donc le nombre de lignes-
4°)
mettre toutes tes valeurs à inscrire dans un tableau, puis avant de sortir de la procédure copier l'ensemble du tableau dans ta feuille
C'est très intéressant, ça. Tu veux dire qu'un listing est créé "en mémoire", et qu'à la fin des calculs, il est "édité" dans la feuille? Et comment peux-t-on faire ça...?
Dim Tabl as variant, Tabl=array() ..., J'ai jamais fait non plus!

Désolé de te solliciter autant.
Bizarrement, nom intitulé de ce post ne tente personne d'autre...J'espère quand même n'être fâché avec personne!

Cordialement
Rataxes64
Commenter la réponse de CerberusPau
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018
0
Merci
Re,

Ah! nos messages se sont croisés.

Oh oui, je veux bien que tu m'envoies un exemple!

Juste pour info, j'ai relancé avec tes conseils 1°) et 2°) : difficile de remarquer un gain de temps.
Je crois beaucoup plus à ce "tableau virtuel" dont on recopie les "X" à la fin.
Pour le MP, euh, si personne ne nous a (encore) rejoint, je ne désespère pas. Et puis on n'encombre personne... Mais bien sûr si tu préfères, fais à ta convenance.

Cordialement
Rataxes64
Commenter la réponse de CerberusPau
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
212
0
Merci
Bonjour,
Bizarrement, nom intitulé de ce post ne tente personne d'autre...J'espère quand même n'être fâché avec personne!

Ne pas chercher une explication compliquée à ce silence. Il a ses raisons.
Et la raison est ici tout simplement un non-engouement pour l'aboutissement de ce "truc"-là.
La sagesse première conduit à réaliser le caractère assez contreproductif de la consultation d'une énorme liste de combinaisons pour en choisir une "viable" (car je ne vois aucune autre explication que celle-ci).
Voilà tout. (je ne participerai jamais à de telles démarches du seul fait qu'au prétexte de faciliter les choses, elles finissent par les alourdir et les ralentir).
Voilà. Et je tiens à renouveler mes sentiments amicaux (mais honnêtes avant tout).

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Commenter la réponse de ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
212
0
Merci
Pour mieux comprendre ce dont je parle :
Imaginez que l'on ait recensé toutes les situations/ coups possibles d'une partie d'échec (énorme liste) dans le but de permettre à un joueur de prendre une décision déjà ainsi calculée.
Le voyez-vous raisonnablement passer un temps fou à consulter cette liste pour y localiser CETTE situation ? ===>> Non, n'est-ce-pas ?
Cependant, il serait toujours possible dans cette démarche/échecs, d'accompagner par une base de données qui permettrait au joueur de localiser d'emblée la situation.
Mais voilà : la situation, dans ce cas, serait l'objet d'un constat.
Or, dans ce que veut faire CerberusPau, les choses sont bien pires, puisqu'il s'agirait de ne pas partir d'un constat, mais bel et bien de générer des situations (mettre en route des machines) et qu'il n'y aurait alors d'autres possibilités que de parcouru toute la liste pour déterminer les situations "viables" !
Je ne pense pas qu'une telle démarche soit de bon sens.
Le bon sens, alors ? ===>>*
1) le constat premier ? ===>> il est celui des besoins prioritaires (telle ou telle autre machine)
2) les constat suivants ? === >> mise en route envisageable ou non d'autres machines (et là également, par ordre prioritaire)
3) A chaque ajout : vérification, avant l'ajout , de ce que cet ajout ne fera pas dépasser la limite permise. (un calcul à faire, donc, sur constat ... et constat sur la base de besoins prioritaires, dans l'ordre de priorité de ces besoins).
Voilà. Bonne journée à tous.



________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Commenter la réponse de ucfoutu
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018
0
Merci
Bonjour ucfoutu,

Matinal, toi aussi.

Complètement d'accord avec toi sur le principe. Je m'y suis tout de même collé pour de toutes autres raisons.
Ces "combinaisons" représentent en fait la mise en route automatisée (et aléatoire) d'extracteurs de fumée en cas d'incendie (et dans un internat de collège en plus).
On veut attirer l'intention (et le démontrer) sur l'absolue nécessité d'en revoir l'alimentation électrique, car dans bien des "combinaisons' de leur déclenchement automatique par l'alarme incendie, c'est l'alimentation électrique générale qui va disjoncter, avec les conséquences qu'on suppose!

Ce petit bout de code et ce tableau feront l'objet d'une présentation "active", et donc, je souhaite que le temps de calcul soit "raisonnable".
En plus de ce mode "automatique" d'affichage des combinaisons hors cible, (mes lignes avec des "x"), le tableau propose un mode par choix sélectif "manuel", pour pouvoir tester une combinaison au choix et "voir" si elle est possible.
Toutefois, cette méthode n'est peut-être pas la plus appropriée, mais elle a au moins le mérite d'être concrétisée.

Voilà.
Je reste ouvert à toute remise en question.

Bonne journée.
Cordialement.
Rataxes64
Commenter la réponse de CerberusPau