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 Sub

Bonjour,

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 :

avant

Et il suffit que je glisse légèrement le formulaire à l'aide de la souris pour que tout se positionne correctement comme ceci :

apres

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

9suivi-32ter.xlsm (54.55 Ko)

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 Sub

Non 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

Rechercher des sujets similaires à "format userform"