Microsoft 365 CALCULE DE TVA

aktal-s

XLDnaute Nouveau
Bonjour, j'espère que vous allez bien, j'ai un petit problème pour le calcule auto de la TVA et HT, j'ai récupéré un fichier excel sur le forum, que j'ai modifié un peu, le problème dans le fichier, le calcule se fait en bas, or que dans mon fichier les calcules doit se faire en haut, je vous met le fichier, je vous remercie infiniment pour m'aider.
Merci
 

Pièces jointes

  • test tva.xlsm
    23.1 KB · Affichages: 29

soan

XLDnaute Barbatruc
Inactif
Bonjour aktal-s,

je ne sais pas trop si je dois te souhaiter la bienvenue ! 😜 d'un côté tu as le "grade" de "Nouveau" avec 1 seul post ; de l'autre côté, tu n'es plus nouveau puisque tu t'es inscrit le 22 mai... 2019 ! et en 2 ans 1 mois 6 jours ton post #1 est ton tout premier post ? faut pas être aussi timide, hein ? t'as l'droit d'poster des messages plus souvent ! 😄 j'espère quand même que si j't'apporte une solution valable, tu attendras pas de nouveau plus de 2 ans avant d'poster une réponse, lolllllll ! 🤣



ton fichier en retour ; clique sur "Bouton 2" ➯ travail effectué ! 😊 sur mon PC, ça donne ceci :​

Image.jpg


à part l'inversion des 2 lignes initiales, et l'ajout d'une ligne pour la TVA, note que j'ai effacé la coche initiale "X" qui était en K1 ; en effet, le job a été fait, donc cette coche est devenue inutile ; d'autre part, pour le calcul de la TVA lui-même, tu peux vérifier ceci :

HT = 50 / 1,2 = 41,666666666667 = 41,67 (arrondi à 2 décimales) ; puis TVA = 50,00 - 41,67 = 8,33 ; et bien sûr : 41,67 × 20 % = 41,67 × 0,2 = 8,334 = 8,33 (arrondi à 2 décimales).​



pour les colonnes E et F, j'ai mis un format de Nombre avec 2 décimales et séparateur de milliers ; pour la colonne G, comme c'est des numéros de comptes comptables sur lesquels il n'y aura pas de calculs, j'ai mis un format Texte ; avantage : pour un long n° de compte comptable, il n'y aura pas de risque qu'il soit transformé en nombre au format Scientifique, avec perte implicite des derniers chiffres !



code VBA de Module1 :

VB:
Option Explicit

Sub Test()
  If ActiveSheet.Name <> "Feuil1" Then Exit Sub
  Dim n&: n = Cells(Rows.Count, 1).End(3).Row
  If n = 1 And IsEmpty([A1]) Then Exit Sub
  Dim v1#, v2#, i&, j&: i = n: Application.ScreenUpdating = 0
  Do While i > 0
    With Cells(i, 1)
      If .Offset(, 10) = "X" Then
        If .Offset(, 6) = 512 And Left$(.Offset(1, 6), 1) = "6" Then
          v1 = .Offset(1, 4)
          v2 = Round(v1 / 1.2, 2): If v2 > 0 Then .Offset(, 4) = v2
          .Offset(1, 4).ClearContents: .Offset(1, 5) = v1
          .Offset(, 5).ClearContents
          .Offset(, 6) = .Offset(1, 6): .Offset(1, 6) = 512
        End If
        j = i + 1: Rows(j).Insert
        Cells(i, 1).Resize(, 4).Copy Cells(j, 1): Cells(j, 7) = 445660
        v2 = v1 - v2: If v2 > 0 Then Cells(j, 5) = v2
        .Offset(, 10).ClearContents
      End If
    End With
    i = i - 1
  Loop
End Sub

si besoin, tu peux demander une adaptation.
à te lire pour avoir ton avis. 😉

soan
 

Pièces jointes

  • test tva.xlsm
    18.9 KB · Affichages: 13

aktal-s

XLDnaute Nouveau
Bonjour Soan, merci pour ton aide , j'apprécie vraiment, pour mon total absence j'étais pas au top pour des raisons divers, mais ça va maintenant..
Pour mon fichier j'ai mis en pièce jointe un exemple, les compte 6 ça passe en haut et le 512 en bas, dans ton fichier le 512 est en haut et le compte 6 est en bas, si tu peux seulement mettre le 512 en bas c'est serait parfait.
Merci encore :)
 

Pièces jointes

  • test tva (6).xlsm
    21.5 KB · Affichages: 5

soan

XLDnaute Barbatruc
Inactif
@aktal-s

d'après l'image ci-dessous, tu peux voir que : a) j'ai ajouté une coche "X" en colonne K pour chaque 1ère ligne d'un groupe de lignes jaunes ; c'est donc une opération avec un compte de charges de classe 6 pour lequel il faut ajouter une ligne de TVA (petit rappel comptable : c'est pas forcé qu'un compte de classe 6 soit assujetti à la TVA, car il peut y avoir une exonération de TVA ➯ c'est mieux que ce soit toi qui coche les opérations comptables adéquates, et pas que ce soit fait de façon automatique) ; b) j'ai inversé volontairement ce qui est dans le cadre rouge, manuellement, pour que tu puisses voir que la macro va rétablir l'ordre correct : d'abord le compte de charges de classe 6, puis le compte 512, la ligne de TVA étant ensuite insérée entre ces 2 lignes.​

Image 1.jpg


clique sur "Bouton 2" ➯ ça donne le résultat ci-dessous ; en colonne K, toutes les coches "X" ont bien été effacées ; pour les 4 opérations comptables en jaune : c'est bien le compte de charges en 1er, donc en haut ; le compte Banque 512000 ou 512 est en bas ; la ligne de TVA est au milieu, avec le compte 445660 mouvementé au Débit (➯ même sens comptable que le compte de charges).​

Image 2.jpg




code VBA de Module1 :

VB:
Option Explicit

Sub Test()
  If ActiveSheet.Name <> "Feuil1" Then Exit Sub
  Dim n&: n = Cells(Rows.Count, 1).End(3).Row
  If n = 1 And IsEmpty([A1]) Then Exit Sub
  Dim v1#, v2#, i&, j&, b As Byte
  i = n: Application.ScreenUpdating = 0
  Do While i > 0
    With Cells(i, 1)
      If .Offset(, 10) = "X" Then
        b = -(Left$(.Offset(, 6), 3) = 512 And Left$(.Offset(1, 6), 1) = "6")
        v1 = .Offset(b, 4)
        v2 = Round(v1 / 1.2, 2): If v2 > 0 Then .Offset(, 4) = v2
        If b = 1 Then
          .Offset(1, 4).ClearContents
          .Offset(1, 5) = v1: .Offset(, 5).ClearContents
          .Offset(, 6) = .Offset(1, 6): .Offset(1, 6) = 512
        End If
        j = i + 1: Rows(j).Insert
        Cells(i, 1).Resize(, 4).Copy Cells(j, 1): Cells(j, 7) = 445660
        v2 = v1 - v2: If v2 > 0 Then Cells(j, 5) = v2
        .Offset(, 10).ClearContents
      End If
    End With
    i = i - 1
  Loop
End Sub

soan
 

Pièces jointes

  • test tva (6).xlsm
    19.6 KB · Affichages: 7

soan

XLDnaute Barbatruc
Inactif
@aktal-s

dans mon code VBA précédent, j'ai mis cette instruction :

b = -(Left$(.Offset(, 6), 3) = 512 And Left$(.Offset(1, 6), 1) = "6")

j'ai bêtement oublié de mettre 512 entre guillemets, comme ceci :

b = -(Left$(.Offset(, 6), 3) = "512" And Left$(.Offset(1, 6), 1) = "6")

en effet, Left$() retourne une chaîne de caractères ➯ comparer avec le nombre 512 ne plante pas, mais à chaque tour de boucle, y'a une conversion implicite du texte retourné par Left$() en nombre pour vérifier si ce nombre est égal au nombre 512 situé à droite du signe égal « = » ➯ mettre 512 entre guillemets évite la conversion implicite : ça compare 2 textes "512" ; et ne perds pas de vue que c'est dans la boucle Do .. Loop ➯ y'avait une conversion implicite n× ; c'est subtil, hein ? 😜

pour le nouveau fichier de ton post #6, je vais le télécharger maintenant, puis je le regarderai dès que j'en aurai le temps. :)

soan
 

soan

XLDnaute Barbatruc
Inactif
Bonjour aktal-s,

désolé pour le gros retard, mais c'est enfin prêt ! :)

