Format Userform
Bonjour à tous,
J'ai un tableur Excel composé de 3 feuilles.
Feuille Suivi32 qui contient un tableau alimenté par un UserForm.
Feuille BDD qui contient les divers tableaux servant à alimenter les ListBox du UserForm.
Feuille CLIENT qui contient un tableau avec les clients et leurs informations.
Mon soucis est que lorsque j'ouvre mon formulaire les ListBox changent de position et je dois bouger légèrement le UserForm avec la souris pour que les ListBox reviennent à leur position initiale.
Auriez-vous une solution à mon souci ?
Je suis débutante en VBA alors soyez indulgents.
Merci d'avance pour votre aide précieuse.
Voici le code de mon UserForm :
' Code pour le bouton dans la feuille SUIVI 32 qui ouvre le UserForm
Sub AfficherUserForm()
UserForm1.Show
End Sub
' Code à mettre dans le UserForm
Private Sub UserForm_Initialize()
' Charger les listes déroulantes depuis la feuille BDD
ChargerVendeurs
ChargerCodeOT
ChargerTypeMAT
ChargerEtat
ChargerMarque
' Définir les dimensions fixes du formulaire
Me.Width = 645
Me.Height = 645
' Centrer le UserForm sur l'écran
Me.StartUpPosition = 0 ' Manuel
Me.Left = Application.Left + (Application.Width - Me.Width) / 2
Me.Top = Application.Top + (Application.Height - Me.Height) / 2
End Sub
' Chargement des listes déroulantes
Sub ChargerVendeurs()
Dim ws As Worksheet
Dim i As Integer
Dim derniereLigne As Integer
Set ws = ThisWorkbook.Sheets("BDD")
derniereLigne = Application.WorksheetFunction.CountA(ws.Range("D:D"))
' Vider la liste avant de la remplir
ListBox3.Clear
' Remplir la ListBox des vendeurs
For i = 2 To derniereLigne
If Trim(ws.Cells(i, 4).Value) <> "" Then
ListBox3.AddItem ws.Cells(i, 4).Value
End If
Next i
End Sub
Sub ChargerCodeOT()
Dim ws As Worksheet
Dim i As Integer
Dim derniereLigne As Integer
Set ws = ThisWorkbook.Sheets("BDD")
derniereLigne = Application.WorksheetFunction.CountA(ws.Range("A:A"))
' Vider la liste avant de la remplir
ListBox6.Clear
' Remplir la ListBox des codes OT
For i = 2 To derniereLigne
If Trim(ws.Cells(i, 1).Value) <> "" Then
ListBox6.AddItem ws.Cells(i, 1).Value
End If
Next i
End Sub
Sub ChargerTypeMAT()
Dim ws As Worksheet
Dim i As Integer
Dim derniereLigne As Integer
Set ws = ThisWorkbook.Sheets("BDD")
derniereLigne = Application.WorksheetFunction.CountA(ws.Range("F:F"))
' Vider la liste avant de la remplir
ListBox7.Clear
' Remplir la ListBox des types de matériel
For i = 2 To derniereLigne
If Trim(ws.Cells(i, 6).Value) <> "" Then
ListBox7.AddItem ws.Cells(i, 6).Value
End If
Next i
End Sub
Sub ChargerEtat()
Dim ws As Worksheet
Dim i As Integer
Dim derniereLigne As Integer
Set ws = ThisWorkbook.Sheets("BDD")
derniereLigne = Application.WorksheetFunction.CountA(ws.Range("H:H"))
' Vider la liste avant de la remplir
ListBox4.Clear
' Remplir la ListBox des états
For i = 2 To derniereLigne
If Trim(ws.Cells(i, 8).Value) <> "" Then
ListBox4.AddItem ws.Cells(i, 8).Value
End If
Next i
End Sub
Sub ChargerMarque()
Dim ws As Worksheet
Dim i As Integer
Dim derniereLigne As Integer
Set ws = ThisWorkbook.Sheets("BDD")
derniereLigne = Application.WorksheetFunction.CountA(ws.Range("J:J"))
' Vider la liste avant de la remplir
ListBox5.Clear
' Remplir la ListBox des marques
For i = 2 To derniereLigne
If Trim(ws.Cells(i, 10).Value) <> "" Then
ListBox5.AddItem ws.Cells(i, 10).Value
End If
Next i
End Sub
' Code pour la recherche automatique des informations client
Private Sub TextBox12_AfterUpdate()
Dim ws As Worksheet
Dim numClient As String
Dim i As Integer
Dim derniereLigne As Integer
Dim trouve As Boolean
' Récupérer le numéro de client saisi
numClient = Trim(TextBox12.Value)
If numClient = "" Then Exit Sub
Set ws = ThisWorkbook.Sheets("CLIENT")
derniereLigne = Application.WorksheetFunction.CountA(ws.Range("A:A"))
trouve = False
' Rechercher les informations du client
For i = 2 To derniereLigne
If Trim(ws.Cells(i, 1).Value) = numClient Then
' Remplir automatiquement les champs client
TextBox20.Value = ws.Cells(i, 2).Value ' STE
TextBox13.Value = ws.Cells(i, 3).Value ' NOM
TextBox19.Value = ws.Cells(i, 4).Value ' ADRESSE
TextBox11.Value = ws.Cells(i, 5).Value ' CP
TextBox18.Value = ws.Cells(i, 6).Value ' VILLE
TextBox14.Value = ws.Cells(i, 7).Value ' TEL
TextBox17.Value = ws.Cells(i, 8).Value ' MAIL
trouve = True
Exit For
End If
Next i
If Not trouve Then
MsgBox "Numéro de client non trouvé!", vbExclamation
' Effacer les champs si le client n'est pas trouvé
TextBox20.Value = ""
TextBox13.Value = ""
TextBox19.Value = ""
TextBox11.Value = ""
TextBox18.Value = ""
TextBox14.Value = ""
TextBox17.Value = ""
End If
End Sub
' Code pour le bouton AJOUTER
Private Sub CommandButton1_Click()
Dim ws As Worksheet
Dim derniereLigne As Integer
' Vérification des champs obligatoires
If ListBox3.ListIndex = -1 Then
MsgBox "Veuillez sélectionner un commercial!", vbExclamation
Exit Sub
End If
If Trim(TextBox12.Value) = "" Then
MsgBox "Veuillez entrer un numéro de client!", vbExclamation
Exit Sub
End If
' Ajouter les données dans la feuille SUIVI 32
Set ws = ThisWorkbook.Sheets("SUIVI 32")
' Trouver la dernière ligne avec des données
derniereLigne = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row + 1
' Ajouter les données dans les cellules correspondantes
ws.Cells(derniereLigne, 1).Value = ListBox3.Value ' VENDEUR
ws.Cells(derniereLigne, 2).Value = TextBox22.Value ' BDC
ws.Cells(derniereLigne, 3).Value = TextBox21.Value ' MAT
ws.Cells(derniereLigne, 4).Value = TextBox12.Value ' NUM CLI
ws.Cells(derniereLigne, 5).Value = TextBox20.Value ' STÉ
ws.Cells(derniereLigne, 6).Value = TextBox13.Value ' NOM
ws.Cells(derniereLigne, 7).Value = TextBox19.Value ' ADRESSE
ws.Cells(derniereLigne, 8).Value = TextBox11.Value ' CP
ws.Cells(derniereLigne, 9).Value = TextBox18.Value ' VILLE
ws.Cells(derniereLigne, 10).Value = TextBox14.Value ' TEL
ws.Cells(derniereLigne, 11).Value = TextBox17.Value ' MAIL
ws.Cells(derniereLigne, 12).Value = TextBox23.Value ' DÉLAI BDC
ws.Cells(derniereLigne, 13).Value = TextBox15.Value ' OT 1
ws.Cells(derniereLigne, 14).Value = TextBox16.Value ' OT 2
ws.Cells(derniereLigne, 15).Value = TextBox9.Value ' DATE OT
ws.Cells(derniereLigne, 16).Value = ListBox6.Value ' CODE OT
ws.Cells(derniereLigne, 17).Value = ListBox7.Value ' TYPE MAT
ws.Cells(derniereLigne, 18).Value = TextBox24.Value ' NUM SERIE
ws.Cells(derniereLigne, 19).Value = ListBox5.Value ' MARQUE
ws.Cells(derniereLigne, 20).Value = TextBox25.Value ' MODELE
ws.Cells(derniereLigne, 21).Value = TextBox8.Value ' DIAMETRE
ws.Cells(derniereLigne, 22).Value = TextBox26.Value ' LONGUEUR
ws.Cells(derniereLigne, 23).Value = TextBox27.Value ' DATE LIVRAISON
ws.Cells(derniereLigne, 24).Value = TextBox28.Value ' DETAIL OT
ws.Cells(derniereLigne, 25).Value = ListBox4.Value ' ETAT
' Message de confirmation
MsgBox "Données ajoutées avec succès!", vbInformation
' Réinitialiser le formulaire pour une nouvelle saisie
ReinitialiserFormulaire
End Sub
' Fonction pour réinitialiser le formulaire
Private Sub ReinitialiserFormulaire()
' Réinitialiser tous les champs pour une nouvelle saisie
TextBox22.Value = "" ' BDC
TextBox21.Value = "" ' MAT
TextBox12.Value = "" ' NUM CLI
TextBox20.Value = "" ' STÉ
TextBox13.Value = "" ' NOM
TextBox19.Value = "" ' ADRESSE
TextBox11.Value = "" ' CP
TextBox18.Value = "" ' VILLE
TextBox14.Value = "" ' TEL
TextBox17.Value = "" ' MAIL
TextBox23.Value = "" ' DÉLAI BDC
TextBox15.Value = "" ' OT 1
TextBox16.Value = "" ' OT 2
TextBox9.Value = "" ' DATE OT
TextBox24.Value = "" ' NUM SERIE
TextBox25.Value = "" ' MODELE
TextBox8.Value = "" ' DIAMETRE
TextBox26.Value = "" ' LONGUEUR
TextBox27.Value = "" ' DATE LIVRAISON
TextBox28.Value = "" ' DETAIL OT
' Réinitialiser les listes déroulantes
ListBox3.ListIndex = -1 ' VENDEUR
ListBox6.ListIndex = -1 ' CODE OT
ListBox7.ListIndex = -1 ' TYPE MAT
ListBox5.ListIndex = -1 ' MARQUE
ListBox4.ListIndex = -1 ' ETAT
End SubBonjour,
Votre code est très bien organisé pour une "débutante" (vous êtes modeste), félicitations !
Pour info : vous pouvez renommer vos ListBox/TextBox comme ça votre code sera encore plus clair (au lieu de Listbox6 => ListCodesOT par exemple).
Bon en revanche pour votre problème j'ai du mal à saisir cette histoire de déplacement des objets… pourriez-vous joindre un fichier ? Merci.
Merci .
Alors lorsque je clique sur le bouton pour ouvrir mon formulaire celui-ci apparait avec les Listbox disposées ainsi :
Et il suffit que je glisse légèrement le formulaire à l'aide de la souris pour que tout se positionne correctement comme ceci :
J'ai essayé d'inclure du code pour que les positions des Listbox restent toujours les même mais cela ne fonctionne pas.
Merci.
voici le fichier
Merci.
A vrai dire chez moi votre UF s'ouvre sans décalage. Mais je pense savoir ce qui pourrait poser problème.
En changeant votre Initialize par le code ci-dessous, le problème est-il résolu ?
Private Sub UserForm_Initialize()
' Définir les dimensions fixes du formulaire
Me.Width = 645 ' Remplacez par la largeur souhaitée en points
Me.Height = 645 ' Remplacez par la hauteur souhaitée en points
' Centrer le UserForm sur l'écran
Me.StartUpPosition = 1 ' centré sur la fenetre active
' Charger les listes déroulantes depuis la feuille BDD
ChargerVendeurs
ChargerCodeOT
ChargerTypeMAT
ChargerEtat
ChargerMarque
End SubNon cela n'a rien résolu mais peut-être en augmentant ? Je travaille sur deux écrans. Mon pc portable et un écran plus grand pour faciliter le travail sur ce genre de grands fichiers et je pense que c'est à cause de ça car sur le petit écran du pc portable je n'ai pas le soucis.
Oui c'est certainement lié aux tailles d'écrans. Et en supprimant Me.With et Me.Height ? Car à vrai dire votre UserForm a déjà une taille donc forcer ses dimensions n'est pas forcément nécessaire.
Essayez d'ajouter l'instruction DoEvents à la dernière ligne du initialize pour voir si cela change quelque chose aussi.
Merci pour l'information ! Cela à l'air de fonctionner.
Bonne journée.
Super ! Quelle était la solution alors ?
Pensez à clôturer le fil si résolu.
Bonne journée