OVH Cloud OVH Cloud

combobox

4 réponses
Avatar
Gilles
Bonjour.
Je suis désolé je suis novice.
Voila je vous explique mon probleme.

Je fais un document (genre formulaire) sous word en .dot

Dans ce document j'ai incorpore des listes déroulantes de noms de
personnel,
des zones de texte et de chiffres.

Je voudrais que dans les premieres utilisations les listes déroulantes etant
vides, saisir le nom des personnels afin qu'ils se rajoutent dans la liste
et que cette liste reste remplie meme apres fermeture du document.

Voila ce que j'ai mis .

Private Sub ComboBox1_Change()

ComboBox1.AddItem "MARTIN, Patrick"

End Sub


Si vous pouvais m'aider merci a vous.

Gilles

4 réponses

Avatar
Anacoluthe
Bonjour !

"Gilles" nous a écrit ...
Je voudrais que dans les premieres utilisations les listes
déroulantes etant vides, saisir le nom des personnels afin qu'ils se
rajoutent dans la liste et que cette liste reste remplie meme apres
fermeture du document


Il est préférable de rester dans votre _ficelle_ de discussion
tout particulièrement quand Clément a pris soin de répondre
qu'il ne faut pas dans votre cas utiliser l'événement Change !!!
Que votre combo soit dans un formulaire, un document ou une
Userform, placez en sortie une macro qui compare la valeur
entrée avec toutes celles de la liste. Si l'utilisateur entre
une valeur nouvelle, elle est ajoutée à la liste.

Anacoluthe
« On peut tirer un âne avec une ficelle, mais non le pousser. »
- Driss CHRAÏBI

Avatar
Clément Marcotte
Bonjour,

Je voudrais que dans les premieres utilisations les listes
déroulantes etant

vides,


Au lieu de partir avec des listes vides, fais une liste dans le
bloc-notes sans faire Enter après le dernier nom et enregistre le
fichier au format texte (*.txt). Ensuite mets ceci dans un module de
ton fichier:


Remplace noms.txt par le nom de ton fichier texte et adapte le chemin
d'accès


'========================================= 'Pour Initialiser le combobox au lancement de la procédure, en
'utilisant les lignes du fichier noms.txt. Le ComboBox se nomme Liste.
'La procédure renseignercombo est appelée à partir de la procédure
'UserForm_initialize de l'UserForm
'=========================================== Public tableau
Sub renseignercombo()
Const ForAppending = 8
Const ForReading = 1
Const ForWriting = 2
Dim fs As Object, lefichier As Object
Dim derniereligne As Integer, nombrelignes As Integer
Dim ligne As String
Dim i As Integer, f1
'L'objet "FileSystemObjet" dispose de la propriété line
'qui permet de connaître le nombre de lignes du fichier.
'Ici on crée une liaison tardive avec FSO
Set fs = CreateObject("scripting.FileSystemObject")
'Associer la variable lefichier au FileSystemObject
Set lefichier = fs.opentextfile("c:mes documentsnoms.txt", _
ForAppending, True)
derniereligne = lefichier.Line
nombrelignes = derniereligne
lefichier.Close
ReDim tableau(nombrelignes)
Set lefichier = fs.opentextfile("c:mes documentsnoms.txt", _
ForReading, True)
'Relire le fichier et regrouper les noms dans un tableau unique
For i = 1 To derniereligne
ligne = lefichier.readline
UserForm1.Liste.AddItem (ligne)
tableau(i) = ligne
Next
lefichier.Close
Set fs = Nothing
End Sub

saisir le nom des personnels afin qu'ils se rajoutent dans la liste
et que cette liste reste remplie meme apres fermeture du document.



'=================================== 'Pour Mettre à jour la liste et enregistrer le fichier quand
'l'utilisateur choisit un nom et clique sur le bouton Retirer de son
'UserForm:
'====================================
Private Sub Retirer_Click()
Dim i As Integer, lebout As Integer
Dim fs As Object, lefichier As Object
UserForm1.Hide
lebout = UBound(tableau)
'Retirer le nom du contrôle
For i = 1 To lebout
If Liste.Value = tableau(i) Then
tableau(i) = ""
End If
Next
'Vider le contrôle
Liste.Clear
'Mettre le tableau à jour
For i = 1 To lebout - 1
If tableau(i) = "" Then
tableau(i) = tableau(i + 1)
tableau(i + 1) = ""
End If
Next
lebout = lebout - 1
ReDim Preserve tableau(lebout)
'Écrire le nouveau fichier
Set fs = _
CreateObject("scripting.FileSystemObject")
Set lefichier = _
fs.CreateTextFile("c:mes documentsnoms.txt")
For i = 1 To lebout
If i < lebout Then
lefichier.writeline (tableau(i))
Liste.AddItem tableau(i)
Else
lefichier.write (tableau(i))
Liste.AddItem tableau(i)
End If
Next
UserForm1.Show
End Sub

