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 =...

herve62

XLDnaute Barbatruc
Supporter XLD
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 Junior
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 Junior
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:

herve62

XLDnaute Barbatruc
Supporter XLD
Oui c'est possible ( j'ai vu le Instr=-1 ??? car pas d'espace ou valeur nombre) car il faudrait aussi revoir TOUT le format de chaque code !!!!!!!:eek: parfois j'ai vu juste 18 ???? ou "000045" pas d'espace ? ( au pif) donc encore pour faire vite > on error resume next
Pour t'éviter des Pb futurs il faudrait partir sur du "Propre" donc là un bon format pour tous tes codes , ça fait beaucoup mais c'est comme ça
Astuce : une petite macro qui les lit 1 par 1 et les recopie dans une feuille bien en xxxxxxx ou autre
faudra traiter les : non espaces , valeurs nombre ; je sais pas ce qu'on peut trouver dans ta liste !!!
Ensuite tu remets en place
Enfin pour éviter le Message à l'effacement tu modifies :
If Cells(T, 1) <> "" Then MsgBox "Code Article non trouvé"
j'ai testé
 

Pieerre69

XLDnaute Junior
Oui c'est possible ( j'ai vu le Instr=-1 ??? car pas d'espace ou valeur nombre) car il faudrait aussi revoir TOUT le format de chaque code !!!!!!!:eek: parfois j'ai vu juste 18 ???? ou "000045" pas d'espace ? ( au pif) donc encore pour faire vite > on error resume next
Pour t'éviter des Pb futurs il faudrait partir sur du "Propre" donc là un bon format pour tous tes codes , ça fait beaucoup mais c'est comme ça
Astuce : une petite macro qui les lit 1 par 1 et les recopie dans une feuille bien en xxxxxxx ou autre
faudra traiter les : non espaces , valeurs nombre ; je sais pas ce qu'on peut trouver dans ta liste !!!
Ensuite tu remets en place
Enfin pour éviter le Message à l'effacement tu modifies :
If Cells(T, 1) <> "" Then MsgBox "Code Article non trouvé"
j'ai testé

Cette " feuille base de données" est extraite de la BDD de notre ERP.
Si les utilisateurs de l'entreprise n'ont pas créé les codes au bon format, c'est vrai que tout est fichu en l'air. Mais c'est indépendant de ma volonté.

Cette base étant une base avec connexion SQL Server, elle se met à jour de façon automatique....


Si je comprend, à part standardiser tous les codes articles, il faut que je laisse tomber la solution "macro" ? Et que je privilégie les formules dnas les cellules ?
 

herve62

XLDnaute Barbatruc
Supporter XLD
J'ai connu il y a très longtemps , j'avais une base d'achats avec des articles juste pour ma partie parmi des milliers . Grosse entreprise nous avions un service informatique costaud avec des petits Dpt dont un en charge des SQL > il me faisait mes fichiers "texte" tous les lundis du VAX ou BAHN et virés sur notre serveur windows ; Ensuite j'avais écris une petite macro pour charger sur mon PC avec le bon format ; 3, 4h passées au début, mais ensuite chaque sem. rien à faire juste ..... appuyer sur le bouton
Avec tes formules tu auras le même soucis si tu as RECHERCHEV "0045" et que dans tes cellules c'est "00045 " cela ne marchera pas
Par expérience ce que j'ai fait fonctionnait très bien .... et quel gain de temps (et surtout rien à faire :D)
 

chris

XLDnaute Barbatruc
RE

Avec 2019 voir si tu ne peux pas extraire et nettoyer via PowerQuery intégré à Excel

@herve :​
pourquoi continuer à ignorer les avantages des listobjects et continuer avec des codes tels que der_lig = (.Cells(100000, 1).End(xlUp).Row) + 1​
qui ne marchent pas si la liste dépassent 100000 lignes...​

On peut simplifier et nettoyer tous les espaces de début ou fin de chaînes, tant dans le code article que l'autre colonne ainsi
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim code_art As String
Dim ch_art, code As String
If Intersect(Target, Range("A23:A41")) Is Nothing Then Exit Sub
On Error Resume Next
T = Target.Row

