Microsoft 365 Assistance pour optimisation d'un code VBA qui ne fonctionne pas comme souhaité

  • Initiateur de la discussion Initiateur de la discussion desto
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

desto

XLDnaute Junior
Bonjour a tous,
J'espère que vous allez bien.
je viens par ce canal vous solliciter afin que vous m'aidiez à voir ce qui ne va pas dans mon code ci joint.
en effet, j'ai essayé de bidouiller quelque chose pour effectuer une première partie d'une tâche avant de pouvoir completer.
Le code ci joint doit exécuter les actions suivantes:
Parcourir des fichiers Excel dans un dossier, récupérer les informations de la feuille ‘’ EP745_TRX_SPEC_SN_TG ‘’ et faire les traitements ci-après :

  • Compiler dans un premier temps toutes les données de cette feuille spécifique dans le lot de fichier,
  • Regrouper par date de la ‘’D’’ et par pays (SÉNÉGAL et TOGO) de la colonne ‘’B’’
  • Exclure la ligne dont la colonne ‘’J’’ est non-vide et tenir uniquement compte des cellules vides.
  • Exclure également les lignes dont la colonne ‘’C’’ contient la mention ‘’ SMS617R’’
  • Exclure les lignes dont la colonne ‘’A’’ qui contient la mention ‘’ TRANSACTIONS’’

  • Exclure lignes de la colonne ‘’S’’ avec la mention ‘’R’’ en faisant une vérification de la référence figurant dans la colonne ‘’L’’ de telle sorte que toute référence en double dont l’une à la mention ‘’R’’ dans de la colonne ‘’S’’ soit exclue au même titre que les lignes de la colonne ‘’S’’ avec la mention ‘’R’’ ne doit pas être considéré dans ce cas pour déterminer le nombre de transaction à afficher en résultat
  • Exclure les lignes de la colonne ‘’S’’ avec la mention ‘’R’’ en faisant une vérification de la référence figurant dans la colonne ‘’L’’ de telle sorte que toute référence en double dont l’une à la mention ‘’R’’ dans de la colonne ‘’S’’ soit exclue au même titre que les lignes de la colonne ‘’S’’ avec la mention ‘’R’’ avant le calcul de la somme des montant avant de Faire la somme des montants de la colonne ‘’Q’’
  • Améliorer la gestion des dates pour obtenir le format correct
  • Améliorer la conversion des montants pour obtenir les valeurs numériques correctes
  • Inclure l'effacement préalable complet des résultats précédents dans les feuilles Données compilées et Résultats, tout en évitant les redéfinitions et les doublons
  • N’afficher sur la feuille « Résultat » que le cumul des montants par date et par pays
  • Afficher le résultats sur une nouvelle feuilles avec la date, le pays, montant total et le nombre de transactions dans un tableau structuré dans le classeur de la macro
  • les dates sont au format "28OCT24" et les montants sous ce format "100 000,00.
Il se trouve qu'a la fin du traitement, il génère les résultats dans un autre classeur autre que celui de la macro et intègre la dernière ligne avec la mention "TRANSACTIONS" dans les données à ressortir.
Les dates ne remontent également comme il se doit
Aussi, je ne sais pas comment ajouter une vérification pour m'assurer que les informations sont correctes sans refaire le traitement manuel .
J'ai joint le code ainsi que quelques exemples de fichiers qui servent de base de travail.
Je souhaite m'assurer que j'ai pu régler cette première étape avant de poursuivre.
Je vous remercie déjà pour vos précieux conseils qui m'aideront a améliorer mon code
 

Pièces jointes

Dernière édition:
Bonjour,
Avec Power Query (chargé dans un TCD), voici ce que j'obtiens :
Modif de 16H50
1746802378830.png


Cependant, quelques transactions ont une valeur nulle dans la colonne Q (Amount). Faut-il les comptabiliser?
 

Pièces jointes

  • 1746788560984.png
    1746788560984.png
    16.8 KB · Affichages: 32