'========================================= 'Mettre la liste et le fichier à jour, quand l'utilisateur ajoute
'un nom dans le ComboBox.
'========================================== Private Sub Liste_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
Dim i As Integer
For i = 1 To UBound(tableau)
If Liste.Value = tableau(i) Then
tableau(0) = ""
Exit Sub
Else
tableau(0) = Liste.Value
End If
Next
'redimensionner le tableau
'sans en effacer le contenu
ReDim Preserve tableau(UBound(tableau) + 1)
'copier la donnée ajoutée à la nouvelle position
tableau(UBound(tableau)) = tableau(0)
Liste.AddItem (Liste.Value)
enregistrefichier
End Sub

Sub enregistrefichier()
'Enregistrer le fichier de noms
'après l'ajout d'un nom
Const ForAppending = 8
Dim i As Integer, fs As Object
Dim lefichier As Object
Set fs = _
CreateObject("scripting.FileSystemObject")
Set lefichier = _
fs.opentextfile("c:mes documentsnoms.txt", _
ForAppending, True)
lefichier.writeblanklines (1)
lefichier.write UserForm1.Liste.Value
lefichier.Close
End Sub

Pour le plaisir de la chose. Au lieu de créer le fichier texte
initial avec le bloc-notes, on peut utiliser la fonction array() comme
support d'origine de la liste de noms et faire le fichier texte à
partir de là.

Sub fairefichier()
Dim fso As Object, fs As Object
Dim lesnoms As Variant, i As Integer
Dim maximum As Integer
lesnoms = Array("Lagaffe", "Gaston", "C'est ici", "Melrose")
maximum = UBound(lesnoms)
'Créer une liaison tardive avec le
'FileSystemObject
Set fso = CreateObject("Scripting.FileSystemObject")
Set fs = fso.CreateTextFile("c:mes documentsnoms.txt")
'Transférer le tableau dans le fichier
For i = 0 To maximum
If i < maximum Then
'writeline force un passage à la ligne
'pour tous les noms avant le dernier
fs.writeline lesnoms(i)
Else
'Write évite le passage à la ligne
'pour le dernier nom.
'Opération nécessaire pour éviter
'certaines erreurs subséquentes
fs.write lesnoms(i)
End If
Next
End Sub

Avatar
Clément Marcotte
Au moins les questions à répétition sont finies.


"Clément Marcotte" a écrit dans le
message de news:
Bonjour,

Je voudrais que dans les premieres utilisations les listes
déroulantes etant

vides,


Au lieu de partir avec des listes vides, fais une liste dans le
bloc-notes sans faire Enter après le dernier nom et enregistre le
fichier au format texte (*.txt). Ensuite mets ceci dans un module de
ton fichier:


Remplace noms.txt par le nom de ton fichier texte et adapte le
chemin

d'accès


'========================================= > 'Pour Initialiser le combobox au lancement de la procédure, en
'utilisant les lignes du fichier noms.txt. Le ComboBox se nomme
Liste.

'La procédure renseignercombo est appelée à partir de la procédure
'UserForm_initialize de l'UserForm
'=========================================== > Public tableau
Sub renseignercombo()
Const ForAppending = 8
Const ForReading = 1
Const ForWriting = 2
Dim fs As Object, lefichier As Object
Dim derniereligne As Integer, nombrelignes As Integer
Dim ligne As String
Dim i As Integer, f1
'L'objet "FileSystemObjet" dispose de la propriété line
'qui permet de connaître le nombre de lignes du fichier.
'Ici on crée une liaison tardive avec FSO
Set fs = CreateObject("scripting.FileSystemObject")
'Associer la variable lefichier au FileSystemObject
Set lefichier = fs.opentextfile("c:mes documentsnoms.txt", _
ForAppending, True)
derniereligne = lefichier.Line
nombrelignes = derniereligne
lefichier.Close
ReDim tableau(nombrelignes)
Set lefichier = fs.opentextfile("c:mes documentsnoms.txt", _
ForReading, True)
'Relire le fichier et regrouper les noms dans un tableau unique
For i = 1 To derniereligne
ligne = lefichier.readline
UserForm1.Liste.AddItem (ligne)
tableau(i) = ligne
Next
lefichier.Close
Set fs = Nothing
End Sub

saisir le nom des personnels afin qu'ils se rajoutent dans la liste
et que cette liste reste remplie meme apres fermeture du document.



