Comment automatiser des calculs dès que cellule <>vide

Bonjour

je souhaiterais utiliser une macro ou procédure permettant les calculs de somme ou moyenne automatiques dans mes cellules N, P Q r S T U sans formule à l'intérieur comme actuellement.

cf fichier

quelqu'un aurait-il une idée?

merci

Zbig

41saut002.xlsx (17.25 Ko)

bonjour

a defaut tu peux jouer de la protection en laissant les colonnes de saisie libres d'acces et en cochant "masqué" pour les autres ainsi on ne verra plus les formules dans la barre de tache et.....personne ne pourra scratcher les operations .....

cordialement

Salut

cette solution n'est pas satisfaisante.

Il reste la solution d'un bouton macro permetant le calcul, mais il faudrait cliquer à chaque fois alors que je sais que la solution avec la touche "entrée" est réalisable, je l'ai déjà vue.

merci pour ta réponse

Zbig

Bonjour,

ça pose quoi comme problème qu'il y ait des formules ?

Là, à voir comme ça, vraiment aucun intérêt à mettre du vba. D'autant plus que tu ne connais pas et seras incapable de faire évoluer...

eric

Bonjour Eric, le forum

"ça pose quoi comme problème qu'il y ait des formules ?"

je ne veux pas bloquer les cellules, je ne veux pas les masquer et pour éviter de supprimer par hasard.

je ne pense pas qu'il y aura une évolution.

et puis ça me formera à comprendre le vba.

merci

Zbig

Ah ben si c'est pour te former il faut utiliser l'évènement Change.

Et pour les formules tu peux utiliser evaluate() pour les fonctions feuilles n'ayant pas d'équivalent en vba (mais les fonctions doivent y être en anglais et le séparateur la , au lieu du

eric

Salut Eric, le forum

si j'ai bien compris, je mets cette private sub dans feuil1 pour qu'elle soit uniquement active dans cette feuille

mais le problème reste la création des boucles "For" pour le calcul

J'attends de l'aide pour cela car il me manque beaucoup de notion vba

cdl

Zbig

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)

'pour chaque ligne L de 4 à 68 si cellule (L,1) <> "", créer une boucle afin que

    ' Si une des cellules des colonnes H (n°8) à M (n°13) et 0 (15) de la ligne L n'Est pas vide alors
           If cells (L,8) <> "" or cells (L,9) <> "" or cells (L,10) <> "" or cells (L,11) <> "" or cells (L,12) <> "" or cells (L,13) <> "" or cells (L,15) <> "" Then
                ' calculer le best en colonne N (n°14)
                      Cells(lL,14) = _
                                 "=IF(AND(COUNT(RC[-6]:RC[-1])=0,COUNTA(RC[-6]:RC[-1])<=3),"""",(MAX(RC[-6]:RC[-1])))"

        End If
 End Sub

Non, tu n'as pas besoin de boucle.

Ta procédure reçoit Target en paramètre : c'est la cellule modifiée ayant déclenché l'évènement.

Sa ligne :

lig=target.row

Et si tu écris :

Cells(lL,14) = "=IF(AND(COUNT(RC[-6]:RC[-1])=0,COUNTA(RC[-6]:RC[-1])<=3),"""",(MAX(RC[-6]:RC[-1])))"

tu écris la formule dans la cellule, pas le résultat.

Soit tu le calcules directement en vba, soit tu mets :

ta_cellule= evaluate(ta_formule)

Mais essaie de traduire tes références L1C1 en A1, c'est plus lisible...

Ajoute au début

if target.cells.count >1 then exit sub sinon ça va planter si tu colles ou vides plusieurs cellules d'un coup.

Ou éventuellement traiter ces cas.

eric

Salut Eric

désolé mais là je coule au milieu de l'océan vba.

Ca doit etre clair pour toi mais malheureusement pas pour moi.

Peux tu stp, détailler la procédure?

je tenterai de continuer les autres calculs via l'outil "enregistrer une macro"

merci

Zbig

Bonjour,