Dernière édition:
La conversion de cette colonne D, à mon avis est très aléatoire. Car cela dépendra comment elle a été écrit.
Je te propose d'utiliser la date en colonne E, qui est à +1 jour de celle de la colonne D, soit 27/10/2024 au lieu de 26/10/2024 (col D).
Quant "TRANSACTION", elle n'est pas prise en compte dans ton code. Elle se trouve en dernière ligne.
Il suffit de modifier le numéro de la dernière pour qu'elle ne soit plus prise en compte.
Pour la date, je crois avoir trouvé une solution :
VB:
' Convertir la date (colonne D) du format "28OCT24" au format date
            dateTraitement = wsDonnees.Cells(ligneCourante, 4).Value
            If Len(dateTraitement) = 7 Then ' Format attendu: "28OCT24"
                ' Convertir le mois en nombre
                Select Case UCase(Mid(dateTraitement, 3, 3))
                    Case "JAN": dateConvertie = DateSerial(2000 + Val(Right(dateTraitement, 2)), 1, Val(Left(dateTraitement, 2)))
                    Case "FEB", "FÉV": dateConvertie = DateSerial(2000 + Val(Right(dateTraitement, 2)), 2, Val(Left(dateTraitement, 2)))
                    Case "MAR": dateConvertie = DateSerial(2000 + Val(Right(dateTraitement, 2)), 3, Val(Left(dateTraitement, 2)))
                    Case "APR", "AVR": dateConvertie = DateSerial(2000 + Val(Right(dateTraitement, 2)), 4, Val(Left(dateTraitement, 2)))
                    Case "MAY", "MAI": dateConvertie = DateSerial(2000 + Val(Right(dateTraitement, 2)), 5, Val(Left(dateTraitement, 2)))
                    Case "JUN", "JUI": dateConvertie = DateSerial(2000 + Val(Right(dateTraitement, 2)), 6, Val(Left(dateTraitement, 2)))
                    Case "JUL": dateConvertie = DateSerial(2000 + Val(Right(dateTraitement, 2)), 7, Val(Left(dateTraitement, 2)))
                    Case "AUG", "AOÛ": dateConvertie = DateSerial(2000 + Val(Right(dateTraitement, 2)), 8, Val(Left(dateTraitement, 2)))
                    Case "SEP": dateConvertie = DateSerial(2000 + Val(Right(dateTraitement, 2)), 9, Val(Left(dateTraitement, 2)))
                    Case "OCT": dateConvertie = DateSerial(2000 + Val(Right(dateTraitement, 2)), 10, Val(Left(dateTraitement, 2)))
                    Case "NOV": dateConvertie = DateSerial(2000 + Val(Right(dateTraitement, 2)), 11, Val(Left(dateTraitement, 2)))
                    Case "DEC", "DÉC": dateConvertie = DateSerial(2000 + Val(Right(dateTraitement, 2)), 12, Val(Left(dateTraitement, 2)))
                    Case Else: dateConvertie = 0 ' Date invalide
                End Select
            Else
                dateConvertie = 0 ' Format de date non reconnu
            End If
            
            ' Si la date est valide, continuer
            If dateConvertie <> 0 Then
 
Bonjour à toutes & à tous, bonjour @desto
Juste une remarque :
Avec tes critères
Exclure SMS617R
Exclure Les références dont une occurrence est marquée par un R en colonne "ANNULATION"

Si j'applique ce deuxième critère à l'ensemble des 3 fichiers, je ne ramène aucune ligne vu que tes fichiers ne contiennent que les références SMS617R et SMS601R et que la référence SMS601R est marquée par un R en colonne Annulation du fichier "Diamond_Report_VSS_v1v_27OCT24_25042025120123.xlsx"

Ce dernier filtre doit-il s'appliquer aux fichiers un par un ou globalement à tous les fichiers importés ?

À bientôt
ce dernier filtre s'applique à chaque fichier
 
