Résolu XL 2019 Fonction RECHERCHEV

Pieerre69

XLDnaute Nouveau
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
 
Ce fil a été résolu! Aller à la solution…

Fichiers joints

dg62

XLDnaute Accro
Bonjour pierre69,
Vos lignes sont fusionnées c'est sans doute la cause du problème.
Changer la hauteur de ligne plutôt que la fusion.
 

Pieerre69

XLDnaute Nouveau
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
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
 

Fichiers joints

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
 
Ce message a été identifié comme étant une solution!
Dernière édition:

herve62

XLDnaute Barbatruc
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 Accro
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 Nouveau
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
Bonjour
@herve62
Ton code prend le code article dans la table des articles et non dans le document à remplir donc tu n'es pas dans la situation réelle
 

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 Nouveau
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 !
 

chris

XLDnaute Barbatruc
RE

Pourquoi fusionnes-tu et n'utilises-tu pas simplement des lignes plus hautes ?
 
Dernière édition:

Pieerre69

XLDnaute Nouveau
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.
 

herve62

XLDnaute Barbatruc
Une dernière version si pas le temps de changer les données, avec méthode "basique", et que c'est le résultat qui compte ( j'espère !!)
j'ai juste formaté la col A en texte
se met à jour à chaque saisie de A23 à A41
 

Fichiers joints

Pieerre69

XLDnaute Nouveau
C'est plutôt pas mal !! Mais quand je recopie ton code dans mon fichier, je n'ai que le message "Code Article non trouvé"
Que fait ton premier If ?
 

herve62

XLDnaute Barbatruc
Il faut d'abord reformater toute la colonne A en texte
le 1er IF est pour la zone de cellules (intersect) ou la macro peut s'activer donc juste entre A23 et A41
Pour voir l'erreur , supprime le "On error resume next" sinon c'est juste à cause de l'effacement dans la zone ..... j'ai fait ça vite fait car tu as dis
et j'ai des délais à tenir.
et pas testé à toute utilisation
 

Pieerre69

XLDnaute Nouveau
Il faut d'abord reformater toute la colonne A en texte
le 1er IF est pour la zone de cellules (intersect) ou la macro peut s'activer donc juste entre A23 et A41
Pour voir l'erreur , supprime le "On error resume next" sinon c'est juste à cause de l'effacement dans la zone ..... j'ai fait ça vite fait car tu as dis

et pas testé à toute utilisation
La colonne A de quelle feuille ?

Je ne remet pas en cause ta solution qui a l'air de focntionner dans ton fichier. Mais dans le mien j'ai retouché des choses en essayant de trouver une autre solution à la méthode "formule simple dans cellule".

C'est simplement pour voir d'où vient le pb ;)

Merci en tout cas de te donner tout ce mal !
 

Pieerre69

XLDnaute Nouveau
L'erreur vient de la ligne

VB:
code = Left(ch_art, (InStr(ch_art, " ") - 1))
Je dois changer quoi ?

Ok je crois que cette ligne permet d'attribuer à la variable code que la partie à gauche (qui va jusqu'au prochain espace) du code article.

Quand je regarde la valeur de code, il m'indique "" alors que ch_art donne bien "000002"
 
Dernière édition:

Créez un compte ou connectez vous pour répondre

Vous devez être membre afin de pouvoir répondre ici

Créer un compte

Créez un compte Excel Downloads. C'est simple!

Connexion

Vous avez déjà un compte? Connectez vous ici.

Haut Bas