XL 2010 Recherche index match avec 2 critères

lolobala

XLDnaute Nouveau
Bonjour à tous,

Après avoir lu plusieurs forums et effectué plusieurs tests divers, je m'en remets à vos connaissances.
Le code vba que je tente de faire doit retrouver dans le fichier Nouvelle_gamme, le numéro d'opération contenu dans la colonne I en fonction du code cherchée en colonne D et en colonne J.

J'ai donc essayé de passer par la formule Index equiv suivante :
=INDEX('C:\Users\balaguer\Downloads\[Nouvelle_Gamme.xlsx]Nouveau Cas emploi'!$A$4:$O$11834;EQUIV(1;('C:\Users\balaguer\Downloads\[Nouvelle_Gamme.xlsx]Nouveau Cas emploi'!$D$4:$D$11834=C2)*('C:\Users\balaguer\Downloads\[Nouvelle_Gamme.xlsx]Nouveau Cas emploi'!$J$4:$J$11834=L2);0);9)

La formule fonctionne dans excel, j'ai essayé de la retranscrire en VBA et en rendant le code "dynamique" (Le chemin peut changer, ainsi que le nom de l'onglet etc ...)
Mais lorsque je tente de lire le programme j'ai le message Erreur '1004' Impossible de lire la propriété Index de la classe WorksheetFunction

Auriez-vous une solution à mon problème ?
D'avance merci pour votre aide,

Cordialement
Laurent
 

Pièces jointes

  • Nouvelle_BOM.xlsm
    87.3 KB · Affichages: 6
  • Nouvelle_Gamme.xlsx
    212.1 KB · Affichages: 5

job75

XLDnaute Barbatruc
Bonsoir lolobala, sylvanu, danielco,

Téléchargez les fichiers joints dans le même dossier (le bureau).

Le plus simple est d'entrer des formules de liaison en colonne O, exécutez cette macro du fichier .xlsm :
VB:
Sub Affectation()
Dim form$, derlig&
form = "='" & ThisWorkbook.Path & "\[Nouvelle_Gamme.xlsx]Nouveau Cas emploi'!"
Application.ScreenUpdating = False
ThisWorkbook.Names.Add "Plage1", form & "$A$4:$O$11834" 'nom défini
ThisWorkbook.Names.Add "Plage2", form & "$D$4:$D$11834"
ThisWorkbook.Names.Add "Plage3", form & "$J$4:$J$11834"
[O2].FormulaArray = "=INDEX(Plage1,MATCH(1,(Plage2=C2)*(Plage3=L2),0),9)" 'formule matricielle
derlig = [A1].CurrentRegion.Rows.Count
If derlig > 2 Then [O2].AutoFill Range("O2:O" & derlig) 'remplit la colonne
'Range("O2:O" & derlig) = Range("O2:O" & derlig).Value 'facultatif, supprime les formules
End Sub
Pour que FormulaArray accepte la formule il faut que la macro définisse les noms Plage1 Plage2 Plage3.

Sinon la formule de liaison serait trop grande et ne serait pas acceptée.

A+
 

Pièces jointes

  • Nouvelle_BOM.xlsm
    87.2 KB · Affichages: 7
  • Nouvelle_Gamme.xlsx
    212.1 KB · Affichages: 3
Dernière édition:

lolobala

XLDnaute Nouveau
Bonjour,

Merci pour votre aide. La solution de job75 marche très bien.

Une dernière chose, le nom de la feuille "Nouveau cas d'emploi" va changer suivant les cas.
Est-il possible de le mettre dans une variable ? J'imagine que oui mais dans ce cas comment écrire la ligne :
'form = "='" & ThisWorkbook.Path & "\[Nouvelle_Gamme.xlsx]Nouveau Cas emploi'!"

Désolé mon niveau en vba est très limité
Merci pour votre retour

Laurent
 
Dernière édition:

job75

XLDnaute Barbatruc
Bonjour lolobala, le forum,

La macro précédente s'exécute chez moi en 0,44 seconde.

Sur un très grand tableau la durée sera beaucoup plus grande.

