VBA rechercheV sur plage ou je ne connais ni le début ni fin

Fermé
Jerome - 2 août 2022 à 20:48
 Jerome - 10 août 2022 à 14:47

Bonjour,

Je me permets de solliciter votre aide car je souhaiterais faire une rechercheV en VBA avec pour plage de recherche une première variable qui définit le haut de mon tableau et une seconde qui définit le bas de mon tableau. Je précise que le tableau est mouvant (il n'a pas de page fixe) il change d'une semaine sur l'autre.

Variable pour le haut de mon tableau

HTCD2 = Cells(DLTCD + 9, 1)
Cells(DLTCD + 9, 1).Select

Variable pour le bas de mon tableau

DLTCD2 = Sheets("TCD").Columns(1).Find("*", , , , xlByColumns, xlPrevious).Row

Avec l'enregistreur, ça m'a enregistré ceci : 

ActiveCell.FormulaR1C1 = "=IFERROR(VLOOKUP(RC[-7],TCD!R46C1:R73C2,2,0),""0"")"

Saut que du coup chaque semaine la partie "R46C1:R73C2" de ma rechercheV sera différente et donc erroné car le haut de mon tableau dépend du nombre de ligne au dessus qui lui aussi évolue.

Sauriez vous comment trouver le haut de mon tableau, mais dans la plage de recherche de la formule rechercheV ?

Merci pour votre aide,

Cordialement


Windows / Chrome 103.0.0.0

7 réponses

ccm81 Messages postés 10871 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 1 août 2024 2 413
Modifié le 3 août 2022 à 18:58

un essai pour fabriquer la formule

https://www.cjoint.com/c/LHdqVbjat7B

Cdlmnt

1

Bonjour CCM81,

Très grand merci pour ton aide. Je regarde ça à tête reposé car c'est complexe pour moi

Merci++++++++++++++++++++++++

0

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

0
ccm81 Messages postés 10871 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 1 août 2024 2 413
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

1

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

0
ccm81 Messages postés 10871 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 1 août 2024 2 413 > Jerome
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

0
Jerome > ccm81 Messages postés 10871 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 1 août 2024
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

0
ccm81 Messages postés 10871 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 1 août 2024 2 413
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

0
ccm81 Messages postés 10871 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 1 août 2024 2 413
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

0
Mike-31 Messages postés 18322 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 31 juillet 2024 5 086
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


0

Bonjour Mike-31,

Un grand merci pour ton fichier qui est très bien expliqué. Par contre, je ne vois pas trop comment l'appliquer dans une formule rechercheV ?

Encore merci pour ton aide,

Cordialement

Jérôme

0
Mike-31 Messages postés 18322 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 31 juillet 2024 5 086 > Jerome
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é 

0
Jerome > Mike-31 Messages postés 18322 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 31 juillet 2024
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

0
Mike-31 Messages postés 18322 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 31 juillet 2024 5 086 > Jerome
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

1
Jerome > Mike-31 Messages postés 18322 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 31 juillet 2024
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

1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question

Bonjour 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

0
ccm81 Messages postés 10871 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 1 août 2024 2 413
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

0

Bonjour CCM81,

J'ai commencé à regarder ton fichier ça a l'air parfait. Et surtout merci pour toutes les explication grâce au '

Merci +++++

0
ccm81 Messages postés 10871 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 1 août 2024 2 413
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

0

Bonjour CCM81,

Top un grand merci. C'est toujours mieux quand c'est plus simple :-)

Cordialement

0