Traduction formule en VBA

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

eduraiss

XLDnaute Accro
Bonjour le forum

Voici un formule que je voudrais mettre dans un code VBA qui alimenterait la cellule X6

SOMMEPROD((ESTNUM(TROUVE("R/";$C$4:$C$11)))*1)+SOMMEPROD((ESTNUM(TROUVE("R/";$C$14:$C$34)))*1)+SOMMEPROD((ESTNUM(TROUVE("R/";$C$35:$C$36)))*1)+SOMMEPROD((ESTNUM(TROUVE("R/";$C$65:$C$95)))*1)+SOMMEPROD((ESTNUM(TROUVE("R/";$C$98:$C$123)))*1)

Merci de votre aide

Cordialement
 

eduraiss

XLDnaute Accro
re
Si c'est cela les feuilles sont copiés a l'identique donc le codes est sur chaque feuilles
Si je rajoute un R/H en colonne (7) sur la feuille du lundi, le compteur en tient compte sur toute les feuilles (mardi et mercredi)

C'est cela qui ne vas pas
 

Roland_M

XLDnaute Barbatruc
re

il y a un code feuille à chacune pour mise à jour auto quand on modif dans une des 3 colonnes !
tu peux les supprimer mais il ne faudra pas oublier de cliquer sur le bouton calcul !

salut à toi Eric ! excellent je n'y aurai pas pensé ! mais c'est bien sûr avec> Application.Caller.Worksheet
comme quoi ce forum est formidable pour l'enrichissement de la communauté !

EDIT !!! @Eriiic et aussi Eduraiss
par contre Eriiic il y a un inconvénient de taille avec Application.Caller.Worksheet !
en mettant un msgbox je me suis aperçu qu'à chaque modif la macro s'exécutait dans toutes les feuilles !?
avec beaucoup de feuilles ça va poser problème !

RE-EDIT: décidément voilà qui n'est pas mal du tout avec formule ! merci à toi Laurent !
du coup pour notre ami je me suis permis de mettre tes formules ! il choisira !?


RE-EDIT: une autre formule un peu plus simple
=NB.SI($C$4:$C$11;"R/*")+NB.SI($C$14:$C$34;"R/*")+NB.SI($C$37:$C$61;"R/*")+NB.SI($C$65:$C$95;"R/*")+NB.SI($C$98:$C$123;"R/*")

@eduraiss et celle-ci, vu que l'on bouclait sur toute la hauteur ceci suffit !
(quand j'y pense tout ça pour une simple formule ! mais on était parti sur du vba alors . . .)
dans X6 =NB.SI($C$4:$C$123;"R/*")
dans X8 =NB.SI($E$4:$E$123;"R/*")
dans X10=NB.SI($G$4:$G$123;"R/*")
 

Pièces jointes

Dernière édition:

laurent950

XLDnaute Barbatruc
Bonsoir pour les formulles via VBA pour :

Merci à vous Roland M :) vous avez bien fait, nous somme ici pour nous aider.

Range("X6") = _
"=SUMPRODUCT((ISNUMBER(FIND(""R/"",R4C3:R11C3)))*1)+SUMPRODUCT((ISNUMBER(FIND(""R/"",R14C3:R34C3)))*1)+SUMPRODUCT((ISNUMBER(FIND(""R/"",R37C3:R61C3)))*1)+SUMPRODUCT((ISNUMBER(FIND(""R/"",R65C3:R95C3)))*1)+SUMPRODUCT((ISNUMBER(FIND(""R/"",R98C3:R123C3)))*1)"

Range("X8") = _
"=SUMPRODUCT((ISNUMBER(FIND(""R/"",R4C5:R11C5)))*1)+SUMPRODUCT((ISNUMBER(FIND(""R/"",R14C5:R34C5)))*1)+SUMPRODUCT((ISNUMBER(FIND(""R/"",R[29]C5:R61C5)))*1)+SUMPRODUCT((ISNUMBER(FIND(""R/"",R65C5:R95C5)))*1)+SUMPRODUCT((ISNUMBER(FIND(""R/"",R98C5:R123C5)))*1)"

Range("X10") = _
"=SUMPRODUCT((ISNUMBER(FIND(""R/"",R4C7:R11C7)))*1)+SUMPRODUCT((ISNUMBER(FIND(""R/"",R14C7:R34C7)))*1)+SUMPRODUCT((ISNUMBER(FIND(""R/"",R37C7:R61C7)))*1)+SUMPRODUCT((ISNUMBER(FIND(""R/"",R65C7:R95C7)))*1)+SUMPRODUCT((ISNUMBER(FIND(""R/"",R98C7:R123C7)))*1)"


Laurent
 
Dernière édition:

Roland_M

XLDnaute Barbatruc
re

ok !
mais la petite formule aurait été préférable !
dans X6 =NB.SI($C$4:$C$123;"R/*")
dans X8 =NB.SI($E$4:$E$123;"R/*")
dans X10=NB.SI($G$4:$G$123;"R/*")
fiable, simplissime, plus léger car sans code feuille ni module, et recopiable sans problème !
c'est comme tu veux !
 

eriiic

XLDnaute Barbatruc
Bonjour,

par contre Eriiic il y a un inconvénient de taille avec Application.Caller.Worksheet !
en mettant un msgbox je me suis aperçu qu'à chaque modif la macro s'exécutait dans toutes les feuilles !?
avec beaucoup de feuilles ça va poser problème !

C'est normal, c'est le rôle de Application.Volatile. Je suis parti de ce qui avait été déposé sans trop réfléchir, ayant eu l'attention attirée par le problème de feuille.

En fait il faut simplement passer à la fonction la plage à surveiller :
VB:
Function Compte(plage As Range) As Double
    Dim c As Range
    For Each c In plage
        If Left(c, 2) = "R/" Then Compte = Compte + 1
    Next c
End Function
Sur feuille :
Code:
=compte(C4:C123)
saisir la plage manuellement, les fusions de cellules gênent à la souris.
eric

Edit : mais NB.SI($C$4:$C$123;"R/*") est mieux à mon avis. Tant qu'à faire autant se passer de vba. :)
 
Dernière édition:

eriiic

XLDnaute Barbatruc
Une fonction non volatile est ré-évaluée uniquement que si un des paramètres change, aucune raison de la recalculer sinon.
Si elle est volatile elle est ré-évaluée à chaque Calculate (et avant lui, ça peut avoir son importance), donc à chaque saisie.
A n'utiliser que si elle dépend d'un changement ne générant aucun événement. Cas le plus classique : un changement de couleur.

La majorité des fonctions natives d'excel sont non-volatiles. Pour t'aider à comprendre, par exemple Alea() et Aujourdhui() le sont pour des raisons évidentes.
eric
 

Discussions similaires

Réponses
11
Affichages
455
  • Question Question
Microsoft 365 Problème de formule VBA
Réponses
2
Affichages
793

Statistiques des forums

Discussions
315 292
Messages
2 118 097
Membres
113 430
dernier inscrit
Exyr