XL 2019 Substituer fonction INDIRECT dans une formule

  • Initiateur de la discussion Initiateur de la discussion KTM
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

KTM

XLDnaute Impliqué
Bonsoir chers tous
A l'aide de la macro ci dessous j'insère en colonne P une formule matricielle contenant la fonction INDIRECT.
VB:
Sub Formule1()
Dim dl As Long
With Sheets("Grille_de_Disp")
 dl = .Range("A" & Rows.Count).End(xlUp).Row + 1
 .[Q11] = .Range("A" & Rows.Count).End(xlUp).Row + 1
    .Range("P2").FormulaArray = _
        "=MAX((R2C1:INDIRECT(""$A$""&R11C[1])=RC[-15])*(R2C2:INDIRECT(""$B$""&R11C[1])=RC[-14])*(R2C3:INDIRECT(""$C$""&R11C[1])=RC[-13])*(R2C11:INDIRECT(""$K$""&R11C[1])))"
 
      .Range("P2").AutoFill Destination:=.Range("P2:P" & .Range("A" & Rows.Count).End(xlUp).Row), Type:=xlFillDefault
  End With
End Sub

Mais il se trouve que ma macro est extrêmement lente et Il m'a été recommandé de réécrire ma formule en évitant la fonction INDIRECT.
j'ai essayé d'adapter un exemple avec la macro suivante mais je me mélange un peu les pédales .
Je vous prie de bien vouloir me corriger .Merci
Code:
Sub Formule2()
Dim dl As Long
With Sheets("Grille_de_Disp")
 dl = .Range("A" & Rows.Count).End(xlUp).Row + 1
.Range("P2").FormulaArray = "=MAX("&"($A$2:$A$" & dl &")=A2)"&"*"&"($B$2:$B$" & dl &")=B2)"&"*"&"($C$2:$C$" & dl & ")=C2)"&"*"&"($K$2:$K$" & dl)"
.Range("P2").AutoFill Destination:=.Range("P2:P" & .Range("A" & Rows.Count).End(xlUp).Row), Type:=xlFillDefault
  End With
End Sub
 
Bonsoir KTM,

Sur votre fil précédent votre commentaire c'est "super et bien !!".

Il aurait fallu nous dire si la suppression des INDIRECT diminuait la durée d'exécution et de combien !!

Si la durée d'exécution n'est pas réduite vous pouvez rester avec vos INDIRECT inutiles.

A+
J'ai testé votre solution et la durée d'exécution est belle et bien réduite.
Dans ce poste-ci je voudrais adapter votre solution a un autre exemple avec formule matricielle mais je coince.

VB:
Dim dl As Long
With Sheets("Grille_de_Disp")
    dl = .Range("A" & Rows.Count).End(xlUp).Row + 1
    .Range("P2").FormulaArray = _
    "{=MAX(($A$2:$A$" & dl & ")=A2)*($B$2:$B$" & dl & ")=B2)*($C$2:$C$" & dl & ")=C2)*($K$2:$K$" & dl & ")}"
    .Range("P2").AutoFill Destination:=.Range("P2:P" & .Range("A" & Rows.Count).End(xlUp).Row), Type:=xlFillDefault

End With
 
Merci, la réduction est intéressante, voici donc votre macro corrigée :
VB:
Sub Formule2()
Dim dl As Long
With Sheets("Grille_de_Disp")
    dl = .Range("A" & Rows.Count).End(xlUp).Row + 1
    .Range("P2").FormulaArray = "=MAX((A$2:A$" & dl & "=A2)*(B$2:B$" & dl & "=B2)*(C$2:C$" & dl & "=C2)*K$2:K$" & dl & ")"
    .Range("P2").AutoFill .Range("P2:P" & dl), xlFillValues
End With
End Sub
 
Cela dit votre calcul de la variable dl n'est pas fameux, il vaut mieux écrire :
VB:
Sub Formule2()
Dim dl As Long
With Sheets("Grille_de_Disp")
    dl = .Range("A" & Rows.Count).End(xlUp).Row
    If dl = 1 Then Exit Sub
    .Range("P2").FormulaArray = "=MAX((A$2:A$" & dl & "=A2)*(B$2:B$" & dl & "=B2)*(C$2:C$" & dl & "=C2)*K$2:K$" & dl & ")"
    .Range("P2").AutoFill .Range("P2:P" & dl), xlFillValues
End With
End Sub
 
Merci, la réduction est intéressante, voici donc votre macro corrigée :
VB:
Sub Formule2()
Dim dl As Long
With Sheets("Grille_de_Disp")
    dl = .Range("A" & Rows.Count).End(xlUp).Row + 1
    .Range("P2").FormulaArray = "=MAX((A$2:A$" & dl & "=A2)*(B$2:B$" & dl & "=B2)*(C$2:C$" & dl & "=C2)*K$2:K$" & dl & ")"
    .Range("P2").AutoFill .Range("P2:P" & dl), xlFillValues
End With
End Sub
MERCI Job75
C'est super !!!
Prière vérifier ce qui suit. Toujours certains détails qui m'échappent. Merci
VB:
Sub Formule()
With Sheets("Grille_de_Disp")
Dim dl As Long
dl = .Range("A" & Rows.Count).End(xlUp).Row + 1
.Range("Q4").FormulaR1C1 = _
    "=SUMPRODUCT((YEAR(B2:B" & dl & "))= TB!$B$5)*((B2:B" & dl & "))<= TB!$B$11))"
.Range("Q9").FormulaR1C1 = _
    "=SUMPRODUCT((YEAR(B2:B" & dl & "))= TB!$B$5)*(D2:D" & dl & ")= ""Oui"")*((B2:B" & dl & "))<= TB!$B$11))"
.Range("Q24").FormulaR1C1 = _
   "=COUNTIFS(B2:B" & dl & "),TB!B11,D2:D" & dl & "),""Oui"")"
.Range("Q25").FormulaR1C1 = _
    "=COUNTIFS(B2:B" & dl & "),TB!B11,D2:D" & dl & "),""T.In"")"
    .Range("Q26").FormulaR1C1 = _
"=SUMPRODUCT((YEAR(B2:B" & dl & "))= TB!$B$5)*(D2:D" & dl & ")= ""T.In"")*((B2:B" & dl & "))<= TB!$B$11))"
End With
End Sub
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
2
Affichages
375
Réponses
4
Affichages
362
Réponses
8
Affichages
444
Réponses
4
Affichages
529
Retour