Macro pour recherche aléatoire avec des conditions
Bonjour Brouhaha, bonjour le forum,
Toujours ma même histoire du pneu crevé... Si j'amène une photo au garagiste non seulement il ne me le réparera pas mais en plus il se foutra bien de ma gueule si je lui dis que c'est urgent...
Pour te proposer une solution il nous faut la tester au préalable et pour cela il faudrait recréer tout ton environnement. C'est plus de la passion, c'est carrément une galère. Un fichier exemple sera bien plus utile qu'une "photo"...
ok merci je vais vous envoyer ca maintenant .
merci beaucoup pour la réponse déja
exemple de ce que je veux faire :
étape 1
je veux que mon pointeur va pointer sur la cellule C13 ensuit partir la chercher aléatoirement dans la colonne O
étape 2
on a deux cas
si il la pas trouver il sort un message box "non trouver dans colonne O"
si il la trouver donc il va prendre( la valeur de son tonnage (dans la colonne I )- la valeur de son unité de lavage (colonne k)) est ensuite mettre le résultat dans la colonne R et dans la colonne I (remplacer l'ancien tonnage )
ensuite en passe a C14
remarque : le résultat de calcul sera placer das la même ligne que le tonnage et l'unité de lavage
étape 3
avant le lancement de chaque boucle de recherche aléatoire il faut vérifié est ce que la valeur de la cellule (colonne I ) > la valeur de la cellule (colonne k).
si oui on lance la boucle normalement donc on calcul ( la valeur de son tonnage (dans la colonne I )- la valeur de son unité de lavage (colonne k)) est ensuite on met le résultat dans la colonne R et dans la colonne I (pour remplacer l'ancien tonnage )
et ensuite en passe le pointeur a C14
si non on cherche un autre tonnage > la valeur de la cellule (colonne k) et qui a la même chaine de caractère (dans notre cas C13 )
et si tous les tonnage qui correspondent a la cellule C13 sont < 53 on passe directement a C14 et ainsi de suite
regarde l'image pour mieux comprendre l'exemple
et j'ai mis Aussi les fichier excel en piéce jointe
mercii
ThauTheme ta comprit ce que je veux faire ?
Re,
Oui mais là je n'ai pas le temps... Dès que j'ai un peu de disponibilité je regarde ça...
ok mercii beaucoup je serai dans l'attente d'une reponse de ta part mercii
Re,
Le code ci-dessous devrait convenir :
Sub Macro1()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim TB1 As Variant 'déclare la variable TB1 (TaBleau 1)
Dim TB2 As Variant 'déclare la variable TB2 (TaBleau 2)
Dim I As Integer 'déclare la variable I (Incrément)
Dim V As String 'déclare la variable V (Valeur)
Dim NB As Integer 'déclare la variable NB (NomBre)
Dim K As Integer 'déclare la variable K (incrément)
Dim J As Integer 'déclare la variable J (incrément)
Dim NA As Integer 'déclare la variable NA (Nombre Aléatoire)
Dim TL() As Variant 'déclare la variable TL (Tableau des Lignes)
Dim LI As Integer 'déclare la variable LI (LIgne)
Dim C As Double 'déclare la variable C (Calcul)
Set O = Sheets("Interface") 'définit l'onglet O
TB1 = O.Range("B12").CurrentRegion 'définit le tableau TB1
TB2 = O.Range("H12").CurrentRegion 'définit le tableau TB2
For I = 2 To UBound(TB1, 1) 'boucle 1 : sur toutes les ligne I du tableau TB1 (en partant de la seconde)
Erase TL: NB = 0: LI = 0 'vide le tableau TL, initialise le nombre NB, initialise la ligne LI
If TB1(I, 2) <> "" Then 'condition 1 : si la valeur ligne I, colonne 2 de TB1 n'est pas vide
V = TB1(I, 2) 'définit la valeur V (récupère la valeur de la donnée ligne I, colonne 2 de TB1)
'définit le nombre de fois NB que V apparaît dans la colonne 15 (=O) de l'onglet O
NB = Application.WorksheetFunction.CountIf(O.Columns(15), V)
If NB = 0 Then 'condition 2 : si NB est égale à zéro
MsgBox Chr(34) & V & Chr(34) & " est inexistant dans la colonne O !" 'message
GoTo suite 'va au plat suivant de la boucle 1 via l'étiquette "suite"
End If 'fin de la condition 2
K = 1 'initialise la variable K
For J = 2 To UBound(TB2, 1) 'boucle 2 : sur toutes les lignes J du tableau TB2 (en partant de la seconde)
'condition 3 : si la donnée ligne J colonne 8 de TB2 est égale à la valeur V et si le tonnage en
'colonne I (ou colonne 2 de TB2) est supérieur à l'unité de lavage en colonne K (ou colonne 4 de TB2)
If TB2(J, 8) = V And TB2(J, 2) > TB2(J, 4) Then
ReDim Preserve TL(1 To K) 'redimensionne le tableau TL
TL(K) = J + 11 'récupère le numéro de la ligne (J+11) car TB2 commence à la ligne 12)
K = K + 1 'incrémente K
End If 'fin de la condition 3
Next J 'prochaine ligne de la boucle 2
Randomize 'lance le générateur de nombres aléatoires
'définit un nombre aléatoire NA entre 1 et Le nombre d'élément du tableau TL
NA = Int((UBound(TL, 1) * Rnd) + 1)
LI = TL(NA) 'définit une ligne aléatoire contenant la valeur V
C = O.Cells(LI, 9) - O.Cells(LI, 11) 'définit le calcul C
O.Cells(LI, 18).Value = C 'renvoie le calcul C dans la cellule colonne 18 (=R) de l'onglet O
O.Cells(LI, 9).Value = C 'renvoie le calcul C dans la cellule colonne 9 (=I) de l'onglet O
End If 'fin de la condition 1
suite: 'étiquette
Next I 'prochaine ligne de la boucle 1
End Sub
Une chose à vérifier. Comme le plat peut apparaître plusieurs fois dans la colonne C, le nombre aléatoire NA peut être répété.
Par exemple :
C13 = Plat2. La ligne définie de manière aléatoire peut être la ligne 42 donc on retrouve en R42 : 418,207211488718 - 53 = 365,2072115 et aussi en I42
C14 = Plat2 . La ligne définie de manière aléatoire peut être encore la ligne 42 donc on retrouve en R42 : 365,2072115 - 53 = 312,207211488718 et aussi en I42
Est-ce que cela pose problème ou pas ?
NON EN FAITE C4EST EXACTEMENT CE QUE JE VEUX LE CALCUL QUE TA FAIT EST JUSTE
CE QUE JE VEUX SAVOIR STP EST CE QUE CE CODE JE PEUX LE METTRE DANS MA GRANDE BOUCLE QUE J4AI DANS LE MODULE 2 PSQ en faite je veux quand la valeur 53 atteint T7 que les cellule de la colonne X commence a se remplire et aussi les celules de la colonne R et I doivent changer
si tu peux juste me dire ou je dois mettre le code que tu ma dit exactement pour que je puisse faire ce que je t'est dit
mercii beaucoup
merci beaucoup ThauThème grace a toi je vais reussire mon projet merciii
en faite tous les condition que ta fait sont exactement ce que je veuxx
merciiiiiiiiiiiiiiiii beaucouppppppppppppp
la il me faut juste que je met le code que tu ma écrit dans ma boucle principale pour que une fois quand j'aapuis sur le bouton simulation que tous mes cellules se remplisse
merciii
thauthéme j'ai placer le nom de la procédure Macro1 dans ma boucle principale qui démare en appuiant sur le bouton simulation ( voir image du code de ma boucle principale )
mais ca ma pas donner le résultat que je voulais
psq en faite moi ma colonne X son remplissage suit la colonne C de mon TB1 et je veux que aussi le remplissage de ma cellule R et I suit l'ordre de la colonne C de mon TB1 et que une fois on a une cellule vides dans la colonne C on revient a C13
exemple du principe
dans ma cellule C13 du TB1 j'ai Plat2 c'est la première chaine de caractère de ma colonne C donc ce cas ma macro va cherché 53 de T7 et la met dans Plat2 donc plat2=53 (cellule X3) ET 2 seconde Après C passe de C13 a C14 ET on trouve C14 correspond toujours a Plat2 donc on va encore envoyer T7 a plat2 donc plat2 maintenant est égal a 53+53=106
Maintenant pour la 2éme partis Macro1 c'est enfaite le même principe je veux que quand T7 =53
que ma recherche va ce lancer dans TB2 pour trouver C13 aléatoirement parmis les Plat2 que j'ai dans la colonne O ensuite faire le calcul de son nouveau tonnage (colonne I-colonneK) et la mettre dans R et I , et 2 seconde après on passe a chercher C14 et on fait la méme chose jusqu'a trouver le vide et on revient a C13
Regarde stp le fichier et tu va voir que ce que le TB2 fait correspond pas a ce que j'ai dans la colonne C
exemple dans une boucle de C13:C51 je dois avoir que 3 plat2 aux quel je doit calculer le nouveau tonnage mais je me retrouve dans une seul boucle avec 4 plat2 aux quel le tonnage est changer
merci thauthéme et désolé vaiment je suis consiente du dérangement que je t'est fait
merci encore
Re,
J'ai essayé d'intégrer le code à ta boucle mais comme tu boucle avec un système Do... Loop et moi avec un système For I = 1 to ... Next..., je ne m'en sors pas pour le moment. Mais je ne lâche pas l'affaire...
merci beaucoup vraiment
Bonjour ThauTheme;
je vous contacte pour une amélioraion que je veux effectué a mon code
Bonjour ;
je vous contacte pour une amélioration que je veux effectué sur mon code
1) on faite je veux fixé le nombre de fois que je veux ma boucle tourne dans la celule B4
je veux que quand je clique sur le bouton simulation , que ma boucle tourne le nombre de fois que je vais lui fixé dans la cellule B4 (Nombre de boucle )
2)la 2 éme chose que je veux modifié svp dans mon code c'est :
- maintenant avant de cliqué dur le bouton simulation , les celulles B7:T7 sont vides
- quand on clique sur le bouton simulation la cellule B7 ce rempli et aprés 2 seconde la cellule C7 se rempli jusqu'a T7 et une fois que T7 est rempli la boucle pour remplire la colonne X se lance
- maintenant ce que je veux c'est que une fois que B7 est rempli on lance la boucle qui rempli la colonne X
voila le fichier svp merci :
Option Explicit
Option Base 1
Public Satisfait As Boolean
Sub Choix_Aleatoire()
Dim f As Worksheet: Set f = Sheets("Interface")
Dim r, a, c
Dim d As Object: Set d = CreateObject("scripting.dictionary")
Dim i As Integer, j As Integer, n As Integer
'On enregistre chaque ligne ayant la même clé
r = f.[H13:Q51]
For i = LBound(r) To UBound(r)
d(r(i, 8)) = d(r(i, 8)) & i + 12 & ":"
Next i
'On boucle la colonne C
j = 13
Do While f.Cells(j, 3).Value <> ""
Recommence_la_boucle:
'On vérifie que la valeur existe dans le dictionnaire sinon on quitte la procédure
If Not d.exists(f.Cells(j, 3).Value) Then MsgBox f.Cells(j, 3).Value & " non trouvé dans la colonne O", 16: f.Cells(j, 3).Activate: Exit Sub
'On remet les items dans un tableau
a = Split(d(f.Cells(j, 3).Value), ":")
'On choisit une ligne au hasard dans le tableau
n = a(Int(((UBound(a) - 1) * Rnd)))
'Revenir au début si la ligne ne peut pas rester positive
If f.Cells(n, "i").Value - f.Cells(n, "k").Value < 0 Then GoTo Recommence_la_boucle
'On calcule la valeur en colonne R et on remplace également en colonne I
f.Cells(n, "r").Value = f.Cells(n, "i").Value - f.Cells(n, "k").Value
f.Cells(n, "i").Value = f.Cells(n, "r").Value
'On note le poste choisi en colonne F pour exemple
f.Cells(j, "f").Value = "Ligne " & n
'On incrémente et on boucle
j = j + 1
Loop
'Vérifie si toutes les valeurs ont été bouclées
Satisfait = True
End Sub
Sub Plaque5_Cliquer()
Dim UniteLavage As Long
Dim d As Object
Dim i As Integer, j As Integer, c As Variant
Dim Nbre_Total_Boucl As Integer
Dim Rng1, Rng2 As Range
Dim Nb_Boucle As Integer
Dim Arret As Boolean
'Dim compt As Integer
'compt = 1
Satisfait = False
With Sheets("Interface")
'On vérifie s'il existe une valeur en B1
If .[b1] = "" Then MsgBox "Insérer une valeur en B1", 16: Exit Sub
'On enregistre la variable UniteLavage
UniteLavage = .[b1]
'On applique la valeur à la ligne 7
'code pour le lancement des passe dans le tunel
Arret = False: Nb_Boucle = 0
'Do Until compt = 2
If Range("B1").Value <> "" Then 'vérifie que B1 n'est pas vide
Nbre_Total_Boucl = Columns(3).Find("*", , , , , xlPrevious).Row - 12
Do While Arret = False
DoEvents
'Range("B7:T7").Value = "" 'réinitialise ton "tableau"
i = 2 'valEUr de Ma première colonne du tableau
Application.Wait Time + TimeSerial(0, 0, 2) 'attends 10 sec
Do Until Range("T7") <> "" Or Arret = True 'conditionne la boucle jusqu'à la dernière colonne de ton tableau
If i > 2 Then Cells(7, i - 1).Value = Range("B1") 'mettre la valeur de B1 dans les cellule precedente
Cells(7, i).Value = Range("B1").Value 'mets ta valeurs dans la cellule de ton tableau
i = i + 1 'prochaine colonne
Application.Wait Time + TimeSerial(0, 0, 2) 'attends 10 sec
DoEvents
Loop
Range("B3") = Range("B3") + Range("T7")
'If Range("B7") <> "" Then
'boucle sur la colonne X
Set Rng1 = Columns(24).Cells.Find(Range("C13").Offset(Nb_Boucle, 0).Value)
If Rng1 Is Nothing Then
MsgBox Range("C13").Offset(Nb_Boucle, 0).Value & " non trouvé en colonne X"
Else
Rng1.Offset(1, 0).Value = Rng1.Offset(1, 0).Value + Range("B7").Value
'End If
End If
Nb_Boucle = Nb_Boucle + 1
If Nb_Boucle = Nbre_Total_Boucl Then Exit Do
Loop
Else
MsgBox "B1 est vide !"
End If
'.Range("b7:t7").Value = UniteLavage
'On démarre la procédure de choix aléatoire
Choix_Aleatoire
'Si Satisfait n'est pas atteint on quitte
If Not Satisfait Then Exit Sub
'On détermine la quantité de chaque Plat
i = .[c65000].End(xlUp).Row
Set d = CreateObject("scripting.dictionary")
'On boucle la colonne C
For j = 13 To i
'On incrémente chaque Plat pour déterminer le nombre de chaque
d(.Cells(j, 3).Value) = d(.Cells(j, 3).Value) + 1
Next j
For Each c In d.keys: d(c) = d(c) * UniteLavage: Next c
'On boucle la colonne X
'For j = 2 To 13 Step 2
'If d.exists(.Cells(j, "x").Value) Then .Cells(j, "x").Offset(1).Value = d(.Cells(j, "x").Value)
' Next j
'On ajoute la valeur à B1
.[B3] = WorksheetFunction.Sum([x2:x13])
End With
'compt = compt + 1
End Sub
merci ThauTheme
Bonjour ThauThème j'ai besoin de ton aide pour la suite de mon projet stp
on faite moi j'ai déjà la première parti de mon programme qui est bien faite et qui est ecrite dans le module tunel "(Plaque5_Cliquer()" et ce que je veux faire je veux l'intégré dans cette boucle principale
voila ce que j'ai fait maintenant : j'ai programé le remplissage de la colonne B7:T7 et je l' est relié a ma colonne X et I en executant le programme tu va voir ce qu'il fait . ( je te conseil stp de voir d'abord le fonctionnement de se que j'ai fait )
maintenant j'ai rajouter des cellules dans la colonne W qui va jouer le rôle de mon stock et cette étape c'est une étape intermédiaire dans mon programme et je sais pas comment l'intégré car il est lié a la cellule T7 et a la colonne(24) :
W5 :4er emplacement de stockage
W6 :3éme emplacement de stockage
W7: 2éme emplacement de stockage
W8: 1éme emplacement de stockage
ce que je veux faire c'est que lorsque ma cellule T7 est remplie. que ma cellule W8 ce remplie automatiquement et recoi la valeur de T7 et que 1 seconde apres w7 recois T7 et 1 seconde aprés W6 recoi T7 et 1seconde aprés W5 recois T7
de plus il faut considérer que W8 se vide chaque 5 seconde pour envoyer ca valeur a la colonne X ( maintenant c'est la celulle T7 qui renvoi ça valeur a la colonne X)
merci