Macro pour recherche aléatoire avec des conditions

bonjour svp je suis null en vba et j'ai besoin de votre aide

vous avez si joint une image avec ce que je faire svp aidez moi svp c'est urgent merciii

tableau2

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

tableau explication

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 c'est gentil de ta part

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

enmpalcement macro1

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
merci

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

boucle
16simulation3.xlsm (70.11 Ko)

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 j'ai vraiment besoin de ton aide

capture
17simulation4.xlsm (74.24 Ko)
Rechercher des sujets similaires à "macro recherche aleatoire conditions"