Transformer formule SOMMEPROD en VBA [Résolu]

Messages postés
84
Date d'inscription
mercredi 2 janvier 2019
Statut
Membre
Dernière intervention
23 août 2019
- - Dernière réponse : belba.yahya
Messages postés
84
Date d'inscription
mercredi 2 janvier 2019
Statut
Membre
Dernière intervention
23 août 2019
- 9 juin 2019 à 13:33
Bonjour
peux quelqu'un m'aider pour effectué une fonction SOMMEPROD en vba pour un tableau de statistique mensuel via une date horizontal de ("D3:AH3") et des nationalité vertical de("C4:C39"), j'avais fais cette formule suivante:=SOMMEPROD((Tableau3[Nat]=Feuil5!$C4)*($D$3>=Tableau3[Arrivée])).
mais je veux faire ça en vba pour que mon fichier excel soit bien professionnelle.
sachant que les données sont dans la feuil("Fiche_Client") et le transfert soit dans la feuil("Arrivée").
merci en avance ce fichier pour mon travail d’hôtel.
ci joint mon fichier de test.
https://www.cjoint.com/c/IFisRyLN8gK
Afficher la suite 

3 réponses

Messages postés
2001
Date d'inscription
lundi 6 mai 2013
Statut
Membre
Dernière intervention
16 octobre 2019
230
0
Merci
Bonjour,

Pourquoi parlez-vous de SOMMEPROD alors que vous utilisez NB.SI.ENS qui va très bien d'ailleurs?

    Range("D4:AH42").FormulaR1C1 = "=COUNTIFS(Fiche_Client!C11,R3C,Fiche_Client!C9,RC3)"


Cdlt
belba.yahya
Messages postés
84
Date d'inscription
mercredi 2 janvier 2019
Statut
Membre
Dernière intervention
23 août 2019
-
merci beaucoup,ça a bien fonctionné,sauf je ne sais pas pourquoi ça devient très lent
Commenter la réponse de Frenchie83
Messages postés
50087
Date d'inscription
lundi 13 août 2007
Statut
Contributeur
Dernière intervention
20 octobre 2019
10959
0
Merci
Bonsoir.

Je ne connais pas bien VBA, et je ne peux pas t'aider pour ta macro. Cependant j'en sais suffisamment pour t'assurer que tu ne retirerais aucun avantage à remplacer tes formules classiques pour du VBA, et que tu resterais le seul à penser que ton fichier serait devenu "bien professionnel", ce qui est inexact.

Par contre tu peux optimiser ta formule
=NB.SI.ENS(Tableau3[Arrivée];Arrivées!D$3;Tableau3[Nat];Arrivées!$C4)
en l'écrivant
=NB.SI.ENS(Tableau3[Arrivée];D$3;Tableau3[Nat];$C4)
ou même
=NB.SI.ENS(T[Arrivée];D$3;T[Nat];$C4)
si tu remplaces le nom Tableau3 par T,
vu qu'il y a quand même 1209 fois cette formule dans chacune de tes 3 dernières feuilles !

Tu pourrais en profiter pour supprimer les noms inutiles de cette liste : chambres, Clients, Codes, compta, Crit1, Crit2, Crit3, Extraire, invoices, names, Noms, prix, taxe et tpt

C'est bien, la retraite ! Surtout aux Antilles ... 
Raymond (INSA, AFPA)
Commenter la réponse de Raymond PENTIER
Messages postés
2001
Date d'inscription
lundi 6 mai 2013
Statut
Membre
Dernière intervention
16 octobre 2019
230
0
Merci
RE,

votre formule traduite en VBA
Range("D4:AH42").FormulaR1C1 = "=COUNTIFS(Tableau3[Arrivée],Arrivées!R3C,Tableau3[Nat],Arrivées!RC3)"


ou avec la fonction équivalente VBA
Sub Formule()
Application.ScreenUpdating = False
Set f1 = Sheets("Fiche_Client")
Set f2 = Sheets("Arrivées")
For L = 4 To 42
For c = 4 To 34
f2.Cells(L, c) = Application.WorksheetFunction.CountIfs(f1.Range("K6:K10000"), f2.Cells(3, c), f1.Range("I6:I10000"), f2.Cells(L, 3))
Next c
Next L
Set f1 = Nothing
Set f2 = Nothing
End Sub


Cdlt
Commenter la réponse de Frenchie83