'=================================== > 'Pour Mettre à jour la liste et enregistrer le fichier quand
'l'utilisateur choisit un nom et clique sur le bouton Retirer de son
'UserForm:
'==================================== >
Private Sub Retirer_Click()
Dim i As Integer, lebout As Integer
Dim fs As Object, lefichier As Object
UserForm1.Hide
lebout = UBound(tableau)
'Retirer le nom du contrôle
For i = 1 To lebout
If Liste.Value = tableau(i) Then
tableau(i) = ""
End If
Next
'Vider le contrôle
Liste.Clear
'Mettre le tableau à jour
For i = 1 To lebout - 1
If tableau(i) = "" Then
tableau(i) = tableau(i + 1)
tableau(i + 1) = ""
End If
Next
lebout = lebout - 1
ReDim Preserve tableau(lebout)
'Écrire le nouveau fichier
Set fs = _
CreateObject("scripting.FileSystemObject")
Set lefichier = _
fs.CreateTextFile("c:mes documentsnoms.txt")
For i = 1 To lebout
If i < lebout Then
lefichier.writeline (tableau(i))
Liste.AddItem tableau(i)
Else
lefichier.write (tableau(i))
Liste.AddItem tableau(i)
End If
Next
UserForm1.Show
End Sub

'========================================= > 'Mettre la liste et le fichier à jour, quand l'utilisateur ajoute
'un nom dans le ComboBox.
'========================================== > Private Sub Liste_BeforeUpdate(ByVal Cancel As
MSForms.ReturnBoolean)

Dim i As Integer
For i = 1 To UBound(tableau)
If Liste.Value = tableau(i) Then
tableau(0) = ""
Exit Sub
Else
tableau(0) = Liste.Value
End If
Next
'redimensionner le tableau
'sans en effacer le contenu
ReDim Preserve tableau(UBound(tableau) + 1)
'copier la donnée ajoutée à la nouvelle position
tableau(UBound(tableau)) = tableau(0)
Liste.AddItem (Liste.Value)
enregistrefichier
End Sub

Sub enregistrefichier()
'Enregistrer le fichier de noms
'après l'ajout d'un nom
Const ForAppending = 8
Dim i As Integer, fs As Object
Dim lefichier As Object
Set fs = _
CreateObject("scripting.FileSystemObject")
Set lefichier = _
fs.opentextfile("c:mes documentsnoms.txt", _
ForAppending, True)
lefichier.writeblanklines (1)
lefichier.write UserForm1.Liste.Value
lefichier.Close
End Sub

Pour le plaisir de la chose. Au lieu de créer le fichier texte
initial avec le bloc-notes, on peut utiliser la fonction array()
comme

support d'origine de la liste de noms et faire le fichier texte à
partir de là.

Sub fairefichier()
Dim fso As Object, fs As Object
Dim lesnoms As Variant, i As Integer
Dim maximum As Integer
lesnoms = Array("Lagaffe", "Gaston", "C'est ici", "Melrose")
maximum = UBound(lesnoms)
'Créer une liaison tardive avec le
'FileSystemObject
Set fso = CreateObject("Scripting.FileSystemObject")
Set fs = fso.CreateTextFile("c:mes documentsnoms.txt")
'Transférer le tableau dans le fichier
For i = 0 To maximum
If i < maximum Then
'writeline force un passage à la ligne
'pour tous les noms avant le dernier
fs.writeline lesnoms(i)
Else
'Write évite le passage à la ligne
'pour le dernier nom.
'Opération nécessaire pour éviter
'certaines erreurs subséquentes
fs.write lesnoms(i)
End If
Next
End Sub





Avatar
Gilles
Merci Clément pour ta syntaxe.
Gilles
"Clément Marcotte" a écrit dans le message
de news:
Au moins les questions à répétition sont finies.


"Clément Marcotte" a écrit dans le
message de news:
Bonjour,

Je voudrais que dans les premieres utilisations les listes
déroulantes etant

vides,


Au lieu de partir avec des listes vides, fais une liste dans le
bloc-notes sans faire Enter après le dernier nom et enregistre le
fichier au format texte (*.txt). Ensuite mets ceci dans un module de
ton fichier:


Remplace noms.txt par le nom de ton fichier texte et adapte le
chemin

d'accès


'========================================= > > 'Pour Initialiser le combobox au lancement de la procédure, en
'utilisant les lignes du fichier noms.txt. Le ComboBox se nomme
Liste.

