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]listbox et button option


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 164
    Points : 43
    Points
    43
    Par défaut [VBA-E]listbox et button option
    salut
    voila j'ai besoin de votre aide:
    dans une page excel (colone A) j'ai une liste de travaux et (colonne B) un etat d'avancement (0 - 25 - 50 - 75 - 100 %)

    j'ai donc effectue un userform avec un lisbox me recopiant tout les travaux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Public Sub iniListBox1()
    Dim c As Range
     
    With Sheets("v43")
        For Each a In .Range("a2:a" & .Range("a65536").End(xlUp).Row)
            ListBox1.AddItem a
            ListBox1.List(ListBox1.ListCount - 1, 1) = a.Row
     
        Next a
    End With
    End Sub
    et j'ai aussi un label contenant 5 boutons options ( 0 - 25 - 50 - 75 - 100)

    Alors , j'aimerais que, lorsque je selectionne un travail dans le listbox , que le bouton option correspopndant a la valeur de l'avencement soit coché.

    puis

    si je coche un autre bouton option pour ce meme travail , effectuer le changement dans la page excel grace a un bouton .

    voila , merci de votre aide

  2. #2
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    tiens voila pour récupérer valeur avancement...

    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
    Private Sub ListBox1_Click()
     Dim iAdv As Integer
      Label1 = Sheets("V43").Range("A2").Offset(ListBox1.ListIndex)  'Recupére travail sélectionné
      iAdv = Sheets("V43").Range("A2").Offset(ListBox1.ListIndex, 1) 'Recupére avancement
      Select Case iAdv
         Case 0
           opt0.Value = True
         Case 25
           Opt25 = True
         Case 50
           Opt50 = True
         Case 75
           Opt75 = True
         Case 100
           Opt100 = True
        Case Else
          MsgBox "Valeur avancement incorecte " & iAdv
        End Select
    End Sub

  3. #3
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    et pour écrire dans feuille exel...
    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
    Private Sub opt0_Click()
     MajAdv
    End Sub
    Private Sub opt25_Click()
     MajAdv
    End Sub
    Private Sub opt50_Click()
     MajAdv
    End Sub
    Private Sub opt75_Click()
     MajAdv
    End Sub
    Private Sub opt100_Click()
     MajAdv
    End Sub
     
     
    Sub MajAdv()
      If ListBox1.ListIndex >= 0 Then
     
        If opt0 Then Sheets("V43").Range("A2").Offset(ListBox1.ListIndex, 1) = 0
        If Opt25 Then Sheets("V43").Range("A2").Offset(ListBox1.ListIndex, 1) = 25
        If Opt50 Then Sheets("V43").Range("A2").Offset(ListBox1.ListIndex, 1) = 50
        If Opt75 Then Sheets("V43").Range("A2").Offset(ListBox1.ListIndex, 1) = 75
        If Opt100 Then Sheets("V43").Range("A2").Offset(ListBox1.ListIndex, 1) = 100
     
      End If
    End Sub

  4. #4
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 164
    Points : 43
    Points
    43
    Par défaut
    super
    merci , par contre pour eviter de mauvaise manip j'avais incruster un bouton "confirmer" permetant de valider la modif (post precedent)

    alors comment l integrer dans la modif des valeur : le code que tu m'avais donner pour le bouton valider avec le Mdp marche tres bien , mais comment compilé les 2

    encore merci a toi

  5. #5
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 164
    Points : 43
    Points
    43
    Par défaut
    autant pour moi
    j ai supprimer :
    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
    Private Sub opt0_Click() 
     MajAdv 
    End Sub 
    Private Sub opt25_Click() 
     MajAdv 
    End Sub 
    Private Sub opt50_Click() 
     MajAdv 
    End Sub 
    Private Sub opt75_Click() 
     MajAdv 
    End Sub 
    Private Sub opt100_Click() 
     MajAdv 
    End Sub
    et renvoyer mon bouton_click vers majadv

    merci a toi

  6. #6
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 164
    Points : 43
    Points
    43
    Par défaut
    par contre , comment serait il possible de faire une barre d'avancement en fonction du pourcentage des travaux

    j'ai dans ma page ( ou il y a les travaux et valeur d'avencement ) fait un calcul de la moyenne des pourcentages et a partir de cette valeur j'aimerais voir une barre de defilement sur mon userform :

    est - ce possible ? et comment faire?


    et enfin :
    dans le userform ou s'affiche tout mes traveaux et bouton option , j'ai des bouton que j'aimerais utiliser pour n'afficher que les traveaux a 50% ou 25 ou 75 dans le listbox en fonction du bouton : c'est possible

    merci

  7. #7
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    pour la barre de défilement il doit y avoir un contrôle .. mais je sais plus lequel ... tu peu en bricoler 1 avec 2 controle image ..., superposé.. de même taille.. et de couleur différente.. et tu fais varier la taille du contrôle au premier plan par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Image1.Width = 2 * Sheets("V43").Range("A2").Offset(ListBox1.ListIndex, 1)
    ...

    pour le filtrage de ta liste, il te faut que tu rajoute une option à ta fonction InitListe..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Public Sub iniListBox1(Optional Filtre As Integer = -1)
    Dim c As Range
    ListBox1.Clear
    With Sheets("v43")
        For Each A In .Range("a2:a" & .Range("a65536").End(xlUp).Row)
            If Filtre = -1 Or Filtre = A.Offset(0, 1) Then
             ListBox1.AddItem A
             ListBox1.List(ListBox1.ListCount - 1, 1) = A.Row
            End If
        Next A
    End With
    End Sub
    puis tu appelle ta fonction suivant l'initialisation à effectuer :
    initListbox1 ' ... pour toutes les lignes
    initListBox1 50 '... pour travaux à 50%
    ..

  8. #8
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 164
    Points : 43
    Points
    43
    Par défaut
    ok

    pour la barre , j'ai essayer en faisant comme tu dit : 2 zone image identique superpose avec ton code mais aussi ca :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Private Sub Image2_click()
    Image2.Width = Image1.Width * Sheets("V43").Range("c1").Offset(ListBox1.ListIndex, 1)
    End Sub
    pour multiplier la taille de 1 par le rapport de pourcentage ( <1) afin d'obtenir la taille de 2
    mais ca plante

  9. #9
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 164
    Points : 43
    Points
    43
    Par défaut
    Citation Envoyé par bbil
    pour le filtrage de ta liste, il te faut que tu rajoute une option à ta fonction InitListe..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Public Sub iniListBox1(Optional Filtre As Integer = -1)
    Dim c As Range
    ListBox1.Clear
    With Sheets("v43")
        For Each A In .Range("a2:a" & .Range("a65536").End(xlUp).Row)
            If Filtre = -1 Or Filtre = A.Offset(0, 1) Then
             ListBox1.AddItem A
             ListBox1.List(ListBox1.ListCount - 1, 1) = A.Row
            End If
        Next A
    End With
    End Sub
    puis tu appelle ta fonction suivant l'initialisation à effectuer :
    initListbox1 ' ... pour toutes les lignes
    initListBox1 50 '... pour travaux à 50%
    ..
    disont que je bloque sur le principe : faut il faire autant de code que de bouton de filtre , comment va t il savoir que je veux les 25 ou 50 ou 75 .car dans ton code je ne voi aucune condition en rapport avec le %age

    merci

  10. #10
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 164
    Points : 43
    Points
    43
    Par défaut
    bon
    pour la barre c'est ok , j'ai mis ma ligne de commande dans userform_initialize et a chaque validation , et c'est bon

    reste plus que le filtre

    merci a toi

  11. #11
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    ben mon filtre ... c'est le paramétre que tu donne ... à Initliste... , j'ai supposé que tu ne voulais qu'une seule des valeurs .. 0 25 50 75 100 dans ta liste , tu passe cette valeur à initliste, derriére un bouton par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    initListBox1 50 '... pour travaux à 50%
    dans mon code le test du filtre et effectuer sur la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Filtre = -1 Or Filtre = A.Offset(0, 1) Then
    j'ai utiliser -1 comme paramétre par défaut permettant d'afficher tous les enregistrement...

    ? c'est plus clair ?

  12. #12
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 164
    Points : 43
    Points
    43
    Par défaut
    en fait, ce que je ne comprend pas , c est le liens entre -1 et afficher tout , que mettre pour ne voir que les 25% ou 50%

    je comprend l'ensemble du code , mais je bloque sur la condition du test

    j'ai bien 1 bouton par % ( 0-25-50-75-100) mais j'arrive pas a faire le liens avec ton code pour chaque bouton


    Ps : pour la barre , l'erreur se produit qd je rajoute :
    .Offset(ListBox1.ListIndex, 1)
    donc j'ai supprimer et c'est bon !!


    une petite dernier question :
    je pense que tu a compris le principe de mon projet , mais j'ai creer un multipage dans ce userform avec 6 onglets dans lesquels on retrouve exactement les memes choses ( option - bouton - llistbox) et le meme principe a la difference pres des données qui viennent d'une autre page excel :
    ma question est de savoir si je doit retaper les memes codes pour chaque partie ( en changeant nom des bouton et autres) ou il y a une facon plus simple de faire


    merci enormement

  13. #13
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    Bien avec le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    (..)
            If Filtre = -1 Or Filtre = A.Offset(0, 1) Then
             ListBox1.AddItem A
    (..)
    je rajoute A ..(la cellule en cours dans boucle for..) si le filtre est = -1 ou si le filtre est égal à la cellule à droite de la cellule pointée par la variable range A...


    Tu dois pouvoir utiliser le même userform partout... tu peu peu être rajouter une variable globale à l'userForm .. , en haut du code :



    tu remplace dans l'userform tous les Sheets("v43") par sh...

    et avant l'ouverture de l'userform tu affecte la bonne feuille à la variable


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    set Userform1.sh = Sheets("v43") 
    Userform1.show

  14. #14
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 164
    Points : 43
    Points
    43
    Par défaut
    bon , encore merci , mais je crois que tu va me prendre pour un debile mais je pige rien a ce filtre.

    en fait je ne vois pas ou il y a recherche de tel ou tel ligne de travaux contenant 25 ou 50 %

    sinon pour le reste j'ai du mal m'expliquer

    voila mon fichier xls si tu veux :
    http://lazouille83.free.fr/divers/travaux.xls

    desole mais j'arrive pas a te suivre

    merci tout de meme

  15. #15
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    bon j'ai regardé ton code ... pour ce qui est de la sélection des enregistrement rajoute :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Private Sub CommandButton1_Click()
    iniListBox1
    End Sub
     
    Private Sub CommandButton2_Click()
    iniListBox1 50
    End Sub
     
    Private Sub CommandButton3_Click()
    iniListBox1 100
    End Sub
    et remplace la procédure Inilistbox1.. par celle que j'ai posté plus haut... , profite en pour corriger la ligne
    dim c as range qui devient dim a as range

  16. #16
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    pour l'lhistoire multipage ... je n'avais pas tout compris....

    pour utilise le même code pour toute les pages .. limite le nombre de contrôle à un seul exemplaire ...:

    , commence par "vider toutes les pages ormis la V43..."
    déplace les contrôles de la V43 hors de la page...
    réduit la page...
    et replace les contrôles dessous...


    rajoute la ligne



    tout en haut du code de l'userform pour déclarer la variable SH ... et modifie l'affectation de la variable SH sur changement de page (et à l'initialisation ..)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub MultiPage1_Change()
     Set sh = ThisWorkbook.Sheets(MultiPage1.Pages(MultiPage1.Value).Caption)
     iniListBox1
     End Sub
     
    Private Sub UserForm_Initialize() 'initialisation du userform
     Set sh = ThisWorkbook.Sheets(MultiPage1.Pages(MultiPage1.TabIndex).Caption)
    iniListBox1
    Label2ini
    majbarre
    End Sub
    remplace dans tous ton code Sheets("V43"). par sh.


  17. #17
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 164
    Points : 43
    Points
    43
    Par défaut
    cool , je te remercie enormement , ca marche tres bien
    par contre, j'aimerais , qd un bouton 0 -50 ou 100 est selectionne et que j'effectue une modification d'un avancement par l'intermediare d'un bouton option coinfirmer par le bouton valider , que le listbox soit mis a jour.

    faut il que je rajoute dans bouton_click l'action inilistbox1, ou les 3 ( inilisbox 1 50 - inilisbox1 100)
    car comment faire pour lui faire actualise la liste en fonction du filtre

    merci a toi

    je marque le sujet comme resolu , car c'est deja bien comme ca


  18. #18
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    Citation Envoyé par zouille
    faut il que je rajoute dans bouton_click l'action inilistbox1, ou les 3 ( inilisbox 1 50 - inilisbox1 100)
    non pas les trois... sinon seulement le dernier sera pirs en compte... crèe par exemple une variable globale à l'userform ..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dim memFiltre as integer
    pour mémoriser le dernier filtre utilisé

    modifie la fonction inilistbox1... pour mettre à jour la mémorisation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Private Sub iniListBox1(Optional Filtre As Integer = -1)
    Dim a As Range
    memFiltre = Filtre
    ListBox1.Clear 
    (...)
    puis sur ton bouton valider ... pour mise à jour tu fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Private Sub CommandButton4_Click()
      Dim ret As Integer
      ret = MsgBox("Confirmer la modificaiton", vbOKCancel)
      If ret = vbOK Then
        MajAdv
        iniListBox1 memFiltre
      End If
    End Sub

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

Discussions similaires

  1. VBA Excel - Listbox - Removeitem
    Par jmh51 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 23/02/2007, 15h31
  2. [VBA-E] ListBox Valeur dejà ajouté?
    Par Yoshiblow dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 26/01/2007, 11h20
  3. VBA regroupement date selon choix option (par jour, par mois)
    Par IndyJones dans le forum VBA Access
    Réponses: 2
    Dernier message: 04/12/2006, 20h06
  4. [VBA-E] ListBox et Codes postaux
    Par forsay1 dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 13/03/2006, 10h07
  5. [VBA][Access]: Listbox se référant à une autre BD
    Par Alexj51 dans le forum Access
    Réponses: 4
    Dernier message: 07/02/2006, 15h36

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