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 :

[VBA-E] Liaison entre une listbox et un userform


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé Avatar de lio62
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    472
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 472
    Par défaut [VBA-E] Liaison entre une listbox et un userform
    Bonjour,
    j'ai un userform "SAISIE" avec une listbox comportant des cases a cocher( avec les propriétés de la listbox)

    je voudrais en cliquant sur l'une des cases qu'un userform(userform7, toujours le même) avec une textbox s'ouvre et me transfère ensuite les données dans une feuille de calcul("bd") à différents endroits (cellules contigües) selon l'item sélectionné;

    actuellement je n'arrive pas a faire la liaison

    j'ai joins un fichier.

    merci a+

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Hello Lio,
    Je viens juste de faire ça.
    Pour parvenir à placer les bonnes données aux bons endroits,
    - un tableau des adresses des cellules à renseigner.
    - les textbox, combos et listbox ont, dans leur nom un index identifiable, de telle manière que cet index corresponde à l'index du tableau des adresses des cellules.
    Enfin, afin de placer chaque fiche (correspondant à une saisie et/ou sélection dans l'userform) sur une nouvelle ligne, une variable NoLigne initialisée à l'ouverture de l'userform sur la 1ère ligne vide de la BdD, NoLigne incrémentée à chaque nouvelle validation des données.
    Enfin, pour placer les données dans la feuille aux bons endroits, une boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    For each LeControl in Userform1.controls
         if instr(LeControl.name, "_")<>0 then
              'ici, si on a "_txt" dans le nom, c'est un textbox
              'l'index est donné par le nombre formaté à deux chiffres qui suit "_txt"("_txt01", "_txt05"... etc)
              'traitement du textbox, où 01 ou 05 correspond à l'index du tableau d'adresse
            elseif 'si on a "_lst", c'est une listbox ou un combo qu'on traite comme tels
              'ici encore, l'index de l'adresse est donné pr le nombre formaté à deux chiffres qui suit "_lst" ("_lst06", "_lst09"... etc
              'traitement de la liste où 06 correspond... etc
         endif
    Next
    Cela te permet de traiter à la fois les listes et les textbox.
    La solution du tableau d'adresses pourrait te permettre de régler également ton problème pour le fichier que tu as baptisé "fusion", pb auquel je n'ai pas eu le tps de te répondre
    Une dernière chose : pour ton tableau d'adresses, utilises cette forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LesAdresses = Array(Cells(1, 2), Cells(2, 2), Cells(3, 2), Cells(1, 5), Cells(2, 5), ...)
    Et pour affecter les valeurs de tes contrôles à ces adresses
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Range(LesAdresses(Lindex).address = LeControl.value
    'ou
    Range(LesAdresses(Lindex).address = LeControl.List(LeCombo.listindex)
    'selon que tu as un txtbox ou une liste
    Bon courage

  3. #3
    Membre éclairé Avatar de lio62
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    472
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 472
    Par défaut
    salut ousk

    Ouf je pensais n'avoir jamais de réponse j'essaye de déchiffrer tout ca

    as tu regarder le fichier joint. Je n'ai pas mis le deuxième fichier qui doit etre inamovible comme je l'avais dis j'ai préféréé scinder (mes dificultés )
    en deuxième position il y aura la concaténation de plusieurs colonnes (adresse, horaire) et en troisième la reccopie des données sur cette ffameuse feuille pour laquelle je pense pouvoir faire des transpositions, mes colonnes de ma bd étant contigües.


    merci a+

  4. #4
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Oui, j'ai jeté un oeil sur ton fichier. Je ne comprends pas pourquoi tu parles de concaténation. Tes données doivent bien être placées dans des cellules indépendantes. Je ne vois pas l'intérêt de les concaténer.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DEPANNAGE	28/02/2007	15:15 a 15:30
    chacune des données étant dans une cellule, est plus facile à traiter que
    "DEPANNAGE" & séparateur & "28/02/2007" & séparateur & "15:15 a 15:30"
    Ma foi, c'est toi qui vois.

  5. #5
    Membre éclairé Avatar de lio62
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    472
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 472
    Par défaut
    salut, pour le code je n'arrive pas a m'en sortir avec l'initialisation de la variable Noligne là pour l'instant dns cet exemple ca me restitue les données en b1 ce qui est normal et pour les mettre sur la dernière ligne (première ligne vierge) je suis paumé

    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 CommandButton1_Click()
     
    Sheets("bd").Select
     
     dernièreligne As Integer
     
    Dim noligne As Integer
     'dernièreligne = Range("A1").End(xlDown).Row + 1 ' Première ligne vide
     
    lesadresses = Array(Cells(1, 2), Cells(2, 2), _
           Cells(3, 2), Cells(1, 5), Cells(2, 5))
     
     
     
        For Each lecontrol In saisie.Controls
        If InStr(lecontrol.Name, "_txt01") <> 0 Then
    Range(lesadresses(lindex).Address) = lecontrol.Value
     
     
     Else
     End If
     Next
     
    End Sub

    en ce qui concerne la concaténation je suis tout a fait d'accord avec toi mais le tableau que j'envvoie chaque matin a ma direction doit comporter l'adresse et la ville dans la meme cellule ainsi que le début et la fin d'intervention (idem)
    je n'ai donc pas le choix.

    par contre je les garde en bout de BdD pour pouvoir faire des stats (afffaire à suivre...)




    merci a+

  6. #6
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Tu pourrais t'appliquer quand tu mets du code sur le forum
    Ok pour ton pb, ce ne sont pas des cellules que tu dois mettre dans ton tableau mais des colonnes. J'avais compris autre chose (et, à voir ton code, je ne vois pas quoi )
    Tu veux les coller où tes données ? dans un tableau préformaté ou dan une ligne ?
    Si c'est dans un tableau préformaté, la syntase est bonne à l'index près.
    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
    Dim dernièreligne As Integer
    Dim noligne As Integer, Lindex as integer
    Lindex = 0
     'dernièreligne = Range("A1").End(xlDown).Row + 1 ' Première ligne vide
     
    lesadresses = Array(Cells(1, 2), Cells(2, 2), Cells(3, 2), Cells(1, 5), Cells(2, 5))
        For Each lecontrol In saisie.Controls
             If InStr(lecontrol.Name, "_txt01") <> 0 Then
                     Range(lesadresses(lindex).Address) = lecontrol.Value
                     Lindex = Lindex+1
                 Else
             End If
        Next
     
    End Sub
    Si c'est sur une ligne, tu dis
    A+

  7. #7
    Membre éclairé Avatar de lio62
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    472
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 472
    Par défaut
    salut ouskel je suis tout dépressionné maintenant

    mais mes données je veux les mettre sur la première ligne vierge de ma bd c tout

    (pff personne ne maime sur le forume ya qtoi)
    allez salut a + et merci j'sui loin detre l'meilleur élève

  8. #8
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Si tu mets tout sur une même ligne, je ne comprends pas les adresses de cellules que tu mets dans ton tableau. C'est n'importe quoi. Tu as un problème ?
    Donc, on a dit sur la même ligne. Tu connais les colonnes : Ce sont elles que tu dois mettre dans ton tableau, pas l'adresse de la cellule.
    Comme tu as plusieurs fois les mêmes colonnes dans ton propre tableau, je suppose que tu veux renseigner les colonnes 1 à 5. Tu sauras corriger ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Dim LesColonnes
    Dim noligne As Integer, Lindex as integer
        Lindex = 0 'inutile, simplement pour te montrer que l'index commence à 0
        noligne = Range("A1").End(xlDown).Row + 1 ' Première ligne vide
        LesColonnes = Array(1, 2, 3, 4, 5)
        For Each lecontrol In saisie.Controls
             If InStr(lecontrol.Name, "_txt01") <> 0 Then
                     Cells(NoLigne, LesColonnes(Lindex)) = lecontrol.Value
                     Lindex = Lindex+1
                 Else
             End If
        Next
    End Sub
    Je te mets ce code mais la prochaine fois, essaie de comprendre ce que tu fais. Je n'arrive pas à piger ce que tu as compris. Et pourtant, pour faire ce que tu as fait il a bien fallu que tu comprennes quelque chose même si mes explications précédentes n'ont pas répondu à ta demande.
    Je pensais que tu avais progressé

  9. #9
    Membre éclairé Avatar de lio62
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    472
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 472
    Par défaut
    salut ousk

    j'avais pas tout compris

    j'arrivais pas a m'ensortir pour qu'il me colle mes données sur la première ligne vierge pour le tableau d'adresses je n'avais rien changé car je faisia les tests que sur la 1ere textbox et je n'arrivais pas a trouver la relation entre dernièreligne et le tableau

    j'essaye ton code


    merci a+

  10. #10
    Membre éclairé Avatar de lio62
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    472
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 472
    Par défaut
    bonjour (re) ca marchemais maintenant......

    dans l'userf, j'ai un frame avec 3 checkbox et ue listbox avec 16 items(environ)N
    je voudrais lorsque l'on clik sur l'une des cases a cocher il me lance un userf (toujours le meme) pour donner une réponse (ex case a cocher q20 lorsque je click dessus l'userf s'ouvre et je peux inscrire le nombre dedans et quand j'appuie sur ok ca me colle les données sur la meme ligne à la suite dans ma bd)

    Pareil pour la listbox

    je joins le fichier

    merci a+

  11. #11
    Membre éclairé Avatar de lio62
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    472
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 472
    Par défaut
    bonjour,
    y a t il un ordre a respecter entre "_txt" et "_lst" ou pour les colonnes car dès que je mélange les deux (txt ,lst) il me met les données n'importe ou sur la ligne.
    sans compter mes soucis de la question précédente.

    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
     LesColonnes = Array(1, 28, 25, 26, 5, 27)
        For Each lecontrol In saisie.Controls
     
                   If InStr(lecontrol.Name, "_lst01") <> 0 Then 'type controle
                     Cells(noligne, LesColonnes(Lindex)) = lecontrol.Value 'lecontrol.List(cb_lst01.ListIndex)
                     Lindex = Lindex + 1
     
                     ElseIf InStr(lecontrol.Name, "_lst02") <> 0 Then 'date
                     Cells(noligne, LesColonnes(Lindex)) = lecontrol.Value 'lecontrol.List(cb_lst02.ListIndex)
                     Lindex = Lindex + 1
     
                     ElseIf InStr(lecontrol.Name, "_lst03") <> 0 Then 'commune
                     Cells(noligne, LesColonnes(Lindex)) = lecontrol.Value 'lecontrol.List(cb_lst03.ListIndex)
                     Lindex = Lindex + 1
                     ElseIf InStr(lecontrol.Name, "_txt04") <> 0 Then   'heure1 
                     Cells(noligne, LesColonnes(Lindex)) = lecontrol.Value
                     Lindex = Lindex + 1
     
                     ElseIf InStr(lecontrol.Name, "_txt05") <> 0 Then 'heure2 
                     Cells(noligne, LesColonnes(Lindex)) = lecontrol.Value
                     Lindex = Lindex + 1
     
     
                     ElseIf InStr(lecontrol.Name, "_txt06") <> 0 Then 'adresse
                     Cells(noligne, LesColonnes(Lindex)) = lecontrol.Value
                     Lindex = Lindex + 1
    merci a +

  12. #12
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Je t'ai déjà répondu à ça pour les listes
    Range(LesAdresses(Lindex).address = LeControl.value
    'ou
    Range(LesAdresses(Lindex).address = LeControl.List(LeControl.listindex)
    'selon que tu as un txtbox ou une liste
    Ce qui devrait donner pour les listes avec un tableau de colonnes à la place du tableau d'adresses :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cells(noligne, LesColonnes(Lindex)) = LeControl.List(LeControl.listindex)
    Tu dis
    A+

    J'ai regardé ton fichier
    Tu fais une saisie dans dans un combobox. Pas étonnant que ça ne fonctionne pas. Un combo est fait pour contenir une liste dans laquelle tu sélectionnes un item. Tu as deux solutions : Ou tu établis une liste des villes que tu utilises pour renseigner ta "comboVilles" ou tu utilises un Textbox. Je regarde ce qu'on peut faire car je me doute que ce n'est pas la seule
    A+

    Alors voilà :
    - Tu as une colonne date mais pas de champ date.
    - Tu as une colonne "Nombre d'intervenants" mais pas de champ correspondant
    1 - Tu as des colonnes pour Q1, Q2... Comment indiques-tu la bonne colonne si tu n'ajoutes pas une condition dans la liste correspondante ?
    2 - Tu donnes à tes contrôles des N° identiques. Dans la méthode que je t'ai données, ces numéros doivent servir d'index pour l'utilisation du tableau de colonnes. Si tu donnes deux fois le N° 01, tu auras deux fois la même colonne : c'est le dernier contrôle qui gagne ?
    3 - Ensuite, pour les horaires, tu as deux champs. Bien. Mais tu n'as qu'une colonne
    4 - Comment veux-tu affecter un même index à deux textbox dont tu concatènes la saisie dans une même colonne ?
    5 - Ensuite, tu dois imaginer que les horaires pourraient, plus loin dans ton projet, te servir pour un décompte des heures. Si tu concatènes l'heure de début et l'heure de fin, comment feras-tu simplement le calcul.

    Si tu peux répondre à mes deux premières questions et éclaircir tes idées quant à mes deux dernières interrogations, on verra ce qu'on peut faire...
    En attendant je ne peux guère t'aider.
    A+

  13. #13
    Membre éclairé Avatar de lio62
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    472
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 472
    Par défaut
    bonjour, ouskel

    je t'envoie un fichier "propre" tel qu'il dervait etre fini mais il faut que je le prepare

    merci a+

  14. #14
    Membre éclairé Avatar de lio62
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    472
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 472
    Par défaut
    bonsoir j'ai essayé de faire un fichier a peu près propre

    j'ai tout mis les données et problèmes dans une feuille RECAP


    merci a+

  15. #15
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Déjà, pour les dates, tu n'es pas obligé de les placer sur une feuille
    Pourquoi ne remplis-tu pas ton combo en mettant des bornes sur les dates
    Tu peux faire ça à l'init de ton combo
    Private Sub userform_initialize()
    DateDansComboDates
    End Sub

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub DateDansComboDates()
    Dim LaDate as date, i as date
        LaDate = Date - 30 'commence le combo à aujourd'hui - 30 jours
        For i = LaDate To LaDate + 60 'le finit à aujourd'hui + 30
            cb_lst02.AddItem i
        Next
    End Sub
    ... et dans le bon format
    Pour faire ça, supprime l'adresse que tu as placée en dur dans le Rowsource de la combo.
    La concaténation des horaires pose pb. Je regarde

  16. #16
    Membre éclairé Avatar de lio62
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    472
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 472
    Par défaut
    bonsoir Ousk
    merci pour les dates je ne connaissais pas
    c fait ca tourne
    et pourquoi il me met les donées partout j'ai pourtant rectifié j'ai mis les control par ordre croissant ?

    merci a+

Discussions similaires

  1. [VBA-E] Liaison vers une feuille non excistante
    Par Myogtha dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 07/03/2007, 12h44
  2. [VBA-A] liaison entre deux tables
    Par lumbroso dans le forum VBA Access
    Réponses: 16
    Dernier message: 01/06/2006, 10h22
  3. [VBA-E] liaison entre Excel et Word
    Par fred bx dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 22/05/2006, 10h45
  4. [VBA-E]rafraichissement d'une listbox
    Par bastien62200 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 28/02/2006, 13h27
  5. Probleme de liaison entre une requete et un objet...
    Par actibluelevrai dans le forum Access
    Réponses: 4
    Dernier message: 20/11/2005, 20h26

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