code_art = Range("A" & T)
With Worksheets("Article")
  
    For Each cellule In .ListObjects("ARTICLE").ListColumns("ARKTCODART").DataBodyRange
        ch_art = cellule
        code = Trim(ch_art)
        If code = Range("A" & T).Text Then
            Sheets("FICHE DE DECLARATION").Range("C" & T) = Trim(cellule.Offset(0, 1).Text)
            Exit Sub
        End If
    Next

    MsgBox "Code Article non trouvé"
End With
End Sub

Edit : à noter que ce code ne traite pas la suppression d'un code saisi dans la Fiche, suppression qui devrait effacer la colonne Designation

Il faudrait pour cela ajouter avant le on Error :
VB:
If Target(1, 1) = "" Then Target.Offset(0, 1) = "": Exit Sub
 
Dernière édition:

herve62

XLDnaute Barbatruc
Supporter XLD
Oui juste ce que j'ai pensé en retrouvant un exemple que j'ai adapté , c'est idem à ton code
je n'ai plus besoin du On error
> derlig avec +de 100 000 lignes , oui ça arrive souvent ???? , je suis encore vieux jeu
si gros fichiers ( je parle de grosses entreprises ) on avait nos GPAO .... etc ; et comme je disais Excel n'était utilisé que avec des SQL
j'ai remis à un format plus convenable la zone de "travail" (A23 A41) car j'ai vu du chinois du kazak .... du ???? 1ere fois , je ne sais pas d'où ça sort ?
 

Pièces jointes

  • Classeur test_V3.xlsm
    332.7 KB · Affichages: 7

Pieerre69

XLDnaute Junior
Oui juste ce que j'ai pensé en retrouvant un exemple que j'ai adapté , c'est idem à ton code
je n'ai plus besoin du On error
> derlig avec +de 100 000 lignes , oui ça arrive souvent ???? , je suis encore vieux jeu
si gros fichiers ( je parle de grosses entreprises ) on avait nos GPAO .... etc ; et comme je disais Excel n'était utilisé que avec des SQL
j'ai remis à un format plus convenable la zone de "travail" (A23 A41) car j'ai vu du chinois du kazak .... du ???? 1ere fois , je ne sais pas d'où ça sort ?

Oui j'ai vu toutes ces langues, il y a même du Portuguais !!
Je ne sais pas dire d'où ça vient en tout cas.

De toute manière je garde vos deux codes bien au chaud en attendant de rendre cette base plus propre et je fais du RECHERCHEV... J'ai formé les opérateurs de production à la saisie, ils devraient toujours utiliser un format "000000".


Merci à vous deux pour le coup de main !
 

Pieerre69

XLDnaute Junior
Bonjour à tous !

Je réactive cette conversation car je voulais étendre ton code type 'rechercheV' automatique à d'autres applications, mais je n'arrive pas à le faire fonctionner.

En le réadaptant, mon soucis vient de la ligne sheets("xxx").range("xxx") = trim(cellule.offset(0,1).text)

Moi je voudrais qu'il récupère la donnée de la colonne 4 (donc j'ai juste changer la valeur de l'offset) d'une part et que d'autre part il l'a "re-récupère" et qu'il l'a multiplie par la valeur d'une autre colonne (même ligne mais colonne différente).

En faisant par exemple :
sheets("xxx").range("xxx1") = trim(cellule.offset(0,1).text)
sheets("xxx").range("xxx2") = trim(cellule.offset(0,1).text)*trim(cellule.offset(0,1).text)

Mais il ne renvoie rien dans aucunes des deux cellules (xxx1 et xxx2)

Vous avez une idée d'où ça peut venir ?
 

chris

XLDnaute Barbatruc
Bonjour

En l’occurrence tu n'as pas changer d'offset... et là tu cherches à multiplier la valeur par elle-même

En plus trim enlève les espaces mais ne convertit pas en numérique...

Sans voir comment est défini cellule (colonne ?), à quoi ressemblent et où sont placés les autres colonnes difficile d'en dire plus...
 

Statistiques des forums

Discussions
311 720
Messages
2 081 897
Membres
101 833
dernier inscrit
sandra25