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