NB: Avant tout, je tiens à notifier que cette base est une base d'exemple pris sur un site d'exercice Access ( bonbache.fr)
Je suis nouveau dans le développement VBA ainsi que sur ce forum.
J'au un problème sur une correspondance multiples variables.
Je dispose de deux fichiers dans un même classeur.
le premier fichier est une base de données volumineux ( 50 000 lignes environ) avec les variables suivantes en tête de colonne ( Civilité, nom, prénom, nb. enfant, aides, code_id(que je veux remplir), ville).
le second fichier ne dispose que de quelques lignes avec comme entête de colonne: civilité, aides, ville, code_id ( ici les code sont déjà prédéfinit).
le problème: je dois vérifier chaque ligne du premier fichier (base de données) et si sur une ligne la civilité, aides et ville correspondent exactement à une ligne du second fichier (fichier de référence), je dois attribuer dans la session code_id de la ligne du premier fichier le code_id du second fichier.
honnêtement, je ne sais pas où commencer sous VBA.
Si le ID est dans plusieurs fichiers, alors il faut dupliquer la macro sur tous les fichiers pouvant contenir les ID. Là ça devient long et fastidieux, surtout s'ils sont nombreux.
Cela s'explique par le fait que le tableau Transco est très petit dans le cas de ton exemple (18 lignes)
La double boucle sur la base et sur Transco comprend en moyenne 50 000 fois 9 lignes soit 450 000 passages.
Si on passe Transco à 300 lignes, le nombre moyen de passage devient 50 000 fois 150 soit 7 500 000 passages.
On voit que la méthode de la double boucle va très vite augmenter en durée en fonction du nombre de lignes de Transco.
La méthode par Dico augmente beaucoup moins vite car le temps d'accès au dico est à peu près constant mais surtout on n'a qu'une seule boucle à parcourir.
Comme toujours, les méthodes de recherche ou de tri dépendent non seulement de la méthode choisie mais aussi de la répartition des données initiales et de leur quantité.
Dans le fichier joint (j'ai repris ton fichier), on exécute les deux méthodes une fois avec un Transco à 18 lignes et une autre fois avec un Transco à 300 lignes. Les résultats sont les suivants:
On pourrait aussi appliquer un filtre automatique. En ne filtrant sur les cellules vides de la colonne G, on obtient toutes les lignes en cause en un seul bloc.
nota: ne pas oublier dans le fichier joint d'adapter les deux constantes à votre cas particulier.
On pourrait aussi appliquer un filtre automatique. En ne filtrant sur les cellules vides de la colonne G, on obtient toutes les lignes en cause en un seul bloc.
nota: ne pas oublier dans le fichier joint d'adapter les deux constantes à votre cas particulier.
Je reviens encore avec mon problème de Correspondance.
j'ai essayé des deux méthode sur ma base de donnée et cela ne marche pas. j'ai donc essayé sur une autre base de données et j'ai toujours le meme problème.
Lorsque j'utilise la methode de dictionaire proposée par @mapomme j'obtiens #N/A dans la colonne de destination. quant à la methode proposée par @sylvanu on ne me signale pas d'erreur mais je n'obtient rien dans la colonne de correspondance.
dans ce fichier je regarde les variables Car, Cylinders, departement, model, origin pour attribuer identifiantID qui est dans la table de transco.
Vous trouverer ci-joint les deux methodes dans deux fichiers distinctes avec le fichier de transco
Je suis perdu. Je ne vois aucun rapport entre votre fichier du début et ceux du message juste ci-dessus.
Si les structures des fichiers ont changé, il est évident que les macros vont se planter.
On verra ça demain.
Je suis perdu. Je ne vois aucun rapport entre votre fichier du début et ceux du message juste ci-dessus.
Si les structures des fichiers ont changé, il est évident que les macros vont se planter.
On verra ça demain.
Bonjour KH, Mapomme,
Dans votre fichier data_Base_Array, les colonnes B et G ne contiennent pas des nombres mais des chaines de caractères.
En PJ je convertis ces deux colonnes en nombres avant la recherche avec :
VB:
If Val(Transco(j, 2)) = Val(cy) Then
et
If Val(Transco(j, 4)) = Val(Moder) Then
J'ai mis les deux en Val au cas où un jour le même problème se pose sur le fichier Identifiant.
Cela provient probablement de l'importation.
Bonjour KH, Mapomme,
Dans votre fichier data_Base_Array, les colonnes B et G ne contiennent pas des nombres mais des chaines de caractères.
En PJ je convertis ces deux colonnes en nombres avant la recherche avec :
VB:
If Val(Transco(j, 2)) = Val(cy) Then
et
If Val(Transco(j, 4)) = Val(Moder) Then
J'ai mis les deux en Val au cas où un jour le même problème se pose sur le fichier Identifiant.
Cela provient probablement de l'importation.
Une question concrète, si dans mes variables tout est que du texte avec parfois des caractères spéciaux, seul le code à attribuer est numérique, comment dois-je procéder car malgré ta correction, je demeure toujours au point d'hier: mes résultats ne s'affichent pas
Moi même je commence à être gêner de ma demande....
Essayez de comprendre que si on ne dispose pas d'un fichier vraiment représentatif, il nous est impossible de vous aider.
Ma macro marche avec le fichier fourni.
Essayez de comprendre que si on ne dispose pas d'un fichier vraiment représentatif, il nous est impossible de vous aider.
Ma macro marche avec le fichier fourni.
Bon @sylvanu j'ai réfléchi un peu et voici ce que j'ai pu faire:
les éléments en commun: Voiture; Type de design; Capitale de Contrôle; Continent / Pays ; Kilométrage.
Si ces éléments sont identique dans la base et dans le ID_CODE alors je créer une colonne dans la base du nom de Identifiant qui copie l'identifiant correspondant dans la feuille ID_CODE dans la colonne Identifiant. Si possible que le code soit dans le classeur de ID_CODE ou dans un nouveau classeur