Recherche multicritère VBA

Tadadadam

XLDnaute Nouveau
Bonjour à tous,

Je suis tout bleu sur ce forum et également tout bleu (et plus encore) en programmation VBA. J'ai passé pas mal de temps sur des sujets répondant à des questions du même type mais je n'ai pas encore réussi à solutionner mon problème.

Afin de simplifier le remplissage d'un tableau, je cherche à développer une macro sur le principe suivant :

J'ai un tableau sur 3 colonnes, un inputbox me permet de saisir un chiffre correspondant à une ou plusieurs cellules de la première colonne. Un autre inputbox me permet de saisir un chiffre correspondant à une ou plusieurs cellules de la deuxième colonne.
En fonction des valeurs saisies je souhaite afficher dans un msgbox le texte correspondant aux 2 premiers chiffres saisis et qui est présent dans la 3eme colonne.

Petit exemple pour que se soit plus clair :

Zone Det Libellé
1 1 a
1 2 b
1 3 c
2 1 d
2 2 e
2 3 f
3 1 g
3 2 h
3 3 i
4 1 j
4 2 k
4 3 l

Si je saisis dans mes inputbox 1 puis 3 je dois afficher c.
Si je saisis 3 puis 1 je dois afficher g.

J'ai essayé plusieurs chose avec les fonctions match et evaluate mais sans succès.

Est ce que quelqu'un aurait une solution à me proposer ?
 
Dernière édition:

Modeste

XLDnaute Barbatruc
Re : Recherche multicritère VBA

Bonjour Tadadadam et bienvenue,

Tu auras noté, en lisant attentivement la charte :) que ce forum autorisait (et recommandait même chaudement!) le fait de joindre un fichier exemple (lequel fichier sera "allégé": 50 à 100 lignes illustrant les différents cas possible et exempt de toute donnée à caractère confidentiel).

Ce petit exemple permettrait de confirmer si les données sont toujours triées en ordre croissant par Zone, puis par Det. Si Det correspond toujours à 1, 2 et 3, merci de le préciser.

Si une solution par formules existe, tu n'es pas intéressé?
Quel est le volume de données dans ton fichier réel?
 

Tadadadam

XLDnaute Nouveau
Re : Recherche multicritère VBA

Bonjour,

En suivant tes conseils je joins le document sur lequel je souhaite travailler.

Pour répondre à tes questions, les données ne sont jamais triées. Je l'ai rédigé comme cela afin de faciliter la compréhension de l'exemple.
La variable zone peut prendre des valeurs allant de 1 à 9999 et la variable det des valeurs allant de 1 à 32.
De plus le fichier peut aller d'une page à une dizaine (avec l'entête présent sur chaque page).

Pour finir, je souhaites avoir un bouton pour déclencher ma macro et je pense donc que cela n'est pas possible en passant par une formule. Sinon pourquoi pas. :)
 

Pièces jointes

  • Test.xlsx
    63.9 KB · Affichages: 44
  • Test.xlsx
    63.9 KB · Affichages: 55
  • Test.xlsx
    63.9 KB · Affichages: 52
Dernière édition:

Modeste

XLDnaute Barbatruc
Re : Recherche multicritère VBA

Re-bonjour,

Essaie ce code dans un module standard: attention, ce n'est qu'une base, il conviendrait d'y ajouter quelques contrôles, par prudence!

VB:
Sub trouveCorresp()
Z% = InputBox("Entrez le n° de zone")
D% = InputBox("Entrez le n° de Det")
Set trouve = Sheets("Test").[C:C].Find(What:=Z, LookAt:=xlWhole, LookIn:=xlValues)
If Not trouve Is Nothing Then
    premAdresse = trouve.Address
    Do
        If trouve.Offset(0, 1) = D Then MsgBox "Pour " & Z & " et " & D & ", la valeur est: " & trouve.Offset(0, 2): Exit Sub
        Set trouve = Sheets("Test").[C:C].FindNext(trouve)
    Loop While Not trouve Is Nothing And trouve.Address <> premAdresse
End If
End Sub
 

Tadadadam

XLDnaute Nouveau
Re : Recherche multicritère VBA

Merci beaucoup cela à l'air de fonctionner.
Pour me permettre de continuer, peux-tu m'expliquer comment à partir de ton code je peux récupérer les numéros de ligne et de colonne de la cellule dont le libellé correspond aux valeurs saisies ?
 

Modeste

XLDnaute Barbatruc
Re : Recherche multicritère VBA

Re²,

comment à partir de ton code je peux récupérer les numéros de ligne et de colonne de la cellule dont le libellé correspond aux valeurs saisies
V'là que tu m'inquiètes, maintenant! :eek: Le libellé, il ne sera pas toujours en colonne E (donc la 5e) !??

Le n° de ligne, quant à lui sera fourni par trouve.Row, au moment où la correspondance est trouvée en colonne D, avec la variable "D" (donc juste avant le Exit Sub)

Me suivez-vous, jeune homme? :) Merci de ne pas répondre: "Mais oui, pépère, je te précède, même!"
 

gosselien

XLDnaute Barbatruc
Re : Recherche multicritère VBA

Bonsoir le forum, Modeste,

