Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

VBA - Pb de remplissage d'une combobox

6 réponses
Avatar
danielos
Bonjour =E0 toutes et =E0 tous,

J'ai conscience que mon post est long mais il me semble n=E9cessaire de=20
donner les =E9l=E9ments utilis=E9s qui peuvent =EAtre =E0 l'origine de mo=
n probl=E8me.

La situation :
J'ai 2 textbox (TextBox3 et TextBox4) sur un Userform1 pour recevoir 2=20
dates.
Ces dates sont valid=E9es par un bouton (ButtonValidationInfos) si elles =

sont coh=E9rentes D2>D1, elles sont envoy=E9es vers une feuille=20
(Donn=E9es_USF)pour pouvoir =E9tablir la liste entre ces 2 dates qui=20
serviront =E0 alimenter une ComboBox (CB_Jour) situ=E9e sur un Userform2.=

La liste des jours entre les 2 dates est r=E9alis=E9e avec une macro=20
List_Jour, et affich=E9e dans la colonne E.
La longueur de la liste =E9tant variable, elle est nomm=E9e Jour et d=E9f=
inie=20
avec la fonction DECALER.
Cette liste alimente la combo CB_Jour lors de l'initialisation du Userfor=
m2.
Un bouton (ButtonRetour)situ=E9 sur le Userform2 permet de revenir sur le=
=20
Userform1 pour pouvoir modifier les dates.

Mon probl=E8me, car =E9videment j'en ai un (au moins) :
Lors d'une premi=E8re saisie (D1 et D2) sur USF1 : OK
Ouverture de USF2 : OK
Remplissage CB_Jour : OK
Retour USF1 : OK
Modification D2 (>D2 initiale) : OK
Ouverture USF2 : OK
Remplissage CB_Jour : Pas OK - M=EAme liste qu'avant alors que la liste=20
dans la colonne E est bonne !
Retour USF1 : OK
Modification D2 (<D2 initiale mais toujours >D1 quand m=EAme) : OK
Ouverture USF2 : OK
Remplissage CB_Jour : Liste OK mais j'ai un paquet de lignes vides qui=20
doit correspondre =E0 la diff=E9rence entre D2 initiale et D2 actuelle.


J'ai l'impression que la liste nomm=E9e Jour qui correspond aux donn=E9es=
de=20
la colonne E n'est pas actualis=E9e. Pourtant en faisant D=E9finir un Nom=
=20
lorsque je vais sur Jour et que je met le curseur sur la fonction=20
D=E9caler, il n'y a bien que les cellules remplies qui sont entour=E9es.

Est-ce grave docteur ? Non plus s=E9rieusement,
Est-ce la raison ?
Comment y rem=E9dier ?

Merci d'avance pour votre aide.


Ci-dessous les codes :

Sur USF1

Private Sub TextBox3_Change()
'V=E9rification que la saisie est uniquement num=E9rique
If Not IsNumeric(Right(TextBox3, 1)) And Right(TextBox3, 1) <> "/" Then=

MsgBox "Le caractere saisi n'est pas valide - Utiliser=20
uniquement des chiffres - Format attendu jj/mm/aaaa"
TextBox3 =3D Left(TextBox3, Len(TextBox3) - 1)
End If
'longueur maximale de la saisie pour un format xx/xx/xxxx
Dim Valeur As Byte
TextBox3.MaxLength =3D 10 'nb caracteres maxi dans textbox
Valeur =3D Len(TextBox3)
End Sub

Private Sub TextBox4_Change()
'V=E9rification que la saisie est uniquement num=E9rique
If Not IsNumeric(Right(TextBox4, 1)) And Right(TextBox4, 1) <> "/" Then=

MsgBox "Le caractere saisi n'est pas valide - Utiliser=20
uniquement des chiffres - Format attendu jj/mm/aaaa"
TextBox4 =3D Left(TextBox4, Len(TextBox4) - 1)
End If
'longueur maximale de la saisie pour format xx/xx/xxxx
Dim Valeur As Byte
TextBox4.MaxLength =3D 10 'nb caracteres maxi dans textbox
Valeur =3D Len(TextBox4)
End Sub

