- VBA rechercheV sur plage ou je ne connais ni le début ni fin
- Le fichier à télécharger contient une liste de chats. triez-la comme dans le tableau ci-dessous (attention, on ne voit que le début…). quel est le mot formé par les 8 dernières lettres de la colonne code ? - Forum Word
- Word attend la fin d'une action ole ✓ - Forum Word
- Image de manchots sur une image de plage ✓ - Forum Graphisme
- Incompatibilité de type vba ✓ - Forum Programmation
- Frédéric cherche à faire le buzz sur les réseaux sociaux. il a ajouté une image d’ours polaire sur une image de plage. retrouvez l'image originale de la plage. que cache l'ours polaire ? - Forum Graphisme
7 réponses
Modifié le 3 août 2022 à 18:58
un essai pour fabriquer la formule
https://www.cjoint.com/c/LHdqVbjat7B
Cdlmnt
6 août 2022 à 19:37
Bonjour
d'après ton exemple le TCD2 se situe exactement en dessous du TCD1 mais 9 lignes plus bas. Il n'est pas décalé, il est lui aussi en colonne A et B.
quand tu dis : 'il n'est pas décalé' : le mien ou le tien ?
Tu modifies la disposition de mes tcd dans mon fichier comme ça te va et tu me renvoies le fichier
Cdlmnt
Bonjour CCM81
Un très grand merci. Du coup avec le retour de CCM81, peu importe où est situé le TCD, il le retrouve. Après dans mon fichier mes TCD ne sont pas identifiés par un nom quel qu'il soit. Je vais essayer de le faire.
Si tu préfères, voici mon fichier avec la macro déjà réalisée.
'
https://www.cjoint.com/c/LHhiGzHdFNN
'
Ce que je souhaite pour la suite, c'est que la recherche V aille chercher dans la feuille TCD le TCD2 qui est entre de la ligne A54 à B74. La difficulté c'est que toutes les semaines ma plage de recherche (tcd2) sera différente. C'est pour ça que la dernière commande est inexacte car elle va chercher les cellules du jour ou je l'ai réalisée.
ActiveCell.FormulaR1C1 = "=IFERROR(VLOOKUP(RC[-7],TCD!R46C1:R73C2,2,0),""0"")"
Encore merci
Modifié le 7 août 2022 à 16:00
Ce que je souhaite pour la suite, c'est que la recherche V aille chercher dans la feuille TCD le TCD2 qui est entre de la ligne A54 à B74.
Uniquement cette formule chercher xxx dans TCD2 , et pas autre chose dans une autre tcd ?
RQ. en passant : pourquoi ne pas mettre les 5 tcd les uns à côté des autres (tous commenceraient en ligne 1), ça simplifierai pas mal
7 août 2022 à 21:50
Re bonjour,
Tout à fait, je recherche que dans le TCD2 (mais il est mouvant). Entièrement d'accord...mais ma cheffe souhaite avoir un visu avec des TCD positionnés ainsi........
Après franchement si c'est trop compliqué tant pis, je renégocierais de mettre les tcd les uns à côté des autres :-)
Cordialement
3 août 2022 à 10:56
Bonjour
Pour la fin, pas de pb puisque c'est la dernière cellule non vide de la colonne
Par contre, pour le début, il faudrait en dire plus, quel est le critère qui permet de le savoir (HTCD2 = Cells(DLTCD + 9, 1)
Cells(DLTCD + 9, 1).Select n'est pas très clair)
Cdlmnt
3 août 2022 à 11:11
un petit exemple récupérant l'adresse de la plage
https://www.cjoint.com/c/LHdji2TRJNB
RQ. ActiveCell.FormulaR1C1 . tu devrais plutôt utiliser .formulaLocal qui te permet d'avoir des adresses de type A1
Cdlmnt
Modifié le 3 août 2022 à 14:57
Bonjour le fil,
Je n'ai pas le temps d'épurer un code que j'avais créé il y a des lustres, qui permet de nombreuses identifications de plages variables, de nombreuses lignes inutiles permettent d'avoir un visuel sur le travail du code VBA
pour permettre d'annoter les entêtes de colonnes et de lignes, l'identification de la plage de recherche commence ligne 3 colonne 3 soit C3
l'identification de la matrice de recherche est automatique en fonction du premier mot trouvé quelque soit la colonne et la ligne, le mot cible est en D1 et doit être dans la première colonne de la matrice, le n° colonne de recherche est en H1
https://www.cjoint.com/c/LHdmRsfwd7F
Modifié le 3 août 2022 à 17:35
Re,
la RECHERCHEV est la dernière ligne du code, la valeur cible recherchée dans la première colonne est en D1 et le numéro colonne de recherche est en H1.
si tu recherches toujours la valeur dans la deuxième colonne, tu peux remplacer H1 dans le code par 2
[K1] = WorksheetFunction.VLookup(Range("D1").Value, Range(Cells(P_Lig, P_Col), Cells(D_Lig, D_Col)), [H1], False)
par contre dans le code de nombreuses lignes sont inutiles, pour jouer j'ai créé des possibilités que j'ai en partie isolé
5 août 2022 à 18:30
Re bonjour Mike-31,
Un grand merci pour ta réponse. En effet, je ne l'avais pas vu au départ. Petite question car avec mon faible niveau la compréhension est compliquée pour moi, mais du coup j'ai essayé cette formule mais elle se met en rouge erreur d'exécution et me précise qu'il manque un =
WorksheetFunction.VLookup(Range("A2"), Range(Cells(HTCD2, HTCD2+1), Cells(DLTCD2, DLTCD2+1)), 2, False) mais ça ne fonctionne pas.
Du coup, j'ai essayé ça sans grand espoir car Cells(2, SA).Select correspond à la cellule où je veux réaliser ma formule, mais cette fois ci la lignes s'est surligné en jaune (erreur d'éxecution '1004': Erreur définie par l'application ou par l'objet
Cells(2, SA).Select = WorksheetFunction.VLookup(Range("A2"), Range(Cells(HTCD2, HTCD2 + 1), Cells(DLTCD2, DLTCD2 + 1)), 2, False)
Merci pour ton aide
Amicalement
Jérôme
6 août 2022 à 20:10
Re,
Pas trop le temps de suivre la discussion, alors j'ai pris comme base le fichier de l'ami CCM que je salue
il suffit de choisir le n° du tableau en C3 et la valeur recherchée en C5
le tableau est automatiquement identifié quelque soit sa position
https://www.cjoint.com/c/LHgsboYtkeF
il est possible de perfectionner le code pour définir le nombre de colonne de chaque tableau et la longueur de la validation.
Il serait judicieux d'avoir un exemple de ton fichier pour travailler plus rapidement sur des bases réelles
Modifié le 7 août 2022 à 10:41
Re,
Pas de souci et je comprends c'est déjà très gentil de me répondre.
Voici mon fichier une fois brute sans l'exécution de la macro, vous pouvez la lancer pour voir à quoi ça ressemble car tout est bon sauf la dernière commande
'
https://www.cjoint.com/c/LHdorQIvTHD
'
Voici le fichier avec la macro déjà réalisée.
'
https://www.cjoint.com/c/LHhiGzHdFNN
'
Ce que je souhaite pour la suite, c'est que la recherche V aille chercher dans la feuille TCD le TCD2 qui est entre de la ligne A54 à B74. La difficulté c'est que toutes les semaines ma plage de recherche (tcd2) sera différente. C'est pour ça que la dernière commande est inexacte car elle va chercher les cellules du jour ou je l'ai réalisée.
ActiveCell.FormulaR1C1 = "=IFERROR(VLOOKUP(RC[-7],TCD!R46C1:R73C2,2,0),""0"")"
Je regarde ce que tu as fait tout de suite et merci encore
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionBonjour CCM81,
Un très grand merci pour ta réponse et ton aide.
En effet et désolé de mon manque de clarté. En fait, j’ai créé 5 TCD sur une feuille nommée TCD. Chaque TCD est mouvant, il peut être plus ou moins court d’une semaine sur l’autre.
Du coup, j’ai créé des variables permettant de positionné mes TCD selon l’emplacement les uns des autres.
Exemple, le TCD1 commence toujours en A1, par contre la dernière ligne de mon TCD elle varie de semaine en semaine. Exemple en S1 mon TCD1 va jusqu’à la cellule A36, S2 il va jusqu’à A45, en S3 A39 ETC.
Du coup, j’ai créé une variable qui définit la dernière ligne remplie de mon TCD1
DLTCD = Sheets("TCD").Columns(1).Find("*", , , , xlByColumns, xlPrevious).Row
Une fois que je connais la fin de mon TCD1, j’ai créé mon TCD2, 9 lignes en dessous du TDC1 avec la variable HTCD2 (signifiant Haut de mon TCD2)
HTCD2 = Cells(DLTCD + 9, 1)
J’ai définit la dernière ligne de mon TCD2 par la variable DLTCD2
DLTCD2 = Sheets("TCD").Columns(1).Find("*", , , , xlByColumns, xlPrevious).Row
Les autres TCD sont également positionnés selon l’emplacement des autres TCD. Pour info, même si ça nous est inutile pour ma recherche, le TCD3 se situe 3 colonnes à droite du TCD1, le TCD4 se situe 9 lignes en dessous du TCD3 et le TCD5 se situe 3 ligne à droite du TCD4
Plus loin dans ma macro, je réalise une rechercheV dont la Table_Matrice de la rechercheV est le TCD2. Voici la formule sur bureautique :
=SIERREUR(RECHERCHEV(A2;TCD!$A$40:$B$87;2;0);0)
Sauf que du coup c’est erroné car la Table_Matrice « TCD!$A$40:$B$87 » est figée alors que mon TCD2 lui ne sera jamais précisément sur ces cellules puisqu’il dépend d’autres éléments mouvants également. A mon niveau j’aurais besoin qu’il aille chercher le TCD2 qui est définit pas son début avec la variable HTCD2 et par la fin avec DLTCD2.
Je précise que je suis nul en VBA et que je réalise ma macro avec l’enregistreur et que je modifie en VBA pour avoir exactement ce que je souhaite.
J’ai créé un fichier au cas où je ne suis pas clair,
https://www.cjoint.com/c/LHdorQIvTHD
Je précise qu’il s’agit de la toute dernière commande. Les commandes du dessus peuvent être exécuté par la macro
Pour votre fichier, je vous en remercie. J’avoue que c’est un peu complexe pour moi. De ce que je comprends, il va chercher la plage du tableau, mais du coup comment le transcrire dans une formule rechercheV ?
Concernant l'activecell, je l'utilise car c'est la proposition de l'enregistreur. Si j'ai bien compris le .formulaLocal va me permettre d'utiliser des adresse de type A1:B2 plutôt que R1C1:R2C2 c'est bien ça ?
Encore merci.
Cordialement
Jérôme
8 août 2022 à 09:59
Bonjour
Si tu n'as de recherche que dans le tcd2, ça n'est pas la peine de modifier la disposition de tes tcd.
Une solution dans ce sens.
J'ai affiché la formule pour excel 2003 (chez moi), dans le code, tu as celle pour ta version d'excel
https://www.cjoint.com/c/LHih2XpUDGB
Cdlmnt
9 août 2022 à 16:49
Bonjour
Un poil plus simple
Public Sub ok() Dim nuche Dim li1 As Long, li2 As Long, adrtcd2 As String, f As String, g As String, f1 As String With Sheets("TCD") ' recup n° cherché dans tcd2 nuche = .Range("C5").Value ' dernière ligne tcd2 li2 = .Cells(Rows.Count, 1).End(xlUp).Row li1 = li2 ' prelière ligne tcd2 Do li1 = li1 - 1 Loop Until .Cells(li1, 1) = "" ' adrezse tcd2 adrtcd2 = .Range(.Cells(li1 + 1, 1), .Cells(li2, 2)).Address ' formule excel 2003 - chez moi g = "RECHERCHEV(" & nuche & ";" & adrtcd2 & ";2;0)" f = "=SI(ESTNA(" & g & ");""""" & ";" & g & ")" ' formule excel >=2007 ça devrait ressembler à ça 'f1 = "=SIERREUR(" & g & ";0)" .Range("C7").FormulaLocal = f End With End Sub
Cdlmnr
5 août 2022 à 18:46
Bonjour CCM81,
Très grand merci pour ton aide. Je regarde ça à tête reposé car c'est complexe pour moi
Merci++++++++++++++++++++++++
6 août 2022 à 18:28
Bonjour CCM81,
Très grand merci pour ton aide. Du coup, je viens de regarder ton fichier et en gros c'est quasi ça sauf qu'en faite et d'après ton exemple le TCD2 se situe exactement en dessous du TCD1 mais 9 lignes plus bas. Il n'est pas décalé, il est lui aussi en colonne A et B.
Ce que je voudrais du coup c'est par exemple déterminer le 1 du TCD2 qui me rapporterait "lulu01", et non le 1 du TCD1 qui ramènerait à "toto01"
Je n'ai pas le niveau pour réussir à faire les modifications moi même, vois tu ce qui me poserait problème ? J'ai essayé de modifier les Const mais ça me renvoie des erreurs
Merci pour ton aide
Amicalement