Pour la date, je crois avoir trouvé une solution :
VB:
' Convertir la date (colonne D) du format "28OCT24" au format date
            dateTraitement = wsDonnees.Cells(ligneCourante, 4).Value
            If Len(dateTraitement) = 7 Then ' Format attendu: "28OCT24"
                ' Convertir le mois en nombre
                Select Case UCase(Mid(dateTraitement, 3, 3))
                    Case "JAN": dateConvertie = DateSerial(2000 + Val(Right(dateTraitement, 2)), 1, Val(Left(dateTraitement, 2)))
                    Case "FEB", "FÉV": dateConvertie = DateSerial(2000 + Val(Right(dateTraitement, 2)), 2, Val(Left(dateTraitement, 2)))
                    Case "MAR": dateConvertie = DateSerial(2000 + Val(Right(dateTraitement, 2)), 3, Val(Left(dateTraitement, 2)))
                    Case "APR", "AVR": dateConvertie = DateSerial(2000 + Val(Right(dateTraitement, 2)), 4, Val(Left(dateTraitement, 2)))
                    Case "MAY", "MAI": dateConvertie = DateSerial(2000 + Val(Right(dateTraitement, 2)), 5, Val(Left(dateTraitement, 2)))
                    Case "JUN", "JUI": dateConvertie = DateSerial(2000 + Val(Right(dateTraitement, 2)), 6, Val(Left(dateTraitement, 2)))
                    Case "JUL": dateConvertie = DateSerial(2000 + Val(Right(dateTraitement, 2)), 7, Val(Left(dateTraitement, 2)))
                    Case "AUG", "AOÛ": dateConvertie = DateSerial(2000 + Val(Right(dateTraitement, 2)), 8, Val(Left(dateTraitement, 2)))
                    Case "SEP": dateConvertie = DateSerial(2000 + Val(Right(dateTraitement, 2)), 9, Val(Left(dateTraitement, 2)))
                    Case "OCT": dateConvertie = DateSerial(2000 + Val(Right(dateTraitement, 2)), 10, Val(Left(dateTraitement, 2)))
                    Case "NOV": dateConvertie = DateSerial(2000 + Val(Right(dateTraitement, 2)), 11, Val(Left(dateTraitement, 2)))
                    Case "DEC", "DÉC": dateConvertie = DateSerial(2000 + Val(Right(dateTraitement, 2)), 12, Val(Left(dateTraitement, 2)))
                    Case Else: dateConvertie = 0 ' Date invalide
                End Select
            Else
                dateConvertie = 0 ' Format de date non reconnu
            End If
           
            ' Si la date est valide, continuer
            If dateConvertie <> 0 Then
en fait, je n'ai pas voulu utiliser les pseudo-dates de la colonne D, car il y a en colonne E une vraie date.
Mais tu veux utiliser la colonne D, à ta guise voici une fonction pour convertir la colonne D.
VB:
Option Explicit

Function ConvertirDate(txt As Variant) As Variant
    Dim jour As String, mois As String, annee As String
    Dim moisFr As String
    
    ' Vérifier si c'est déjà une date
    If IsDate(txt) Then
        ConvertirDate = txt ' Si c'est une vraie date, on la retourne telle quelle
        Exit Function
    End If
    
    ' Vérifier le format du texte
    If Len(txt) <> 7 Or Not IsNumeric(Left(txt, 2)) Then
        ConvertirDate = Null ' Ignore les valeurs invalides
        Exit Function
    End If

    ' Extraire les parties de la date
    jour = Left(txt, 2)
    mois = Mid(txt, 3, 3)
    annee = Right(txt, 2)

    ' Normaliser le mois
    mois = LCase(Trim(mois))

Select Case mois
    ' Mois anglais
    Case "jan", "janv": moisFr = "01"
    Case "feb", "févr": moisFr = "02"
    Case "mar": moisFr = "03"
    Case "apr", "avr": moisFr = "04"
    Case "may", "mai": moisFr = "05"
    Case "jun", "juin": moisFr = "06"
    Case "jul", "juil": moisFr = "07"
    Case "aug", "août": moisFr = "08"
    Case "sep": moisFr = "09"
    Case "oct": moisFr = "10"
    Case "nov": moisFr = "11"
    Case "dec", "déc": moisFr = "12"
    Case Else
        ConvertirDate = Null ' Ignore les mois inconnus
        Exit Function
End Select

    ' Déterminer le siècle
    If CInt(annee) >= 30 Then
        annee = "19" & annee ' XXe siècle
    Else
        annee = "20" & annee ' XXIe siècle
    End If

    ' Construire la date sous format "jj/mm/aaaa"
    ConvertirDate = DateValue(jour & "/" & moisFr & "/" & annee)
End Function

'utilisation dans ton code comme ci-dessous:
'dateValeur = ConvertirDate(wsSource.Cells(i, 4).Value)
 
Bonjour à toutes & à tous, bonjour @desto
Juste une remarque :
Avec tes critères
Exclure SMS617R
Exclure Les références dont une occurrence est marquée par un R en colonne "ANNULATION"

Si j'applique ce deuxième critère à l'ensemble des 3 fichiers, je ne ramène aucune ligne vu que tes fichiers ne contiennent que les références SMS617R et SMS601R et que la référence SMS601R est marquée par un R en colonne Annulation du fichier "Diamond_Report_VSS_v1v_27OCT24_25042025120123.xlsx"

Ce dernier filtre doit-il s'appliquer aux fichiers un par un ou globalement à tous les fichiers importés ?

À bientôt
ce dernier filtre s'applique à chaque fichier
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
4
Affichages
225
Réponses
5
Affichages
532
Retour