CerberusPau
Messages postés377Date d'inscriptionlundi 3 avril 2006StatutMembreDernière intervention22 août 2018
-
30 juin 2013 à 20:22
CerberusPau
Messages postés377Date d'inscriptionlundi 3 avril 2006StatutMembreDernière intervention22 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 là, 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.
CerberusPau
Messages postés377Date d'inscriptionlundi 3 avril 2006StatutMembreDernière intervention22 août 20181 2 juil. 2013 à 09:16
Re,
Autre chose.
Pendant cette présentation, on ne veut pas ne faire qu'un "constat".
Etant donné qu'il n'est pas possible de définir des "priorités" puisque les mises en route sont aléatoirement déclenchées par l'alarme incendie, le tableau doit pouvoir proposer des possibilités de modifications. Par exemple, si tel moteur est remplacé par un moins gourmand (Valeur de mode changée pour ce moteur) : Que se passe-t'il?
Sur quel moteur agir prioritairement? Là, cela devient vite un vrai casse-tête. Et ce n'est plus mon affaire, mais celle des motoristes qui seront présents.
Moi, je propose de "seulement" démontrer que :
1 - Il y a un GROS problème.
2 - Il est possible de "tester" des solutions de façon "parlante" pour les décideurs.
3 - Les décideurs pourront effectivement "vérifier" les solutions proposées par les motoristes.
CerberusPau
Messages postés377Date d'inscriptionlundi 3 avril 2006StatutMembreDernière intervention22 août 20181 2 juil. 2013 à 09:31
Re,
L'analyse de Ucfoutu est très pertinente :
mise en route envisageable ou non d'autres machines
et
vérification, avant l'ajout, de ce que cet ajout ne fera pas dépasser la limite permise.
C'est justement la raison de l'existence de la partie Sélection(choix) du tableau : On clique , selon un ORDRE PRIORITAIREMENT CHOISI dans les cases de Mode (1 seul mode par moteur ; sélection marquée par un "X"), et AU FUR ET A MESURE, les cases dont la sélection ferait dépasser la consommation passe en rouge (avec un message d'erreur si l'on veut quand même les sélectionner).
CerberusPau
Messages postés377Date d'inscriptionlundi 3 avril 2006StatutMembreDernière intervention22 août 20181 2 juil. 2013 à 23:05
Bonsoir,
Suite aux échanges MP proposés par Cheyenne concernant l'utilisation d'un tableau Tbl(65356,25), j'en ai conclu que l'on améliorerait pas le temps de traitement ou d'affichage. En effet le bouclage de chaque combinaison étant "surveillé" par un Exit for dès que l'on dépasse la cible, on a toutes les configurations MINIMUM qui conduisent au dépassement de la cible. Et ça suffit.
Donc le temps de traitement est déjà bien optimisé.
Il est long?
Non, on est trop pressé!
Reste à "toiletter mon code de travail (option explicit, etc., etc.)
Donc le temps de traitement est déjà bien optimisé.
Peut-être. C'est là que l'on voit la limite des langages interprétés comme VBA. Tu pourrais envisager d'utiliser un langage compilé comme VB.net ou Caiguisé et un DataCridView pour l'affichage
Il est long?
Je n'ai pas regardé si tu as-tu mis :
application.screenupdating = false
au début de la macro et
application.screenupdating = true
à la fin. En éliminant la mise à jour continuelle de l'affichage, tu gagnerais un peu de temps. En revanche, tu perds tout contrôle visuel de la progression du travail
Non, on est trop pressé!
Peut-être.
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_cheyenne
Messages postés693Date d'inscriptionsamedi 18 mai 2002StatutMembreDernière intervention17 avril 20172 4 juil. 2013 à 13:42
Bonjour,
Ok, pas de gain de temps.
Justement à propos du couple For/Next essaye avec Do...Until, c'est 7 fois plus rapide.
Toutefois ce test a été réalisé avec une boucle comportant 1 million d'itérations, toi, au pire, tu n'en as que 5, mais c'est à tenter.
Je suppose que tu mesures le temps d'exécution avec la fonction GetTickCount...
cs_cheyenne
Messages postés693Date d'inscriptionsamedi 18 mai 2002StatutMembreDernière intervention17 avril 20172 5 juil. 2013 à 14:01
Bonjour CerberusPau,
Ce n'est pas GetTickConte mais GetTickCount.
Je vais chercher pour voir comme je peux utiliser ça, après avoir testé Do...While.
Ben non, il vaudrait mieux faire l'inverse. Implémenter d'abord la fonction, faire la mesure avec For/Next les changer en Do/While et faire une 2éme mesure. Faire une moyenne sur 5 ou 10 tests pour chaque essai avec For et Do.
Parce que chrono en main, ce n'est pas le top pour faire évaluer le temps d'exécution d'un code.
CerberusPau
Messages postés377Date d'inscriptionlundi 3 avril 2006StatutMembreDernière intervention22 août 20181 5 juil. 2013 à 16:21
Bonjour,
Il semblerait que'avec l'API GetTickCount:
Option Explicit
Dim StartTime As Variant
Dim EndTime As Variant
Public Declare Function GetTickCount Lib "kernel32" () As Long
Sub APIstart()
'donne le nombre total de secondes
StartTime = GetTickCount() / 1000
Range("D7").Value = StartTime
End Sub
Sub APIend()
'donne le nombre total de secondes
EndTime = GetTickCount() / 1000
Range("E7").Value = EndTime
End Sub
on ait le même résultat qu'avec Time
Sub TIMstart()
'donne le nombre de minutes:secondes
Range("G7").Value = Time
End Sub
Sub TIMend()
'donne le nombre de minutes:secondes
Range("H7").Value = Time
End Sub
Mais exprimé de façon différente
La différence TIMend - TIMstar, me paraît plus directement "parlante" car directement en mn:s.
J'utilise donc Time.
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018211 5 juil. 2013 à 18:12
Bonjour,
Il ne faut pas s'égarer à vouloir à tout prix sodomiser les coléoptères !
On parle ici de quoi ? de quelles différences (en quelles unités) de durée de traitement ?
Inutile, ici, d'abuser de la fonction GerTickCount. Inutile égalerment de "dépenser" une cellule ===>>
au lancement des instructions en cause :
dim debut as double
debut = timer
et en fin d'exécution des instruction en cause
msgbox timer - début
affichera la durée avec une précision nettement inférieure au centième de seconde
exemple :
Dim deb As Double, i As Long, a As Long
deb = Timer
For i = 1 To 10000000
a = a + 1 ' ou n'importe quelles instructions
Next
MsgBox Timer - deb
________________________
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.