XL 2016 Tri et copié coller de valeur selon date et varibale en automatique

StanislasC

XLDnaute Nouveau
Bonjour à tous,

J'essaye actuellement d'automatiser un de mes fichiers mais je ne sais pas par quel bout prendre le problème et comment le réaliser.

Dans mon fichier, j'ai une base de donnée qui correspond à des commandes avec différentes informations. Une base de donnée classique.
Mon utilisation actuelle est que je tri cette base de donnée avec des slicers pour faire ressortir que certaines commandes d'un certain fournisseur et d'une certaine date, je les copies colles dans un autre fichier pour faire une vérification indépendante et envoyer ce fichier à quelqu'un d'autre.

Sauf que je considère que devoir répeter cette manip de nombreuses fois à la main est une réelle perte de temps sans valeur ajoutée humaine.
Je cherche donc un moyen de l'automatiser via du VBA.

Mon processus imaginé serait le suivant :

-Je lance la macro via un bouton,
-Cela me demande de selectionner une plage de date (élément primodiale)
-La macro effectue donc pour la plage de date demandés les différents copier coller d'un coup.
-Les copier coller doivent être divisés en plusieurs groupes, c'est un critère de fournisseur pour moi et dans l'excel cela est représenté dans la colonne "Nom" et "Nom bis",

Pour exemple,en Août 2022, pour le nom "A", je dois réaliser un copier coller de toutes les commandes avec le nom bis "aa" "ab" et "ac", et un autre groupe de copier coller devra contenir pour cette même période de Août 2022, toujours le même nom "A" mais cette fois, les nom bis "ad" et "ae".

La date représente le premier volet de tri de ma base de donnée, et les "Nom" et "Nom Bis" représente les différents groupes de copier coller que je dois réaliser.

Je vous joint un fichier type de ma base de données avec le résultat de la manip que j'explique ci-dessus.

Merci d'avance pour votre aide et reste bien entendu à votre disposition pour toute explication supplémentaire.

Cordialement,

StanislasC
 

Pièces jointes

  • Test VBA Factu.xlsx
    13.4 KB · Affichages: 6
Solution
Bonjour,

Voir ci-joint.
Attention que lorsqu'une liste de la feuille liste n'a aucun élément concerné, on crée du coup un en-tête de tableau vide.
Est-ce que c'est quelque chose qui peut arriver ? Auquel cas, il faut d'abord vérifier si la liste possède un élément dans la feuille Source.

Bonne journée,

StanislasC

XLDnaute Nouveau
Bonjour xUpsilon,
Merci pour ton retour, cela fait plusieurs fois que tu m'aide et je t'en remercie !

C'est bien la procédure que j'attendais !

Je ne trouve pas à quel moment dans le code tu détermine quels doivent être les groupes de copier coller, comme je vais devoir faire par moment plusieurs groupes au sein d'un même "Nom".
Exemple:
groupe 1 ab ac ae
groupe 2 ad af

De plus, saurais-tu comment ajouter à la fin de chaque tableau le total de la Qtt et du Prix ?

Merci d'avance,
Cordialement,
 

StanislasC

XLDnaute Nouveau
Globalement cela sera une liste fixe, certains changements seront peut-être faits mais sous forme d'ajouts de nouveaux noms plus que de modification de groupes. Donc une liste prédéfinie stockée dans une feuille me semble être une bonne solution

Je le vois malgré tout comme une partie de ma macro qui peut être assez évolutive, dans le sens ou plus tard je voudrais peut-être réaliser ce même tri mais avec une nouvelle varibale.
 

xUpsilon

XLDnaute Accro
Les Nom ont-ils une cardinalité 1-n avec les NomBis ? (j'entends par là, est-ce que les NomBis associés à un Nom peuvent uniquement être associés à ce Nom, ou peuvent-ils aussi être associés à d'autres Nom ?)

Si ces NomBis ne dépendent pas des Nom, les listes de NomBis seront-elles maitres ou esclaves de Nom ?
J'entends par là, doivent les tableaux être regroupés d'abord par Nom puis par NomBis ou l'inverse ?

Bien à toi,
 

StanislasC

XLDnaute Nouveau
Effectivement les Noms Bis n'appartiennent qu'a un seul Nom.
Les Noms correspondent à des groupes dans lequels les noms bis sont des entitésqui peuvent être indépendantes ou groupées entre elles mais forcément en lien avec leur nom.

aa et ab ne sont pas forcément liés mais font tous deux parties de A et ne peuvent pas faire partie de B.
 

xUpsilon

XLDnaute Accro
Toutes ces listes existeront au préalable de l'exécution de la macro ?
Pas que je me lance dans un casse tête pour recroiser le tableau avec les listes avant traitement si il suffit uniquement de boucler sur les lignes d'une feuille déjà écrite.

Bien à toi,
 

xUpsilon

XLDnaute Accro
Voir ci-joint pour une nouvelle version prenant en compte ces listes.

Les tableaux sont créés dans l'ordre d'apparition des listes. Si tu souhaites avoir tes tableaux rangés par Nom, je te conseille de faire un tableau structuré et de garder ta première colonne toujours triée.

Bien à toi,
 

Pièces jointes

  • Test VBA Factu.xlsm
    28.3 KB · Affichages: 2

xUpsilon

