VBA---equivalence sommeprod.

  • Initiateur de la discussion Initiateur de la discussion JJ1
  • 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 !

Re : VBA---equivalence sommeprod.

Bonsour®

formule ou VBA ?
pas clair la question...

solution Formule :
Capture.jpg
 

Pièces jointes

  • sommeprodi.xlsx
    sommeprodi.xlsx
    17.1 KB · Affichages: 26
  • Capture.jpg
    Capture.jpg
    26.1 KB · Affichages: 31
  • Capture.jpg
    Capture.jpg
    26.1 KB · Affichages: 43
Re : VBA---equivalence sommeprod.

Bonjour le fil, bonjour le forum,

Si j'ai bien compris (ce qui est très rare...), une proposition VNA :
Code:
Sub Macro2()
Dim O As Object 'déclare la variable O (Onglet)
Dim PJ As Range 'déclare la variable PJ (Plage Jaune)
Dim PB As Range 'déclare la variable PB (Plage Bleue)
Dim LI As Byte 'déclare la variable LI (Ligne)
Dim CEL As Range 'déclare la variable CEL (CELlule)
Dim CJ As Range 'déclare la variable CJ (Cellule Jaune)
Dim CB As Range 'déclare la variable O (Cellule Bleue)
Dim TJ As Integer 'déclare la variable TJ (Total Jaune)
Dim TB As Integer 'déclare la variable TB (Total Bleu)

Set O = Sheets("Feuil1") 'définit l'onglet O
Set PJ = O.Range("F5:K5") 'définit la plage PJ
Set PB = O.Range("L5:P5") 'définit la plage PB
For LI = 6 To 20 'boucle 1 : sur les lignes 6 à 20
    TJ = 0: TB = 0 'réinitalise les totaux TJ et TB
    For Each CEL In O.Range(O.Cells(LI, 1), O.Cells(LI, 5)) 'boucle 2 : sur toutes les cellules CEL des colonnes 1 (=A) à 5 (=E) de la ligne LI
        For Each CJ In PJ 'boucle 3 : sur toutes les cellules CJ de la plage PJ
            If CEL.Value = CJ.Value Then TJ = TJ + 1 'si les cellue sont identiques incrémente le total TJ
        Next CJ 'prochaine cellule de la boucle 2
        For Each CB In PB 'boucle 4 : sur toutes les cellules CB de la plage PB
            If CEL.Value = CB.Value Then TB = TB + 1 'si les cellue sont identiques incrémente le total TB
        Next CB 'prochaine cellule de la boucle 4
    Next CEL 'prochaine cellule de la boucle 2
    O.Cells(LI, 6).Value = CStr(TJ) & CStr(TB) 'dans la colonne F de la ligne LI, renvoie le total TJ concatené avec le total TB
Next LI 'prochaine ligne de la boucle 1
End Sub
 
Re : VBA---equivalence sommeprod.

Bonsour®
brut d'enregistreur :

VB:
Sub Macro3()
Application.ScreenUpdating = False
    Range("F6").Select
    ActiveCell.FormulaR1C1 = _
        "=SUMPRODUCT(COUNTIF(RC[-5]:RC[-1],R5C6:R5C11))&"" ""&SUMPRODUCT(COUNTIF(RC[-5]:RC[-1],R5C12:R5C16))"
    Range("F6").Select
    Selection.AutoFill Destination:=Range("F6:F20")
    Range("F6:F20").Select
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
        Application.ScreenUpdating = True
End Sub
 
Dernière édition:
Re : VBA---equivalence sommeprod.

Merci Robert,modeste

Les codes semblent lourds jamais ils ne seront plus rapides que des sommeprod concatenes? Je vais tester cet AM?
Et avec des procédures sous forme tablo?
Je vais chercher sur goog...

A+
 
Re : VBA---equivalence sommeprod.

Bonjour JJ1, salut aux autres,

Voici 2 fichiers :

- le 1er avec SOMMEPROD

- le 2ème avec cette fonction VBA :

Code:
Function Calcul$(r, r1, r2)
Dim x, y, p As Byte, q As Byte
r = r: r1 = r1: r2 = r2 'matrices, plus rapides
For Each x In r
  For Each y In r1
    If x = y Then p = p + 1
  Next
  For Each y In r2
    If x = y Then q = q + 1
  Next
Next
Calcul = p & q
End Function
Le double-clic sur F6 permet de déterminer la durée d'exécution de la formule.

Sur Win 7 - Excel 2010 SOMMEPROD est 2 fois plus rapide : 36 µs contre 72 µs.

A+
 

Pièces jointes

Dernière édition:
Re : VBA---equivalence sommeprod.

Bonsour®
Le double-clic sur une formule F6 permet de déterminer la durée d'exécution de la formule.

un formule est plus rapide qu'une macro et une function perso pour moi c'est une macro ...
quand à l'utilisation de matricielle (i.e. SOMMEPROD) le handicap vient de la prolifération des tableaux virtuels utilisés en taille mémoire et de sa restitution(taille mémoire)

😕
sauf si je n'ai pas compris ou tu voulais en venir...
Capture.jpg

voir pièce jointe ???
 

Pièces jointes

  • essai-durée-.xlsm
    essai-durée-.xlsm
    55.2 KB · Affichages: 23
  • Capture.jpg
    Capture.jpg
    55 KB · Affichages: 35
  • Capture.jpg
    Capture.jpg
    55 KB · Affichages: 45
Re : VBA---equivalence sommeprod.

salut

macro condensée :
VB:
Sub Macro3()
  Application.ScreenUpdating = False
  [F6:F20].FormulaR1C1 = _
         "=SUMPRODUCT(COUNTIF(RC[-5]:RC[-1],R5C6:R5C11))&"" ""&  SUMPRODUCT(COUNTIF(RC[-5]:RC[-1],R5C12:R5C16))"
  'pour ne plus avoir de formules gourmandes en durée (beaucoup de lignes)*
  [F6:F20] = [F6:F20].Value
End Sub

*Si le nombre de lignes ne cesse d'augmenter, les durées risquent d'en faire autant avec les "SOMMEPROD".
 
Dernière édition:
- 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
Assurez vous de marquer un message comme solution pour une meilleure transparence.

Discussions similaires

Réponses
17
Affichages
389
Réponses
1
Affichages
134
  • Question Question
Microsoft 365 Fonction si
Réponses
7
Affichages
149
Retour