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