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 !
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
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.
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
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.
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
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 :
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
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
- 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.