Comme ça, ça sera sans doute plus simple pour toi :

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count > 1 Or Target.Column <= 4 Then Exit Sub
    If Intersect(Target, Range("H:M")) Is Nothing Then Exit Sub
    Cells(Target.Row, "N").FormulaLocal = "=SI(ET(NB(H4:M4)=0;NBVAL(H4:M4)<=3);"""";(MAX(H4:M4)))"
    Cells(Target.Row, "N") = Cells(Target.Row, "N")
End Sub

Tu as juste à copier-coller la formule depuis la feuille, et à doubler les " à l'intérieur de la formule.

eric

Bonjour Eric

merci, ça marche sur une ligne (la 4e) puis après les infos recherchées donnent le resultats de la 4e ligne!

J'ai tenté également d'ajouter une formule en colonne P; et il y a un bigue.

je te joins le code

merci

Zbig

'procédure permettant de d'automaiser les calculs
'Cet évènement est déclenché lorsque le contenu d'une cellule est modifiée dans la feuille.
 'La procédure ne prend pas en compte la modification des mises en forme dans la cellule
Private Sub Worksheet_Change(ByVal Target As Range)

'permet de sortir de la procédure si plus d'une cellule est sélectionnée
    '(sinon la suite de la macro renvoie un message d'erreur)
    If Target.Count > 1 Or Target.Column <= 4 Then Exit Sub 'si le nbre de cells selectionnées >1 ou si le n° Col <=4 (a -b-c-d) alors exit

    If Intersect(Target, Range("H:M")) Is Nothing Then Exit Sub 'si la cellule entre col H et M est vide alors exit

    'sinon calculs suivants

    'calculer la formule du best en colonne N  si une des cellules entre H et M <> vide
    Cells(Target.Row, "N").FormulaLocal = "=SI(ET(NB(H4:M4)=0;NBVAL(H4:M4)<=3);"""";(MAX(H4:M4)))"
    Cells(Target.Row, "N") = Cells(Target.Row, "N")

    'calculer la formule de moyenne en colonne P  si une des cellules entre H et M <> vide
    'Cells(Target.Row, "P").FormulaLocal = "=SI(NBVAL(H4:M4)<3;"";SI(ET(NB(H4:M4)=0;NBVAL(H4:M4)>3);0;SI(NB(H4:M4)=0;"";SI(NB(H4:M4)=1;MAX(H4:M4)/3;SI(NB(H4:M4)=2;(MAX(H4:M4)+GRANDE.VALEUR(H4:M4;2))/3;MOYENNE(MAX(H4:M4);GRANDE.VALEUR(H4:M4;2);GRANDE.VALEUR(H4:M4;3)))))))"
   ' Cells(Target.Row, "P") = Cells(Target.Row, "P")
End Sub
25saut003.xlsm (24.99 Ko)

Parce que tu n'as pas fait ce que je te disais au post précédent...

Et le commentaire pour :

If Intersect(Target, Range("H:M")) Is Nothing Then Exit Sub

est :

'si la cellule n'est pas entre col H et M alors exit

eric

Salut

J'ai vu l'erreur des double """". et le commentaire faux merci

j'ai corrigé mais les résultats des calculs de la ligne 4 se répettent sur les autres lignes même si je change les données.

si je supprime toutes les données , les calcules restent figés.

Zbig

mais les résultats des calculs de la ligne 4 se répettent sur les autres lignes

remplace partout où tu as des références :

H4:M4

par :

H" & target.row & " :M" & target.row

si je supprime toutes les données , les calcules restent figés.

je t'avais dit de traiter ces cas si besoin.

Tu veux refaire ce qu'excel fait déjà très bien tout seul.

Ca ne m'interesse que très peu, il va falloir que tu te prennes en main que tu cherches un peu, c'est comme ça qu'on apprend. Comme tu voulais te former...

eric

Bonjour

"Tu veux refaire ce qu'excel fait déjà très bien tout seul. "

je ne comprends pas ce que tu veux dire par cela.

Evidemement je tatonne avec les formules, et c'est par l'exemple que j'apprends,

merci de ton aide

cordialement

Zbig

"Tu veux refaire ce qu'excel fait déjà très bien tout seul. "

je ne comprends pas ce que tu veux dire par cela.

Tulipe te l'a expliqué, tu peux très bien masquer tes formules et protéger les résultats.

Mais pour toi ce n'est une solution satisfaisante., on se demande bien pourquoi...

erix.

Bonjour

les solutions 'masquer" ou "proteger les cellules" sont bonnes je l'avoue

mais tout simplement je ne veux pas avoir de formules dans les cellules

je vous remercie pour votre aide bien précieuse.

Après de multiples essais, j'utilise le type .formulaR1C1

comme suit

With Cells(Target.Row, "O")

Cells(Target.Row, "O").FormulaR1C1 = "=IF(AND(COUNT(RC9:RC14)=0,COUNTA(RC9:RC14)<=3),"""",(MAX(RC9:RC14)))"

.Value = .Value: End With

que j'ai ensuite décliné pour chaque calcul

merci

Zbig

Rechercher des sujets similaires à "comment automatiser calculs que vide"