Macro pour journal de caisse

Bonjour à tous,

J'ai débuté un fichier pour une entreprise, mais je bloque déjà car trop complexe pour moi.
(je fais ça afin de m'améliorer sur Excel...)

Le but serait quand cliquant sur le mode de paiement, ça copie les données dans journal de caisse, sur la bonne ligne en fonction de la date, et sinon se serait trop simple, additionne au fur et à mesure les ventes.

Ensuite, viens déduire les produits du stock.

J'ai vraiment l'impression que c'est irréalisable...

Si quelqu'un peut m'aider?

Merci d'avance
Cris

https://www.cjoint.com/doc/17_09/GIuoXt4NBhD_Suivi-CA-Stock.xlsm

64 réponses

Résumé de la discussion

Le fil porte sur l’automatisation d’un fichier Excel par VBA visant à transférer les données d’un ticket vers le journal de caisse selon la date, à ajouter les ventes et à déduire le stock. Les échanges mettent en évidence des difficultés telles que la copie des données sur la bonne ligne et l’addition des ventes, qui fonctionnent différemment selon l’onglet (statistiques vs tableau de bord/gestion mensuelle). Des pistes sont explorées pour améliorer l’incrémentation par client sur 6 et 12 mois, optimiser les boucles et vérifier la première ligne vide en colonne I, avec des tests et des fichiers partagés. Des avancées concrètes sont rapportées, dont une solution trouvée répondant au besoin, mais des blocages subsistent notamment sur la validation du ticket et l’envoi vers le suivi des ventes.

Bobot (l’IA à votre service)
  1. Bonjour

    1° rajouter une cellule pour le total en E13 de Vente jour et y mettre une formule de SOMME pour sommer toutes les cellules au dessus

    2° Mettre cette macro dans un module :
    Sub caisse()
    Dim Ligne As Long
    With Sheets("Journal de caisse")
    Ligne = .Columns(1).Find(Date, , , , xlByColumns, xlPrevious).Row
    If Range("E3") > 0 Then .Range("C" & Ligne) = Range("E3")
    .Range("D" & Ligne) = Range("E35") - Range("E3")
    End With
    End Sub


    3° Créer un nouveau bouton avec pour code :
    Private Sub CommandButton1_Click()
    caisse
    End Sub


    Cdlmnt
    Via
    0
    1. Merci beaucoup pour ta réponse, ça ne fonctionne pas comme je le souhaiterais mais grâce à ta macro, je décortique et espère y arriver...

      Cris
      0
      1. Maintenant mes 3 macros de validation du ticket fonctionnent, seulement il faudrait que ça additionne avec les cellules du journal de vente, car la sa réactualise seulement.

        Voir fichier ci-joint.

        Merci d'avance.
        Cris

        https://www.cjoint.com/c/GIvsmyXk2PD
        0
        1. par exemple là j'essaye sur la ligne contenant G9 mais je n'arrive pas à la composer:

          Sub Espece()
          Dim Ligne As Long
          With Sheets("Journal de caisse")
          Ligne = .Columns(1).Find(Date, , , , xlByColumns, xlPrevious).Row
          If Range("G9") > 0 Then .Range("C" & Ligne) = Range Sum(("G9") ; "C & Ligne"))
          If Range("G5") > 0 Then .Range("D" & Ligne) = Range("G5")
          If Range("G24") > 0 Then .Range("F" & Ligne) = Range("G24")
          End With
          End Sub
          0
          1. Bonjour

            Il suffit de modifier tes lignes de macro comme cela :
            If Range("G9") > 0 Then .Range("C" & Ligne) =.Range("C" & Ligne)+ Range("G9")

            D'autre part il est inutile d'avoir 3 fois la même macro pour especes, cheque et CB

            Tu fais une seule macro Sub journal() avec les lignes actuelles qui reportent les données et dans les 3 Sub espece, CB et chèque tu remplaces ces lignes par un appel à journal

            Cdlmnt
            Via

            "L'imagination est plus importante que le savoir."    A. Einstein
            0
            1. MERCI beaucoup, ça fonctionne parfaitement!!!

              Non j'aimerais que se soit le mode de paiement qui valide le ticket donc j'aimerais conserver les 3.

              Maintenant je vais rajouter le fait de réinitialiser le ticket a la fin de chaque macro (mais sa je sais faire)

              Ensuite je vais bien lire tes données pour rajouter le fait de déduire les articles du stock. J'espère que tu seras là si problème car tu es un vrai pro!

              UN GRAND MERCI.

              Cris
              0
              1. Re,

                C'est bien le mode de paiement qui valide le ticket mais comme c'est la même opération qui est à faire c'est plus ergonomique de faire une seule macro :
                Sub journal ()
                Dim Ligne As Long
                With Sheets("Journal de caisse")
                Ligne = .Columns(1).Find(Date, , , , xlByColumns, xlPrevious).Row
                If Range("G9") > 0 Then .Range("C" & Ligne) =.Range("C" & Ligne)+ Range Sum(("G9") ; "C & Ligne"))
                If Range("G5") > 0 Then .Range("D" & Ligne) =.Range("D" & Ligne)+ Range("G5")
                If Range("G24") > 0 Then .Range("F" & Ligne) = .Range("F" & Ligne)+Range("G24")
                End With
                End sub 


                puis la macro associé au bouton devient :
                Sub espece()
                journal
                End sub


                le clic sur le bouton espece lance donc la macro journal

                Faire la même chose pour CB et chèque

                Pas de souci recontacte moi pour la gestion du stock si problème

                Cdlmnt
                Via

                0
                1. Ah ok je comprend mieux maintenant se que c'est la macro associée.

                  mais trop tard j'ai bien avancé sur le fichier...

                  Maintenant, en cliquant sur le mode de paiement ça interfère sur journal de caisse ainsi que stock...

                  Mon fichier fonctionne parfaitement, je te le joint ci-dessous:

                  https://www.cjoint.com/c/GIvwCvJqd0D

                  Mais maintenant, j'aimerais bloquer les cellules, imaginons on mets une stagiaire en caisse!!!

                  Mais du coup je suis en erreur. je ne pense pas pouvoir contrer ça donc je ne verrouille pas mais bon si tu as un conseil je suis preneur...

                  Fichier mode verrouillé:

                  https://www.cjoint.com/c/GIvwJpO5VsD

                  Encore un GRAND MERCI!

                  Cris
                  0
                  1. J'ai trouvé ceci:

                    Mais ça ne fonctionne pas, je pense ne pas savoir le placer correctement...

                    Sub MacroavecfeuilleProtect()

                    ActiveSheet.Unprotect "lemotdepasse"

                    'Placez ici vos instructions

                    ActiveSheet.Protect "lemotdepasse", True, True, True

                    End Sub

                    CRIS
                    0
                    1. Bonjour

                      C'est bien la méthode à employer

                      En fait après chaque ligne With (Sheets)... dans tes macros, mettre l'instruction .Unprotect ou .Unprotect "toto" si elle est protégée par un mot de passe (en remplaçant toto par le mot de passe bien sûr)
                      Et avant chaque End with mettre l'instruction .Unprotect ou .Unprotect "toto"

                      Cdlmnt
                      Via
                      0
                      1. Bonjour Via55,

                        J'ai bien avancer sur le fichier, enfin maintenant la mise en forme ne devrais plus bouger.

                        Est ce que je peux te demander encore une fois un peu d'aide?

                        En effet je rencontre un problème lors de la validation de mon ticket de caisse.

                        Voir dans: Userform3; Sub Valider_le_ticket; section : With sheets(Suivi ventes) et 'presta

                        Tu verras que lorsque je valide le ticket, j'envoie bien les données dans stock, j'envoie bien également dans le journal de caisse. Mais impossible d'envoyer dans suivi ventes.

                        Je ne comprend pas pourquoi. 

                        Merci d'avance si tu peux jeter un œil.

                        Cris

                        https://www.cjoint.com/c/GIDpmEte1QD
                        0
                    2. Bonjour

                      1) Tu fais rechercher la dernière ligne remplie dans la colonne B, or il y des formules dans la colonne B donc cellules non vides ! il faut rechercher dans la colonne I
                      2) Il faut rajouter +1 pour avoir la 1ere ligne vide
                      3) Il y a un point en trop devant Range("E4")

                      Lignes corrigées :
                      ' Classement dans suivi ventes
                      With Sheets("Suivi ventes")

                      i = Sheets("Suivi ventes").Range("I65536").End(xlUp).Row + 1 'Permet de se positionner sur la dernière ligne de tableau VIDE

                      'presta
                      If Range("E4") <> 0 Then .Range("I" & i) = (TextBox4)
                      If Range("E4") <> 0 Then .Range("F" & i) = Range("E4")

                      Ces lignes gèrent les presta mais il n'y a aucune ligne pour les ventes ?!

                      Cdlmnt
                      Via
                      0
                      1. Re,

                        Merci beaucoup, j'essaye ça de suite... Dire que j'ai passé l'après midi à chercher...

                        Oui il n'y a pas encore pour Vente car tant que presta ne fonctionnais pas je n'ai pas encore écris pour les ventes.

                        J'essaye de suite et si tout ok je créer le tout et te fais un retour.

                        Un immense MERCI pour ta réactivité!

                        Cris
                        0
                      2. Je viens de copier coller, ma vente se valide mais toujours rien dans suivi ventes...

                        Je ne comprends vraiment pas
                        0
                      3. @Cris68300Renvoie moi ton fichier corrigé
                        0
                      4. @Cris68300C'est moi qui avait omis de te signaler de changer les Ligne en I dans les 2 lignes suivantes :
                        If Range("E4") <> 0 Then .Range("I" & i) = (TextBox4)
                        If Range("E4") <> 0 Then .Range("F" & i) = Range("E4")

                        ça devrait être bon maintenant

                        Cdlmnt
                        Via
                        0
                    3. Via,

                      Peut être peux tu m'aider encore...

                      En fait ce que je cherche c'est enregistrer le ticket, article par article pour pouvoir après extraire des stats, client, fournisseur etc...

                      Et aussi avoir un suivi de chaque vente.

                      Le seul problème, tu verras à la dernière ligne du suivi des ventes, c'est que je n'obtiens pas une ligne par article. exemple lors de la dernière ligne j'ai essayé avec une prestation et 1 article de chaque de chez Zao fournisseur et je récolte 1 seule ligne (sauf que j'aimerais les 4 pour 4 articles/presta).

                      Je ne sais pas si je suis bien clair dans mon explication, sinon dis moi et je recommence.

                      Et 2ieme problème, pc très long maintenant pour valider le ticket, formule trop longue ou PC trop faible en capacité?

                      Merci d'avance pour ta réponse.

                      Cris

                      https://www.cjoint.com/c/GIDrNfamWtD
                      0
                      1. Je suis de sortie ce soir, je regarde ça en rentrant ou demain
                        0
                        1. Normal, pas de souci,
                          très bonne soirée à toi.

                          Cris
                          0
                      2. et ici?
                        https://mon-partage.fr/f/AYHJOgv4/
                        0
                        1. Oui super!

                          je regarde ça de suite, mais pour l'instant j'ai une dizaine de seconde entre la validation click et l'exécution...

                          Je pense plus PC trop vieux.

                          En tout cas merci encore, je regarde ton travail de très prêt et reviens vers toi,

                          Cris
                          0
                        2. Merci ça fonctionne.

                          Du coup j'ai passé la nuit à comprendre les boucles (car même si ce fichier va servir à une amie pour son commerce, mon premier but est de m'améliorer et d'apprendre).

                          Par contre toujours ce problème, plus de 20 sec d'attente lors de la validation... (début de semaine je vais acheter un nouveau PC et pense que sa ira mieux)
                          0
                        3. Est-ce que tu peux regarder l'ajout d'un nouveau client.
                          Usf2

                          Car à l'ajout j'ai besoin qu'il se mette sur la dernière ligne mais avant j'ai besoin de copier les formules des colonnes (A,S,T,U,V)

                          Je n'y arrive pas...

                          https://www.cjoint.com/c/GIEdeGeeAnD
                          0
                        4. Via,

                          Je viens de remarquer que depuis ta boucle, je n'ai plus le report dans stock...

                          Je n'ose pas y toucher, je préfère t'attendre.

                          Cris
                          0
                        5. @Cris68300Bonjour Cris,

                          1) le report dans stock s'effectue bien chez moi dans le fichier que tu m'as envoyé

                          2) Ne t'embêtes pas avec la recopie des formules par macro, étends d'abord ces formules sur un nombre de lignes conséquentes (nombre de clients maxi évalués : 500 par ex) mais pas jusqu'en bas car ça ferait ramer encore plus
                          L'extension n'est pas gênante car les formules n'affichent que du vide ou 0 si pas de valeur en colonnes précédentes

                          Cdlmnt
                          Via
                          0
                      3. Désolé oubli de ma part d'un -1 dans la boucle pour les stocks :
                        If Range("E" & n) > 0 Then .Range("C" & n - 1) = .Range("C" & n - 1) - Range("E" & n)

                        Cdlmnt
                        Via
                        0
                        1. Super effectivement c'étais ça.

                          Il me tarde d'avoir ta lecture pour le deviner tout seul...

                          Merci encore
                          0
                        2. En attendant ta réponse, je cherchais à faire le calcul du rendu monnaie.

                          Toujours sur Usf3
                          J'aimerais afficher la différence de Txtbox1 - 2 dans textbox 3 (j'ai aussi essayé avec frame pour le rendre non cliquable.

                          Voici ce que je fait:
                          Private Sub TextBox3_Change()
                          UserForm3.TextBox3.Value = TextBox1 - TextBox2 'aussi essayer avec (.....)
                          TextBox3.Value = Format(TextBox2.Value, "0.00 €")
                          End Sub

                          Mais impossible.

                          Tant que j'y suis, ensuite, reporter ce montant dans la msgbox de validation, de façon à se que la personne en caisse puisse le laisser affiché avant de cliquer ok, pour s'en servir en rendant la monnaie, vous vous en serais douté...

                          Si j'en demande trop n'hésites pas à me le dire, car j'apprécie beaucoup ton aide et tes connaissances, mais ça commence à faire beaucoup...
                          (Si tu passes dans le coin de l'institut de beauté qui va utiliser ce fichier, tu auras massage gratuit de ma part!!!!!!!!)

                          Bien cordialement,

                          Cris
                          0
                        3. @Cris68300Re,

                          Pas de souci !
                          Ta sub dois se déclencher au changement dans textbox1, pas textbox2 :
                          Private Sub TextBox1_Change()
                          If TextBox1 = "" Then Exit Sub
                          TextBox3.Value = TextBox1 - TextBox2
                          TextBox3.Value = Format(TextBox3.Value, "0.00 €")
                          End Sub

                          Pour afficher le rendu aussi dans la boîte de message, modifier ainsi les premières lignes :
                          Private Sub CommandButton1_Click()
                          Dim Rep As Integer
                              If TextBox3 > 0 Then mes = "A rendre : " & TextBox3
                              Rep = MsgBox("Valider la vente?" & Chr(10) & mes, vbYesNo + vbQuestion, "mDF XLpages.com")


                          En attendant la suite (je suis sûr qu'il y en aura une)
                          Bien cordialement
                          Via
                          0
                        4. @via55Wouaw tu es magique!!!! Je n'aurais jamais trouvé.

                          Mais tu sais qu'à chaque solution que tu me donnes, je la décortique consciencieusement pour comprendre et apprendre.

                          Je suis passionné de la puissance Excel! c'est pour ça.

                          Allez à très vite comme tu dit! :)

                          Cris
                          0
                        5. @Cris68300Oui c'est ça qui est passionnant avec Excel on n'a jamais fini d'apprendre et tout ce qu'on peut arriver à faire est incroyable

                          A bientôt

                          Via
                          0
                      4. Je me suis pas trompé en te disant à très vite...

                        Bon, bonne nouvelle, l'onglet "suivi ventes" entièrement fini. Pour le terminer, il me restais à chercher le fournisseur, j'ai usé de 2 colonnes sur cotés, écriture blanc, et INDEX EQUIV.

                        Maintenant je reviens vers toi car j'ai cherché quasiment toute la matinée, pour l'USF1, j'ai regardé 100 000 Tutos, mais ne trouve pas.

                        En fait j'ai une listbox, qui vient s'alimenter par soit combo nom soit combo prénom (et j'ai réussi à faire une combo active efface l'autre)

                        Mais là où je bloque, c'est que une fois client affiché dans listbox, j'aimerais juste d'un clic le sélectionner dans cette dite listbox et que sa affiche adresse ville etc...
                        Via source de données sheets(Clients)

                        C'est un système de vérification, au cas où j'ai 2 Didier Bertrand par exemple, puis sa permets à la vendeuse, de vérifier si changement de tel ou mail etc...

                        Voilà, je t'ai tout dit.

                        Je te joints à nouveau le fichier vu qu'il a évolué.

                        Merci,
                        Cris

                        https://www.cjoint.com/c/GIEpD4Lb72D
                        0
                        1. Voilà
                          https://mon-partage.fr/f/vfLoq4ez/

                          J'ai du rajouter 2 textbox pour le nom et le prenom dans l'userform car l'affichage dans les combobox relance la macro que tuas faite au changement dans les combos. Trop galère à modifier ou à shunter

                          Pour échanger les fichiers il vaut mieux passer par monpartage on peut ouvrir directement les fichiers avec macro ce qui n'est pas le cas pour cjoint

                          Cdlmnt
                          Via
                          0
                          1. ok je retiens pour le partage.

                            Je regarde de suite ton travail.

                            Merci
                            0
                        2. Bonjour Via,

                          J'espère que tu passes un bon dimanche.

                          Est-ce que tu pourras regarder, quand tu as 5 min, car sur l'onglet vente jour lorsque que je crée un nouveau client, tout fonctionne mais j'ai le nom et prénom qui vient se copier dans ce même onglet "vente jour", en colonne S et T sur la ligne+1 (en rapport du fichier client). C'est à dire mon client se crée en ligne 20 du fichier client et le nom prénom sur 21.

                          Seulement, j'ai tout fouillé, formule et macro, je n'arrive pas à trouver où cette (fausse) action a pu être écrite.

                          Pour moi vu que c'est lié au "Valider de Créer un nouveau client" je ne cesse de penser que ça doit venir de là, mais je ne trouve rien.

                          Merci d'avance.
                          Cris

                          PS: J'ai bien avancé, tout est programmé au niveau recherche client, création client, aussi bien onglet vente que client.

                          Je vais pouvoir me pencher sur la partie Statistique

                          https://mon-partage.fr/f/CgRqVP3Q/
                          0
                          1. NUL NUL que je suis, oubli ce message!!!

                            Une formule étais entrée en S et T, suite à la suppression de ses 2 colonnes mon problème est résolu!!!
                            0
                        3. En revanche, si tu as une astuce pour insérer le format code postal dans mes macro d'ajout ou de modifier, je suis preneur.

                          J'ai trouver avec formatnumber 00000

                          Mais mon code postal devient 82 100 rangé sur gauche

                          au lieu de:

                          82100 rangé à droite

                          Cdt
                          Cris
                          0
                          • 1
                          • 2
                          • 3
                          • 4