Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 03/11/2011, 19h19   #1
Invité de passage
 
Inscription : janvier 2009
Messages : 6
Détails du profil
Informations personnelles :
Âge : 49

Informations forums :
Inscription : janvier 2009
Messages : 6
Points : 0
Points : 0
Par défaut Gestion d'une ListBox

Bonjour,

Dans un excel (2002&2003), je souhaiterais pouvoir alimenter un USF

1) que je charge depuis la feuiille "Formation"

Code :
1
2
3
4
5
6
7
 
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) 
        If Target.Column = 7 Then 
                F_RIF_1.Show 
        End If 
        Cancel = True 
End Sub
Et" F_RIF" (USF) s'ouvre en étant initialisé ainsi

Code :
1
2
3
4
5
6
7
8
9
 
Private Sub UserForm_Initialize() 
    With ListBox1 
        .ColumnCount = 4 
        .ColumnWidths = "80;100;100;50" 
        .RowSource = "Transit_RdV_RIF!a2:d1000" 
        .MultiSelect = fmMultiSelectSingle 
    End With 
End Sub
en chargeant les valeurs contenues dans la feuille "Transit_RdV_RIF"

Jusque là, tout se déroule comme prévu, sauf que, je n'ai besoin que
]d'une part, des lignes dont la valeur est nulle (= " ") de la colonne
A (date)
d'autre part, des valeurs des colonnes B (Noms), C (Prénoms) & D (N°
de Tél).
en vue d'une sélection pour alimenter la feuille "Formation" qui est
ma cellule active du départ
afin de récupérer le nom, Prénom et le N° de Tél.

Là je sèche ..... comme une étoile à marée basse

Merci de vos éclairages

Cordialement

JeanYves
JeanYvesGascon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/11/2011, 21h17   #2
Responsable Visual Basic
 
Avatar de bbil
 
Inscription : juin 2003
Messages : 11 773
Détails du profil
Informations personnelles :
Âge : 45
Localisation : France, Ariège (Midi Pyrénées)

Informations forums :
Inscription : juin 2003
Messages : 11 773
Points : 16 849
Points : 16 849
Envoyer un message via Skype™ à bbil
JeanYvesGascon pourrai tu nous dire cela autrement ..:

Citation:
Jusque là, tout se déroule comme prévu, sauf que, je n'ai besoin que
]d'une part, des lignes dont la valeur est nulle (= " ") de la colonne
A (date)
d'autre part, des valeurs des colonnes B (Noms), C (Prénoms) & D (N°
de Tél).
en vue d'une sélection pour alimenter la feuille "Formation" qui est
ma cellule active du départ
afin de récupérer le nom, Prénom et le N° de Tél.
je comprends pas ce que tu veux est-ce les noms et prénoms et n°Tel des lignes pour les-quelles la date n'est pas renseignée ?
bbil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/11/2011, 21h36   #3
Expert Confirmé
 
Avatar de patricktoulon
 
