VBA - Pb de remplissage d'une combobox

Le
danielos
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 mo=
n 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éf=
inie
avec la fonction DECALER.
Cette liste alimente la combo CB_Jour lors de l'initialisation du Userfor=
m2.
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.Va=
lue)
Sheets("Données_USF").Cells(4, 2).Value = CDate(UserForm1.TextBox4.Va=
lue)

'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

=DECALER(Données_USF!$E$2;;;NBVAL(Données_USF!$E:$E)-1)
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
DanielCo
Le #23655821
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
MichD
Le #23655981
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)
isabelle
Le #23656071
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
MichD
Le #23656181
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
DanielCo
Le #23656671
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
MichD
Le #23657481
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
Publicité
Poster une réponse
Anonyme