Base de données: recherche critère et affichage dans nouvelle feuille VBA

Caroooline

XLDnaute Nouveau
Bonjour à tous,

Merci d'avance pour vos réponses et pour le temps que vous m'accorderez.

Je travaille depuis plusieurs jours sur une énorme base de données clients appelée "fullb". J'ai créé différentes macros mais une me pose problème en particulier.

Chaque client a son numéro d'identification dans la première colonne (colonne A).
Chaque année, un client (nouveau ou ancien) fait une nouvelle commande de vin. La commande avec la date s'ajoute en dernière ligne de mon tableau.

Sachant que chacun de mes clients a effectué plusieurs commandes (dans l'année ou chaque année, peu importe), je cherche à afficher toutes les lignes de ses commandes dans une nouvelle feuille de mon fichier.

J'ai donc créé un UserForm avec une ComboBox (qui est la liste déroulante de tous les numéros d'identification client), relié à un bouton.

Je voudrais qu'une fois que j'ai choisi le numéro de mon client, toutes ses commandes s'affichent dans ma feuille "#ordersclient".

Voici mon code de UserForm:

'Selection des valeurs de ma ComboBox
Private Sub UserForm_Initialize()
Dim y As Integer
y = 1
Do Until IsEmpty(Worksheets("fullb").Range("A" & y))
Call Me.ComboBox1.AddItem(Worksheets("fullb"). _
Range("A" & y).Value)
y = y + 1
Loop
Dim lig As Long, cel As Range
Application.ScreenUpdating = False
Sheets("#ordersclient").Rows("4:65536").ClearContents
lig = 3
With Sheets("fullb")
For Each cel In Range("a2:a" & [W65536].End(xlUp).Row)
'If cel.Value = "ComboBox1.Value" Then
If InStr(1, cel.Value, ComboBox1.Value) > 0 Then
lig = lig + 1
'Recopie dans la feuille "ordersclient" à partir de la ligne 3
Sheets("#ordersclient").Cells(lig, 1).Resize(, 22) = .Cells(cel.Row, 1).Resize(, 22).Value
End If
Next cel
End With
Application.ScreenUpdating = True
End Sub

Ce qui bloque, c'est la ComboBox1.Value. Dans ma feuille #ordersclient, toutes les lignes s'affichent et non pas uniquement celles correspondent au numéro d'identification client.

Peut être que je devrais complètement changer de codage macro...

Merci pour votre aide,

Caroline
 

xhudi69

XLDnaute Accro
Re : Base de données: recherche critère et affichage dans nouvelle feuille VBA

Bonjour Caroooline, le Forum

Bienvenue sur XLD_