Pour aller plus vite il faut utiliser des tableaux VBA et le Dictionary :
VB:
Sub Affectation()
Dim feuille$, form$, tablo, d As Object, i&
feuille = "Nouveau Cas emploi" 'modifiable
form = "='" & ThisWorkbook.Path & "\[Nouvelle_Gamme.xlsx]" & feuille & "'!"
Application.ScreenUpdating = False
[P4:P11834].FormulaArray = form & "I4:I11834" 'formule de liaison matricielle
[Q4:Q11834].FormulaArray = form & "D4:D11834" 'formule de liaison matricielle
[R4:R11834].FormulaArray = form & "J4:J11834" 'formule de liaison matricielle
tablo = [P4:R11834] 'matrice, plus rapide
Set d = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(tablo)
    d(tablo(i, 2) & tablo(i, 3)) = tablo(i, 1) 'mémorise la 1ère colonne
Next
[P4:R11834].ClearContents 'RAZ
With ActiveSheet.UsedRange: End With 'actualise la barre de défilement verticale
With [A1].CurrentRegion.Resize(, 15)
    tablo = .Value 'matrice, plus rapide
    For i = 2 To UBound(tablo)
        tablo(i, 15) = d(tablo(i, 3) & tablo(i, 12)) 'récupération
    Next
    .Columns(15) = Application.Index(tablo, , 15) 'restitution
End With
End Sub
L'exécution se fait maintenant en 0,08 seconde.

A+

A+
 

Pièces jointes

  • Nouvelle_BOM(1).xlsm
    89.4 KB · Affichages: 13
  • Nouvelle_Gamme.xlsx
    212.1 KB · Affichages: 12

lolobala

XLDnaute Nouveau
Bonjour Job75,

Merci de l'intérêt que tu portes à mon problème.
Je ne maitrise pas suffisamment le vba pour comprendre cette solution, surtout les tableaux, ça me paraît tellement complexe.

Je vais tout de même essayer de l'adapter à mon cas.

Encore merci
Bonne journée
 

lolobala

XLDnaute Nouveau
Bonjour le forum,

J'ai essayé d'adapter ce code ci-dessus à mon programme mais étrangement j'ai une erreur "13" incompatibilité de type sur la dernière ligne.
La seule chose qui a changé c'est le nombre de lignes....

1666967776188.png


J'ai constaté que "d" contenait 256Item alors que j'ai beaucoup plus de ligne que ça....
Est-ce que le problème peut venir de cela ? Une idée ?

1666969636732.png

1666969663772.png


Merci pour votre retour
Laurent
 
Dernière édition:

job75

XLDnaute Barbatruc
Bonjour lolobala, le forum;

Votre image montre que le Dictionary contient 11814 keys (clés) uniques.

Il y a autant d'items mais seulement 256 sont uniques, rien d'anormal à ça.

Ce sont des textes de 10 chiffres, ce qui montre que la colonne I du fichier .xlsx est au format Texte.

En entrant ces textes en colonne O du fichier .xlsm la macro les convertis en entiers de type Long.

Le bug peut s'expliquer par le fait qu'au départ cette colonne contient des entiers de type Integer 10 20 30.

Essayez donc en effaçant d'abord la colonne O :
VB:
    .Columns(15).Clear 'RAZ
    .Columns(15) = Application.Index(tablo, , 15) 'restitution
Si ça ne suffit pas joignez vos 2 fichiers.

A+
 
Dernière édition:

lolobala

XLDnaute Nouveau
Je viens de tester la solution mais j'ai toujours le même message d'erreur.
Je vous mets en pièce jointe les 2 fichiers.
Par contre je suis obligé de supprimer des lignes dans le fichier test_nouvelle_BOM. En réalité j'ai plus de 150000 lignes et le fichier fait plus de 7 mo, donc trop volumineux pour être en pièce jointe...

Merci pour votre aide
Laurent
 

Pièces jointes

  • test_nouvelle_gamme.xlsx
    887.6 KB · Affichages: 3
  • test_nouvelle_BOM.xlsm
    698.4 KB · Affichages: 4
Dernière édition:

Statistiques des forums

Discussions
314 714
Messages
2 112 143
Membres
111 439
dernier inscrit
elde87