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érer la valeur d'un textbox sur un USF2 appelé par un premier USF [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Inscrit en
    Août 2010
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 3
    Par défaut Récupérer la valeur d'un textbox sur un USF2 appelé par un premier USF
    Bonjour le Forum,

    mon problème est simple en apparence mais je n'y arrive pas. je vais essayer de vous l'exposer aussi clairement que possible. Merci par avance de votre précieuse aide.

    Dans mon projet VBA, j'ai plusieurs userforms (usf) dont le fonctionnement commence par la saisie dans un TextBox (tbClient) quelques caractères pour rechercher le client selon le contexte de l'usf, par exemple UFSource.
    Après avoir saisi quelques lettres dans tbClient, un bouton Seek (dans UFSource) permet de lancer un usf UFSeek contenant un textbox tbSeek et une ListView LV alimentée selon le contexte de UFSource.
    Au fur et à mesure que le tbSeek change les items de LV sont filtrés. Après un événement LV_Click je souhaite récupérer l'item sélectionné par un moyen que j'ignore, fermer UFSeek et continuer mon traitement dans UFSource avec tBClient = l'item

    Mon problème est que je n'arrive pas à passer la valeur de l'item sélectionné dans le LV par une instruction du type Forms("UFSource").Controls("tbClient")=Item avant de fermer UFSeek

    Bien entendu je souhaite que UFSeek soit un outil commun à tous mes usf.

    Dans un module (indépendant de UFSeek), j'ai donc créé une sub UFSeek_Show(UFSource As UserForm, tbSource As String) qui est appelée par le bouton Seek qui affiche UFSeek en ayant au préalable chargé LV et dupliqué le contenu de tbSource dans tbSeek. ce même module contient également les sub tbSeek_Change et LV_Click.

    Après plusieurs recherches j'ai pensé qu'un module de classe pouvait m'aider, mais je n'en ai jamais utilisé et je n'arrive pas à structurer la démarche.

    Merci de votre aide.

  2. #2
    Expert confirmé Avatar de BENNASR
    Homme Profil pro
    Responsable comptable & financier
    Inscrit en
    Décembre 2013
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Responsable comptable & financier
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 2 962
    Par défaut
    bonjour
    j'ai eu le même besoin et j'ai trouvé mon bonheur ... donc ce n'est pas mon code
    donc j'ai un userform pour rechercher et puis double clic sur le code souhaité à ce moment s'ouvre une nouvelle userform avec un textbox qui prend comme valeur le code déjà choisi
    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
    Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean) 'au double-Click dans la ListBox1
    Dim LI As String
    LI = Me.ListBox1 'récupère la ligne de la ListBox1
    With UserForm1 'prend en compte l'UserForm1
        With .ComboBox1 'prend en compte la TextBox2
            'sélectionne le texte
            .SetFocus 'place le curseur
            .SelStart = 0 'début de la sélection
            .SelLength = .TextLength 'longueur de la sélection
            .Value = LI
        End With
        Unload Me 'vide et ferme l'UserForm2
        .Show 'affiche l'UserForm1
     
    End With 'fin de la prise en compte de l'UserForm1
     
    End Sub
    j'espère que ça t'aide à avancer
    Bonne Continuation

  3. #3
    Futur Membre du Club
    Inscrit en
    Août 2010
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 3
    Par défaut
    Bonjour BENNASR,

    Merci pour ta réponse aussi rapide.
    En réalité même le nom du UFSource est un argument (l'idée est de paramétrer en une ligne de code l'appel de UFSeek et de récupérer le contenu du tbSeek depuis n'importe quel userfom appelant UFSource) .
    Donc il faut le passer en argument. Désolé si ce n'était pas clair dans mon énoncé .
    Depuis ce matin j'ai pensé à utiliser la collection Userform pour boucler dessus jusqu'à trouver celui que je veux remplir (plus exactement remplir le controle tbSource dans UFSource).

    Ce n'est certainement pas la méthode la plus orthodoxe ou la plus directe mais ça me permet d'avancer (très certainement qu'un module de classe pour instancier le contrôle du userform devrait fonctionner et ça serait plus "classe")

    Voici mon code pour ceux que ça peut aider.
    (à insérer dans le userform UFSource)

    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
    Sub UFSeek_Show(UFSource As String, tbSource As String, LeftPos, TopPos) 'passage des paramètres à l'UFSeek
     
    If UFSeek.tbSeek = "" Then Importer_Client (UFSource) 'sub qui rempli la LV selon le contexte de UFSource
     
    UFSeek.LView.ColumnHeaders.Clear
    UFSeek.LView.ColumnHeaders.Add , , "Client" 
    UFSeek.LView.ColumnHeaders(1).Width = 265
    UFSeek.tbSeek.SetFocus
    UFSeek.LView.Tag = tbSource
     
    UFSeek.Show
     
    'pendant l'affichage de UFSeek, le textbox tbSeek est renseigné (depuis l'item selectionné dans LView)
    'après une instruction UFSeek.Hide il faut récupérer la valeur de tbSeek
     
    For i = 0 To VBA.UserForms.Count - 1
        If VBA.UserForms.Item(i).Name = UFSource Then
            With VBA.UserForms.Item(i).Controls(tbSource)
                .Value = UFSeek.tbSeek
                If .Value <> "" Then 'mise en forme du controle tbSource lorsqu'il est rempli avec l'item recherché
                    .Tag = UFSeek.tbSeek
                    .BackColor = &H80FFFF
                    .Font.Bold = True
                End If
            End With
        End If
    Next i
     
    End Sub
    Merci encore

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut

    Citation Envoyé par bougalix Voir le message
    [...]
    l'idée est de paramétrer en une ligne de code l'appel de UFSeek et de récupérer le contenu du tbSeek depuis n'importe quel userfom appelant UFSource
    [...]
    C'est une EXCELLENTE idée . C'est une architecture très professionnelle (la seule qui vaille, en fait).

    Voici la mise en place de ce que tu souhaites obtenir, pour ce que je j'ai cité de ton message. Je ne dis donc pas ici comment tu dois filtrer et arriver à la bonne valeur dans usf2 (apparemment, tu as cette solution), mais comment architecturer ton code pour découpler tes userforms, qui devraient être totalement indépendants l'un de l'autre.

    Je te donne ici un userform tout simple avec un seul textbox et un bouton de commande. Lorsque l'on clique sur le bouton, une propriété publique du usf appelée Result est valorisée puis le formulaire est masqué. La fonction qui l'a appelé récupère alors la valeur de Result et la met à disposition du reste du code en retour de fonction. Tu as ainsi UNE LIGNE DE CODE à utiliser dans le reste de ton application.

    Code du userform
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Option Explicit
     
    Public Result As String
     
    Private Sub btnValidate_Click()
      Result = "Validate"
      Me.Hide
    End Sub
    La fonction qui l'appelle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Function getSeek() As String
      With UserForm1
        .Show
        If .Result = "Validate" Then getSeek = .txtSeek.Value
      End With
      Unload UserForm1
    End Function
    Tu peux utiliser cette fonction n'importe où dans ton code (dans d'autres userforms, mais aussi dans d'autres procédures de ton application), dès que tu as besoin de récupérer la valeur sur base de ta recherche: SeekValue = getSeek(), car le code du usf2 n'est plus lié au usf1. il y a une séparation claire des responsabilités de chaque userform (Le USF2 a la responsabilité de te permettre de chercher ta donnée par saisie intuitive et le premier peut utiliser la valeur du second sur simple appel d'une fonction dont la responsabilité est de restituer cette valeur) et les deux ne sont en fait pas liés. De plus, en ne liant pas les usf1 au usf2, tu capitalises sur le code de USF2.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  5. #5
    Futur Membre du Club
    Inscrit en
    Août 2010
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 3
    Par défaut
    Bonsoir,
    je suis très honoré cher Pierre de ta citation et merci pour ta réponse.
    En effet alimenter une variable publique est une piste que j'avais envisagée. Mais je dois dire que l'appel par une Function est encore une des finesses dont tu as le secret et grâce auxquelles tu nous as éclairé à d'innombrables reprises sur ce merveilleux site.
    ça me donne même une autre idée: passer comme argument de ta fonction getSeek le nom du USF appelant . ===> Function getSeek(USFSource)
    Ce qui me permettrait de l'utiliser dans le code de l'usf pour y déclencher des traitements au moyen de sub toutes logées dans un module indépendant.
    Gain en maintenance et en lisibilité du code.

    Merci encore, d'autres idées me viennent...

    Bonne soirée

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Citation Envoyé par bougalix Voir le message
    [...]
    Merci encore, d'autres idées me viennent...

    Bonne soirée
    Super. Content que ces idées d'architecture te permettent d'avancer dans ton projet.

    Enjoy
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 15/07/2008, 14h05
  2. récupérer des valeur dans une textbox..
    Par mohe27 dans le forum ASP.NET
    Réponses: 11
    Dernier message: 15/12/2007, 20h37
  3. Réponses: 6
    Dernier message: 14/08/2007, 09h26
  4. Récupérer la valeur d'un champs sur OnKeyDown
    Par robocop2776 dans le forum Access
    Réponses: 1
    Dernier message: 22/06/2007, 18h34
  5. Réponses: 4
    Dernier message: 14/10/2005, 17h34

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