IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Récupération d'objet créé par une boucle [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2009
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 52
    Points : 38
    Points
    38
    Par défaut Récupération d'objet créé par une boucle
    Bonjour,

    Je ne sais pas si mon objet est clair mais rassurez vous, je vais vous expliquer et mettre des morceaux de code pour mieux comprendre.

    Je suis en train de créer un fichier qui me servira à gérer mon stock informatique.

    Là j'en suis à la partie retour de matériel par un employé. J'ai donc créer un userform qui me permet de faire une recherche dans la liste du matériel qui est sorti avec son nom. Ensuite je fais une boucle de recherche et je crée des contrôles (2 textbox et 1 checkbox) en rapport au nombre de ligne trouvée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    'définie la ligne de départ pour la recherche
     
        ligne_rech = 2
        i = 0
    'Boucle de recherche
     
        Do Until Range("B" & ligne_rech).Value = ""
            If Range("E" & ligne_rech).Value = tb_rechbene.Text And Range("J" & ligne_rech).Value = "" Then
            i = i + 1
    'Création des champ texte pour le modèle
            Set tbmod = Me.Controls.add("forms.textbox.1")
                With tbmod
                .Name = "tbmod" & i
                .Left = 12
                .Top = 150 + (30 * i) - 30
                .Width = 102
                .Height = 15.75
                .TextAlign = fmTextAlignCenter
                .Value = Range("B" & ligne_rech).Value
                End With
    'Création des champ texte pour le numéro de série
            Set tbser = Me.Controls.add("forms.textbox.1")
                With tbser
                .Name = "tbser" & i
                .Left = 144
                .Top = 150 + (30 * i) - 30
                .Width = 156
                .Height = 15.75
                .TextAlign = fmTextAlignCenter
                If Range("C" & ligne_rech).Value <> "" Then
                .Value = Range("C" & ligne_rech).Value
                Else: .Value = "Pas de numéro de série"
                End If
                End With
    'Création des case à cocher
            Set cret = Me.Controls.add("Forms.checkbox.1")
                With cret
                .Name = "cret" & i
                .Left = 312
                .Top = 150 + (30 * i) - 30
                .Width = 15.75
                .Height = 15.75
                End With
     
            End If
            ligne_rech = ligne_rech + 1
        Loop
    Je me retrouve donc avec mon formulaire de départ avec autant de ligne créée que de ligne trouvée dans la liste.

    Dans ce formulaire j'ai un bouton retour qui devrait, en fonction des checkbox cochée, copiée la ligne dans un autre onglet. La partie copiage de ligne il n'y a pas de problème je gère.

    Mais ma question est la suivante, comment je fais pour que quand je clique sur le bouton 'retour' qu'il analyse quelle checkbox est coché étant donné que quand je parle de l'objet 'cret1' j'ai le droit à un debug pour objet requis.

  2. #2
    Membre chevronné Avatar de rvtoulon
    Homme Profil pro
    Agent Technique
    Inscrit en
    Mars 2009
    Messages
    1 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Agent Technique
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 042
    Points : 2 003
    Points
    2 003
    Par défaut
    Bonjour,
    une adaptation de cette récente discussion :http://www.developpez.net/forums/d10...nees-checkbox/

    Tu boucles sur les controls de ton userform et si c'est un checkbox alors tu vérifies qu'il est coché et si c'est le cas alors tu affiches, par exemple, un msgbox qui t'indiques le nom de celui qui est coché.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Dim ctrl As Control
     
    For Each ctrl In UserForm1.Controls
        If TypeOf ctrl Is MSForms.CheckBox Then
          'Si la checkbox est cochée alors
          If ctrl.Value = True Then
          'ici le code que tu souhaites faire si la checkbox
          'est cochée
          MsgBox "La " & ctrl.Name & " " & "est cochée"
          End If
        End If
    Next ctrl
    Adapte ce code a ce que tu souhaites faire.
    @+

    Si vous avez trouvé la solution à votre problème n'oubliez pas d'appuyer sur
    Et n'oubliez pas de voter en appuyant sur si ce message a repondu à vos attentes.
    Ou sur si ce n'est pas le cas

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mars 2009
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 52
    Points : 38
    Points
    38
    Par défaut
    J'étais justement parti sur quelque chose qui ressemblait à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    Private Sub b_ret_Click()
     
     
    Dim Ctrl As Control
    i = 1
    x = 0
    y = 0
    'Boucle sur la collection de contrôles
    For Each Ctrl In retour.Controls
        If TypeName(Ctrl) = "CheckBox" Then
            x = x + 1
            If Ctrl.BoundValue = "Faux" Then
                y = y + 1
            End If
        End If
     
    i = i + 1
    Next Ctrl
     
    If x = y Then
        MsgBox "Merci de cocher au moins une cache pour enregistrer un retour"
    End If
     
    End Sub
    Je partais justement avec quelque chose dans ce genre là mais je ne voyais pas comment en fonction de quelle case qui est coché, comment retrouvé la ligne correspondante dans la feuille sortie.

    Du coup ce que j'ai fait c'est mettre en tant que 'caption' le numéro de la ligne comme ça j'ai juste à récupérer cette valeur comme dans ton exemple et ça marche pas trop mal :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    Dim Ctrl As Control
    y = 0
    'Boucle sur la collection de contrôles
    For Each Ctrl In retour.Controls
        If TypeOf Ctrl Is MSForms.CheckBox Then
          'Si la checkbox est cochée alors
          If Ctrl.Value = True Then
          'ici le code que tu souhaites faire si la checkbox est cochée
          Range("J" & Ctrl.Caption).Value = "X"
          x = Sheets("retour").Range("B1").End(xlDown).Row + 1
          Rows(Ctrl.Caption).Copy Sheets("retour").Rows(x)
          y = y + 1
          End If
        End If
    Next Ctrl
     
    If y = 0 Then
        MsgBox "Merci de choisir le matériel en retour"
        Else
            If y = 1 Then
                MsgBox "Le retour à bien été enregistré"
                Unload Me
            Else
                MsgBox "Les " & y & " enregistrements ont bien été enregistrés"
                Unload Me
            End If
    End If
    Merci encore

  4. #4
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 898
    Points : 8 529
    Points
    8 529
    Par défaut
    Salut
    Je n'ai pas regardé ton code en détail, mais pour stocker le numéro de ta ligne, tu peux utiliser la propriété Tag de ton checkbox
    Par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Sheets("retour").Rows(Ctrl.Tag).Copy Sheets("retour").Rows(x)
    J'en profite pour attirer ton attention sur le fait que ton 1er Rows dans ton code, fait référence aux lignes de la feuille active, qui ne sera pas forcement la même feuille que sheet("retour")

    Autre question, retour, c'est une feuille ou un UserForm??
    Si c'est une feuille, pourquoi tu t’embêtes a mettre des checkbox, autant mettre un X directement dans une cellule, non?
    Si ta feuille et ton UserForm se nomment tous les 2 "retour" ... un conseil change le nom de l'un des 2

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. initialisation d'une listview par une boucle
    Par sam_c_java dans le forum Windows Forms
    Réponses: 3
    Dernier message: 24/10/2007, 11h10
  2. Classe d'un Objet défini par une variable
    Par tatouille dans le forum VB.NET
    Réponses: 4
    Dernier message: 12/06/2007, 13h38
  3. [Conception] Faire une somme de valeurs définies par une boucle
    Par fixbraun dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 25/09/2006, 23h46
  4. [Timer] timer bloqué par une boucle for?
    Par Jidefix dans le forum Interfaces Graphiques en Java
    Réponses: 3
    Dernier message: 18/09/2006, 17h12
  5. [Vb.net] Indexé un objet crée dans une boucle
    Par picpic dans le forum Windows Forms
    Réponses: 10
    Dernier message: 17/12/2003, 14h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo