IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

LETTRAGE AVEC VBA


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Comptable
    Inscrit en
    Novembre 2019
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : Maroc

    Informations professionnelles :
    Activité : Comptable
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2019
    Messages : 12
    Points : 7
    Points
    7
    Par défaut LETTRAGE AVEC VBA
    Bonjour,

    Je travaille avec VBA qui me permet de lettrer des écritures débit - crédit et d'identifier celles qui se lettrent et de leurs accorder un code lettrage.

    Cependant, il existe des lignes qui leurs soldes est égale à 0 et le VBA les considèrent comme différents et leurs attribuent 0 en colonne lettrage. (ci-joint un aperçu de fichier)

    Nom : Exemple Etat FR.png
Affichages : 486
Taille : 101,6 Ko

    Etant débutante en VBA, j'aimerais bien savoir où est l'erreur sur le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    Option Explicit
    Public Sub lettrer()
    Const ldb = 6
    Const cOP = "D"
    Const cMt = "F"
    Const crs = "G"
    Dim lig As Long
    Dim dic
    Dim mof As String
    Dim tOP, tMt
    Dim tdk
    With ActiveSheet
        lig = .Cells(.Rows.Count, cOP).End(xlUp).Row + 1
        tOP = .Cells(ldb, cOP).Resize(lig - ldb, 1).Value
        tMt = .Cells(ldb, cMt).Resize(lig - ldb, 1).Value
        ReDim trs(1 To UBound(tOP))
        Set dic = CreateObject("Scripting.Dictionary")
        dic.RemoveAll
        For lig = 1 To UBound(tOP)
            mof = tOP(lig, 1) & "|"
            If dic.Exists(mof) Then
                dic(mof) = dic(mof) + tMt(lig, 1)
            Else
                dic.Add mof, tMt(lig, 1)
            End If
        Next lig
        tdk = dic.keys: ReDim t_l(1 To 3)
        For lig = 1 To UBound(tdk)
            If dic(tdk(lig)) = 0 Then dic(tdk(lig)) = d_lettre(t_l)
        Next lig
        For lig = 1 To UBound(tOP)
            mof = tOP(lig, 1) & "|": trs(lig) = dic(mof)
        Next lig
        .Cells(ldb, crs).Resize(UBound(trs), 1).Value = Application.Transpose(trs)
    End With
    End Sub
    Public Function d_lettre(tbl)
    Dim idx As Integer, plu As Integer
        For idx = 1 To UBound(tbl): d_lettre = d_lettre & Chr(tbl(idx) + 65): Next
        plu = 1
        For idx = UBound(tbl) To 1 Step -1
            If tbl(idx) < 25 Then: tbl(idx) = tbl(idx) + plu: Exit For: Else: tbl(idx) = 0
        Next
    End Function
    Merci pour votre aide.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par FanSu Voir le message
    Bonjour,

    Etes-vous certaine que les montants ont tous deux chiffres après la virgule ? Vous aurez remarqué que le seul cas qui fonctionne, c'est lorsque vous avez des valeurs entières.

    Regardez si en arrondissant à deux chiffres après la virgule dans votre code, cela règle le problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
                For lig = 1 To UBound(tOP)
     
                    mof = tOP(lig, 1) & "|"
                    If dic.Exists(mof) Then
                        dic(mof) = dic(mof) + Round(tMt(lig, 1), 2)
                    Else
                        dic.Add mof, Round(tMt(lig, 1), 2)
                    End If
     
                Next lig
    Nb : Lorsque vous éditez du code dans vos messages, sélectionnez-le et cliquez sur la balise # dans le menu, et indentez vos lignes.

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Comptable
    Inscrit en
    Novembre 2019
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : Maroc

    Informations professionnelles :
    Activité : Comptable
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2019
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Bonjour Eric,

    Merci tout d'abord pour votre feed-back, A propos de ta remarque, oui exactement le lettrage est attribuer juste aux montants entier.

    Et j'ai essayé avec la modification du code que tu m'as envoyé et ça marche toujours pas.

    Je met en attaché le fichier excel pour plus de clarté.





    Salutations.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par FanSu Voir le message
    Lorsqu'un code ne fonctionne pas comme il faut, il ne faut pas hésiter à placer des Debug.print pour voir ce que vous récupérez à chaque passage dans les boucles. Ici, j'ai pris comme exemple l'opération OP0278/20 et j'ai modifié le code comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
                For Lig = 1 To UBound(tOP)
     
                    mof = tOP(Lig, 1) & "|"
                    If Dic.Exists(mof) Then
                        Dic(mof) = Dic(mof) + Round(tMt(Lig, 1), 2)
                    Else
                        Dic.Add mof, Round(tMt(Lig, 1), 2)
                    End If
     
                   If mof = "OP0278/20" & "|" Then
                       Debug.Print "Ligne : " & Lig & ", montant " & tMt(Lig, 1) & ", valeur restante " & Dic(mof)
                   End If
     
                Next Lig
    Le résultat dans la fenêtre exécution (Ctrl-G) a donné cela :
    Pièce jointe 584935


    Il faut donc arrondir sur la somme. Le code est donc à modifier comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    Public Sub lettrer()
     
    Const ldb = 6
    Const cOP = "D"
    Const cMt = "F"
    Const crs = "G"
    Dim Lig As Long
    Dim Dic
    Dim mof As String
    Dim tOP, tMt
    Dim tdk
    Dim ShEtat As Worksheet
     
            Set ShEtat = Sheets("ETAT 4438")
     
            With ShEtat
     
                 Lig = .Cells(.Rows.Count, cOP).End(xlUp).Row + 1
                tOP = .Cells(ldb, cOP).Resize(Lig - ldb, 1).Value
                tMt = .Cells(ldb, cMt).Resize(Lig - ldb, 1).Value
     
                ReDim trs(1 To UBound(tOP))
                Set Dic = CreateObject("Scripting.Dictionary")
                Dic.RemoveAll
     
                For Lig = 1 To UBound(tOP)
     
                    mof = tOP(Lig, 1) & "|"
                    If Dic.Exists(mof) Then
                        Dic(mof) = Round(Dic(mof) + tMt(Lig, 1), 2)
                       ' Dic(mof) = Dic(mof) + Round(tMt(Lig, 1), 2)
                    Else
                        Dic.Add mof, Round(tMt(Lig, 1), 2)
                    End If
     
                 '  If mof = "OP0278/20" & "|" Then
                '       Debug.Print "Ligne : " & Lig & ", montant " & tMt(Lig, 1) & ", valeur restante " & Dic(mof)
               '    End If
     
                Next Lig
     
                tdk = Dic.keys: ReDim t_l(1 To 3)
     
                For Lig = LBound(tdk) To UBound(tdk)  ' L'indice de la matrice démarre à 0
              '  For Lig = 1 To UBound(tdk)
                    If Dic(tdk(Lig)) = 0 Then Dic(tdk(Lig)) = d_lettre(t_l)
                Next Lig
     
                For Lig = LBound(tOP) To UBound(tOP) ' L'indice de la matrice démarre à 0
               ' For Lig = 1 To UBound(tOP)
                    mof = tOP(Lig, 1) & "|": trs(Lig) = Dic(mof)
                Next Lig
     
                .Cells(ldb, crs).Resize(UBound(trs), 1).Value = Application.Transpose(trs)
     
            End With
     
    End Sub
    Nb : En démarrant les boucles à 1 dans les matrices tdk et tOP, la première pièce "OP3074/19" n'est pas prise en compte car les indices doivent démarrer à 0. Le plus simple est de noter LBound

  5. #5
    Futur Membre du Club
    Femme Profil pro
    Comptable
    Inscrit en
    Novembre 2019
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : Maroc

    Informations professionnelles :
    Activité : Comptable
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2019
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Merci énormément Eric

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. afficher la barre de menus complète avec vba
    Par jejestyle dans le forum Access
    Réponses: 7
    Dernier message: 07/09/2006, 18h07
  2. Utilisation de DDERequest avec VBA
    Par queenmum dans le forum Général VBA
    Réponses: 1
    Dernier message: 10/09/2005, 12h24
  3. Ouvrir un document Excel en READ ONLY (avec VBA)
    Par beegees dans le forum Access
    Réponses: 2
    Dernier message: 29/12/2004, 20h48
  4. Créer un formulaire avec VBA ?
    Par Jean Bonnisme dans le forum VBA Access
    Réponses: 3
    Dernier message: 14/10/2004, 10h40
  5. problème avec VBA
    Par Delph dans le forum Langage
    Réponses: 2
    Dernier message: 19/08/2002, 13h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo