Enregistrement données d’un UserForm ligne par ligne dans un classeur

Bonjour tout le monde,

C’est ma première fois sur ce forum, enchantée !

Je poste un message pour gentiment vous demander de l’aide.

Voici mon problème :

J’ai besoin de remplir une feuille avec des informations récoltées via un UserForm autrement dit à chaque fois que l’utilisateur saisit des informations dans le UserForm et qu’il l'enregistre, il faudrait que les données soient inscrites dans une feuille. Un formulaire rempli = une ligne dans la feuille.

Ce qu’il se passe avec mon code, c’est qu’à chaque UserForm complété et enregistré cela modifie seulement la première ligne de mon tableau et donc écrase l’enregistrement fait précédemment.

Pourtant, j’ai essayé plusieurs choses :

- Mise en place d’une boucle For

- ou encore

While Cells(i, 1) <> ""
     i = i + 1
Wend

-...

Votre aide serait donc la bienvenue !

Je mets mon code en PJ si cela peut vous aider.

J’espère que j’ai été compréhensible dans mes propos et que mon post est approprié sur ce forum.

Merci pour vos réponses,

Bonne journée !

Salut,

Pour avoir la dernière ligne non vide d'une feuille Excel sur une colonne particulière, il faut utiliser :

derniereLigne = ThisWorbook.Worksheets("Registre_Livraison").Range("A" & Rows.Count).End(xlUp).Row + 1

Ca te donnera l'index de la ligne ou renseigner les informations issues de l'UserForm.

Ainsi on aura

Cells(derniereLigne, 12).Selec

Au lieu de

Cells(decalage + i, 12).Select

Bibu

Bonjour

Votre feuille est en tableaux structurés, donc déjà un premier point, vous n'avez pas besoin de formater jusqu'à la ligne 1000000 !
Est-ce bien la macro Enregistrer Click qui vous pose souci car je ne vois pas le code que vous avez placé ici

Cordialement

Ah oui ça paraît plus clair de le faire avec cette formule !
Seulement quand je modifie mon code avec j'ai une erreur qui apparaît et je ne vois pas comment la régler :/

L'erreur est :

Erreur 424 : Objet requis

D'accord je corrigerai cela alors merci !

Pour trouver le code il faut:

- Ouvrir vba

- Aller dans le menu à gauche et ouvrir l'onglet feuille

- Double-cliquer sur UserFormEnr puis sur le bouton enregistrer

Re,

Jusqu'à la ligne "Remise à zero du formulaire", votre code peut être ceci

' Remplissage classeur
Private Sub Enregistrer_Click()
Dim rep As Integer
Dim lig As Long

rep = MsgBox("Voulez-vous enregistrer ?", vbYesNo + vbDefaultButton2) 'bouton No actif par défaut
If rep = vbYes Then 'Si réponse OUI

    With Worksheets("Registre_Livraison").ListObjects("TabEnregistrement")
        If .ListRows.Count = 0 Then
            .ListRows.Add: lig = 1
        Else: .ListRows.Add: lig = .ListRows.Count 'insérer à la dernière ligne
        End If
        With .DataBodyRange
            .Item(lig, 1) = Date_Liv
            .Item(lig, 2) = Heure_Liv
            .Item(lig, 3) = DateThéorique_Liv
            .Item(lig, 4) = HeureThéorique_Liv
             'Num enregistrement - A completer
            .Item(lig, 6) = Transporteur
            .Item(lig, 7) = NbPalettes
            .Item(lig, 8) = Fournisseur
            .Item(lig, 9) = Pays
            .Item(lig, 10) = Nature
           'Solde - A completer
            If Oui = True And Non = True Then 'A comptabiliser
                MsgBox ("Oui et Non ne peuvent pas être cochés ensemble. Veuillez choisir s'il faut comptabiliser les palettes.")
            End If

            If Oui = False And Non = False Then .Item(lig, 12).ClearContents
            If Oui = True Then .Item(lig, 12).Value = "OUI"
            If Non = True Then .Item(lig, 12).Value = "NON"

            .Item(lig, 13) = Camion 'Identifiant Camion
            .Item(lig, 14) = Chauffeur 'Identifiant Chauffeur
            .Item(lig, 15) = Commentaires   'Commentaires
            .Item(lig, 16) = EnrDate 'Date de l'enregistrement
            'Heure de l'enregistrement - A completer
            .Item(lig, 18) = Utilisateur 'Utilisateur
        End With
    End With

     'Remise du formulaire à zéro
    Date_Liv = ""
    Heure_Liv = ""
    DateThéorique_Liv = ""
    HeureThéorique_Liv = ""
    Transporteur = ""
    NbPalettes = ""
    Fournisseur = ""
    Pays = ""
    Nature = ""
    Camion = ""
    Chauffeur = ""
    Oui = False
    Non = False
    Commentaires = ""
    Utilisateur = ""