Tu devrais afficher les résultats dans un ListBox (sur l'UserForm) puis éventuellement transférer sur une feuille Template.
Un petit fichier exemple (anonimisé) serait un plus.

@+:cool:

EDIT: bonsoir Robert
 
Dernière édition:

Robert

XLDnaute Barbatruc
Repose en paix
Re : Base de données: recherche critère et affichage dans nouvelle feuille VBA

Bonsoir Caroooline et bienvenue, bonsoir le forum,

Une solution avec un filtre automatique non testée et pour cause (y'a pas de fichier exemple) :
Pour que ça marche il faut que ta combobox s'appelle ComboBox1. Il faut aussi que la première ligne de l'onglet source ne contienne pas de données mais les étiquettes de ces données (Numéro / Nom / etc.)...

Pas besoin de bouton, les données sont copiées au changement dans la ComboBox1.
Le code :

Code:
Private OS As Object 'déclare la variable OS (Onglet Source)
Private OD As objet 'déclare la variable OD (Onglet Destination)

Private Sub UserForm_Initialize() 'à l'initialisation de l'UserForm
Dim DL As Long 'déclare la variable DL (Dernière Ligne)
Dim PL As Range 'déclare la variable PL (PLage)

Set OS = Sheets("fullb") 'définit l'onglet source OS
Set OD = Sheets("#ordersclient") 'définit l'onglet destination OD
DL = OS.Cells(Application.Rows.Count, 1).End(xlUp).Row 'définit la dernière ligne éditée DL de la colonne 1 (=A) de l'onglet OS
Set PL = Range("A2:A" & DL) 'définit la plage PL
Me.ComboBox1.List = PL.Value 'alimente la ComboBox1
End Sub

Private Sub ComboBox1_Change() 'au changement dans la combobox1
Dim PLV As Range 'déclare la variable PLV (PLage Visible)

Application.ScreenUpdating = False 'masque les rafraîchissements d'écran
'condition : si la ComboBox1 n'est pas vide et si sa valeur appartient à la liste
If Me.ComboBox1.ListIndex <> -1 and Me.ComboBox1.Value <> "" Then
    OS.Range("A1").AutoFilter Field:=1, Criteria1:=Me.ComboBox1.Value 'filtre la colonne A avec le contenu de la ComboBox1 comme critère
    Set PLV = PL.SpecialCells(xlCellTypeVisible).Offset(0, 21) 'définit la plage PLV
    OD.Rows("4:65536").ClearContents 'vide les anciennes données de l'onglet destination
    PLV.Copy OD.Range("A3") 'copie la plage PLV et la colle dans la cellule A3 de l'onglet destination OD
    OS.Range("A1").AutoFilter 'supprime le filtre automatique
End If 'fin de la condition
Application.ScreenUpdating = True 'affiche les rafraîchissements d'écran
End Sub
Attention à bien laisser les deux variables Private, OS et OD en début de module comme dans l'exemple.
 

Caroooline

XLDnaute Nouveau
Re : Base de données: recherche critère et affichage dans nouvelle feuille VBA

Merci beaucoup à vous xhudi69 et Robert pour votre réactivité!

Je viens d'essayer ton code Robert, mais je crois que j'ai un petit problème avec la plage PLV. Je vais m'y pencher plus longuement pour voir ce qui bloque.

Voici mon fichier anonymisé en pièce jointe si cela peut vous aider.

Je reviens vers vous dès lors que j'aurai exploité vos deux pistes.

Merci encore de votre aide précieuse.

Caroline
 

Pièces jointes

  • exemple Caroline macro vba.xlsm
    82.6 KB · Affichages: 72

Robert

XLDnaute Barbatruc
Repose en paix
Re : Base de données: recherche critère et affichage dans nouvelle feuille VBA

Bonsoir Carooline, Xhudi, bonsoir le forum,

J'ai corrigé les quelques bugs que je navet (dans ce cas on peut..) pu testé et te propose une version plus aboutie qui semble fonctionner. J'ai eu des problème au départ avec le filtre qui filtrait mal (un comble non !). J'ai alors décidé de nettoyer les cellules de la colonne A avec TRIM qui supprime d'éventuels espaces avant et après le texte. Le filtre fonctionne parfaitement mais j'espère que ça ne va pas poser de problème pour tes autres codes. À utiliser d'abord sur l'exemple avant de transposer sur ton fichier original...
Le code modifié :

Code:
Private OS As Object 'déclare la variable OS (Onglet Source)
Private OD As Object 'déclare la variable OD (Onglet Destination)
Private PL As Range 'déclare la variable PL (PLage)

Private Sub UserForm_Initialize() 'à l'initialisation de l'UserForm
Dim DL As Long 'déclare la variable DL (Dernière Ligne)
Dim CEl As Range 'déclare la variable CEl (CELlule)
Dim D As Object 'déclare la variable D (Dictionnaire)

Set OS = Sheets("fullb") 'définit l'onglet source OS
Set OD = Sheets("#ordersclient") 'définit l'onglet destination OD
DL = OS.Cells(Application.Rows.Count, 1).End(xlUp).Row 'définit la dernière ligne éditée DL de la colonne 1 (=A) de l'onglet OS
Set PL = OS.Range("A2:A" & DL) 'définit la plage PL
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For Each CEl In PL 'boucle sur toutes les cellule de CEL la plage PL
    CEl.Value = Trim(CEl.Value) 'supprime d'éventuelle espace avant et après le texte
    D(CEl.Value) = "" 'alimente le dictionnaire D
Next CEl 'prochaine cellule de la boucle
Me.ComboBox1.List = D.keys 'alimente la ComboBox1 d'une liste sans doublons
End Sub

Private Sub ComboBox1_Change() 'au changement dans la combobox1
Dim PLV As Range 'déclare la variable PLV (PLage Visible)

Application.ScreenUpdating = False 'masque les rafraîchissements d'écran
'condition : si la ComboBox1 n'est pas vide et si sa valeur appartient à la liste
If Me.ComboBox1.ListIndex <> -1 And Me.ComboBox1.Value <> "" Then
    OS.Range("A1").AutoFilter Field:=1, Criteria1:=CStr(Me.ComboBox1.Value) 'filtre la colonne A avec le contenu de la ComboBox1 comme critère
    Set PLV = PL.Resize(, 22).SpecialCells(xlCellTypeVisible) 'définit la plage PLV
    OD.Rows("3:" & Application.Rows.Count).Clear 'vide les anciennes données de l'onglet destination (de la ligne 3 à la dernière)
    PLV.Copy OD.Range("A3") 'copie la plage PLV et la colle dans la cellule A3 de l'onglet destination OD
    OS.Range("A1").AutoFilter 'supprime le filtre automatique
End If 'fin de la condition
Application.ScreenUpdating = True 'affiche les rafraîchissements d'écran
OD.Activate 'sélectionne l'onglet destination OD
Unload Me 'vide et ferme l'UserForm
End Sub
Le fichier modifié :
 

Pièces jointes

  • Caroooline_v01.xlsm
    75.9 KB · Affichages: 50

Caroooline

XLDnaute Nouveau
Re : Base de données: recherche critère et affichage dans nouvelle feuille VBA

Génial! Merci beaucoup Robert, vraiment mille mercis!

J'ai cependant créé un bouton avec un module pour afficher le UserForm mais cela ne fonctionne pas. Il ne parvient pas à détecter l'objet ClientTracking dans mon module.

Tu m'as dit que la mise en place d'un bouton n'était pas nécessaire. Comment fais tu pour saisir le numéro client de la colonne A sans exécuter de module?

En tout cas, je t'en suis infiniment reconnaissante pour toute l'aide que tu m'as fourni!

Bonne soirée!

Caroline
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Base de données: recherche critère et affichage dans nouvelle feuille VBA

Bonsoir Caroooline, Xhudi, bonsoir le forum,

En fait tes boutons avaient été aplatis par mes filtres. Il suffit de cocher l'option Ne pas déplacer ou domensionner avec les cellules qui s'ouvre d'un clic-droit sur le bouton : Format de contrôle... onglet Propriétés.
À ta place, je les mettrais dans la ligne 1 en augmentant sa hauteur, au dessus des étiquettes et en figeant les volets... Regarde ce que ça donne dans la version 2...

sinon, je voulais parler du bouton dans l'UserForm. C'est lui qui n'a plus d'utilité. D'ailleurs je l'ai supprimer...

 

Pièces jointes

  • Caroooline_v02.xlsm
    82.7 KB · Affichages: 60
Dernière édition:

Caroooline

XLDnaute Nouveau
Re : Base de données: recherche critère et affichage dans nouvelle feuille VBA

Bonjour Robert!

Merci pour toutes ces notifications et pour tout ce temps accordé à mon projet.

Je ne parviens pas à lire ce dernier UserForm sur ta dernière version. Excel se ferme complètement. Comme tu l'as mentionné précédemment j'ai peut-être trop de macros générées.

En suivant tous tes conseils et en les appliquant sur mon fichier, le problème viendrait du module 8 "ClientTracking.Show" . Le bouton refuse de charger le UserForm.

Je vais revoir mon fichier en détails et essayer de comprendre où est le problème.

Merci encore pour ce coup de main d'expert ;) Je reviens vers toi dès lors que je serais parvenue à trouver le problème!

Bonne journée

Caroline
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Base de données: recherche critère et affichage dans nouvelle feuille VBA

Bonjour le fil, bonjour le forum,

Désolé pour la réponse tardive mais je n'ai plus internet chez moi...
Je ne comprends pas car ici tout marche impeccable sur le fichier v02. Le bouton New Order ouvre l'UserForm1. Le bouton See Orders per client ouvre l'userform ClientTracking. Le bouton CASES TO BE PICKED lance la procédure [pickup] du module [ModuleÊ6] et le bouton UNPAID ORDERS lance la procédure [unpaid] du module [ModuleÊ5]...
Tu dis qu'Excel se ferme carrément ! C'est étrange. Peut être devrais-tu partir d'un fichier vierge et y récupérer tes données via des copier/coller. C'est pénible mais ça peut-être un gain de temps au final plutôt que de tourner en rond à chercher des solutions...
 

Discussions similaires

Statistiques des forums

Discussions
313 207
Messages
2 096 216
Membres
106 535
dernier inscrit
StephCo