Soustraire des valeurs selon cellules dans boucle

Bonjour, (désolé pour le titre compliqué)

J'essais présentement avec un VBA de soustraire de 1 (dans la colonne D) toutes les cellules sélectionné au hasard dans la colonne situé en A.

La colonne A possède une liste d'objet

La colonne B représente les probabilité que l'objet de la liste A soit tiré (Fonctionne)

La colonne C représente la quantité initial des objets (ex: comme dans un sac avec des billes de différente couleur)

La colonne D représente le nombre actuel restant des objets (Ce que je cherche à modifier en cliquant sur le bouton Tirage)

La colonne E permet de choisir combien d'objet sont tiré (Fonctionne)

La colonne F dresse la liste des objets tiré en ordre alphabétique (Fonctionne)

J'ai inclu mon fichier excel pour mieux visualiser etc.

Donc, pour l'instant j'arrive a piger au hasard avec des probabilités, par contre je n'arrive pas a soustraire de 1 la Quantité Restante a chaque fois que l'objet est tiré.

Dans le code vba, il me manque une façon d'indiquer dans la boucle for d'aller chercher la Quantité Restante et de soustraire de 1 (pour les objets tiré seulement). J'ai essayer avec la fonction Offset mais sans grand succès. Je ne sais pas si c'est possible

Je suis ouverte a d'autre solution aussi (débutante en vba)

Merci d'avance pour votre aide!

Je tiens à préciser qu'une bonne partie du code à été pris d'un forum d'aide comme celui-ci, malheureusement je n'arrive plus à retrouver la source pour citer etc.

Suite à d'autre recherches, je tente présentement d'aller réduire la Quantité Restante après que la liste d'objets pigés soit générée.

- J'utilise une boucle For pour aller chercher chaques résultats dans la colonne A avec un Match.

- Puis ensuite, faire une sélection pointant dans la bonne colonne (Quantité Restante / colonne D)

ex: Range(resultatDuMatch + 1, "D").Select

- Finalement soustraire de 1 la cellule selectionnée

Pour l'instant, la ligne exécutant le Match/Equiv ne fonctionne pas et je n'arrive pas à fixer le problème.

Dim N As Long
    Dim M As Integer
    Dim resultatObtenu As String
    Dim ObjetObtenu As Object
    N = Cells(2, 6).End(xlDown).Row
    Range("F2:F" & N).Select
    'Selection.Value = "Fish" (Just a test)'

    'Recherche de chaque résultats et enlever de la colonne Quantité Restante -1'
    For M = 2 To N

        resultatObtenu = Cells(M, "F")
        ObjetObtenu = Equiv(resultatObtenu, ("A2:A65536"), 0)

        'Aller soustraire dans la colonne Quantité, le +1 est en raison que la colonne A a une entête'
        ObjetObtenu = ObjetObtenu + 1
        Range(ObjetObtenu, "D").Select
        ActiveCell.Value = ActiveCell.Value - 1
        Next M

Je ne sais pas si c'est en raison du Equiv qui est écrit Match en anglais, si c'est la déclaration du range de recherche etc.

Merci pour toute aide

Bonsoir,

Je ne sais pas ce que tu veux faire... mais j'ai tout de même compris que le point de départ est une liste d'objets (col. A), d'accord ! Ces objets peuvent être en quantités diverses (col. C), toujours d'accord ! Tu fais un tirage aléatoire parmi ces objets, pas de problème à ce sujet... !

Là où j'en vois un, c'est la colonne B, intitulée Probabilités. Le tirage s'effectuant sur l'ensemble des objets, chaque objet individuel a une chance égale d'être tiré. Mais les objets appartenant à diverses catégories, chaque catégorie étant représentée par un nombre variable d'objets, la probabilité de tirer un objet d'une catégorie donnée va en effet varier pour chaque catégorie, elle sera égale au rapport du nombre d'objets de la catégorie sur le nombre total d'objets de toutes catégories. Et la somme des probabilités de chaque catégorie sera toujours égale à 1 !

Seulement, les probabilités portées en col. B ne résultent pas d'un calcul, on ne sait d'où elles sortent, et on voit au premier coup d'oeil que la somme n'en est sûrement pas égale à 1 !