End If
End Sub

Avant tout vous devez sélectionner toutes les lignes depuis 4 jusque la dernière ligne (1000000), puis click droite et choisir "supprimer les lignes de tableau"
Il vous restera la ligne 4 en grisé ce qui est normal puisque vous êtes en tableau structuré.

Je n'ai pas modifié plus bas
D'autres choses peuvent être aussi changées dans votre fichier. Comme par exemple la macro Auto_close qui est remplacée par d'autres fonctions aujourd'hui

Cordialement

Edit : J'ai remis le code complet

Toutes mes excuses j'ai fait une faute de frappe en écrivant mon code ..

Utilisez ceci :

derniereLigne = ThisWorkbook.Worksheets("Registre_Livraison").Range("A" & Rows.Count).End(xlUp).Row + 1

Edit : Ah et bien je vois que ça ne fonctionne pas non plus du au fait de l'utilisation du tableau .. Désolé, je pense que la solution de Dan sera parfaite pour vous dans ce cas.

Re,

A BibuNesco,

Ce n'est pas grave ! Il faut dire aussi que je n'avais pas précisé l'existence du tableau

A Dan,

J'ai essayé le code et tout fonctionne à merveille ! C'est ce que je recherchais et en plus le code est réécrit en meilleure forme, c'est parfait !

En tout cas, merci beaucoup à vous deux pour votre précieuse aide et le temps que vous m'avez accordé !

Je vous souhaite une très belle journée !

(peut-être à un de ces jours sur le forum )

OK.

En regardant votre fichier, vous pourriez aussi changez ceci :
- Supprimez les macro "Autoclose", "AfficheForm", "Userform activate" et "Dim temps" en entête
- Changez les macros suivantes :

Private Sub UserForm_Initialize()
Call majHeure
Pays.List = Worksheets("Pays").ListObjects("Tableau1").DataBodyRange.Value
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
Call ArretHeure
End Sub

- Dans le module 3 actuel, effacer tout et mettez ces deux codes (attention à Dim temps qui doit être en première ligne du module) :

Dim temps
Sub majHeure()
UserFormEnr.EnrDate.Caption = Format(Now, "dd/mm/yyyy            hh:mm:ss")
temps = Now + TimeValue("00:00:1")
Application.OnTime temps, "majHeure"
End Sub

Sub ArretHeure()
 On Error Resume Next
 Application.OnTime temps, Procedure:="majHeure", Schedule:=False
End Sub

- Une fois terminé, allez dans la feuille Pays et sélectionnez les lignes 251 à 100xxxx, puis comme précédemment faite click droite puis supprimer les lignes. De cette sorte, votre liste déroulante "Pays" dans l'userform ne contiendra plus de blanc. Elle ne prendra que l'ensemble des données définies par "Tableau1" dans le gestionnaire de noms

Crdlt

Je viens d'effectuer les modifications. C'est bien plus propre comme cela !

Encore merci pour vos conseils et votre aide !

Passez une bonne après-midi

Rechercher des sujets similaires à "enregistrement donnees userform ligne classeur"