Sub lance()
Dim i As Integer, j As Integer, ctr As Integer, total As Integer
Dim nl As Integer, alea As Integer, joueur As Integer, drapeau As Boolean
' Remise à zero des lignes et colonnes
Range("B2:IV65536").ClearContents
'----------------------------------------------------------------------------
' La macro est faite, pour definir un nombre de bateaux inconnu : !
' C'est la colonne A qui donne le nombre de bateaux !
' Pareil pour les jour, ce qui veut dire que tu peux ajouter des journées !
' en ajoutant des titres en ligne 1 et des bateaux en ajoutant des titres en!
' colonne A !
'----------------------------------------------------------------------------
' Une boucle sur les titre de colonne (ligne 1) ---> jours
' j=1 à nombre total de colonne -1 (la colonne A n'est pas une journée
For j = 1 To Range("IV1").End(xlToLeft).Column - 1
' Total est un compteur qui va compter le nombre de barreurs pour une journée
' il est remis à zero avant chaque journée
total = 0
' Recuperation du nombre de bateaux engagés (-1 : la ligne 1 n'est pas un bateau)
nl = Range("A65536").End(xlUp).Row - 1
' Tant que le nmbre de bateaux et <> du nombre de barreurs
While total <> nl
' tirage aleatoire d'un bateau :
' rnd(time) donne un nombre aleatoire entre 0 et 0,999999999999999999
' on multiplie par nl (nombre de bateaux) et on ne recupere la partie entiere avec int
' ensuite on ajoute 1, sinon 0 et pas de nl (on veut entre 1 et nl)
alea = Int(Rnd(Time) * nl) + 1
' if la cellule est vide je peux traiter le bateau
If Cells(alea + 1, j + 1) = 0 Then
' incrementer 1 à total
total = total + 1
' mettre un drapeau à faux : le tirage aleatoire du barreur peux selon le resultat donner
' plusieur fois le meme barreur donc on va controler si le barreur est deja en piste et
' s'il n'y est pas on va passer le drapeau à true pour le selectionner
drapeau = False
' quand que le barreurs est present dans la liste
While drapeau = False
' tirage aleatoire du barreur (meme principe que pour le bateau)
joueur = Int(Rnd(Time) * nl) + 1
' on controle sur toute la colonne si le barreur y est
For ctr = 1 To nl
' si je barreur est trouvé je sors de la boucle
If Cells(ctr + 1, j + 1) = joueur Then Exit For
' prochaine ligne
Next ctr
' si la la sortie de la boucle n'est pas prematurée (Exit For), ctr sera plus grand que nl
' donc le barreur n'a pas ete trouvé, on peut donc le traiter en remettant de drapeau à true
If ctr > nl Then drapeau = True
Wend
' mise en place du barreur en face du bateau selon la journée
Cells(alea + 1, j + 1) = joueur
End If
' prochain barreur
Wend
' prochaine journée
Next j
End Sub