XL 2019 Fonction RECHERCHEV

Pieerre69

XLDnaute Junior
Bonjour à toutes et à tous,

J'ai un petit soucis dans l'exécution d'une macro qui effectue une RECHERCHEV.

L'objectif de cette macro est de renvoyer une désignation (que je considère comme une chaine de caractères même si c'est de l'alphanumérique) lorsque le code article (qui est au format personnalisé 000000 -> ex : 002360 / 000481 / 009856) renseigné se trouve dans la matrice.

Je pense que l'erreur que VBA m'affiche correspond au format des données, mais je ne vois pas comment faire autrement.

CI-joint mon code et les deux feuilles concernées.

Merci par avance !
VB:
Sub test()

Dim der_lig As Long
Dim code_art As String
Dim rv As String

code_art = Range("A23")
der_lig = (Sheets("Article").Cells(300000, 1).End(xlUp).Row) + 1

If code_art <> "" Then
        
    For i = 23 To 41 Step 2
    rv = Application.VLookup(code_art, Sheets("Article").Range("A2:C9000"), 2, False).Text
    Range("C" & i) = rv
    code_art = Range("A" & i)
    
    Next
    Else
End If
    
End Sub
 

Pièces jointes

  • Classeur test.xlsm
    320.7 KB · Affichages: 11
Solution
Bonjour

Tu as plusieurs problèmes :
Ton tableau des articles contient des codes articles avec une dizaine d'espaces en fin de code, idem pour les autres champs

Donc sauf à inclure ces espaces dans le code recherché cela ne peux fonctionner

Pourquoi une macro alors que la formule suivante suffirait :
VB:
=SI(A23<>"";RECHERCHEV(TEXTE(A23;"000000");ARTICLE;2;0);"")

Pourquoi des cellules fusionnées plutôt que des lignes de plus grande hauteur ?

Ton code ne tire par partie du Tableau structuré de tes articles
Si la colonne Article contenait effectivement des textes de type 000002
ceci fonctionnerait
Code:
Dim code_art As String
Dim rv As String

code_art = Range("A23")

If code_art <> "" Then
       
    For i = 23 To 41 Step 2
    rv =...

Pieerre69

XLDnaute Junior
Je n'ai jamais eu de soucis avec mes cellules fusionnées dans mes autres macros qui sont un peu plus compliquées que celle-là.
De plus, je fais bien un step 2 dans ma boucle, donc c'est comme si je décalais de 1 vers le bas ma sélection. Il ne devrait pas y avoir de soucis de ce côté là.

Même si je note bien l'info comme quoi je dois changer la hauteur de ligne plutôt que de fusionner, je n'ai pas envie de le faire car je dois recommencer tout mon fichier (qui comporte bien plus de feuilles que ce que je vous ai partagé) ainsi que modifier tout le code VBA associé.

Je pensais plus à des problèmes de compatibilités de format (il m'affiche d'ailleurs erreur 13), mais je ne m'y connaît pas assez dans les types de variables pour saisir d'où vient le soucis.
 

herve62

XLDnaute Barbatruc
Supporter XLD
Bonjour
Beaucoup de fautes de base !
1) on ne met pas une sub simple dans une feuille mais dans un module
2) il n'y avait pas de distinction entre les "Range" des feuilles
3) formule lookup revue
j'ai testé le 1er cas > Ok

