Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Moyenne automatique

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

M

monsieurjulien

Guest
Bonjour,

J'utilise Excel Mac 2011.
Je désirerais dans une feuille avoir :
- une première cellule utilisée pour la saisie de nombres (j'entre une valeur, je valide et la cellule devient à nouveau vierge)
- une seconde, qui afficherait automatiquement la moyenne de toutes les valeurs saisies dans la première
Je ne maîtrise pas du tout VBA, c'est pourquoi je sollicite l'aide du forum.
Merci d'avance
 
Re : Moyenne automatique

Bonjour monsieurjulien, salut bruno66, kingfadhel,

Bravo, c'est un problème tout à fait intéressant, j'ai mis un Like au post #1.

Voyez le fichier joint et ces macros dans le code de la feuille :

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address <> "$A$2" Then Exit Sub
If Not IsNumeric(CStr(Target)) Then Exit Sub
Dim tablo(), i&
Target.Select
If IsError([saisies]) Then
  ThisWorkbook.Names.Add "saisies", Target.Value
Else
  ReDim tablo(Application.Count([saisies]), 0)
  For i = 0 To UBound(tablo) - 1
    tablo(i, 0) = Application.Index([saisies], i + 1)
  Next
  tablo(i, 0) = Target
  ThisWorkbook.Names.Add "saisies", tablo
End If
Target = ""
Target(1, 2) = Application.Average([saisies]) 'moyenne
End Sub

Private Sub CommandButton1_Click() 'Visualisation (des saisies)
If Not IsError([saisies]) Then [D2].Resize(Application.Count([saisies])) = [saisies]
End Sub

Private Sub CommandButton2_Click() 'RAZ
[A2:B2,D:D].ClearContents
If Not IsError([saisies]) Then ThisWorkbook.Names("saisies").Delete
End Sub
Les saisies en A2 sont mémorisées dans le nom défini saisies.

Les 2 boutons ne sont pas indispensables mais ils sont fort utiles :

- "Visualisation" permet d'afficher les nombres saisis depuis l'origine

- "RAZ" remet tout au point de départ.

Edit : bonjour Roger2327, je ne vous avais pas vu.

A+
 

Pièces jointes

Dernière édition:
Re : Moyenne automatique

Re,

Merci beaucoup Christian 🙂

Cela marchait bien avec un tableau à une dimension.

J'ai voulu passer à un tableau à deux dimensions (pour éviter Application.Transpose) et j'ai mal testé.

Alors revenons au tableau à une dimension :

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address <> "$A$2" Then Exit Sub
If Not IsNumeric(CStr(Target)) Then Exit Sub
Dim tablo(), i&
Target.Select
If IsError([saisies]) Then
  ThisWorkbook.Names.Add "saisies", Target.Value
Else
  ReDim tablo(Application.Count([saisies]))
  For i = 0 To UBound(tablo) - 1
    tablo(i) = Application.Index([saisies], i + 1)
  Next
  tablo(i) = Target
  ThisWorkbook.Names.Add "saisies", tablo
End If
Target = ""
Target(1, 2) = Application.Average([saisies]) 'moyenne
End Sub

Private Sub CommandButton1_Click() 'Visualisation (des saisies)
If Not IsError([saisies]) Then _
  [D2].Resize(Application.Count([saisies])) = Application.Transpose([saisies])
End Sub

Private Sub CommandButton2_Click() 'RAZ
[A2:B2,D:D].ClearContents
If Not IsError([saisies]) Then ThisWorkbook.Names("saisies").Delete
End Sub
Fichier (2).

A+
 

Pièces jointes

Re : Moyenne automatique


Les macros de ton fichier tourne, mais bloque dés qu'on saisie la 3éme valeur.
peut etre un problème au niveau des dimensions du tableau déclaré vba
 
Re : Moyenne automatique

Bonsoir à tous.


On n'est pas obligé d'utiliser la très-douteuse fonction Transpose :​
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address <> "$A$2" Then Exit Sub
If Not IsNumeric(CStr(Target)) Then Exit Sub
Dim tablo(), i&, u
Target.Select
If IsError([saisies]) Then
  ThisWorkbook.Names.Add "saisies", Target.Value
Else
  ReDim tablo(Application.Count([saisies]), 0)
  For i = 0 To UBound(tablo) - 1
    u = Application.Index([saisies], i + 1)
    On Error Resume Next
    tablo(i, 0) = u
    tablo(i, 0) = u(1)
    On Error GoTo 0
  Next
  tablo(i, 0) = Target
  ThisWorkbook.Names.Add "saisies", tablo
End If
Application.EnableEvents = False '(ça évitera des appels inutiles à Worksheet_Change...)
Target = ""
Target(1, 2) = Application.Average([saisies]) 'moyenne
Application.EnableEvents = True
End Sub


Bonne soirée.


ℝOGER2327
#6957


Jeudi 5 As 141 (Saint Van Meegeren, faussaire - fête Suprême Quarte)
17 Brumaire An CCXXII, 7,6738h - cresson
2013-W45-4T18:25:02Z
 
Re : Moyenne automatique

Re,

Merci Roger d'avoir complété mon travail, votre macro du post #11 va très bien.

En effet, avec ma macro du post #8, le nombre d'éléments de la matrice mémorisée ne pouvait pas dépasser 256.

A+
 
Re : Moyenne automatique

Re,

Bon j'ai finalement compris pourquoi ma macro du post #6 ne marchait pas.

Il fallait simplement ne pas omettre la colonne (1) dans Application.Index([saisies], i + 1, 1) :

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address <> "$A$2" Then Exit Sub
If Not IsNumeric(CStr(Target)) Then Exit Sub
Dim tablo(), i&
Target.Select
If IsError([saisies]) Then
  ThisWorkbook.Names.Add "saisies", Target.Value
Else
  ReDim tablo(Application.Count([saisies]), 0)
  For i = 0 To UBound(tablo) - 1
    tablo(i, 0) = Application.Index([saisies], i + 1, 1)
  Next
  tablo(i, 0) = Target
  ThisWorkbook.Names.Add "saisies", tablo
End If
Target = ""
Target(1, 2) = Application.Average([saisies]) 'moyenne
End Sub

Private Sub CommandButton1_Click() 'Visualisation (des saisies)
If Not IsError([saisies]) Then _
  [D2].Resize(Application.Count([saisies])) = [saisies]
End Sub

Private Sub CommandButton2_Click() 'RAZ
[A2:B2,D:D].ClearContents
If Not IsError([saisies]) Then ThisWorkbook.Names("saisies").Delete
End Sub
Nota pour Roger : les Application.EnableEvents sont inutiles puisqu'au début on teste avec :

Code:
If Not IsNumeric(CStr(Target)) Then Exit Sub
Fichier (3).

A+
 

Pièces jointes

Dernière édition:
Re : Moyenne automatique

Re...


(...)
Nota pour Roger : les Application.EnableEvents sont inutiles puisqu'au début on teste avec :

Code:
If Not IsNumeric(CStr(Target)) Then Exit Sub
(...)
C'est exact, mais il n'en est pas moins exact que chaque fois que vous validez une valeur en A2, Worksheet_Change est appelé trois fois : une fois lors de la validation, une fois lors de l'exécution de la ligne​
VB:
Target = ""
et une fois lors de l'exécution de la ligne​
VB:
Target(1, 2) = Application.Average([saisies])
Ce n'est pas grave puisque les deux derniers appels sont interceptés par l'une des deux premières lignes de code. Ce n'est pas grave, mais c'est inutile.​


Bonne nuit.


ℝOGER2327
#6958


Jeudi 5 As 141 (Saint Van Meegeren, faussaire - fête Suprême Quarte)
17 Brumaire An CCXXII, 9,3701h - cresson
2013-W45-4T22:29:18Z
 
Re : Moyenne automatique

salut

j'en étais là
Code:
Private Sub Worksheet_Change(ByVal R As Range)
  If R.Address <> "$A$2" Then Exit Sub
  If R = "" Then Exit Sub
  If Not IsNumeric(R) Then R = "": Exit Sub
  If R(1, 2) = "" Then n = 0: s = 0
  n = n + 1: s = s + R
  R(1, 2) = s / n
  R = "":  R(1, 1).Select
End Sub
 

Pièces jointes

- 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

  • Question Question
XL 2021 Macro
Réponses
6
Affichages
315
Réponses
1
Affichages
177
Réponses
2
Affichages
494
Réponses
16
Affichages
933
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…