j'ai ajouté les 3 lignes qui détaillent pour le monsieur la ligne trouvée et les 3 colonnes en couleur...
ça devrait l'aider :)

P.

Sub trouveCorresp()
Z% = InputBox("Entrez le n° de zone")
D% = InputBox("Entrez le n° de Det")
Set trouve = Sheets("Test").[C:C].Find(What:=Z, LookAt:=xlWhole, LookIn:=xlValues)
If Not trouve Is Nothing Then
premAdresse = trouve.Address
Do
If trouve.Offset(0, 1) = D Then '
MsgBox ("la ligne est : ") & trouve.Row
trouve.Interior.ColorIndex = 6 ' colonne C
trouve.Offset(0, 1).Interior.ColorIndex = 6 ' colonne D
trouve.Offset(0, 2).Interior.ColorIndex = 6 ' colonne E
End If
Set trouve = Sheets("Test").[C:C].FindNext(trouve)
Loop While Not trouve Is Nothing And trouve.Address <> premAdresse
End If
End Sub
 

Tadadadam

XLDnaute Nouveau
Re : Recherche multicritère VBA

Bonjour,

Désolé de revenir relancer le sujet après plusieurs jours (semaines ?!) mais j'ai fait des essais avec le code et j'ai quelques soucis.

J'ai ce code qui fonctionne très bien :
Code:
Sub trouveCorresp()

'Déclaration variable
Dim libelle As String
Z% = InputBox("Entrez le n° de zone")
D% = InputBox("Entrez le n° de Det")

'Configuration de la fonction recherche de la zone
Set trouve = Sheets("Test").[C:C].Find(What:=Z, LookAt:=xlWhole, LookIn:=xlValues)

If Not trouve Is Nothing Then
    premAdresse = trouve.Address
    Do
    
        If trouve.Offset(0, 1) = D Then libelle = InputBox("Correction du libellé", "Libellé", trouve.Offset(0, 2)): Exit Sub
                                             
        
        Set trouve = Sheets("Test").[C:C].FindNext(trouve)
    Loop While Not trouve Is Nothing And trouve.Address <> premAdresse
End If



End Sub

Alors que celui-ci ne fonctionne que pour le premier détecteur de chaque zone (7-1, 6-1, ...) et pas pour les autres
Code:
Sub trouveCorresp()

'Déclaration variable
Dim libelle As String
Z% = InputBox("Entrez le n° de zone")
D% = InputBox("Entrez le n° de Det")

'Configuration de la fonction recherche de la zone
Set trouve = Sheets("Test").[C:C].Find(What:=Z, LookAt:=xlWhole, LookIn:=xlValues)

If Not trouve Is Nothing Then
    premAdresse = trouve.Address
    Do

        If trouve.Offset(0, 1) = D Then libelle = InputBox("Correction du libellé", "Libellé", trouve.Offset(0, 2))
                                        trouve.Offset(0, 2) = libelle
                                        trouve.Offset(0, 5) = "BF": Exit Sub
        
          
        Set trouve = Sheets("Test").[C:C].FindNext(trouve)
    Loop While Not trouve Is Nothing And trouve.Address <> premAdresse
End If



End Sub

Mon but étant d'éventuellement pouvoir corriger le libellé de la ligne recherchée.

Les 2 lignes que je rajoute suffisent à buguer la macro. Savez vous pourquoi ?
 

Dranreb

XLDnaute Barbatruc
Re : Recherche multicritère VBA

Bonsoir.

Si vous avez plusieurs instructions consécutives soumises au Then d'un If à exécuter, vous devez soit les mettre toutes sur la même ligne logique séparées de ":" (une ligne logique pouvant éventuellement être constituée de plusieurs lignes physiques toutes terminées par le signe de continuation " _" sauf la dernière), soit mettre le 1ère d'entre elle non à la suite du Then mais sur une nouvelle ligne et terminer le tout par End If.

À part ça, moi je ferais ça avec un Userform, je pense.
 

Dranreb

XLDnaute Barbatruc
Re : Recherche multicritère VBA

Bonjour.

Je n'ai peut être pas été clair.
If trouve.Offset(0, 1) = D Then libelle = InputBox("Correction du libellé", "Libellé", trouve.Offset(0, 2))
trouve.Offset(0, 2) = libelle
trouve.Offset(0, 5) = "BF": Exit Sub
Il est normal que cette boucle ne tourne qu'une fois puisqu'elle contient un Exit Sub qui n'est soumis à aucune condition. Il faut probablement soit ça :
VB:
If trouve.Offset(0, 1) = d Then libelle = InputBox("Correction du libellé", "Libellé", trouve.Offset( _
   0, 2)): trouve.Offset(0, 2) = libelle: trouve.Offset(0, 5) = "BF": Exit Sub
soit ça :
VB:
If trouve.Offset(0, 1) = d Then
   libelle = InputBox("Correction du libellé", "Libellé", trouve.Offset(0, 2))
   trouve.Offset(0, 2) = libelle
   trouve.Offset(0, 5) = "BF": Exit Sub: End If
 

Discussions similaires

Statistiques des forums

Discussions
312 229
Messages
2 086 426
Membres
103 206
dernier inscrit
diambote