Report de données par formulaire
Bonjour !
Voilà, j'ai créé un classeur dans lequel j'ai une feuille Formulaire et une autre feuille où les données validées dans le formulaires viendraient se cumuler!
J'ai récupéré la macro d'un autre fichier Excel que je possède (et sur lequel ça fonctionne très bien!) J'ai bidouillé pour que les données correspondent (je crois) mais la formule ne fonctionne pas et ne transfert pas les données ? Est-ce que quelqu'un pourrait m'aider ?
Je mets à disposition le classeur vide de données !
Merci pour vos coups de mains à venir !!!
Hello Syra,
Effectivement, ton code à été un peu bidouillé.
Si ton objectif est juste de collecter les données de ton formulaires et de les mettre dans ta feuille ACHATS, voici un code qui devrait faire l'affaire.
Tu trouveras des commentaires pour t'aiguiller si tu dois effectuer des modifications dans les adresses des cellules, ou simplement ajouter de nouvelles lignes si tu as d'autres champs dans ton formulaire.
Sub AddNewPurchase()
Dim ws As Worksheet, wsDB As Worksheet
Set ws = Sheets("NOUVEL ACHAT") ' Variable feuille
Set wsDB = Sheets("ACHATS")
Dim intLastRow As Integer, intRowToPast As Integer
intLastRow = wsDB.Cells(Rows.Count, 2).End(xlUp).Row ' Dernière ligne non vide de la feuille Achats
intRowToPast = intLastRow + 1 ' Prochaine ligne vide
With wsDB
.Cells(intLastRow, 2).Value = ws.Range("B5").Value ' Désignation / Colonne 2 (B)
.Cells(intLastRow, 3).Value = ws.Range("D5").Value ' Référence / Colonne 3 (C)
.Cells(intLastRow, 5).Value = ws.Range("B8").Value ' Où / Colonne 5 (E)
.Cells(intLastRow, 6).Value = ws.Range("D8").Value ' Date / Colonne 6 (F)
.Cells(intLastRow, 8).Value = ws.Range("B11").Value ' Quantité / Colonne 8 (H)
.Cells(intLastRow, 7).Value = ws.Range("D11").Value ' Prix d'achat / Colonne 7 (G)
End With
' Plage de cellule à effacer après traitement
Dim rngToClear As Range
Set rngToClear = ws.Range("B5,B8,B11,D5,D8,D11")
rngToClear.ClearContents ' Effacer le contenu des cellules définis
MsgBox "L'achat a été ajouté avec succès !", vbInformation + vbOKOnly
End SubCe code est à lier au bouton.
A+,
Kilian
Bonsoir !
Merci pour ta réponse ! C'est presque parfait car en fait, ça colle les informations par dessus la dernière ligne existante..
Par contre le code est vraiment nickel ! C'est super clair merci beaucoup !!
De mon côté j'ai déjà fait une petite modif mais le bug avait déjà lieu avant
Sub AddNewPurchase()
Dim ws As Worksheet, wsDB As Worksheet
Set ws = Sheets("NOUVEL ACHAT") ' Variable feuille
Set wsDB = Sheets("ACHATS")
Dim intLastRow As Integer, intRowToPast As Integer
intLastRow = wsDB.Cells(Rows.Count, 2).End(xlUp).Row ' Dernière ligne non vide de la feuille Achats
intRowToPast = intLastRow + 1 ' Prochaine ligne vide
With wsDB
.Cells(intLastRow, 2).Value = ws.Range("B5").Value ' Désignation / Colonne 2 (B)
.Cells(intLastRow, 3).Value = ws.Range("D5").Value ' Référence / Colonne 3 (C)
.Cells(intLastRow, 5).Value = ws.Range("B8").Value ' Où / Colonne 5 (E)
.Cells(intLastRow, 6).Value = ws.Range("D8").Value ' Date / Colonne 6 (F)
.Cells(intLastRow, 8).Value = ws.Range("B11").Value ' Quantité / Colonne 8 (H)
.Cells(intLastRow, 7).Value = ws.Range("D11").Value ' Prix d'achat / Colonne 7 (G)
.Cells(intLastRow, 10).Value = "=RC[-2]*RC[-3]" ' Prix d'achat / Colonne 10 (I)
End With
' Plage de cellule à effacer après traitement
Dim rngToClear As Range
Set rngToClear = ws.Range("B5,B11,D5,D11")
rngToClear.ClearContents ' Effacer le contenu des cellules définis
MsgBox "L'achat a été ajouté avec succès !", vbInformation + vbOKOnly
End SubHello Syra,
Oui pardon, erreur de ma part, j'ai utilisé la mauvaise variable dans l'insertion des valeurs... (intLastRow à la place de intRowToPast).
Voici ta dernière version corrigé.
Sub AddNewPurchase()
Dim ws As Worksheet, wsDB As Worksheet
Set ws = Sheets("NOUVEL ACHAT") ' Variable feuille
Set wsDB = Sheets("ACHATS")
Dim intLastRow As Integer, intRowToPast As Integer
intLastRow = wsDB.Cells(Rows.Count, 2).End(xlUp).Row ' Dernière ligne non vide de la feuille Achats
intRowToPast = intLastRow + 1 ' Prochaine ligne vide
With wsDB
.Cells(intRowToPast, 2).Value = ws.Range("B5").Value ' Désignation / Colonne 2 (B)
.Cells(intRowToPast, 3).Value = ws.Range("D5").Value ' Référence / Colonne 3 (C)
.Cells(intRowToPast, 5).Value = ws.Range("B8").Value ' Où / Colonne 5 (E)
.Cells(intRowToPast, 6).Value = ws.Range("D8").Value ' Date / Colonne 6 (F)
.Cells(intRowToPast, 8).Value = ws.Range("B11").Value ' Quantité / Colonne 8 (H)
.Cells(intRowToPast, 7).Value = ws.Range("D11").Value ' Prix d'achat / Colonne 7 (G)
.Cells(intRowToPast, 10).Value = "=RC[-2]*RC[-3]" ' Prix d'achat / Colonne 10 (I)
End With
' Plage de cellule à effacer après traitement
Dim rngToClear As Range
Set rngToClear = ws.Range("B5,B11,D5,D11")
rngToClear.ClearContents ' Effacer le contenu des cellules définis
MsgBox "L'achat a été ajouté avec succès !", vbInformation + vbOKOnly
End SubEst-ce que la colonne B de ta feuille ACHATS est obligatoirement rempli ou peut-elle être vide ?
Car sur cette ligne, on cherche la dernière cellule de la colonne 2 (B), si vide, mettre une colonne qui sera obligatoirement rempli.
intLastRow = wsDB.Cells(Rows.Count, 2).End(xlUp).Row ' Dernière ligne non vide de la feuille AchatsAutrement, je te conseil d'utiliser des références à tes cellules avec ws.Range plutôt que des références relatives R1C1 ("=RC[-2]*RC[-3]"), ça apportera plus de clarté à ton code.
A+,
Kilian
Bonjour Kilian !
En effet tout va bien !! Je me butais à trouver d'où ça venait et honnêtement, je ne cherchais pas du tout ici !
La colonne B sera toujours remplie oui !
Merci beaucoup pour ton aide! Je note le sujet résolu :)