PS : Attention si + tard utilisation de la donnée en A ex 00018 en fait la string est "00018_____" ( je mets des _ car ici l'éditeur supprime les espaces) il y a plein d'espaces après le dernier digit donc si tu cherches (par ex via inputBox) "00018" ne trouvera jamais
 

Pièces jointes

  • Classeur test.xlsm
    331.2 KB · Affichages: 5
Dernière édition:

chris

XLDnaute Barbatruc
Bonjour

Tu as plusieurs problèmes :
Ton tableau des articles contient des codes articles avec une dizaine d'espaces en fin de code, idem pour les autres champs

Donc sauf à inclure ces espaces dans le code recherché cela ne peux fonctionner

Pourquoi une macro alors que la formule suivante suffirait :
VB:
=SI(A23<>"";RECHERCHEV(TEXTE(A23;"000000");ARTICLE;2;0);"")

Pourquoi des cellules fusionnées plutôt que des lignes de plus grande hauteur ?

Ton code ne tire par partie du Tableau structuré de tes articles
Si la colonne Article contenait effectivement des textes de type 000002
ceci fonctionnerait
Code:
Dim code_art As String
Dim rv As String

code_art = Range("A23")

If code_art <> "" Then
       
    For i = 23 To 41 Step 2
    rv = Application.WorksheetFunction.VLookup(Format(code_art, "000000"), Worksheets("Article").ListObjects("ARTICLE").DataBodyRange, 2, False).Value
    Range("C" & i) = rv
    code_art = Range("A" & i)
   
    Next
    Else
End If
 
Dernière édition:

herve62

XLDnaute Barbatruc
Supporter XLD
Re tous ! @chris
non dans ce cas la string n'importe peu puisqu'il prend direct sa valeur dans la cellule donc il a
"00018 " et ensuite le code reprend la valeur cellule donc idem (espace inclus puisque "as string")
moi ce que j'ai vu en 1er c'est code_art ="" ou sans string, = vide car le range n'était pas référencé donc comme la sub était dans l'onglet "Fiche ...." il prend le A23 qui est vide
Je n'ai pas modifié de format et tout fonctionne
 

dg62

XLDnaute Barbatruc
Bonjour le fil,
Re tous ! @chris
non dans ce cas la string n'importe peu puisqu'il prend direct sa valeur dans la cellule donc il a
"00018 " et ensuite le code reprend la valeur cellule donc idem (espace inclus puisque "as string")
moi ce que j'ai vu en 1er c'est code_art ="" ou sans string, = vide car le range n'était pas référencé donc comme la sub était dans l'onglet "Fiche ...." il prend le A23 qui est vide
Je n'ai pas modifié de format et tout fonctionne
Re,
j'ai fait une exécution pas à pas, A23 renvoie bien une valeur avec la procédure initiale.
Par contre n'y a t-il pas une erreur ici
VB:
With Worksheets("Article")
code_art = .Range("A23")
A23 fait référence à la fiche déclaration je crois.
 

Pieerre69

XLDnaute Junior
Re à tous !

edit : (en gras)
1/ c'est une private sub workbook_change que je met normalement dans cette feuille, mais pour tester j'ai juste créer une sub test() que j'ai laissé dans la feuille ! Je veux qu'elle ne s'exécute que pour cette feuille (d'où son placement).
2/ quand je ne distingue pas les feuilles dans les range, c'est parce que j'utilises la feuille actuelle (par défaut c'est la feuille "FICHE DECLARATION")
3/ vous pouvez me préciser la signification des termes rajouter dans la formule VLookUp ? Je ne saisi pas tout ^^
4/ Effectivement, je n'avais pas vu tout ces codes articles avec des espaces.. Je tire cette feuille d'une BDD SQL Server qui s'actualise en automatique.. Je ferais le tri pour qu'ils n'apparaissent plus.
5/ @herve62 c'est correct, la première condition permet juste de ne rien faire si la cellule A23 de la feuille FICHE DECLARATION est vide, mais je ne reference pas le range (cf. point 2)

Merci pour vos premières réponses en tout cas
 

chris

XLDnaute Barbatruc
re
@Pieerre69
j'ai utilisé la référence au Tableau ARTICLE dont Excel connait le nombre de lignes, ce qui évite de travailler avec du code inadapté aux tableaux de type der_lig

Edit : et la première partie est pour convertir le code recherché de numérique en texte si effectivement le tableau des articles contient des codes sous forme textuelle et non numérique
 
Dernière édition:

chris

XLDnaute Barbatruc
RE
Oui quand on utilise les tableaux structurés (listobjects) on raisonne en tableau pas en plage

Worksheets("Article").ListObjects("ARTICLE").DataBodyRange donne la plage hors titres de ce ce tableau et suit automatiquement l’évolution de celle-ci.
 

Pieerre69

XLDnaute Junior
RE
Oui quand on utilise les tableaux structurés (listobjects) on raisonne en tableau pas en plage

Worksheets("Article").ListObjects("ARTICLE").DataBodyRange donne la plage hors titres de ce ce tableau et suit automatiquement l’évolution de celle-ci.

Super je ne savais pas ! Je retiens du coup :)

Et je viens de relire le fil, c'est vrai que des formules dans la colonne "désignation" c'est plus efficace et moins compliqué à faire.. Je ne sais pas pourquoi je me suis pris la tête avec une macro alors qu'un bout de formule marche aussi bien sans alourdir le fichier !

Merci à vous !
 

Pieerre69

XLDnaute Junior
RE

Pourquoi fusionnes-tu et n'utilises-tu pas pour simplement des lignes plus hautes ?

C'est vrai que ça serait plus logique, mais quand j'ai commencé mon fichier j'ai fusionné, et je me suis aperçu de mon erreur beaucoup trop tard... J'ai maintenant trop avancé pour faire machine arrière, et j'ai des délais à tenir. Je le referais une fois que j'aurais plus de temps, je ferais une V2.
 

Statistiques des forums

Discussions
311 724
Messages
2 081 936
Membres
101 844
dernier inscrit
pktla