Microsoft 365 Tableau filtre et conditions ? VBA ?

leoronaldo

XLDnaute Nouveau
Bonjour à tous,

actuellement je fais des manipulations a la main avec des filtres simple, mais je pense que je ne sais pas exploité l'outils au maximum donc j'ai besoin de votre aide si cela est possible.

j'ai un tableau avec différentes colonnes (Catégorie, n° client, RDV , date de RDV, Commercial), pour le moment je met un filtre sur : (commercial, date du rdv, rdv) je vérifie s'il n'y a pas de client en doublons et ensuite je me crée un autre tableau juste avec la date du RDV , le nom du commercial et je comptabilise le nombre de RDV avec la mention MT1, MT2 ou MT3.

je vous met en exemple le tableau afin de voir si c'est plus parlant pour vous.

Et si bien sur il y a une autre solution plus rapide sachant que c'est un fichier avec beaucoup de lignes de base.

merci

Avant:

1638292475459.png


Apres:
1638292455704.png
 

Pièces jointes

  • Tableau - AIDE.xlsx
    14.6 KB · Affichages: 0
Dernière édition:

leoronaldo

XLDnaute Nouveau
Bonjour,
Merci du retour, oui sur le principe c'est ca. mais j'ai pas compris comment l'utiliser .
j'ai des erreur sur le fichier onglet tableau (liaison macro) (='C:\Users\Luck\Documents\Macros.xlsm'!Solequ(K27:L35;M27:M35))

1638290610546.png


sinon le résultat obtenu c'est parfait sauf pour PAPI c'est MT1 à afficher si possible et non MT1,5 ( j'ai compris le principe 0.5 pour structure)

j'ai essayer de regarder la macro mais je comprend pas tout. merci d'avance

l'Ideal serai d'avoir un bouton pour lancer la macro, choisir le fichier source et de crée l'onglet résultat comme aujourd'hui dans le fichier source.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Ce n'est rien, c'est un truc que j'ai oublié d'enlever, que j'avais fait pour vérifier à travers vos exemple qu'il y avait bien des poids constant pour les Mecano et Structure. C'était le cas : respectivement 1 et 0,5.

Si vous voulez dire qu'il ne faut afficher que la partie entière du score mettez vers la fin :
VB:
TRésu(L, 4) = "MT" & Int(Score)

Essayez de l'adapter dans ce sens mais dans un module standard. Vous pouvez utiliser Application.GetOpenFilename pour récupérer le nom complet du fichier à ouvrir. Mais s'il y a une feuille Résultat créée ou retrouvée, a-t-on la garantie qu'en ouvrant le classeur la feuille active ne sera pas celle ci au lieu de celle contenant les données ?
Si oui remplacez Feuil1 par ActiveSheet et Me par Worksheets("Résultat") …
 

leoronaldo

XLDnaute Nouveau
ok parfait pour le score et du coup en mettant int(score) est il possible de ne pas afficher les MT0.

sinon une question si le fichier source n'a pas la même disposition (colonne mélanger ou plus de colonnes) du coup tout tombe à l'eau ? n'est il pas possible de dire de rechercher l’entête XXX pour dire que c'est la bonne colonne ou d'indiquer la colonne ou les colonnes de critères a prendre en compte.
 

Dranreb

XLDnaute Barbatruc
Testez le :
VB:
If Score > 0.5 Then TRésu(L, 4) = "MT" & Int(Score)
Ça pourrait se faire mais ce serait beaucoup plus facile si les données étaient partout sous forme de tableau Excel avec les intitulé des colonnes concernées pareils.
 

Dranreb

XLDnaute Barbatruc
Exemple de procédure qui pourrait convenir :
VB:
Option Explicit
Sub Résumer()
   Dim ChNomF, Wbk As Workbook, LOt As ListObject, ColRDV As Integer, ColDate As Integer, _
      ColComm As Integer, ColCatg As Integer, ColClie As Integer, TRésu(1 To 500, 1 To 4), _
      SGrDate As SsGr, SGrComm As SsGr, L As Integer, Score As Single, SGrCatg As SsGr, _
      Points As Single, Wsh As Worksheet
   ChNomF = Application.GetOpenFilename("Fichier Excel, *.xls*")
   If VarType(ChNomF) <> vbString Then Exit Sub
   Set Wbk = Workbooks.Open(ChNomF)
   Set LOt = Wbk.Worksheets(1).ListObjects(1)
   ColRDV = LOt.ListColumns("RDV").Index
   ColDate = LOt.ListColumns("DATE RDV").Index
   ColComm = LOt.ListColumns("COMMERCIAL").Index
   ColCatg = LOt.ListColumns("CATEGORIE").Index
   ColClie = LOt.ListColumns("N° Client").Index
   For Each SGrDate In Gigogne(LOt, ColRDV, ColDate, ColComm, ColCatg, ColClie).Item("Externe").Co
      For Each SGrComm In SGrDate.Co
         L = L + 1: TRésu(L, 1) = L: TRésu(L, 2) = SGrDate.Id: TRésu(L, 3) = SGrComm.Id
         Score = 0
         For Each SGrCatg In SGrComm.Co
            Points = SGrCatg.Count: If SGrCatg.Id <> "Mecano" Then Points = Points / 2
            Score = Score + Points
            Next SGrCatg
         If Score > 3 Then Score = 3
         If Score > 0.5 Then TRésu(L, 4) = "MT" & Int(Score)
         Next SGrComm, SGrDate
   On Error Resume Next
   Set Wsh = Wbk.Worksheets("Résultat")
   On Error GoTo 0
   If Wsh Is Nothing Then
      Set Wsh = Wbk.Worksheets.Add: Wsh.Name = "Résultat"
      Wsh.[B2:E2].Value = Array("ID", "DATE RDV", "COMMERCIAL", "RESULTAT")
      End If
   Wsh.[B3].Resize(500, 4).Value = TRésu
   End Sub
 

Dranreb

XLDnaute Barbatruc
Suis-je bête, j'ai complètement oublié que la fonction Gigogne accepte directement les intitulés de colonnes de tableaux Excel. Plus besoin des variables ColQuelQueChose
Code:
For Each SGrDate In Gigogne(LOt, "RDV", "DATE RDV", "COMMERCIAL", "CATEGORIE", "N° Client").Item("Externe").Co
 

Dranreb

XLDnaute Barbatruc
Pour tester, votre plage de données en feuille "Tableau" je l'ai fait 'Mettre sous forme de tableau', dans le style de tableau personnalisé que je propose habituellement, et j'ai organisé la programmation en 3 procédures :
1) — La Sub Worksheet_Activate() dans Feuil2 (Résultat) qui fait établir son résumé en B3,
2) — Une Sub RésuméClassExt dans Module1, qui s'occupe d'ouvrir un classeur et tout ça, mais que je n'ai pas testée,
3) — Une Sub Résumer dans Module1, invoquée par les 2 premières, qui établit le résumé d'après un ListObject et une cellule destinataire spécifiés.
 