XLDnaute Accro
C'est ça, tu suis le format tel qu'il existe à l'heure actuelle. Mais tu peux aussi les mettre sans espace, ou avec un / entre, ou n'importe quel autre caractère. Ce que la macro cherche, c'est "est-ce que le NomBis de la ligne que l'on observe apparait dans la cellule B_ de la feuille Listes_NomBis ?", donc tant que le string est retrouvé, tu peux mettre les séparateurs que tu veux.
C'est faisable oui, il faut rajouter à chaque ligne insérée un Range.FormulaLocal. Je te conseillerais d'essayer de comprendre ma macro et de le faire toi même, et si tu ne comprends pas reviens vers moi pour que je t'explique. Ca ne sert à rien que je te fasse la macro si tu ne sais pas comment elle se comporte ;)

Bonne journée,
 

StanislasC

XLDnaute Nouveau
Bonjour xUpsilon,

J'ai adapté ton code sur mon fichier final, mais rien ne se passe, pas d'erreur annoncée mais pourtant la macro tourne dans le vide on dirait.
Je pense donc qu'il s'agir d'un problème de fichier de source ou de destination mais je ne trouve pas quoi.

Voici le code que j'ai réécris :

Const sWs_Source As String = "Données"
Const sWs_Destination As String = "Résultats"
Const sWs_Listes As String = "Liste Fournisseurs"

Const sCol_FrnUsage As String = "Q"
Const sCol_ReseauBud As String = "T"
Const sCol_Date As String = "D"
Const sDer_Col As String = "AD"

Const nPremlig As Integer = 2

Sub Trifrnfactu()

Dim nLig, nLigInc, nLigNom As Long
Dim nDerLig As Long

Dim oWs_Source As Excel.Worksheet
Set oWs_Source = ThisWorkbook.Worksheets(sWs_Source)

Dim oWs_Destination As Excel.Worksheet
Set oWs_Destination = ThisWorkbook.Worksheets(sWs_Destination)

Dim oWs_Listes As Excel.Worksheet
Set oWs_Listes = ThisWorkbook.Worksheets(sWs_Listes)

Dim Tablo As Variant
Dim sDate_Inf, sDate_Sup As String

sDate_Inf = InputBox("Quelle est la date limite inférieure de la sélection ? (format jj/mm/aaaa)")
Date_Inf = DateSerial(CInt(Right(sDate_Inf, 4)), CInt(Mid(sDate_Inf, 4, 2)), CInt(Left(sDate_Inf, 2)))
sDate_Sup = InputBox("Quelle est la date limite supérieure de la sélection ? (format jj/mm/aaaa)")
Date_Sup = DateSerial(CInt(Right(sDate_Sup, 4)), CInt(Mid(sDate_Sup, 4, 2)), CInt(Left(sDate_Sup, 2)))

nLigInc = 1
nDerLig = oWs_Source.Range(sCol_FrnUsage & Rows.Count).End(xlUp).Row
nDerLigListes = oWs_Listes.Range("A" & Rows.Count).End(xlUp).Row

Tablo = oWs_Source.Range("A" & nPremlig & ":" & sDer_Col & nDerLig)

For nLig = nPremlig To nDerLig
On Error Resume Next
oColl_Noms.Add oWs_Source.Range(sCol_Nom & nLig), oWs_Source.Range(sCol_Nom & nLig)
On Error GoTo 0
Next nLig

For nLigListes = 2 To nDerLigListes
For nLig = LBound(Tablo) To UBound(Tablo)
If Tablo(nLig, Asc(sCol_FrnUsage) - 64) = oWs_Listes.Range("A" & nLigListes) And InStr(oWs_Listes.Range("B" & nLigListes), Tablo(nLig, Asc(sCol_ReseauBud) - 64)) And Tablo(nLig, Asc(sCol_Date) - 64) >= Date_Inf And Tablo(nLig, Asc(sCol_Date) - 64) <= Date_Sup Then
For nCol = LBound(Tablo, 2) To UBound(Tablo, 2)
oWs_Destination.Cells(nLignInc, nCol) = Tablo(nLig, nCol)
Next nCol
nLigInc = nLigInc + 1
End If
Next nLig
nLigInc = nLigInc + 1
Next nLigListes


End Sub

Sub test()
Debug.Print (InSr(oWs_Listes.Range("B" & 1), Tablo(2, Asc("C") - 64)))
End Sub
 

xUpsilon

XLDnaute Accro
Bonjour Stanislas,

Là ça devient difficile de te dire, mais la meilleure manière de voir ce qui ne se déroule pas correctement, c'est de suivre tes variables locales pendant l'exécution du code.
Pour ça, dans l'onglet Développeur :
- Affichage -> Fenêtre variables locales

1664784120053.png



- Exécuter ton code en mode Pas-à-Pas :
1664784162530.png


- En bas à droite, regarde l'évolution de tes variables à chaque étape de ton code pour voir si elles se remplissent correctement, ou pas :
1664784203418.png



Une autre possibilité est de mettre un point d'arrêt (clic gauche avec ta souris dans la barre grise à gauche de la fenêtre d'écriture de la macro) et d'exécuter la macro normalement, qui s'arrêtera à la ligne précédent le point d'arrêt :
1664784319666.png

Un point d'arrêt est indiqué par une ligne surlignée en rouge et un rond rouge à gauche de la ligne d'arrêt.

Bonne journée !

PS : Bien entendu, si tu ne trouves toujours pas, tu peux toujours m'envoyer le fichier réel, mais sans données ;)
 

Discussions similaires

Réponses
28
Affichages
1 K

Statistiques des forums

Discussions
311 709
Messages
2 081 779
Membres
101 816
dernier inscrit
Jfrcs