Placer aléatoirement des "x" dans une zone prédéfinie

[Résolu]
Signaler
-
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
-
Bonjour à tous,
cela fait plus d'une semaine que je cherche comment je peux placer aléatoirement 15 croix dans une zone que l'on l'on a choisi (pour pouvoir l'intégrer au démineur que je suis en train de faire), et malheureusement ça ne donne rien. Si quelqu'un peu m'aider je suis preneuse : il me faudrait un codage simple (en VBA) pas trop évolué car je ne suis qu'une étudiante ayant 1 à 2 heures de cours par semaine ^^.
Merci d'avance :)

18 réponses

Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
Bonjour, jack,
regarde ce que j'en ai dit plus haut :
C'est un peu moins facile que cela, car tirages forcément sans doublon. Et retirer si déjà tiré (jusqu'à ce que pas déjà tiré) est lourd et peu orthodoxe.

or, c'est ce que ferait ton point 4 :
-4- Si la cellule désignée contient déjà un 'x', refaire -3-

Imagine un peu que, par malchance, tu "tombes" un très grand nombre de fois sur une cellule déjà marquée "x" !!!
Tout cela est à éviter et parfaitement évitable. C'est la raison même du mécanisme proposé de touillage

Bon ===>> regardons ce que fait ceci 'exemple avec un bouton sur feuille active):
Private Sub CommandButton1_Click()
  Static tablo() As String, lazone As Range, nb As Integer '===>> de sorte à garder cela en mémoire
  Dim ou As Integer, temp As String, i As Integer
  If lazone Is Nothing Then ' ====>>____________
    Set lazone = Range("B7:K16") '              |
    ReDim tablo(lazone.Count - 1) '             |
    ou = 0 '                                    |
    For Each C In lazone '                      |On ne fait ceci qu'une seule fois
      tablo(ou) = C.Address(False, False) '     |
      ou = ou + 1 '                             |
    Next '                                      |
    nb = UBound(tablo) '                        |
  End If '--------------------------------------
  lazone.ClearContents
  Randomize
  For i = 0 To nb \ 2 '__________________________
    ou = Int(((nb - i) * Rnd)) '                 |
    temp = tablo(ou) '                           |
    tablo(ou) = tablo(nb - i) '                  | 'on touille/retouille à chaque clic, par contre
    tablo(nb - i) = temp '                       |
  Next '________________________________________ |
  For i 0 To 14 '>> on ne prend que les 15 premiers
    Range(tablo(i)) = "x" '===>> et on met un "x" à l'adresse qu'ils contiennent
  Next
End Sub



________________________
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.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
Si ce sujet est résolu ===>> un clic sur le tag "réponse acceptée" pour le libérer, s'il te plait.


________________________
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.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
Bonjour et bienvenue,
Commence s'il te plait par nous montrer le code que tu as au moins tenté, conformément au règlement de ce forum).


________________________
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.
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
Bonjour,

Regarde du côté de Rnd() dans ton aide

Comme tu connais le nombre de ligne et le nombre de colonne, tu ne devrais pas avoir de difficulté à générer des coordonnées aléatoires.


MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
merci de répondre si vite,

voilà la partie que j'ai écrite :
Sub RemplissageAleatoire()

Dim Tableau As Integer
Dim Nombre As Integer
Dim i As Integer
Dim Cell As String

Cells.Clear

Nombre = 15
Tableau = Range("B7:K16").Value

For i = 1 To Nombre

Randomize
Cell = Int((Tableau * Rnd)) + 1
Cell = "X"

Next i

End Sub

Ce n'est vraiment pas fameux désolé. Je sais que j'ai un problème avec la variable Tableau j'ai essayé de mettre tout ce que j'ai vu en cours pour la déclarer mais rien ne marche (je ne connais que: As String, As Integer, As Long, As Boolean, As Single et As Double).
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
Bonjour, MPi,
C'est un peu moins facile que cela, car tirages forcément sans doublon. Et retirer si déjà tiré (jusqu'à ce que pas déjà tiré) est lourd et peu orthodoxe.
Quand je dis "moins facile", je ne dis pas "difficile"
J'ai son code tout prêt (que je viens de faire en quelques lignes de code à peine) mais ne veux absolument rien lui communiquer tant que je n'aurai pas vu (comme je le lui ai demandé) son propre code, son propre effort.

________________________
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.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
Bon ...
Alors regarde ce que fait ceci (ce n'est que le début de mon code) ===>>
Dim lazone As Range, ou as integer
  Set lazone = Range("B7:K16")
  ReDim tablo(lazone.Count - 1)
  ou = 0
  For Each C In lazone
    tablo(ou) = C.Address(False, False)
    ou = ou + 1
  Next

'===================== et cette partie-là n'est que pour que tu voies ce que
'=========== contient le tableau (on ne s'en servira pas dans ce qui va suivre
For ou = 0 To UBound(tablo)
  MsgBox tablo(ou)
Next

Comme tu le constates, nous avons un tableau de toutes les adresses possibles de ta "zone"
Vu ? ===>>
que faire de cela ? ====>>
- 1) touiller ce tableau (le mélanger)
- 2) n'en extraire ensuite que les 10 premiers éléments (ce sont des adresses de cellule ===>> on met un "x" à cette adresse).
Je souhaite maintenant te voir tenter de passer à la seconde étape, donc (touiller le tableau).