note que j'ai modifié tes données de départ ; il y a maintenant 2 opérations comptables avec un compte de charges ; une avec le compte 512 en bas, l'autre avec le compte 512 en haut ; il y a aussi 2 opérations comptables avec un compte de produits ; même remarque : compte 512 en bas ou en haut ; pour ces 4 opérations comptables, il n'y a que 2 lignes, car y'a pas de ligne pour le compte de TVA.

en colonne K, j'ai mis une coche pour chacune de ces 4 opérations comptables, car ayant décidé qu'aucune d'elles est exonérée de TVA, la macro devra ajouter une ligne pour noter cette TVA ; cette coche peut être « X » ou « x » (en majuscule ou en minuscule au choix, selon ta préférence).


clique sur "Bouton 2" ➯ travail effectué ! 😊 c'est-à-dire tout ceci :

* pour les opérations comptables dont le compte 512 était déjà en bas : pas d'inversion ; pour les autres opérations comptables dont le compte 512 était en haut : inversion ➯ au final, pour toutes les opérations comptables, le compte 512 est en bas, comme tu l'avais demandé ; et naturellement, en conséquence, le compte de charges ou de produits est toujours en haut.

* une ligne a été ajoutée pour le compte de TVA ; attention : pour un compte de charges, la TVA est en 445660 TVA sur autres biens et services ; pour un compte de produits, la TVA est en 445710 TVA collectée.

* je te laisse vérifier que les montants sont tous corrects, et placés dans la bonne colonne Débit ou Crédit.​



attention : tu avais mis mon code VBA dans le module de "Feuil1" ! comme ce n'est pas une sub événementielle, il faut la mettre dans un module standard tel que Module1 ; pour insérer un module standard, c'est très facile : quand tu es sur la fenêtre "Microsoft Visual Basic", fais : Alt i m (c'est le raccourci clavier de Insertion / Module).​



code VBA de Module1 :

VB:
Option Explicit

Sub Test()
  If ActiveSheet.Name <> "Feuil1" Then Exit Sub
  Dim n&: n = Cells(Rows.Count, 1).End(3).Row
  If n = 1 And IsEmpty([A1]) Then Exit Sub
  Dim c1$, c2$, v1#, v2#, i&, j&, k As Byte
  i = n: Application.ScreenUpdating = 0
  Do While i > 0
    With Cells(i, 1)
      If UCase$(.Offset(, 10)) = "X" Then 'on ignore toutes les lignes qui n'ont
      'pas de "X" en colonne K ; le UCase$() te permet de cocher aussi avec "x".
        If Not IsEmpty(.Value) Then 'sécurité, au cas où tu mettrais par inadvertance une
        'coche "X" en colonne K pour une des lignes vides intercalaires ; exemple : même
        'si tu mets un "X" en K20, la ligne 20 sera ignorée car A20 est vide.
          c1 = .Offset(, 6)  'n° de compte de la ligne haut d'un groupe de 2 lignes
          c2 = .Offset(1, 6) 'n° de compte de la ligne bas d'un groupe de 2 lignes
          v2 = .Offset(, 4): If v2 = 0 Then v2 = .Offset(, 5) 'TTC (en colonne E ou F)
          v1 = Round(v2 / 1.2, 2) 'HT = TTC / 1,2 (avec un arrondi à 2 décimales)
          With .Offset(, 4)
            .Resize(2, 2).ClearContents 'on efface tous les montants du groupe de 2 lignes
            If Left$(c1, 3) = "512" Then .Offset(, 2) = c2: .Offset(1, 2) = c1 'inversion
            'des n° compte si le compte Banque 512000 (ou 512) est sur la 1ère ligne haut
            k = 5 - (Left$(.Offset(, 2), 1) = "7") 'n° colonne : 5 ou 6 => en E ou en F
          End With
          j = i + 1: Cells(i, k) = v1: Cells(j, 11 - k) = v2: Rows(j).Insert
          .Resize(, 4).Copy Cells(j, 1): Cells(j, 7) = "445" & IIf(k = 5, "660", "710")
          Cells(j, k) = v2 - v1: .Offset(, 10).ClearContents
        End If
      End If
    End With
    i = i - 1
  Loop
End Sub

si besoin, tu peux demander une adaptation.
à te lire pour avoir ton avis. 😉

soan
 

Pièces jointes

  • TEST 02.xlsm
    20.2 KB · Affichages: 8

Discussions similaires

Réponses
6
Affichages
562
Réponses
6
Affichages
301
Réponses
11
Affichages
606

Statistiques des forums

Discussions
315 144
Messages
2 116 724
Membres
112 847
dernier inscrit
kevin1023