Aide Excel VBA rechercheV
Bonjour,
je cherche le code vba correspondant à la rechercheV contenue dans la cellule BH2 feuille "activite_details" et répétée dans les cellules suivantes.
je dois intégrer ce code vba dans un code déjà existant afin d'automatiser la recherchev.
Pour plus de détails cette recherche doit simplement être effectuée jusqu'à la dernière ligne non vide (ce nombre est variable)
J'ai un classeur xlsx contenant deux feuilles, feuille1 "activite_details" et feuille2 "pre_requete_virplus"
Je cherche le code vba correspondant à la rechercheV suivante:
=RECHERCHEV(AK2;pre_requete_virplus!E:E;1;FAUX)
La cellule AK2 se trouve sur la feuille1 et la formule se trouve en BH2 sur la feuille1 et je recherche la valeur de AK2 dans la colonne E de la feuille2
J'aimerais que cette formule se répète sur les lignes suivantes jusqu'à la dernière ligne non vide (le nombre de lignes étant variable)
Il est bien entendu que même si je suis novice en vba voir en informatique je sais évidemment copier coller une formule recherchev manuellement.
Toujours pour être plus clair, ce fichier précité et les deux feuilles citées plus haut sont issues du résultat d'une macro vba.
Macro vba à laquelle je souhaite intégrer cette recherchev pour qu'elle soit générée au moment de la création de ces deux feuilles et donc sont résultat directement disponible à l'ouverture du classeur ainsi créé.
Je sollicite votre aide après avoir passé de longues heures de recherche et d'essai d'adaptation de de diverses solutions fournies ici et ailleurs.
j'espère avoir bien joint mon fichier et merci de votre aide précieuse à tous.
Bonsoir,
Ta demande ne me paraît pas très claire ! Tu as placé une formule en BH sur ta première feuille, laquelle te permet de contrôler si le code de la colonne AK figure dans ta liste de référence sur la 2e feuille. Si tu entends procéder ainsi, tu as ta solution !
Utiliser VBA pour faire la même chose, je dirais que c'est plus vite fait manuellement et que VBA n'apportera rien.
Opérer ce contrôle autrement, et éventuellement assurer un traitement consécutif à ce contrôle, là il y a matière à se pencher sur la question.
Mais à ce moment là précise quel est l'objectif réel de l'opération.
Cordialement.
Bonsoir et merci
En effet c'est simple mais je souhaite simplement intégrer cette rechercheV en Vba au reste du code vba qui génère ce classeur et ces deux feuilles
Si tu t'y tiens, ça intéressera peut-être quelqu'un de te faire une transcription de formule en VBA...
Préviens si tu changes d'avis au profit d'un code VBA, qui fera ce contrôle et portera la mention qu'on veut, et pourra même réaliser autre chose à la suite.
En effet ce serait fort sympa si la formule pouvait afficher "absent" en cas d'erreur et à "contrôler" en cas de correspondance et si en plus on peut filtrer les lignes où il y a correspondance pour ne conserver que celles ci ce serait magique !
Mais je ne voulais pas abuser
Là ta demande est contradictoire : mentionner absent ou à contrôler est une chose (que tu peux également faire avec la même formule réaménagée, ne conserver que les à contrôler en est une autre (qui exclue la première).
S'agit-il de supprimer les absent ?
Oui en effet je souhaiterais ne garder que les lignes â contrôler
Encore merci de votre aide
Bonjour,
Dans ces conditions voilà une procédure qui réalisera l'opération :
Sub ControlTableau()
Dim d As Object, Kctrl, k, n&, i&
Set d = CreateObject("Scripting.Dictionary")
With Worksheets("pre_requete_virplus")
n = .Range("E" & .Rows.Count).End(xlUp).Row
Kctrl = .Range("E2:E" & n).Value
End With
For i = 1 To UBound(Kctrl)
d(Kctrl(i, 1)) = "ok"
Next i
With Worksheets("activite_details")
n = .Range("AK" & .Rows.Count).End(xlUp).Row
Kctrl = .Range("AK1:AK" & n).Value
For i = 2 To n
k = Kctrl(i, 1): Kctrl(i, 1) = d(k)
Next i
Kctrl(1, 1) = "A contrôler"
k = .Cells(1, .Columns.Count).End(xlToLeft).Column + 1
Application.ScreenUpdating = False
With .Cells(1, k).Resize(n)
.Value = Kctrl
.SpecialCells(xlCellTypeBlanks).EntireRow.Delete
End With
'.Columns(k).Delete
End With
End SubOn utilise un outil Dictionnaire pour détecter les éléments à contrôler. Un Dictionnaire est une liste d'éléments composés de deux données : une clé et un item (valeur associé à la clé, qui est unique).
On initialise d'abord la variable objet d comme Dictionnaire. Ensuite sur la feuille 2, après détection de l'étendue de la plage utilisée, on récupère dans une variable Kctrl les valeurs de la plage constituée par la colonne Reference archive (sauf l'en-tête) sous forme de tableau. On constitue le Dictionnaire avec des éléments dont la clé est la référence, et la valeur "ok". [L'utilisation d'un tableau pour le parcourir à la place de la plage elle-même est destiné à accélérer l'exécution dans le cas où l'on peut avoir un grand nombre de lignes.]
On passe ensuite sur la feuille 1 dont on dimensionne l'étendue des données dans la variable n (dernière ligne utilisée, testée sur la colonne AK qui nous intéresse). On affecte les valeurs de cette colonne (que l'on doit traiter) à la variable Kctrl sous forme de tableau (comme précédemment).
On parcourt ce tableau à partir de la ligne 2 (première ligne de données) : pour chaque ligne, on récupère la donnée du tableau dans la variable k et on la remplace par la valeur de l'élément du Dictionnaire d(k) (élément dont la clé a la valeur de k).
Ce qui va alors se passer lors de l'appel de l'élément d(k), c'est que si cet élément existe, sa valeur sera "ok" et cette mention prendra place dans le tableau en remplacement de la référence, s'il n'existe pas, son invocation va automatiquement le créer, mais avec une valeur 'vide', et la référence dans le tableau sera effacée sans être remplacée par rien.
La mention de la ligne 1 du tableau est remplacée par "A contrôler" (ceci n'a pas vraiment d'utilité, sauf si tu voulais conserver la colonne que l'on va ajouter en utilisant le tableau... éventuellement pour des tests de vérification).
On recherche la dernière colonne de données sur la feuille, et on réutilise k pour y consigner le numéro de la colonne suivante (non utilisée). [Comme à partir de là on va intervenir sur la feuille, on inhibe la mise à jour de l'affichage écran, qui ralentirait autrement l'exécution.]
Dans la première colonne vide on va affecter notre tableau Kctrl (nouvelle colonne "A contrôler").
Puis on supprime les lignes de la feuille pour lesquelles la cellule de cette colonne est vide (les absents).
Tu peux désactiver cette ligne (pour voir le détail de ce qui se passe) :
.SpecialCells(xlCellTypeBlanks).EntireRow.Deleteen plaçant une apostrophe devant, qui la transformera en commentaire.
Une dernière ligne :
'.Columns(k).Deleteest ici désactivée (transformée en commentaire par l'apostrophe placée devant), pour te permettre de voir la colonne (qui ne contiendra que des "ok" si la suppression des absents a eu lieu). Il faut enlever l'apostrophe pour la rendre active, et mener l'opération à terme en supprimant cette colonne.
La macro est dans Module1. Elle n'est pas attachée à un bouton (tu peux le faire si tu le souhaites, ou tu peux la lancer par la boîte de dialogue Macro).
Cordialement.
Bonjour,
Je vous remercie grandement de votre aide !!!!
Je reviens vers vous dès que j'aurai testé votre macro qui était loin de mes modestes capacités !!
Je vous remercie aussi pour toutes les excellentes explications que vous me donnez quant à sa mise en œuvre.
Cordialement.
MFerrand
Je reviens comme promis vous remercier une fois de plus après avoir testé votre macro qui fonctionne à la perfection !!!
Il faut ériger un monument en votre honneur !!
Merci !!!