Private Sub ButtonValidationInfos_Click()
Sheets("Donn=E9es_USF").Cells(3, 2).Value =3D CDate(UserForm1.TextBox3.Va=
lue)
Sheets("Donn=E9es_USF").Cells(4, 2).Value =3D CDate(UserForm1.TextBox4.Va=
lue)

'V=E9rification coh=E9rence dates
If Sheets("Donn=E9es_USF").Cells(4, 2).Value <=3D=20
Sheets("Donn=E9es_USF").Cells(3, 2).Value Then
MsgBox "Attention : Vous ne pouvez finir avant d'avoir commenc=E9 "
Else
List_Jour
End If
End Sub

Private Sub ButtonVersProgrammation_Click()
UserForm1.Hide
UserForm2.Show False 'USF en mode non modale
End Sub

Sur USF2

Private Sub UserForm_Initialize()
CB_Jour.RowSource =3D ("Donn=E9es_USF!Jour") 'remplit la combo Choix Jour=

End Sub

Private Sub ButtonRetour_Click()
UserForm2.Hide
UserForm1.Show False 'USF en mode non modale
End Sub


La macro List_Jour

Sub List_Jour()
Sheets("Donn=E9es_USF").Select
If Range("B4").Value <=3D Range("B3").Value Then
Exit Sub
Else
Range("E2:E65536").Select
Selection.ClearContents
Range("E2").Select
New_date =3D Cells(3, 2).Value
Do While New_date <=3D Cells(5, 2).Value
ActiveCell.FormulaR1C1 =3D New_date
New_date =3D New_date + 1
ActiveCell.Offset(1, 0).Range("A1").Select
Loop
End If
End Sub

La colonne des date (Donn=E9es_USF!E) est nomm=E9e Jour
avec la fonction DECALER

=3DDECALER(Donn=E9es_USF!$E$2;;;NBVAL(Donn=E9es_USF!$E:$E)-1)

6 réponses

Avatar
DanielCo
Bonjour,
La macro "Private Sub UserForm_Initialize()
" ne s'exécute qu'au chargement de l'userform. Soit tu décharges
l'userform (unload me), soit tu mets l'instruction :
CB_Jour.RowSource = ("Données_USF!Jour")
dans :
Sub UserForm_Activate()
Cordialement.
Daniel
Avatar
MichD
Bonjour,

Tu ne peux pas utiliser un nom défini à l'aide de la fonction decaler()
pour la propriété RowSource d'un combobox.

Cependant, tu peux utiliser un "nom" en ajoutant une ligne de code lorsque
tu ajoutes une donnée "date" à la liste de la feuille.

En supposant que la liste débute en E2 de la feuille "Toto"
Le nom de la plage pour les besoins de la plage est : "SonNom"
Tu utilises ce nom pour définir la propriété "RowSource" de ton combobox

With worksheets("Toto")
.Range("E2:E" & .Range("E65536").end(xlup).row).Name = "SonNom"
End With

OU tu pourrais renseigner directement la propriété "RowSource"

With Worksheets("Toto")
Me.ComboBox1.RowSource = .Name & "!" & .Range("E2:E" & .Range("E65536").End(xlUp).Row).Address
End With


MichD
--------------------------------------------
"danielos" a écrit dans le message de groupe de discussion : j2bk8a$t9d$

Bonjour à toutes et à tous,

J'ai conscience que mon post est long mais il me semble nécessaire de
donner les éléments utilisés qui peuvent être à l'origine de mon problème.

La situation :
J'ai 2 textbox (TextBox3 et TextBox4) sur un Userform1 pour recevoir 2
dates.
Ces dates sont validées par un bouton (ButtonValidationInfos) si elles
sont cohérentes D2>D1, elles sont envoyées vers une feuille
(Données_USF)pour pouvoir établir la liste entre ces 2 dates qui
serviront à alimenter une ComboBox (CB_Jour) située sur un Userform2.
La liste des jours entre les 2 dates est réalisée avec une macro
List_Jour, et affichée dans la colonne E.
La longueur de la liste étant variable, elle est nommée Jour et définie
avec la fonction DECALER.
Cette liste alimente la combo CB_Jour lors de l'initialisation du Userform2.
Un bouton (ButtonRetour)situé sur le Userform2 permet de revenir sur le
Userform1 pour pouvoir modifier les dates.

