Fonction de correspondance
Bonjour,
J'aimerais créer une fonction vba me permettant de faire appelle à une bibliothèque (me servant de table de correspondance).
Pour être plus claire, j'aimerais créer une fonction publique "mapping" par exemple, qui en fonction des paramètre qui lui sont données permet des faire la correspondance avec une des caractéristiques associé à ce code.
Exemple:
j'ai le code 93A et je cherche à connaitre son "CP" (colonne C).
Bien sur, j'ai donné un exemple simplifié comparé aux bases que je traite, mais c'est pour être plus clair.
Ci-joint un exemple de la "bibliothèque" qui permettrait à cette fameuse fonction d'aller faire ces corespondance.
Cela m'aiderait beaucoup, si quelqu'un avait un code ou un morceau de code ou des conseils à me fournir.
Merci d'avance à tous !
Bonjour dreezy
Avant de pouvoir répondre, pourrais-tu expliquer la finalité de cette "table de correspondance", son volume, le but final...
Bonsoir,
Ce que tu présentes et l'exemple que tu donnes ne nécessite qu'une recherche dans une table. Et s'il n'y a rien d'autre à faire, pourquoi faire plus ?
A ce stade, je n'en vois pas de nécessité. Si tu as d'autres exemples, cela ouvrira peut-être d'autres horizons... Mais les moyens que tu mets en oeuvre doivent toujours correspondre à un besoin et apporter un gain ou un plus par rapport aux autres possibilités utilisables, sans quoi tu risques tout simplement de les gaspiller ou d'user de la mémoire en pure perte...
Cordialement.
Bonjour,
Le but final serait de supprimer toutes mes tables de correspondances de l'ensemble de mes fichiers de travail.
Cela afin d'avoir uniquement cette fonction qui me permet de traduire le "code" (données de ma colonne A) en "région ("colonne B) ou en" CP" (colonne c).
L'exemple que je vous ai illustré est simplifier. Je gère de gros fichiers, Cela me permettrait de gain un temps considérable dans mes process, un supprimant des tables de correspondance dans mes fichiers et un tas de de recherchev dans mes formules car j'utiliserais directement cette fonction qui va chercher les correspondance dans une bibliothèque stocké a 1 seul endroit.
L'avantage est que j'aurais à me maintenir une seule table de de correspondance (= ma bibliothèque), ce qui me permet de centraliser et fiabiliser mes données (plutôt que d'avoir cette table de correspondance dans chaque fichier). Cela, e plus du gain de temps grâce à la fonction
Merci de votre aide !
Bonjour,
Recherchev() fonctionne sur un classeur fermé.
Qu'est-ce qui t'empêche d'utiliser un classeur unique pour tes tables ?
eric
Bonjour,
Effectivement ce que je fais déjà pour les recherchev dans un autre classeur, mais le but est d'éviter d'alourdir les fichiers avec des liens et d'anticiper le risque de cassure de liaison, non mise à jour etc.
Mon objectif est d'optimiser cette façon de faire.
Merci pour vos remarques. Si jamais quelqu'un a une idée ou un support pour créer ce genre de bibliothèque ainsi qu'une fonction, cela me serait bien utile.
Cela peu vous paraître futile, mais dans mon esprit cette amélioration simplifiera mes process (à moi et mon équipe). J'y vois un grand gain de temps, d'efficacité et de fiabilité.
Cdlt.
Bonjour (le fil)
c'est une très bonne réflexion, et une aussi bonne décisiondreezy a écrit :mais le but est d'éviter d'alourdir les fichiers avec des liens et d'anticiper le risque de cassure de liaison, non mise à jour etc. Mon objectif est d'optimiser cette façon de faire.
cela effectivement aussi, devrait être la quête de tout programme bien fait, bien pensé...dreezy a écrit :Cela peu vous paraître futile, mais dans mon esprit cette amélioration simplifiera mes process (à moi et mon équipe). J'y vois un grand gain de temps, d'efficacité et de fiabilité.
Maintenant l'ensemble des questions qui ont été posées au sujet de ton problème concerne non pas le fond mais la forme...
Je veux dire que dans l'exemple que tu présente il n'y a (que) 3 ou 4 données.
L'idée de la "table de correspondance" est bonne en soi, mais elle se justifie pour un volume de données important...
Selon les cas nous pouvons choisir de "conserver toujours" dans tes classeurs" une table avec le code VBA associé éventuellement, ou de créer un fichier "table" dans lequel nous puisons les correspondances dont nous avons besoin... voilà la finalité de nos questions...
Quel volume de table de correspondance (en nombre de ligne et de colonnes) as-tu ? Combien de tables as-tu ? Quelles sont les éléments à récupérer dans ces tables ? ...
Ce sont ces informations là dont nous avons besoin pour te proposer la solution la plus adaptées !
Bonjour,
En effet, il s'agit de volume de données assez important (environ 15000 à 20000 lignes). Éventuellement, j'aimerais l'étendre à d'autre base mais ce n'est pas la priorité.
De plus, je ce que je souhaite mettre en place se rapproche de la seconde proposition c'est à dire "de créer un fichier "table" dans lequel nous puisons les correspondances dont nous avons besoin..."
Pour répondre au questions suivantes:
Quel volume de table de correspondance (en nombre de ligne et de colonnes) as-tu ? Combien de tables as-tu ? Quelles sont les éléments à récupérer dans ces tables ?
Le volume est d'environ 10 000 lignes, la correspondance se ferait avec les 3 premières colonnes parmi 8 colonnes au totale. Les éléments à récupéré sont ceux de la colonne B ou C en fonction du code souhaité de la colonne A.
J'espère que je vous ai fournit assez d'information, pour ceux qui pourrait m'aider ou me donner des idées.
Le format serait un près le même que le fichier fournit dans mon premier message. Juste avec des lignes en plus et 4 colonnes supplémentaires mais facultatifs pour notre travail.
Merci pour vos réponses.
Bonjour,
Je ne sais si cela peut t'être utile, mais cela peut constituer un élément de réflexion... Lorsque j'ai à travailler sur un ensemble d'éléments qu'il est rationnel de ne pas concentrer dans un même classeur, j'essaie en général de me cadrer sur le schéma suivant :
- un classeur principal, léger, qui concentre tout le code et les quelques éléments indispensables pour piloter l'ensemble, à partir duquel j'opère...
- un classeur pour les données de références, qui sera appelé au fil des besoins pour y prélever les éléments nécessaires aux opérations réalisées ;
- ce classeur peut être démultiplié, s'il s'avérait qu'il soit relativement lourd, mais en conservant des regroupements de données homogènes, et en ne séparant pas des éléments qui seront utilisés simultanément...
- un ou plusieurs classeurs pour les résultats produits, en conservant (si plusieurs classeurs) des regroupements fonctionnels : résultats principaux, résultats annexes, suivi statistique, prospection ou prévisions...
L'idée d'excentrer une base de données et d'y faire appel par des fonctions peut effectivement s'avérer pertinente...
Note aussi que tu as également avec un classeur spécialisé base de données la possibilité de travailler avec dans des conditions analogues à une base de données externe (tutos sur ce thème sur le site développez.com).
Cordialement.
Bonjour (..)
@MFerrand
Que de bons (vieux) souvenirs... ISAM, CODASYL, Séquentiels Indexés, Hachage, SGBD avec ou sans R...
Une vraie cure de jouvence...
Que dirais-tu d'en imposer la lecture à ceux qui prononcent les mots "Base de Données"
PS/ Je n'ai jamais été très adepte de MERISE, j'ai plus souvent utilisée la Méthode X... tu connais ?
@dreezy
Revenons à ton problème... en résumé avec mes commentaires et ceux de MFerrand je pense que l réponse à tes questionnement se dessine...
Et justement, c'est souvent là, la clef... le dessin !
Il faut que tu matérialise les données, les besoins (ceux qui permettent d'accéder aux données, ceux qui permettent de calculer des informations, ceux qui peuvent être modifiables...), les attentes de l'utilisateurs et les contraintes de l'environnement (nombre d'utilisateurs en même temps ou pas, volume d'accès aux données dans le temps, simultanéité d'informations et/ou de traitements...)
Bref je rejoins complètement le propos pertinent (et sans aucune notion de plagiat) de MFerrand
MFerrand a écrit :L'idée d'excentrer une base de données et d'y faire appel par des fonctions peut effectivement s'avérer pertinente...
Bonsoir,
Je n'ai pour le moment pas trouvé la solution à mon problème, mais merci à tous pour vos idées et raisonnement.
Bien sûr, en me basant sur vos éléments, je vais continuer de chercher et reste à l'écoute si vous avez des éléments supplémentaire.
Merci.
Personnellement je n'ai pas bien compris l'argument 'pour éviter une rupture des liens'.
Que tu utilises une fonction personnalisée ou la fonction native recherchev() je ne vois pas la différence.
Si ce fichier de données est déplacé sans mise à jour de la fonction ou de la formule ça se passera mal de toute façon.
Je ne vois pas bien ce que tu imagines comme solution.
Avec tout de même encore un avantage avec recherchev(), c'est que si tous tes fichiers utilisant le fichier de données sont ouverts et que tu fais Enregistrer sous pour le déplacer, toutes les formules se mettent à jour.
Par ailleurs nulle part tu n'exposes un mini cahier des charges avec les fonctionnalités voulues qui différerait singulièrement de recherchev(). Si c'est pour faire un clone juste pour modifier la syntaxe je n'en vois pas l'intérêt.
Les idées c'est à toi de les donner
Bonsoir,
Je vais essayer d'avancer étape par étape.
Dans le fichier ci-joint, je souhaiterais utiliser du VBA pour remplir la cellule G4.
En cellule F4 j'ai mon code et en G4 je souhaite y associer son "CP" (colonne C).
J'aimerais faire cela, en créant une fonction (via VBA) et bien sûr sans utiliser le recherchev.
Encore une fois, bien sur que dans ce cas un bon vieux recherchev suffirais mais le but est de commencer ppar là pour arriver à mon but définit plus haut.
Auriez-vous une idée de code?
Merci.
Oui, mais n'y voyant toujours aucun intérêt je n'y passerais pas 1s.
D'autant plus que tu auras toutes les chances que ce soit plus lent.
Des formules sur feuille utilisent tous les threads, vba un seul. Les formules seront calculées 4 ou 8 à la fois sur feuille, une par une en vba...
Attends qq'un d'autre.
(re)
La méthode la plus rapide sous VBA sera de cette forme là... à adapter en fonction de tes fichiers évidemment !
Function TrouverCorresp(code)
Dim tabBdd()
Dim cptBdd
Dim trvBdd As Boolean
tabBdd = Range(Cells(2, 1), Cells(Cells(Rows.Count, 1).End(xlUp).Row, 3))
cptBdd = 1
trvBdd = False
While Not (cptBdd > UBound(tabBdd, 1)) And Not trvBdd
If tabBdd(cptBdd, 1) = code Then
trvBdd = True
Else
cptBdd = cptBdd + 1
End If
Wend
If trvBdd Then
TrouverCorresp = tabBdd(cptBdd, 3)
Else
TrouverCorresp = "?"
End If
End Functionun petit test.
sur 2000 lignes :
recherchev() : 0.008 s
TrouverCorresp() : 0.28 s
46 fois plus lent.
sur 20000 lignes :
recherchev() : 0.034 s
TrouverCorresp() : 2.874 s
845 fois plus lent.
eric
(..)
@eriiic
Je ne remets pas en doute la rapidité de RechercheV, j'ai dit
NCC 1701 a écrit :La méthode la plus rapide sous VBA sera de cette forme là...
Bonsoir,
Merci NCC 1701 pour ce contenu, je vais l'essayer et l'adapter à mon besoin.
Merci Eric pour t'es éléments. En effet, comme je l'ai précisé sur cet exemple simplifié, je suis bien au courant que je recherchev est plus simple mais ce que je veux mettre en place est un peu plus complexe que l'exemple donné. Sur un ensemble de process, si j'y arrive, cela sera beaucoup plus optimal.
J'ai une vision bien clair de dire que je veux faire, c'est peut être plus compliqué de vous le retranscrire.
Merci !
Bonjour (..)
Merci à toi pour cela
dreezy a écrit :Merci NCC 1701 pour ce contenu, je vais l'essayer et l'adapter à mon besoin.
Bonne adaptation...