Pièces jointes

  • GigogneLeoronaldo.xlsm
    73.8 KB · Affichages: 3

leoronaldo

XLDnaute Nouveau
Bonsoir ,
j'ai fais quelques test mais je n'arrive pas a avoir le résultat par rapport a un autre fichier ou les colonnes sont mises a différents endroit et ou il y a d'autres colonnes.

exemple de fichier de données ou avec la macro elle doit se transformer en résultat sur un nouveau onglet

Merci
 

Pièces jointes

  • TEST-donnees (2).xlsx
    41.3 KB · Affichages: 5

Dranreb

XLDnaute Barbatruc
Bonsoir.
Normalement il doit vous signaler s'il ne trouve pas l'intitulé de colonne. Si la colonne existe, corrigez l'entête en celui qu'il attend (le message l'indique) et sauvegardez le.
Mais avant cela, s'il y a lieu, comme c'est le cas pour le .xlsx que vous avez joint, sélectionnez la plage, menu Accueil, groupe Styles, commande Mettre sous forme de tableau.
 

Dranreb

XLDnaute Barbatruc
Je ne sais pas. Mettez des espions pour voir si les expression impliquées correspondent à ce qu'il faut.
Wbk.Worksheets(1).ListObjects(1) doit représenter le 1er tableau Excel de la 1ère feuille du classeur qui vient d'être ouvert.
Oh purée !! J'ai oublié le 's' à la fin de 'ListObjects'. Je vous avais prévenu je n'avais pas testé.
Je crois que je vous aurais répondu plus vite si vous m'aviez indiqué le texte du message d'erreur
 
Dernière édition:

Discussions similaires

Réponses
5
Affichages
367
Réponses
5
Affichages
274

Statistiques des forums

Discussions
312 215
Messages
2 086 329
Membres
103 183
dernier inscrit
karelhu35