'La procédure renseignercombo est appelée à partir de la procédure
'UserForm_initialize de l'UserForm
'=========================================== > > Public tableau
Sub renseignercombo()
Const ForAppending = 8
Const ForReading = 1
Const ForWriting = 2
Dim fs As Object, lefichier As Object
Dim derniereligne As Integer, nombrelignes As Integer
Dim ligne As String
Dim i As Integer, f1
'L'objet "FileSystemObjet" dispose de la propriété line
'qui permet de connaître le nombre de lignes du fichier.
'Ici on crée une liaison tardive avec FSO
Set fs = CreateObject("scripting.FileSystemObject")
'Associer la variable lefichier au FileSystemObject
Set lefichier = fs.opentextfile("c:mes documentsnoms.txt", _
ForAppending, True)
derniereligne = lefichier.Line
nombrelignes = derniereligne
lefichier.Close
ReDim tableau(nombrelignes)
Set lefichier = fs.opentextfile("c:mes documentsnoms.txt", _
ForReading, True)
'Relire le fichier et regrouper les noms dans un tableau unique
For i = 1 To derniereligne
ligne = lefichier.readline
UserForm1.Liste.AddItem (ligne)
tableau(i) = ligne
Next
lefichier.Close
Set fs = Nothing
End Sub

saisir le nom des personnels afin qu'ils se rajoutent dans la liste
et que cette liste reste remplie meme apres fermeture du document.



'=================================== > > 'Pour Mettre à jour la liste et enregistrer le fichier quand
'l'utilisateur choisit un nom et clique sur le bouton Retirer de son
'UserForm:
'==================================== > >
Private Sub Retirer_Click()
Dim i As Integer, lebout As Integer
Dim fs As Object, lefichier As Object
UserForm1.Hide
lebout = UBound(tableau)
'Retirer le nom du contrôle
For i = 1 To lebout
If Liste.Value = tableau(i) Then
tableau(i) = ""
End If
Next
'Vider le contrôle
Liste.Clear
'Mettre le tableau à jour
For i = 1 To lebout - 1
If tableau(i) = "" Then
tableau(i) = tableau(i + 1)
tableau(i + 1) = ""
End If
Next
lebout = lebout - 1
ReDim Preserve tableau(lebout)
'Écrire le nouveau fichier
Set fs = _
CreateObject("scripting.FileSystemObject")
Set lefichier = _
fs.CreateTextFile("c:mes documentsnoms.txt")
For i = 1 To lebout
If i < lebout Then
lefichier.writeline (tableau(i))
Liste.AddItem tableau(i)
Else
lefichier.write (tableau(i))
Liste.AddItem tableau(i)
End If
Next
UserForm1.Show
End Sub

'========================================= > > 'Mettre la liste et le fichier à jour, quand l'utilisateur ajoute
'un nom dans le ComboBox.
'========================================== > > Private Sub Liste_BeforeUpdate(ByVal Cancel As
MSForms.ReturnBoolean)

Dim i As Integer
For i = 1 To UBound(tableau)
If Liste.Value = tableau(i) Then
tableau(0) = ""
Exit Sub
Else
tableau(0) = Liste.Value
End If
Next
'redimensionner le tableau
'sans en effacer le contenu
ReDim Preserve tableau(UBound(tableau) + 1)
'copier la donnée ajoutée à la nouvelle position
tableau(UBound(tableau)) = tableau(0)
Liste.AddItem (Liste.Value)
enregistrefichier
End Sub

Sub enregistrefichier()
'Enregistrer le fichier de noms
'après l'ajout d'un nom
Const ForAppending = 8
Dim i As Integer, fs As Object
Dim lefichier As Object
Set fs = _
CreateObject("scripting.FileSystemObject")
Set lefichier = _
fs.opentextfile("c:mes documentsnoms.txt", _
ForAppending, True)
lefichier.writeblanklines (1)
lefichier.write UserForm1.Liste.Value
lefichier.Close
End Sub

Pour le plaisir de la chose. Au lieu de créer le fichier texte
initial avec le bloc-notes, on peut utiliser la fonction array()
comme

support d'origine de la liste de noms et faire le fichier texte à
partir de là.

Sub fairefichier()
Dim fso As Object, fs As Object
Dim lesnoms As Variant, i As Integer
Dim maximum As Integer
lesnoms = Array("Lagaffe", "Gaston", "C'est ici", "Melrose")
maximum = UBound(lesnoms)
'Créer une liaison tardive avec le
'FileSystemObject
Set fso = CreateObject("Scripting.FileSystemObject")
Set fs = fso.CreateTextFile("c:mes documentsnoms.txt")
'Transférer le tableau dans le fichier
For i = 0 To maximum
If i < maximum Then
'writeline force un passage à la ligne
'pour tous les noms avant le dernier
fs.writeline lesnoms(i)
Else
'Write évite le passage à la ligne
'pour le dernier nom.
'Opération nécessaire pour éviter
'certaines erreurs subséquentes
fs.write lesnoms(i)
End If
Next
End Sub