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 Sub

Ce 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 Sub

Hello 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 Sub

Est-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 Achats

Autrement, 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 :)

Rechercher des sujets similaires à "report donnees formulaire"