________________________
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.
Merci pour ce début par contre il y a plein de mots que je ne connais pas comme Set, ReDim, et For Each ... In ; je vais aller voir ce que tout ça signifie et faire de mon mieux pour la seconde étape encore merci
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
par contre il y a plein de mots que je ne connais pas comme Set, ReDim, et For Each ... In ; je vais aller voir ce que tout ça signifie

C'est cela : ouvrir ton aide VBA et acquérir ces notions (facile, ne t'en fais pas). C'est cela, le développement.


________________________
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.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
Alors, mymydu33 (que j'ai vu revenir, mais sans intervenir) :
Où en es-tu, maintenant ?
Tranquillise-toi : je sais que cette seconde étape (notamment celle du "touillage" du tableau) est la moins facile des 3, non en raison de connaissances techniques "inhabituelles", mais pour le mécanisme de pensée à mettre en oeuvre).
Peu importe ! Je me contenterai de savoir ce que tu as essayé, quelles ont été tes approches ... c'est tout ce que je souhaite voir...
Et tu l'auras alors, ton code


________________________
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.

Bonjour,
Le pire c'est que lors d'une recherche sur google je suis tombé sur CA

Mais bon s’exercer les neurones de temps en temps n'a jamais fait du mal à personne...

Personnellement je l'aurais fait sur une UserForm avec des petits boutons (histoire de ressembler un peu au démineur de windows)


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
Bonjour, acive,
Personnellement je l'aurais fait sur une UserForm avec des petits boutons (histoire de ressembler un peu au démineur de windows)

et moi, personnellement, je préfère en général faire des travaux manuels et/ou artistiques, aller à la pêche, etc ... plutôt que de faire de tels jeux (ou même d'y jouer). Ce n'est pas ma tasse de thé.
Mais la question est ici de savoir comment mettre aléatoirement un "x" dans 15 cellules d'une plage déterminée. Et c'est le seul point qui importe alors pour moi, peu important les raisons de cette affaire (le demandeur aurait d'ailleurs pu éviter de mentionner que cela faisait partie d'un jeu ou d'autre chose). C'est d'ailleurs ce qu'il m'arrive souvent de dire dans mes interventions, genre :
"exposez les tenants et aboutissants du problème techniquement, sans même dire la raison de ces tenants et aboutissants. Ne parlez que d'objets (contrôles, plages, etc...) et des interventions que vous souhaitez y faire.
Le reste (le pourquoi, etc...) ne regarde que vous"
________________________
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.
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
78
Salut
Je viens mettre mon grain de sel ...

Perso, je serai resté avec sa structure initiale (à corriger) :
-1- Randomize
-2- Une boucle de 1 à 10 pour désigner les cases x
-3- Dans cette boucle, génération de 2 chiffres aléatoires :
1 pour les colonnes : entre 2 bornes, 0 et le nombre de colonnes -1
1 pour les lignes : entre 2 bornes 0 et le nombre de lignes -1
et les utiliser dans un .Offset pour se superposer à la position réelle du tableau.
-4- Si la cellule désignée contient déjà un 'x', refaire -3-
-5- Ecrire 'x'
-6- Fin de boucle

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on le partage (Socrate)
Bonjour,

Ucfoutu pour mélanger un tableau entier je dois avouer que je n'ai pas vraiment d'idée.... mais j'ai eu d'autres idées comme :

*si je choisie une colonne aléatoirement et ensuite une ligne dans mon tableau pour après former une cellule qui auras comme coordonnée ce que j'aurais trouvé précédemment je peux obtenir ainsi une case aléatoire et je peux la répéter 15 fois.

*si je tire au hasard un chiffre entre 0 et 100 et le comparer avec la variable ou (j'ai essayé de mettre cette idée en programme mais bien sure ça ne marche pas mais le point positif est que j'ai eu un idée )

Sub placerbombes()
Dim lazone As Range, ou As Integer
Dim C As Range
Dim aléatoire As Integer

Set lazone = Range("B7:K16")
ReDim tablo(lazone.Count - 1)
ou = 0

For i=0 to 15
Randomize
aléatoire = CInt((Rnd * 100) + 1)

For Each C In lazone
While aléatoire + 1 <> ou
tablo(ou) = C.Address(False, False)
ou = ou + 1
Wend

Cells(C.Address).Value = "X"
Next
i=i+1
Next
end sub

Bonjour,
aller à la pêche, etc ... plutôt que de faire de tels jeux (ou même d'y jouer)

Idem pour moi

mymydu33, te voilà avec un peu de matière à reflechir...
Par contre quand tu mets un code sur le forum utilise les balise de code VB (troisième icone en partant de droite)

Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
A mymydu33 : tu l'as, ton code ! Il est tout cuit dans mon dernier message.
Bon. Je suis content que tu aies essayé.



________________________
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.
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
78
@ucfoutu : Sur le principe, tu as raison, c'est plus programmaticalement correct.
Mais bon, pour un débutant, ces considérations peuvent être placées en second plan, histoire de ne pas trop rajouter de couches + peut-être 10 mSec de gagné sur le déroulement global; chouette !

@mymy : Je rejoins ucfoutu sur son appréciation : ça fait plaisir de voir que ces échanges t'ont été profitables.
merci a tous d'avoir répondu et de m'avoir aidé