XL 2016 [RESOLU] VBA : Rechercher et restituer à l'utilisateur une valeur contenue dans le classeur en fonction de la valeur d'une autre cellule

lancelot92

XLDnaute Nouveau
Bonjour à tous,

J’ai un petit problème (facile pour tout initié) que j’ai tenté de résoudre en vain et c’est pourquoi je fais appel à vos compétences.

Mon besoin est le suivant (partiellement satisfait) : obtenir, à l’ouverture de mon fichier une boîte de dialogue qui me demande une valeur (string demande) que je rentre manuellement. Ensuite, le système doit rechercher cette valeur dans ma feuille, puis une fois trouvée me renvoyer la valeur de la cellule inscrite un peu plus loin sur la même ligne, toujours en colonne 6 (string resultat).

Aujourd’hui, je réussis jusqu’à sélectionner la cellule avec ma valeur mais ensuite je ne sais pas comment expliquer au système que je veux la valeur de la cellule en colonne 6…

Pouvez-vous m’orienter dans les instructions à formuler ?

Ci-après le début de mon code

Mille merci par avance,

Option Explicit
Private Sub Workbook_Open()
Dim Demande As String
Dim resultat As String
Dim cellule_codearticle As Range
Dim cellule_classif As Range
Dim adresse As Range
Demande = InputBox("Code article?", "Requête classification fonctionnelle")
Set cellule_codearticle = Cells.Find(Demande, Lookat:=xlWhole)
…?
…?
MsgBox ("La classification fonctionnelle du produit est " & resultat)
ActiveWorkbook.Close False
End Sub
 

James007

XLDnaute Barbatruc
Bonjour,

Pas sûr de tout comprendre ...
A tester
VB:
Set cellule_codearticle = Feuil1.Columns("F:F").Find(What:=Demande, SearchOrder:=xlRows,_
SearchDirection:=xlNext, LookIn:=Values)
MsgBox ("La classification fonctionnelle du produit est " & cellule_codearticle.Value)
 

lancelot92

XLDnaute Nouveau
Bonjour James007,

Et un grand merci pour votre retour.

J’ai inclus les lignes de code fournies et tenté de déclaré la variable Values (qui vous avez placé dans LookIn :=Values) mais je ne sais à quel genre elle appartient…du coup j’ai eu ensuite successivement 2 messages d’erreur :

Erreur d’exécution 13 : incompatibilité de type
Erreur d’exécution ‘9’ : L’indice n’appartient pas à la sélection

Comment puis-je arranger ça ?

Sinon, à quel moment dans mon explication je n’ai pas été assez précis ?

Reformulation du besoin : lorsque je tape une valeur dans la boîte de dialogue (qui peut se trouver à n’importe quelle endroit dans le classeur), le système doit, une fois qu’il l’a repérée dans le tableau, me renvoyer la valeur contenue dans la cellule de la même ligne qui se trouve toujours en colonne F. C’est un immense tableau où la correspondance de ma valeur cellule_codearticle se trouve toujours en colonne F et sur la même ligne que cellule_codearticle ; cette correspondance qui se nomme cellule_classif (étiquette de la colonne F)

Un grand merci par avance pour votre support.
 

lancelot92

XLDnaute Nouveau
Bonjour,

As-tu la possibilité de joindre un petit bout de fichier illustratif .. en prenant bien soin d'anonymiser les données confidentielles ... ;)

Bonjour James007,

Et merci beaucoup pour ton retour.

En pièce jointe, tu trouveras le fichier concerné. J'ai pris soin d'anonymiser le contenu confidentiel.

Bien cordialement,
 

Pièces jointes

  • Classification.xlsm
    57.2 KB · Affichages: 10

lancelot92

XLDnaute Nouveau
Merci pour ton fichier

En ne tenant pas compte des erreurs de saisie du code Article ...

ci-joint ton fichier test

En espèrant que cela t'aide

James007,



Merci beaucoup pour ce retour.