Mon problème, car évidement j'en ai un (au moins) :
Lors d'une première saisie (D1 et D2) sur USF1 : OK
Ouverture de USF2 : OK
Remplissage CB_Jour : OK
Retour USF1 : OK
Modification D2 (>D2 initiale) : OK
Ouverture USF2 : OK
Remplissage CB_Jour : Pas OK - Même liste qu'avant alors que la liste
dans la colonne E est bonne !
Retour USF1 : OK
Modification D2 (<D2 initiale mais toujours >D1 quand même) : OK
Ouverture USF2 : OK
Remplissage CB_Jour : Liste OK mais j'ai un paquet de lignes vides qui
doit correspondre à la différence entre D2 initiale et D2 actuelle.


J'ai l'impression que la liste nommée Jour qui correspond aux données de
la colonne E n'est pas actualisée. Pourtant en faisant Définir un Nom
lorsque je vais sur Jour et que je met le curseur sur la fonction
Décaler, il n'y a bien que les cellules remplies qui sont entourées.

Est-ce grave docteur ? Non plus sérieusement,
Est-ce la raison ?
Comment y remédier ?

Merci d'avance pour votre aide.


Ci-dessous les codes :

Sur USF1

Private Sub TextBox3_Change()
'Vérification que la saisie est uniquement numérique
If Not IsNumeric(Right(TextBox3, 1)) And Right(TextBox3, 1) <> "/" Then
MsgBox "Le caractere saisi n'est pas valide - Utiliser
uniquement des chiffres - Format attendu jj/mm/aaaa"
TextBox3 = Left(TextBox3, Len(TextBox3) - 1)
End If
'longueur maximale de la saisie pour un format xx/xx/xxxx
Dim Valeur As Byte
TextBox3.MaxLength = 10 'nb caracteres maxi dans textbox
Valeur = Len(TextBox3)
End Sub

Private Sub TextBox4_Change()
'Vérification que la saisie est uniquement numérique
If Not IsNumeric(Right(TextBox4, 1)) And Right(TextBox4, 1) <> "/" Then
MsgBox "Le caractere saisi n'est pas valide - Utiliser
uniquement des chiffres - Format attendu jj/mm/aaaa"
TextBox4 = Left(TextBox4, Len(TextBox4) - 1)
End If
'longueur maximale de la saisie pour format xx/xx/xxxx
Dim Valeur As Byte
TextBox4.MaxLength = 10 'nb caracteres maxi dans textbox
Valeur = Len(TextBox4)
End Sub

Private Sub ButtonValidationInfos_Click()
Sheets("Données_USF").Cells(3, 2).Value = CDate(UserForm1.TextBox3.Value)
Sheets("Données_USF").Cells(4, 2).Value = CDate(UserForm1.TextBox4.Value)

'Vérification cohérence dates
If Sheets("Données_USF").Cells(4, 2).Value < Sheets("Données_USF").Cells(3, 2).Value Then
MsgBox "Attention : Vous ne pouvez finir avant d'avoir commencé "
Else
List_Jour
End If
End Sub

Private Sub ButtonVersProgrammation_Click()
UserForm1.Hide
UserForm2.Show False 'USF en mode non modale
End Sub

Sur USF2

Private Sub UserForm_Initialize()
CB_Jour.RowSource = ("Données_USF!Jour") 'remplit la combo Choix Jour
End Sub

Private Sub ButtonRetour_Click()
UserForm2.Hide
UserForm1.Show False 'USF en mode non modale
End Sub


La macro List_Jour

Sub List_Jour()
Sheets("Données_USF").Select
If Range("B4").Value <= Range("B3").Value Then
Exit Sub
Else
Range("E2:E65536").Select
Selection.ClearContents
Range("E2").Select
New_date = Cells(3, 2).Value
Do While New_date <= Cells(5, 2).Value
ActiveCell.FormulaR1C1 = New_date
New_date = New_date + 1
ActiveCell.Offset(1, 0).Range("A1").Select
Loop
End If
End Sub

La colonne des date (Données_USF!E) est nommée Jour
avec la fonction DECALER

ÞCALER(Données_USF!$E$2;;;NBVAL(Données_USF!$E:$E)-1)
Avatar
isabelle
bonjour Denis,

Le 2011-08-15 15:35, MichD a écrit :

Tu ne peux pas utiliser un nom défini à l'aide de la fonction decaler()
pour la propriété RowSource d'un combobox.



