XL 2016 Récuperer données d'un tableau selon condition

Sissou71

XLDnaute Occasionnel
Bonjour,

J'essaye de récuperer dans une feuille des données d'un tableau selon une condition et pas toutes les données.
J'ai beau essayer avec le filtre élaboré ca ne fonctionne pas. Quelqu'un pourrait-il m'aider via le fichier ci-joint ? L'objectif est de faire une extraction par client de ses commandes (quelque soit la date, quelque soit la facturation, juste par client) des colonnes qui sont bleues.

Je vous mets un fichier exemple joint.
Merci à vous.
Cécile
 

Pièces jointes

  • Suivi Commande.xlsm
    39 KB · Affichages: 23

Robert

XLDnaute Barbatruc
Repose en paix
Bonjour le fil, bonjour le forum,

Un proposition VBA en pièce jointe avec le code ci-dessous. J'ai préféré masquer l'onglet Extract Client au départ pour éviter qu'il ne soit modifié par erreur...
Le code :

VB:
Sub Macro1()
Dim AF As Worksheet 'déclare la variable AF (onglet A Facturer)
Dim EC As Worksheet 'déclare la variable EC (onglet Extract Client)
Dim OD As Worksheet 'déclare la variable OD (onglet Destination)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim I As Integer 'déclare la variable I (Incrément)
Dim J As Integer 'déclare la variable J (incrément)
Dim K As Integer 'déclare la variable K (incrément)
Dim TMP As Variant 'déclare la variable TMP (tableau TeMPoraire)
Dim DEST As Range 'déclare la variable DEST (cellule de DESTination)
Dim TL() As Variant 'déclare la variable TL (Tableau des Lignes)

Application.ScreenUpdating = False 'masque les raffraîchissement d'écran
Set AF = Worksheets("A facturer") 'définit l'onglet AF
Set EC = Worksheets("Extract Client") 'définit l'onglet EC
TV = AF.Range("A4").CurrentRegion 'définit le tableau des valeurs TV
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For I = 2 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
  D(TV(I, 2)) = "" 'alimente le dictionnaire D avec la donnée en colonne 2 de la boucle (le client)
Next I 'prochaine ligne de la boucle
TMP = D.Keys 'récupère dans le tableau temporaire TMP la liste des éléments du dictionnaire D sans doublon
Application.DisplayAlerts = False 'empêche les messages d'Excel (en cas de suppression d'un onglet par exemple)
EC.Visible = True 'affiche l'onglet EC
For J = 0 To UBound(TMP) 'boucle 1 : sur tous les éléments du tableau temporaire TMP
  On Error Resume Next 'gestion des erreurs (en cas d'erreur passe à la ligne suivante)
  Worksheets(TMP(J)).Delete 'supprime l'onglet de l'élément TMP(J) de la boucle 1 (génère une erreur si cet onglet n'existe pas)
  If Err <> 0 Then Err.Clear 'si une erreur a été générée, supprime l'erreur
  On Error GoTo 0 'annule la gestion des erreurs
  EC.Copy after:=Sheets(Sheets.Count) 'copy l'onglet EC en dernière position
  Set OD = ActiveSheet 'définit l'onglet destination OD
  OD.Name = TMP(J) 'remomme l'onglet OD avec TMP(J) comme nom
  OD.Range("B1").Value = TMP(J) 'renvoie dans la cellule B1 de l'onglet OD la valeur de TMP(J)
  K = 1 'initialise la variable K
  Erase TL 'vide le tableau TL
  For I = 2 To UBound(TV, 1) 'boucle 2 : sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
  If TMP(J) = TV(I, 2) Then 'si le client correspond au deux boucles
  ReDim Preserve TL(1 To 9, 1 To K) 'redimensionne le tableau des lignes TL (9 lignes, K colonnes)
  TL(1, K) = TV(I, 2) 'récupère dans la ligne 1 de TL la donnée en colonne 2 de TV (Client)
  TL(2, K) = TV(I, 5) 'récupère dans la ligne 2 de TL la donnée en colonne 5 de TV (Libellé)
  TL(3, K) = CLng(TV(I, 6)) 'récupère dans la ligne 3 de TL la donnée en colonne 6 de TV convertie en entier long (Date facturation)
  TL(4, K) = TV(I, 9) 'récupère dans la ligne 4 de TL la donnée en colonne 9 de TV (Prix Total HT)
  TL(5, K) = TV(I, 10) 'récupère dans la ligne 5 de TL la donnée en colonne 10 de TV (Prix Total TTC)
  TL(6, K) = TV(I, 14) 'récupère dans la ligne 6 de TL la donnée en colonne 14 de TV (Nº Facture)
  TL(7, K) = TV(I, 17) 'récupère dans la ligne 7 de TL la donnée en colonne 17 de TV (Adresse de Facturation)
  TL(8, K) = TV(I, 18) 'récupère dans la ligne 8 de TL la donnée en colonne 18 de TV (Adresse Postale...)
  TL(9, K) = TV(I, 19) 'récupère dans la ligne 9 de TL la donnée en colonne 19 de TV (Référence de Facturation...)
  K = K + 1 'incrémente K (ajoute une colonne au tableau des lignes TL)
  End If 'fin de la condition
  Next I 'prchaine ligne de la boucle 2
  Set DEST = OD.Cells(Application.Rows.Count, "A").End(xlUp).Offset(1, 0) 'définit la cellule de destination DEST
  DEST.Resize(UBound(TL, 2), UBound(TL, 1)).Value = Application.Transpose(TL) 'renvoie dans DEST redimensionnée le tableau TL tranposé
  OD.Columns(3).NumberFormat = "dd/mm/yyyy" 'format de date de la colonne 3 de l'onglet OD
  OD.Columns.AutoFit 'largeur automatique de toutes les colonne de l'onglet OD
Next J 'prochain élément de la boucle 1
EC.Visible = False 'masque l'onglet EC
Application.DisplayAlerts = True 'affiche les messages d'Excel
End Sub

Le fichier :
 

Pièces jointes

  • Sissou_v01.xlsm
    45.7 KB · Affichages: 25

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 177
Messages
2 085 972
Membres
103 073
dernier inscrit
MSCHOE16