Que l'on porte des chiffres totalement fantaisistes dans cette colonne serait sans incidence si, comme il se devrait, c'est le nombre d'objets de chacune des catégories qui serait pris en considération lors du tirage... Mais ce n'est pas le cas, ce sont ces chiffres qui sont pris en compte pour pondérer le tirage (d'une façon d'ailleurs sommaire et grossière, sans se donner la peine d'opérer un mélange, c'est à dire l'équivalent numérique de boules que l'on mélange dans un sac avant de procéder à un tirage), et qui serait de toute façon inexacte même s'il s'agissait de probabilités calculées...

Il est donc certain que, bâti sur n'importe quoi, le résultat sera n'importe quoi... sauf un tirage aléatoire parmi les objets présentés !

Toute intervention dans une telle opération fumeuse n'est que du temps perdu inutilement. Je ne déteste pas perdre du temps et sans que cela ait une utilité quelconque... pour autant que cela puisse être agréable...

Merci pour votre explication,

En effet les probabilité ne sont pas basé sur la quantité mais seulement sur la Colonne B (c'est volontaire).

La réalité est que j'essaye de simuler un tirage d'un jeux où peu importe la quantité, les probabilité reste les même tant qu'il reste des objets plus commun. J'espère que cela donne un peu plus de sense à ce que je tente d'accomplir ^_^'

J'ai testé le bouton Tirage et j'arrive bel et bien à simuler les probabilités désirées, il me manque simplement une façon d'aller soustraire la quantité de la colonne D.

Avec d'autre teste, j'ai l'impression que la variable recevant le Equiv n'est pas capable de recevoir le résultat (la variable ObjetObtenu)

Je reçois l'erreur 438, Propriété ou méthode non géré par l'objet.

J'ai essayer différent type comme Long et Object

Sinon mon autre théorie serait dans la fonction du Equiv avec le range de recherche qui serait mal déclaré

(resultatObtenu, Sheets("Box 1").Range("A2,A65536"), 0)

J'ai remis un nouveau fichier V2 (avec le nouveau code et petite modificitation générale)

Merci encore pour votre aide.

Si c'est volontaire de pouvoir tirer (dans le même tirage, sans remise) plusieurs fois le même objet dont la quantité dans le lot est 1 ! il n'y a rien à ajouter !

edit : les "merci" ne me sont sûrement pas destinés ! Je n'ai aucune intention de toucher à ça !

Vous avez raison, mais les valeurs que j'ai mise sur le fichier sont juste pour tester rapidement si la fonction Equiv enlève correctement les bons objets etc. (les vrais quantités pourraient être ex: 15,66, 24 etc..). Donc il me serait vraiment utile de pouvoir faire la soustraction automatiquement.

Désolé, j'aurais du ajouter ce petit détail avant.

Merci pour votre persévérance

Après plusieurs recherches, j'ai finalement trouvé comment faire fonctionner la soustraction

Pour les curieux voici le code faisant la soustraction:

'Va enlever les objet tiré de la colonne Quantité Restante'

    'Selectionne la colonne des résultats'
    Dim N As Long
    Dim M As Integer
    Dim resultatObtenu As String
    Dim ObjetObtenu As Long
    N = Cells(2, 6).End(xlDown).Row
    Range("F2:F" & N).Select
    'Selection.Value = "Fish" (Just a test)'

    'Recherche de chaque résultats et enlever de la colonne Quantité Restante -1'
    For M = 2 To N

        resultatObtenu = Sheets("Box 1").Cells(M, "F")

        With Application.WorksheetFunction
            ObjetObtenu = .Match(resultatObtenu, Worksheets("Box 1").Range("A2:A65536"), 0)

            'Aller soustraire dans la colonne Quantité Restante, le +1 est en raison que la colonne A a une entête'
            ObjetObtenu = ObjetObtenu + 1
            Cells(ObjetObtenu, "D").Select
            ActiveCell.Value = ActiveCell.Value - 1
        End With
        Next M
    

Donc déjà en partant Equiv ne fonctionnait pas en VBA, (il faut utiliser Match).

J'ai mis une V3 du fichier excel qui fonctionne.

Rechercher des sujets similaires à "soustraire valeurs boucle"