VB Melanger des textboxs

Résolu
Bonjour , je cherche désespérément le moyen de mélanger mes 4 textboxs.

J'ai 4 textboxs, et en dessous, j'ai un bouton " Aléatoire", j'aimerais que lorsque que l'on clique sur le bouton aléatoire, le contenu des 4 textboxs se mélangent, sans doublons.

Est ce que quelqu'un aurait une piste ?

15 réponses

  1. Bonjour,

    Est-ce que les textboxes contiennent déjà un contenu ?

    ;o)
    1. par défaut :

      Player 1
      Player 2
      Player 3
      Player 4

      C'est un logiciel pour géré des crews et brackets de tournois. Le contenu des textboxs est récupéré ensuite par des labels, etc pour la gestion de l'évent.
      1. Test ça, à coller dans le formulaire:

        Option Explicit
        
        Private mTab()
        Private ind As Integer
        
        
        Private Sub BoutonAleatoire_Click()
            ind = 0
            InitTab
            SearchAlea
        End Sub
        
        Private Sub InitTab()
        Dim txt As Control
        
            ReDim mTab(0)
            For Each txt In Me.Controls
                If TypeOf txt Is TextBox Then
                    ReDim Preserve mTab(ind)
                    mTab(ind) = txt.Text
                    ind = ind + 1
                    txt.Text = ""
                End If
            Next txt
        
            
        End Sub
        
        Private Sub SearchAlea()
        Dim str As Variant
        Dim cpt As Integer
        
            While cpt <= 3
                str = returnAlea
                If doesExistAlea(str) = False Then
                    Affiche (str)
                    cpt = cpt + 1
                End If
            Wend
            
        End Sub
        
        Private Sub Affiche(ByVal str As Variant)
        Dim txt As Control
        
                For Each txt In Me.Controls
                If TypeOf txt Is TextBox Then
                    If txt.Text = "" Then
                        txt.Text = mTab(str)
                        Exit Sub
                    End If
                End If
            Next txt
        
        End Sub
        
        Private Function returnAlea() As Variant
        Dim alea As Integer
        
            Randomize Timer
            
            alea = CInt(Rnd * (ind - 1))
            If alea > UBound(mTab()) Then alea = UBound(mTab())
            returnAlea = alea
        
        End Function
        
        Private Function doesExistAlea(ByVal str As Variant) As Boolean
        Dim txt As Control
        
            For Each txt In Me.Controls
                If TypeOf txt Is TextBox Then
                    If txt.Text = mTab(str) Then
                        doesExistAlea = True
                        Exit Function
                    End If
                End If
            Next txt
        
            doesExistAlea = False
            
        End Function
        


        ;o)
        1. Contributeur
          Bonjour,
          Une autre solution ?
          J'ai choisi de faire une collection cela raccouci le code du bouton.
          Dans le tag de 4 textBox mettre de 1 à 4 .. textBox1.Tag =1, textBox2.Tag =2.. etc
          Comme tu emploi des textBox je suppose que tu est en VBA ?
          Code à coller dans le module d'ub UserForm
          Si les TextBox sont sur une feuille le code doit être légérement modifié.
          Option Explicit
          Dim CoText As Collection
          
          Private Sub UserForm_Initialize()
          Dim Cl
              Set CoText = New Collection
              For Each Cl In Me.Controls
                  If Cl.Tag <> "" Then
                      CoText.Add Cl, Cl.Tag
                  End If
              Next Cl
          End Sub
          
          Private Sub CommandButton1_Click()
          Dim AR(1 To 4)
          Dim i As Byte, n, R
              For i = 1 To 4: AR(i) = CoText(i): Next i
              Randomize
              For i = 1 To 4
          Reco:
                  R = Int((4 * Rnd) + 1)
                  If AR(R) <> "" Then
                      CoText(i) = AR(R): AR(R) = ""
                  Else: GoTo Reco
                  End If
              Next i
              
          End Sub


          A+
          1. Ok merci beaucoup, je vais essayer ca de suite et je vous tiens au courant !

            Encore merci .,.
            1. Bon j'ai essayer, et j'ai des problèmes pour les deux versions....

              Je tiens a préciser que j'utilise visual studio 2010 RC

              et sinon ce n'est pas du VBA :p

              Pour le code de lermite222

              CoText(i) = AR(R)

              Ce morceau me donne l'erreur :

              Property 'Item' is 'ReadOnly'.

              sinon j'ai du changer de 1 à 4 en 0 à 3 car apparemment le plus petit ne peut être que 0 ._.

              pour le premier code, j'ai des fonctions telle que Randomize Timer qui ne fonctionne pas, la syntaxe n'as pas l'air d'être compatible.
              1. Contributeur
                Comme quoi... Quand ont ne précise pas le language employer !!!!!
                Et tu dis ensuite...
                Je tiens a préciser que j'utilise visual studio 2010 RC
                Mais tu utilise quoi, le C le VB..
                Et de toute façon c'est en .Net
                En gardant le même principe que dans mon code mais en employant les Index il y a possibilité d'y arriver.
                Tu dis.
            2. Vraiment désolé...

              Comme précisé dans le titre j'utilise le VB et non le C

              En utilisant les index ?
              1. Contributeur
                Rectifier avec des contrôles Text indexé de 0 à 3
                Private Sub Command1_Click()
                Dim AR(3)
                Dim i As Byte, R
                    For i = 0 To 3: AR(i) = Text1(i): Next i
                    For i = 0 To 3
                Reco:
                        R = Int((4 * Rnd) + 1) - 1 'moins 1 pour avoir le zéro
                        If AR(R) <> "" Then
                            Text1(i) = AR(R): AR(R) = ""
                        Else: GoTo Reco
                        End If
                    Next i
                End Sub

                Et tout le reste n'est pas nécessaire.
                Randomize n'est pas obligatoir, c'est pour réinitialiser le pseudo compteur aléatoir RND.
                C'est en VB6 mais ça devrait pas poser trop de problème.
                1. j'ai remplacer text1 par textbox1.text

                  TextBox1.Text(i) = AR(R)

                  Ce morceau me donne l'erreur :

                  Property 'chars' is 'ReadOnly'.
                  1. Contributeur
                    Ton VB c'est bien du Visual basic non ?
                    Tu ne sais pas ce que c'est des contrôles indexés ?
                    Sur ta feuille tu colle un textbox (qu'importe le nom)
                    Tu le sélectionne (qu'il ai des poignées.
                    Tu tape Ctrl + C
                    ensuite Ctrl + V
                    Tu va avoir un message.. Ce textbox existe déja voulez_vou... tu dis oui
                    Ensuite tu tape encore deux fois Ctrl + V et tu auras tes 4 TextBox
                    si tu va voir dans la fenêtre des propriétés tu verra qu'il auront un index de 0 à 3
                    Tu ne doit pas les renommer.
                    et si le nom est textbox1
                    tu change Text1(i) par TextBox1(i).text
                    Essaye déja ça...
                    L'expérience instruit plus sûrement que le conseil. (André Gide)
                    Si tu te cogne à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
                    1. j'utilise des windows forms et non des feuilles.

                      textbox1 dans les lignes

                      For i = 0 To 3 : AR(i) = TextBox1(i).text : Next i

                      et

                      TextBox1(i).text = AR(R) : AR(R) = ""

                      me donne l'erreur

                      Class 'System.Windows.Forms.TextBox' cannot be indexed because it has no default property.
                      1. Contributeur
                        Bon, tu me confirme que tu est bien en VB.Net, malheureusement je ne connaîs pas la syntaxe des versions .Net.
                        Le principe de la méthode que je t'ai donné est bonne, à toi de trouver la syntaxe adéquoite à ta version.
                        Désolé mais je sais pas aller plus loin.
                        A+
                    2. No problème , je vais étudier les pistes que vous m'avez donné.

                      Merci encore :p
                      1. Bonjour,

                        La précision sur la version utilisée aurait certainement été utile et aurait fait gagner du temps à tout le monde.

                        Je n'ai pas la version 2010. J'ai importé le projet VB 6 dans la version VB 2008.
                        Voilà ce que ça donne, avec le code que j'ai donné plus haut:

                        Option Strict Off
                        Option Explicit On
                        Imports VB = Microsoft.VisualBasic
                        
                        Friend Class Form1
                        	Inherits System.Windows.Forms.Form
                        	
                        	Private mTab() As Object
                        	Private ind As Short
                        	
                        	
                            Private Sub BoutonAleatoire_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BoutonAleatoire.Click
                                ind = 0
                                InitTab()
                                SearchAlea()
                            End Sub
                        	
                        	Private Sub InitTab()
                        		Dim txt As System.Windows.Forms.Control
                        		
                        		ReDim mTab(0)
                        		For	Each txt In Me.Controls
                                    If TypeOf txt Is System.Windows.Forms.TextBox Then
                                        ReDim Preserve mTab(ind)
                                        mTab(ind) = txt.Text
                                        ind = ind + 1
                                        txt.Text = ""
                                    End If
                        		Next txt
                        				
                        	End Sub
                        	
                        	Private Sub SearchAlea()
                                Dim str As Object
                        		Dim cpt As Short
                        		
                        		While cpt <= 3
                                    str = returnAlea()
                        			If doesExistAlea(str) = False Then
                        				Affiche((str))
                        				cpt = cpt + 1
                        			End If
                        		End While
                        		
                        	End Sub
                        	
                            Private Sub Affiche(ByVal str As Object)
                                Dim txt As System.Windows.Forms.Control
                        
                                For Each txt In Me.Controls
                                    If TypeOf txt Is System.Windows.Forms.TextBox Then
                                        If txt.Text = "" Then
                                            txt.Text = mTab(str)
                                            Exit Sub
                                        End If
                                    End If
                                Next txt
                        
                            End Sub
                        	
                        	Private Function returnAlea() As Object
                        		Dim alea As Short
                        		
                        		Randomize(VB.Timer())
                        		
                        		alea = CShort(Rnd() * (ind - 1))
                        		If alea > UBound(mTab) Then alea = UBound(mTab)
                                returnAlea = alea
                        		
                        	End Function
                        	
                            Private Function doesExistAlea(ByVal str As Object) As Boolean
                                Dim txt As System.Windows.Forms.Control
                        
                                For Each txt In Me.Controls
                                    If TypeOf txt Is System.Windows.Forms.TextBox Then
                                        If txt.Text = mTab(str) Then
                                            doesExistAlea = True
                                            Exit Function
                                        End If
                                    End If
                                Next txt
                        
                                doesExistAlea = False
                        
                            End Function
                        
                        End Class


                        Ce n'est pas très propre.

                        Il faut réorganiser le code. Certaines méthodes n'ont rien à faire dans la classe de la form.

                        ;o)
                        1. Merci ! , cela fonctionne parfaitement. j'ai juste du changer Randomize(VB.Timer())

                          par Randomize(TimeOfDay.ToOADate())

                          Par contre je ne comprend absolument pas comment le code fonctionne en lui même, mais c'est pas grave ._.