Recherche auto
Bonjour à tous,
J' ai besoin d'aide pour l' établissement d'un code VBA permettant de faire une recherche auto sur mes onglets " base de donnée"
Je m' explique :
Il s’agit de données d’évaluation en fonction de plusieurs critères.
Le fichier comprend plusieurs Onglets :
L’onglet 1 est l’onglet module de recherche (je détaillerai plus tard)
Les autres onglets sont les onglets de données appelés « Données 2017 » ; « Données 2016 » etc.. .
Même si le fichier comporte d’autres onglet (dans mon exemple ils s’appellent autres … ces onglets ne doivent pas être pris en compte lors de l’établissement de la recherche !)
L’idée :
Via le premier onglet module de recherche l'idée est d'automatiser la recherche des données sur le fichier.
J’ai donc conçu le fichier de la manière la plus simple possible :
1. L’utilisateur peut choisir un critère (les critères sont trouvables dans les autres onglets, dans mon exemple : « 1 » ; « 2 »….)
2. L’utilisateur doit ensuite sélectionner la période (exemple de S1 à S7.)
3. Et enfin l’utilisateur peut cocher les entreprises concernées (A, B, C, ou D)
4. S’il le désire l’utilisateur peut sélectionner via les cellules « périodes comparaison » une autre période ou d’autres établissement mais le critère reste le même.
Enfin lorsque l’utilisateur clique sur le bouton recherche les données s’affichent en dessous sous forme de tableau. (Modèle attendu en retour dans l’exemple fichier)
Je met le fichier base en pièce jointe si vous avez une idée ou des pistes pour m'aider dans le code à insérer je suis preneur
Bonne journée à vous
petit up ... personne pour m'aider ?
Up de mon sujet personne n'a une idée ?
Personne n aurait une idée ?
Bonjour,
Ce n'est pas un problème d'idée !
En ce qui te concerne, la problématique n'est pas très claire : tu fais en fait, sans le dire, deux recherches totalement indépendantes, qui peuvent ou non présenter des aspects communs, mais cela, je dirai que c'est l'affaire de l'utilisateur.
Mais en ne précisant pas et avec un seul bouton pour déclencher ces deux recherches, on ne sait pas s'il faut y donner cours lorsque les critères de l'une seulement sont indiqués ou pas...
Ensuite la réponse pour une recherche, en l'état actuel du fichier peut occuper 4 lignes. Les zones résultats ne sont donc pas correctement dimensionnées.
Enfin, il faudrait mettre sous liste déroulante les critères qui peuvent être indiqués ainsi...
Tu dois comprendre que lorsqu'on démarre sur un sujet avec des imprécisions de cette nature, on court le risque de devoir le reprendre à plusieurs reprises car le demandeur va dire : oui ! mais non ! ce n'est pas exactement ça que je voulais...
On préfère le plus souvent les sujets bien définis où l'on peut aller droit au but !
Cordialement.
Bonjour,
merci d'avoir pris le temps de me répondre
Désolé si mon sujet n'est pas suffisamment clair je vais essayer d'être plus clair :
Il s' agit en fait de comparer des critères d'une année sur l'autre. Les données de l' année 2016 et les données de l'année 2015 ( par exemple) sont dans deux onglet différents.
Le problème que je rencontre c'est d'une part la fusion , je m' explique:
Pour 1 critère , il y a 4 établissements donc 4 lignes de données j' avais pensé à imbriquer 2 rechercheh : la première pour sélectionner le critère puis la deuxième pour sélectionner l' établissement mais pas moyen d'y arriver....
Aussi effectivement il y a deux recherches mais si je fais une recherche du critère A sur l'année 2016 ma deuxième recherche portera sur le même critère, la même période mais de l'année 2015..
Il s' agit en fait de comparer des critères d'une année sur l'autre. Les données de l' année 2016 et les données de l'année 2015 ( par exemple) sont dans deux onglet différents.
Ça c'est ton problème ! On n'a pas à se préoccuper des motivations de ta recherche. On se préoccupe seulement de savoir si les conditions de recherche permettent de trouver...
Or, tu définis une recherche sur 3 critères : l'année, un critère dénommé critère, un ou plusieurs établissements.
Le 3e est multiple : on sortira autant de lignes que d'établissements demandés...
Le 2e est unique.
Le 1er est ambiguë ! A cause du "De" "à" qui laisserait entendre qu'on puisse couvrir plusieurs années, ce qui entre quelque peu en conflit avec la 2e recherche.
De même, on ne voit pas bien ce que tu comparerais en extrayant des établissements différents dans les deux recherches.
Il s'agit donc d'abord de clarifier les choix et de matérialiser cette clarification dans ton fichier :
Soit une seule recherche : critère Critère maintenu unique
Année : deux ou plus
Etablissement : un ou plusieurs.
On extrait l'ensemble, en faisant une séparation par année.
Soit tu lances plusieurs recherches simultanées, chacune avec l'ensemble de ses critères, et on extrait plusieurs résultats que l'on expose séparément, résultats qui peuvent n'avoir aucun rapport les uns avec les autres...
Tu modifies ton fichier selon tes choix...
Effectivement je ne suis pas très clair :
le 3e critère : OK c est exactement ça
le 2e : OK on s est bien compris
le 1e : le " De .. à " en fait j'ai mal dessiné le tableau : Sur chaque année il y a des chiffres hebdomadaires Imaginons que choisisse de la Semaine 3 à la Semaine 7 . Je prendrais donc de 2 à 7 .
Je veux donc faire ressortir le même critère, pour les même établissement,t à des périodes différentes ( de S1 à S7 dans l' exemple ) pour deux année différentes soit 2016 et 2015 .
Dans ce cas, il te faut 2 emplacements pour l'année : 2 années, une par recherche,
le De... à étant le même pour les 2 recherches
le critère étant le même
et le choix des établissements, le même aussi pour les 2 recherches.
Il faut ajuster ton tableau d'établissement des critères de recherche, pour que l'on puisse travailler dessus.
Voici le nouveau tableau de recherche qu'en penses tu ?
Par contre je comptais mettre des listes déroulantes pour la sélection des Critères et de la période ( De ... à ) mais à l enregistrement du fichier cela s' efface...
Voilà de quoi tester :
Sub Rechercher()
Dim TR(), Et, crit$, a0%, a1%, s0%, s1%, n%, i%, a%, s%, j%
With ActiveSheet
crit = .Range("E12")
If crit = "" Then MsgBox "Choisir un critère !", vbInformation, "Recherche": Exit Sub
a0 = .Range("E13"): a1 = .Range("E14")
If a0 = 0 Or a1 = 0 Then MsgBox "Choisir 2 années !", vbInformation, "Recherche": Exit Sub
If a0 = a1 Then MsgBox "Choisir 2 années différentes !", vbInformation, "Recherche": Exit Sub
If .Range("E15") <> "" Then s0 = CInt(Replace(.Range("E15"), "S", ""))
If .Range("E16") <> "" Then s1 = CInt(Replace(.Range("E16"), "S", ""))
If s0 = 0 Or s1 = 0 Then MsgBox "Choisir une période !", vbInformation, "Recherche": Exit Sub
If s0 >= s1 Then MsgBox "Vérifier la période !!", vbInformation, "Recherche": Exit Sub
n = .Range("I15")
If n = 0 Then MsgBox "Choisir au moins un établissement.", vbInformation, "Recherche": Exit Sub
For i = 0 To 3
If 2 ^ i And n Then Et = Et & ";" & i + 1
Next i
End With
Et = Split(Et, ";"): ReDim TR(UBound(Et) * 2, s1 - s0 + 3)
TR(0, 0) = "Année": TR(0, 1) = "Critère": TR(0, 2) = "Etablissement"
For i = 0 To UBound(TR, 2) - 3
TR(0, i + 3) = "S" & s0 + i
Next i
For a = 0 To 1
With Worksheets("Données " & Array(a0, a1)(a))
n = .Cells(.Rows.Count, 1).End(xlUp).Row
For i = 2 To n
If .Cells(i, 1) = crit Then n = i: Exit For
Next i
If .Cells(n, 1) <> crit Then
MsgBox "Critère non trouvé dans : Données " & Array(a0, a1)(a), vbCritical, "Recherche"
Exit Sub
End If
For i = 1 To UBound(Et)
j = UBound(Et) * a + i
TR(j, 0) = Array(a0, a1)(a): TR(j, 1) = crit: TR(j, 2) = .Cells(n + Et(i) - 1, 4)
For s = 0 To s1 - s0
TR(j, s + 3) = .Cells(n + Et(i) - 1, s + s0 + 4)
Next s
Next i
End With
Next a
Application.ScreenUpdating = False
With ActiveSheet.Range("B26")
.CurrentRegion.Clear
With .Resize(UBound(TR, 1) + 1, UBound(TR, 2) + 1)
.Value = TR
With .Borders
.LineStyle = xlContinuous: .Weight = xlThin
End With
.BorderAround xlContinuous, xlMedium
.HorizontalAlignment = xlCenter
With .Rows(1)
.BorderAround xlContinuous, xlMedium
.Font.Bold = True
End With
.Rows(2).Resize(UBound(TR, 1) / 2).BorderAround xlContinuous, xlMedium
End With
End With
End SubC'est un peu long en raison des vérifications au début et également de la mise en forme finale. Une fois les critères recueillis, la récupération des données occupe la boucle a et les 5 lignes qui précèdent (dimensionnement du tableau résultats).
J'ai mis les semaines sous liste déroulante.
Pour les cases à cocher, je leur ai affecté la cellule sur laquelle elles sont en cellule liée.
La cellule I15 contient la formule :
H15*1+J15*2+H17*4+J17*8Les établissements A B C D sont affectés d'un numéro d'ordre : 1 2 3 4, et respectivement pour chacun lorsqu'il est sélectionné, I15 totalise 1 2 4 8, soit la puissance de 2 du numéro d'ordre -1.
Ce nombre en I15 permet de rapidement détecter les établissements retenus :
For i = 0 to 3
If 2 ^ i And n Then => si VRAI, l'établissement i+1 a été retenu...
Attention : Les noms des feuilles Données 2015 et Données 2016 étaient précédés d'une espace que j'ai supprimée...
Cordialement.
Merci beaucoup MFerrand,
c'était exactement ce que je voulais faire, et vu la complexité du code je pense que je n'aurais pas été capable de m'en sortir .
Je réfléchis maintenant à intégrer un graphique pour que ce soit plus visuel que des simples chiffres mais comment la longueur de mes colonnes et des mes lignes sont variables je patauge un peu , aurais tu une idée ? ( sans abusé de ton savoir faire
Les graphiques, c'est pas trop mon truc...
je creuse la piste des graphique dynamique ... visiblement il n y a pas besoin de code VBA ...
A voir donc