patrick
Inscription : avril 2009
Messages : 1 829
Détails du profil
Informations personnelles :
Nom : patrick
Âge : 42
Localisation : France, Var (Provence Alpes Côte d'Azur)

Informations professionnelles :
Secteur : Bâtiment

Informations forums :
Inscription : avril 2009
Messages : 1 829
Points : 2 857
Points : 2 857
Envoyer un message via MSN à patricktoulon
re
essaie ça:

Edit: j'ai commenté le code
Code :
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
48
49
 
 
sub truc_machin()
 
    ListBox1.Clear    'on vide la liste  au cas ou elle a été rempli anterieurement
'on prend en compte la colonne A juste qu'a la derniere ligne utilisée
    With Worksheets("Transit_RdV_RIF").Range("a1:a" & Sheets("Transit_RdV_RIF").Range("a65530").End(xlUp).Row)
        'la variable c devient la premiere cellule qui est vide en colonne a
        Set c = .Find("", LookIn:=xlValues)
        ' si il y a une occurence
        If Not c Is Nothing Then
            'la variable firstadress devient l'adresse de l'ocurence
            firstAddress = c.Address
            'on commence une boucle do
            Do
                ' avec la listbox 1
                With Me.ListBox1
                    .ColumnCount = 4    'on i met 4 colonnes
                    'on ajoute un item
                    .AddItem
                    'la variable i prend la valeur de l'index de l'item-1
                    i = .ListCount - 1
                    ' maintenant on inscrit les valeur des cellules
                    'la colonne 0 ligne du nouveau item =la cellule 1 colonne a droite de la colonne A de la ligne de lacellule trouvée
                    .List(i, 0) = c.Offset(0, 1)
 
                    'la colonne 1 ligne du nouveau item =la cellule 2 colonne a droite de la colonne A de la ligne de lacellule trouvée
 
                    .List(i, 1) = c.Offset(0, 2)
                    'la colonne 2 ligne du nouveau item =la cellule 3 colonne a droite de la colonne A de la ligne de lacellule trouvée
 
                    .List(i, 2) = c.Offset(0, 3)
                    'la listbox ne sera pas multi select (on ne peut qu'en selectionner qu'un
                    .MultiSelect = fmMultiSelectSingle
                    'on applique les largeurs au colonnes de la listbox
                    .ColumnWidths = "80;100;100;20"
                End With
                ' on cherche l'ocurence suivante
                Set c = .FindNext(c)
                ' on continu tant que que c n'est pa rien et que la nouvelle adresse de cellule ne corespond pas a la precedente
            Loop While Not c Is Nothing And c.Address <> firstAddress
        End If
    End With
 
 
 
 
 
End Sub
je pense que ça correspond a ce que tu cherche


au plaisir

re

j'ai oublié de préciser que les colonnes dans les listbox commence par zéro

donc
la première colonne c'est la colonne 0

la deuxième colonne c'est la colonne 1
et ainsi de suite
ça t'aidera a comprendre les lignes de remplissage de ta listbox


au plaisir
__________________
mes fichiers dans les contributions:
mon formulaire mail avec CDO en vba et mon formulaire mail avec CDO en vbs dans un HTA
mon nouveau mouse in out pour les boutons dans un userform
mon addin pour prendre un cliché de selection de cellules

si ton problème est résolu n'oublie pas de pointer :résolu:ça peut servir aux autres
et n'oublie pas de voter
patricktoulon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/11/2011, 21h02   #4
Invité de passage
 
Inscription : janvier 2009
Messages : 6
Détails du profil
Informations personnelles :
Âge : 49

Informations forums :
Inscription : janvier 2009
Messages : 6
Points : 0
Points : 0
Par défaut Réponse

Bonjour à tous les deux,

Je ne sais comment vous remercier pour vos éclairages
Ce qui m'a donné à réfléchir, ainsi

voici ce que cela donne

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Private Sub UserForm_Initialize() 
 
    Dim c As Range 
    Dim i As Long 
    Dim j As Integer
 
    With ListBox1 
        .ColumnCount = 4 
        .ColumnWidths = "80;100;100;50" 
        .MultiSelect = fmMultiSelectSingle 
    End With 
    For Each c In Range("Transit_RdV_RIF!A2:A[b65536].End(xlUp).Row).Cells 
        If IsEmpty(c) Then 
                ListBox1.AddItem c 
            For j = 1 To 3 
               ListBox1.List(i, j) = c.Offset(0, j) 
            Next j 
            i = i + 1 
        End If 
    Next c 
End Sub
Maintenant de souhaiterai pouvoir copier les valeurs selectionnées
la première dans la cellule active (qui me sert à appeler le
formulaire par un double click)
la deuxième décalée à droite ( ActiveCell.Offset(,1), je pense)
et la troisième décalée de deux crans à droite (ActiveCell.Offset(,2),
je crois)

Sans vouloir abuser ....

Très cordialement


Jean-Yves
JeanYvesGascon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/11/2011, 21h10   #5
Responsable Visual Basic
 
Avatar de bbil
 
Inscription : juin 2003
Messages : 11 773
Détails du profil
Informations personnelles :
Âge : 45
Localisation : France, Ariège (Midi Pyrénées)

Informations forums :
Inscription : juin 2003
Messages : 11 773
Points : 16 849
Points : 16 849
Envoyer un message via Skype™ à bbil
bonsoir :

Une question tu rajoute quoi la :
Code :
1
2
If IsEmpty(c) Then 
                ListBox1.AddItem c
? si tu n'as rien dans ta première colonne....




Pour pouvoir agir sur la ligne "sélectionnée", rajoute une colonne (cachée?) dans ton listbox et stocke y le numéro de ligne de ta feuille excel..
bbil est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 04/11/2011, 22h37   #6
Expert Confirmé Sénior
 
Avatar de Qwazerty
 
Homme Stéphane
La très haute tension :D
Inscription : avril 2002
Messages : 2 446
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Âge : 32
Localisation : France

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

Informations forums :
Inscription : avril 2002
Messages : 2 446
Points : 4 620
Points : 4 620
Envoyer un message via MSN à Qwazerty
Salut

De plus, je n'ai pas testé , mais tu voulais pas plutôt écrires quelque chose comme ça?

Code :
For Each c In Transit_RdV_RIF.Range("A2", Transit_RdV_RIF.Cells(Rows.Count, "B").End(xlUp).Offset(0, -1))
++
Qwaz
__________________

MagicQwaz := Harry Potter la baguette en moins
Le monde dans lequel on vit
HammerFest
Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer
Qwazerty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/11/2011, 22h46   #7
Invité de passage
 
Inscription : janvier 2009
Messages : 6
Détails du profil
Informations personnelles :
Âge : 49

Informations forums :
Inscription : janvier 2009
Messages : 6
Points : 0
Points : 0
Cette place vide (date) me sert à
d'une part, bien m'assurer que les personnes selectionnées (Noms, Prénoms, Tél) ne sont pas affectés pour une échéance à cette date
et d'autre part, cette date sera affecté dans un temps futur pour un autre formulaire.

Ai je bien répondu à ta question ?

Cordialement

JeanYves
JeanYvesGascon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/11/2011, 22h49   #8
Expert Confirmé Sénior
 
Avatar de Qwazerty
 
Homme Stéphane
La très haute tension :D
Inscription : avril 2002
Messages : 2 446
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Âge : 32
Localisation : France

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

Informations forums :
Inscription : avril 2002
Messages : 2 446
Points : 4 620
Points : 4 620
Envoyer un message via MSN à Qwazerty
Salut
Tu peux supprimer la variable i elle ne sert à rien.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    Dim c As Range
    Dim j As Integer
 
    With ListBox1
        .ColumnCount = 4
        .ColumnWidths = "80;100;100;50"
        .MultiSelect = fmMultiSelectSingle
    End With
    For Each c In Transit_RdV_RIF.Range("A2", Transit_RdV_RIF.Cells(Rows.Count, "B").End(xlUp).Offset(0, -1))
        If IsEmpty(c) Then
                ListBox1.AddItem c
            For j = 1 To 3
               ListBox1.List(ListBox1.ListCount - 1, j) = c.Offset(0, j)
            Next j
        End If
    Next c
++
Qwaz
__________________

MagicQwaz := Harry Potter la baguette en moins
Le monde dans lequel on vit
HammerFest
Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer
Qwazerty est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/11/2011, 18h35   #9
Expert Confirmé
 
Avatar de patricktoulon
 
patrick
Inscription : avril 2009
Messages : 1 829
Détails du profil
Informations personnelles :
Nom : patrick
Âge : 42
Localisation : France, Var (Provence Alpes Côte d'Azur)

Informations professionnelles :
Secteur : Bâtiment

Informations forums :
Inscription : avril 2009
Messages : 1 829
Points : 2 857
Points : 2 857
Envoyer un message via MSN à patricktoulon
Par défaut utilisez le bouton editer!!

bonjour a tous

la version que je t'ai donné fait le tout en une seul boucle "do loop"

et utilise le "find" et find next" beaucoup plus rapide qu'une boucle for next surtout si tu a 1000 lignes ou plus
maintenant si tu veut avoir la 1 ere colonne vide de ta listbox (je n'en vois pas l'interet )



Code :
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
 
sub truc_machin()
 
    ListBox1.Clear    'on vide la liste  au cas ou elle a été rempli anterieurement
'on prend en compte la colonne A juste qu'a la derniere ligne utilisée
    With Worksheets("Transit_RdV_RIF").Range("a1:a" & Sheets("Transit_RdV_RIF").Range("a65530").End(xlUp).Row)
        'la variable c devient la premiere cellule qui est vide en colonne a
        Set c = .Find("", LookIn:=xlValues)
        ' si il y a une occurence
        If Not c Is Nothing Then
            'la variable firstadress devient l'adresse de l'ocurence
            firstAddress = c.Address
            'on commence une boucle do
            Do
                ' avec la listbox 1
                With Me.ListBox1
                    .ColumnCount = 5   'on i met 5 colonnes
                    'on ajoute un item
                    .AddItem
                    'la variable i prend la valeur de l'index de l'item-1
                    i = .ListCount - 1
                    ' maintenant on inscrit les valeur des cellules
                    'la colonne 0 ligne du nouveau item =la cellule 1 colonne a droite de la colonne A de la ligne de lacellule trouvée
                    .List(i, 0) = c 
                    'la colonne 1 ligne du nouveau item =la cellule 2 colonne a droite de la colonne A de la ligne de lacellule trouvée
 
                    .List(i, 1) = c.Offset(0, 1)
                    'la colonne 2 ligne du nouveau item =la cellule 3 colonne a droite de la colonne A de la ligne de lacellule trouvée
 
                    .List(i, 2) = c.Offset(0, 2)
                    'la listbox ne sera pas multi select (on ne peut qu'en selectionner qu'un
 
 .List(i, 2) = c.Offset(0, 3)
 
 
'ainsi on se retrouve en colonne 1 la valeur vide trouvée en colonne a de ton sheets et ainsi de suite
 
.MultiSelect = fmMultiSelectSingle
                    'on applique les largeurs au colonnes de la listbox
                    .ColumnWidths = "80;100;100;20"
                End With
                ' on cherche l'ocurence suivante
                Set c = .FindNext(c)
                ' on continu tant que que c n'est pa rien et que la nouvelle adresse de cellule ne corespond pas a la precedente
            Loop While Not c Is Nothing And c.Address <> firstAddress
        End If
    End With

maintenant moi a ta place d'une colonne vide dans ma listbox j'y mettrais le numéro de ligne et je mettrais le width de la première colonne a 0(invisible)

ainsi en cliquant sur ta listbox par la suite tu a la donnée et la ligne ou elle se trouve ça évite en cas de traitement sur le sheets de devoir réutiliser le find ou find next pour retrouver la ligne

a méditer

au plaisir

sinon en reprenant le code de qwazerty tu y met dans la colonne 0 comme te l'a suggéré bill et moi meme le numero de ligne

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
Dim c As Range
    Dim j As Integer
 
    With ListBox1
        .ColumnCount = 4
        .ColumnWidths = "5;100;100;50"
        .MultiSelect = fmMultiSelectSingle
    End With
    For Each c In Transit_RdV_RIF.Range("A2", Transit_RdV_RIF.Cells(Rows.Count, "B").End(xlUp).Offset(0, -1))
        If IsEmpty(c) Then
                ListBox1.AddItem c.row' dans la premiere colonne on y trouvera le numero de lignetu peut la masquer ta colonne 
            For j = 1 To 3
               ListBox1.List(ListBox1.ListCount - 1, j) = c.Offset(0, j)
            Next j
        End If
    Next c

au plaisir
__________________
mes fichiers dans les contributions:
mon formulaire mail avec CDO en vba et mon formulaire mail avec CDO en vbs dans un HTA
mon nouveau mouse in out pour les boutons dans un userform
mon addin pour prendre un cliché de selection de cellules

si ton problème est résolu n'oublie pas de pointer :résolu:ça peut servir aux autres
et n'oublie pas de voter
patricktoulon est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h56.


 
 
 
 
Partenaires

Hébergement Web