Modifier une base execel dans un userform

Bonsoir à tous, je suis debutant et je développe mais je suis coincé depuis 3 jours sur une fonction pourtant connu des userforms: la modification des données.

j'ai pu récupérer des codes de part et d'autres mais vu ke je suis débutant j'y arrive pas.

En effet je dispose d'un userform intitulé frmmotif qui à travers une combobox récupère un certains nombre de champs situés dans la base.

la colonne A de la feuille 1 héberge le matricule définit par des valeurs.

Je souhaiterai lorsque l'on sélectionne un code matrice avec la combobox pouvoir modifier les données dans les textbox et coller les données nouvelles dans la bonne ligne.

J'ai tester plusieurs solutions mais je n'ai pu en adpater aucune

Je compte beaucoup sur votre patience, votre réactivité et votre gentilesse pour m'aider !

merci d'avance

28base-scolarite.zip (53.75 Ko)

Bonsoir Lemy, bonsoir le forum,

La propriété [Tag] des contrôles à renseigner permet de leur attribuer le numéro de la colonne correspondante au contrôle (par exemple : la TextBox2 = Nom se trouve en colonne B (=2), j'attribue à la TextBox2 la propriété [Tag] = 2 / la TextBox29 = Inscription/Montant se trouve en colonne J (=10), j'attribue à la TextBox29 la propriété [Tag] = 10)

Comme le matricule est en principe unique, le numéro de ligne (variable LI) correspond à la propriété [ListIndex] de la ComboBox1 + 7 (le premier élément d'une Combobox a 0 comme Listindex... Pour faire correspondre avec la ligne on ajoute 7).

Regarde comme le code est simplifié...

J'ai quand même harmonisé les formats dans le tableau pour les dates (jj/mm/aaaa) et les montants (monétaire € à 2 décimales)

Tu verras dans le code que quand l'Userform doit envoyer une date vers l'onglet, j'utilise toujours le format américain "yyyy/mm/dd". Il ne faut pas le changer. Cela évite les inversion jours/mois très courante dans ce cas.

Il te faudra aussi revoir l'ordre des Tabulations de l'UserForm1 pour que le focus passe dans l'ordre d'un contrôle à l'autre à l'aide de la touche [Tabulation]...

Le code

Private O As Worksheet 'célare la variable O (Onglet)

Private Sub UserForm_Initialize() 'à l'intialisation de l'UserForm
Set O = Worksheets("1") 'définit l'onglet O
DL = O.Range("A" & Application.Rows.Count).End(xlUp).Row 'définit la dernière ligne éditée Dl de la colonne A de l'onglet O
'alimente la ComboBox1 (A7 si DL = 7 (une seule ligne), la plage A7:A & Dl si plusieurs lignes)
If DL = 7 Then Me.ComboBox1.AddItem O.Range("a7").Value Else ComboBox1.List = O.Range("A7:A" & DL).Value
End Sub

Private Sub ComboBox1_Change() 'au changement dans la ComboBox1
Dim LI As Integer 'déclare la variable LI (LIgne)
Dim CTRL As Control 'déclare la variable CTRL (ContTRôLe)

LI = Me.ComboBox1.ListIndex + 7 'définit la ligne LI
For Each CTRL In Me.Controls 'boucle sur tous les contrôles CTRl de l'UserForm
    'si la propriété [Tag] du contrôle n'est pas vide, récupère dans le contrôle la valeur de la cellule ligne = LI,
    'colonne = propriété [Tag] du contrôle convertie en Byte
    If CTRL.Tag <> "" Then CTRL.Value = O.Cells(LI, CByte(CTRL.Tag)).Value
Next CTRL 'prochain contrôle de la boucle
End Sub

Private Sub CmdValider_Click() 'bouton "Valider"
Dim LI As Integer 'déclare la variable LI (LIgne)

'LI = Me.ComboBox1.ListIndex + 7 'définit la ligne LI
If Me.TextBox8.Text = "" Then
    MsgBox "Vous devez entrer le Montant des frais de scolarité. Merci"
    Me.TextBox8.SetFocus
    Exit Sub
End If
If Me.TextBox9.Text = "" Then
    MsgBox "Vous devez entrer la date de versement des frais. Merci"
    Me.TextBox9.SetFocus
    Exit Sub
End If
If Me.TextBox16.Text = "" Then
    MsgBox "Vous devez entrer le Montant du premier versement. Merci"
    Me.TextBox16.SetFocus
    Exit Sub
End If
If Me.TextBox15.Text = "" Then
    MsgBox "Vous devez entrer la date du premier versement. Merci"
    Me.TextBox15.SetFocus
    Exit Sub
End If
For Each CTRL In Me.Controls 'boucle sur tous les contrôles CTRl de l'UserForm
    If CTRL.Tag <> "" Then 'condition : si la propriété [Tag] du contrôle n'est pas vide
        Select Case CTRL.Name 'agit en fonction du nom du contrôle
            'ici j'ai récupéré toutes les TextBoxes qui renvoient une date
            Case "TextBox4", "TextBox9", "TextBox10", "TextBox15", "TextBox17", "TextBox19", "TextBox21", "TextBox23", "TextBox25", "TextBox27"
                'renvoie dans la cellule ligne = LI, colonne = propriété [Tag] du contrôle convertie en Byte
                'la date du contrôle au format américain
                O.Cells(LI, CByte(CTRL.Tag)).Value = IIf(CTRL.Value = "", "", Format(CTRL.Value, "yyyy/mm/dd"))
            Case Else 'aute cas
                'renvoie dans la cellule ligne = LI, colonne = propriété [Tag] du contrôle convertie en Byte la valeur du contrôle
                O.Cells(LI, CByte(CTRL.Tag)).Value = CTRL.Value
        End Select 'fin de l'action en fonction du nom du contrôle
    End If 'fin de la condition
Next CTRL 'prochain contrôle de la boucle
Unload Me 'vide et ferme l'UserForm en cours
End Sub

Private Sub CmdAnnuler_Click() 'bouton "Annuler"
Unload Me 'vide et ferme l'UserForm en cours
End Sub

Le fichier :

54lemy-v01.zip (48.96 Ko)

infiniment merci vous venez de ressoudre un mal nécessaire, j'espère qu'il va servir à tout le forum.

Rechercher des sujets similaires à "modifier base execel userform"