j'suis pas sur de ça,
http://cjoint.com/?AHpwDPfOOWs


--
isabelle
Avatar
MichD
Bonjour Isabelle,

Pour moi, l'utilité première de la fonction "Decaler" dans la définition
d'un nom est de permettre l'actualisation de ce dernier au fur et à mesure
que des données sont ajoutées et faciliter le traitement.Clairement dans ce
cas, l'usage de la fonction ne remplit pas ce mandat et toujours selon moi,
l'emploi de la fonction n'est nullement justifié... sauf si ce nom à d'autres usages
dans ledit classeur. (Je pense être plus clair !) ;-)

Les vacances (période estivale) se déroulent bien ?


MichD
--------------------------------------------
"isabelle" a écrit dans le message de groupe de discussion : j2bvkm$jn8$

bonjour Denis,

Le 2011-08-15 15:35, MichD a écrit :

Tu ne peux pas utiliser un nom défini à l'aide de la fonction decaler()
pour la propriété RowSource d'un combobox.



j'suis pas sur de ça,
http://cjoint.com/?AHpwDPfOOWs


--
isabelle
Avatar
DanielCo
Bonjour,
On peut utiliser un nom défini. Celui-ci est transformé en une plage
fixe, celle qu'il représentait au moment où il a été utilisé; d'où la
nécessité de réactualiser "RowsSource".
Cordialement.
Daniel


Bonjour Isabelle,

Pour moi, l'utilité première de la fonction "Decaler" dans la définition
d'un nom est de permettre l'actualisation de ce dernier au fur et à mesure
que des données sont ajoutées et faciliter le traitement.Clairement dans ce
cas, l'usage de la fonction ne remplit pas ce mandat et toujours selon moi,
l'emploi de la fonction n'est nullement justifié... sauf si ce nom à d'autres
usages dans ledit classeur. (Je pense être plus clair !) ;-)

Les vacances (période estivale) se déroulent bien ?


MichD
--------------------------------------------
"isabelle" a écrit dans le message de groupe de discussion :
j2bvkm$jn8$

bonjour Denis,

Le 2011-08-15 15:35, MichD a écrit :

Tu ne peux pas utiliser un nom défini à l'aide de la fonction decaler()
pour la propriété RowSource d'un combobox.



j'suis pas sur de ça,
http://cjoint.com/?AHpwDPfOOWs
Avatar
MichD
Bonjour Daniel,

| On peut utiliser un nom défini. Celui-ci est transformé en une plage fixe

Je suis d'accord avec toi, d'ailleurs c'est l'une des deux approches que j'ai proposées dans ma réponse.

Je faisais seulement remarquer qu'il n'y avait aucune raison dans la présente situation d'utiliser la fonction "Decaler"
pour définir le nom. Cela ne signifie pas que c'est une erreur d'y faire référence...Dans ce sens, le message d'Isabelle
a permis d'éclaircir le propos.



MichD
--------------------------------------------
"DanielCo" a écrit dans le message de groupe de discussion : j2d76s$8pt$

Bonjour,
On peut utiliser un nom défini. Celui-ci est transformé en une plage
fixe, celle qu'il représentait au moment où il a été utilisé; d'où la
nécessité de réactualiser "RowsSource".
Cordialement.
Daniel


Bonjour Isabelle,

Pour moi, l'utilité première de la fonction "Decaler" dans la définition
d'un nom est de permettre l'actualisation de ce dernier au fur et à mesure
que des données sont ajoutées et faciliter le traitement.Clairement dans ce
cas, l'usage de la fonction ne remplit pas ce mandat et toujours selon moi,
l'emploi de la fonction n'est nullement justifié... sauf si ce nom à d'autres
usages dans ledit classeur. (Je pense être plus clair !) ;-)

Les vacances (période estivale) se déroulent bien ?


MichD
--------------------------------------------
"isabelle" a écrit dans le message de groupe de discussion :
j2bvkm$jn8$

bonjour Denis,

Le 2011-08-15 15:35, MichD a écrit :

Tu ne peux pas utiliser un nom défini à l'aide de la fonction decaler()
pour la propriété RowSource d'un combobox.



j'suis pas sur de ça,
http://cjoint.com/?AHpwDPfOOWs