J’ai juste 2 petits problèmes :

  • La recherche du code article s’effectue uniquement dans la colonne A, alors que l’info peut aussi se trouver dans la colonne D. J’aurais bien changer Feuil1.Columns("A:A") pour Feuil1.Columns("AD"), cependant l’instruction cellule_codearticle.Offset(0, 5).Select n’est plus valable parce que selon le cas je me déplace de 5 colonnes vers la droite ou de 2… Comment puis-je indiquer au système d’aller chercher systématiquement dans la colonne 6 sans passer par un décalage de cellule du code article ?

  • Lorsque je mets une valeur inexistante, le système réussit quand même à me trouver une correspondance de classification (je pense qu’il s’adapte en fonction du nombre de digits), seulement je préférerais ajouter une condition qui permettrait d’indiquer à l’utilisateur par une boîte de dialogue que la valeur (EXACTEMENT LA VALEUR DEMANDEE) est introuvable. Autrement dit, si l’utilisateur n’indique pas 8 chiffres exactement, ou si le code est inexistant dans le fichier, un message doit le prévenir pour qu’il recommence (ou si trop compliqué à programmer, faire fermer le fichier).
Merci par avance pour tes conseils
 

lancelot92

XLDnaute Nouveau
Bonjour James007,

Et mille merci pour ce fichier très complet !

Par contre, dernière chose, j'ai à faire à un phénomène étrange... au départ le fichier fonctionnait très bien, et après plusieurs utilisations, copies pour modifications etc. le fichier s'est littéralement mis à planter au niveau de l'instruction
VB:
MsgBox "La classification fonctionnelle de l'article " & demande & vbNewLine & vbNewLine _
& " est " & IIf(cellule_codearticle.Column = 1, cellule_codearticle.Offset(0, 5), cellule_codearticle.Offset(0, 2))

=> J'ai eu droit à "erreur d'exécution '91' Bloc objet ou variable de bloc With non définie". Bizarrement, même après le retéchargement de ton fichier, j'avais toujours le même problème, comme si le dysfonctionnement provenait des paramètres VBA et non de la macro en elle-même.

As-tu une idée de l'origine de ce problème ?

Merci par avance,
 

lancelot92

XLDnaute Nouveau
Je crois avoir identifié une cause à effet (inexpliqué mais véridique) : Le code s'est mis à bugger à partir du moment où j'ai voulu protéger le classeur par un code. Même en déverrouillant, ça ne marchait pas, le code erreur apparu était incohérent. Du coup, j'ai tout récrit sur un nouveau fichier et ton code fonctionne maintenant à la perfection. Mais je ne sais vraiment pas ce qui s'est passé tout à l'heure, est-ce vraiment une histoire de protection...?

De plus, je n'avais absolument pas ajouté de condition with dans le code, juste quelques rajouts pour gérer tous types d'erreur que peut commettre l'utilisateur (voir ligne 7) :

Code final :

VB:
Option Explicit

Sub requete()
Dim demande As String
Dim cellule_codearticle As Range
demande = InputBox("Code article en 8 chiffres", "Requête classification fonctionnelle")
If Len(demande) < 8 Then MsgBox " Ce code n'existe pas ...": Exit Sub
If Len(demande) > 8 Then MsgBox " Ce code n'existe pas ...": Exit Sub
If Application.CountIf(Columns("A:D"), demande) > 0 Then
Set cellule_codearticle = Feuil1.Range("A1:A1014,D1:D1014").Find(What:=demande, SearchOrder:=xlRows, SearchDirection:=xlNext, LookIn:=xlValues)
MsgBox "La classification fonctionnelle de l'article " & demande & vbNewLine & vbNewLine _
& " est " & IIf(cellule_codearticle.Column = 1, cellule_codearticle.Offset(0, 5), cellule_codearticle.Offset(0, 2))
Else
MsgBox " Ce code n'existe pas ...":
Exit Sub
End If
End Sub
 

James007

XLDnaute Barbatruc
Re,

Effectivement, sur une feuille protégée, tu as intérêt en début de macro à retirer la protection ...
puis à effectuer toutes tes instructions ...
et, en toute fin de macro à remettre ta protection

Par ailleurs en utilisant Columns("A : D") tu exiges que ta macro, à chaque requête, fasse l'analyse de 4'194'304 lignes ... tu as intérêt à définir plus précisément ta plage-cible ... pour minimiser le temps de recherche ...
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
315 096
Messages
2 116 183
Membres
112 677
dernier inscrit
Justine11