INDEX EQUIV VBA

MURET31

XLDnaute Nouveau
Bonjour le forum!

Je suis à la recherche d'une macro événementielle, j'ai une formule qui fonctionne bien et j'aimerais la passer en VBA:

=INDEX(BDM!E:E;EQUIV(START!B98&E98&H98;BDM!A:A&BDM!B:B&BDM!C:C;0))

Merci pour votre aide.

MU
 

M12

XLDnaute Accro
Bonsoir,
Si tu penses que le fait de passer ta formule "MATRICIELLE" en VBA va accélérer le calcul, tu te trompes

Commence déjà par nommer les plages de ta feuille "BDM" afin qu'elles soient dynamiques et que la formule ne prennent pas la totalité des colonnes
 

Jacky67

XLDnaute Barbatruc
Bonjour le forum!

Je suis à la recherche d'une macro événementielle, j'ai une formule qui fonctionne bien et j'aimerais la passer en VBA:

=INDEX(BDM!E:E;EQUIV(START!B98&E98&H98;BDM!A:A&BDM!B:B&BDM!C:C;0))

Merci pour votre aide.

MU
Bonjour à tous
En plus de la remarque de "M12", cette formule ne s'exécute correctement que si la feuille "start" est la feuille active.
Néanmoins ceci le fait, peu importe la feuille(avec la même latence)
VB:
Sub Test()
    ActiveCell = Evaluate("=INDEX(BDM!e:e,MATCH(start!b98&start!e98&start!h98,BDM!a:a&BDM!b:b&BDM!c:c,0))")
End Sub
 

MURET31

XLDnaute Nouveau
Bonjour M12, Jacky67

Je vous remercie pour votre rapide retour.

@M12 : je ne cherche pas à gagner en rapidité mais tout simplement passer la formule en VBA, cela me donnerait la possibilité d’écrire dans les cellules en cas de besoin sans écraser la formule. Merci

@Jacky67: c’est exactement ce que je cherche mais en macro événementielle. Pour info ma feuille « start » est la feuille active. Merci

Bien cordialement,

MU
 

Jacky67

XLDnaute Barbatruc
Bonjour M12, Jacky67
Pour info ma feuille « start » est la feuille active. Merci

Bien cordialement,

MU
RE..
Alors ceci est suffisant
VB:
Sub Test()
    ActiveCell = Evaluate("=INDEX(BDM!e:e,MATCH(b98&e98&h98,BDM!a:a&BDM!b:b&BDM!c:c,0))")
End Sub

Si on se limite par exemple à 50 000 lignes le résultat est immédiat
VB:
Sub Test1()
Dim Derlg&
Derlg = 50000 ' Ou calculer la dernière ligne réelle
    ActiveCell = Evaluate("=INDEX(BDM!e:e,MATCH(b98&e98&h98,BDM!a1:a" & Derlg & "&BDM!b1:b" & Derlg & "&BDM!c1:c" & Derlg & ",0))")
End Sub
 

Jacky67

XLDnaute Barbatruc
Merci beaucoup Jacky67 cependant j’aurais souhaité la transformer avec :

Private Sub Worksheet_Change(ByVal Target As Range)

Je suis novice en la matière ;)

Bien cordialement,

MU
RE..
Ceci placer dans le module de la feuille Start se déclenche au changement des cellules b98, e98, h98
Le résultat dans cette exemple est en B100
La longueur des plages est prise en compte
Ceci est à adapter bien sur...
Si tu n'arrives pas, mets un exemple brouillon du classeur en pj

VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Derlg&
If Target.Count > 1 Then Exit Sub
With Application: .ScreenUpdating = False: .Calculation = xlManual: .EnableEvents = False: End With
If Not Intersect(Target, Range("b98,e98,h98")) Is Nothing Then
  Derlg = Sheets("BDM").Cells.Find("*", , , , xlByRows, xlPrevious).Row
  [b100] = Evaluate("INDEX(BDM!e:e,MATCH(b98&e98&h98,BDM!a1:a" & Derlg & "&BDM!b1:b" & Derlg & "&BDM!c1:c" & Derlg & ",0))")
End If
With Application: .EnableEvents = True: .Calculation = xlAutomatic: .ScreenUpdating = True: End With
End Sub
 
Dernière édition:

Statistiques des forums

Discussions
311 730
Messages
2 081 991
Membres
101 856
dernier inscrit
Marina40