Changer de moyenne par action dans le classeur

shinrei69 Messages postés 75 Date d'inscription dimanche 13 mars 2011 Statut Membre Dernière intervention 30 juin 2011 - 29 juin 2011 à 08:35
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 - 30 juin 2011 à 14:01
Bonjour à tous.

J'ai une petite modification à apporter à mon programme de pesée réalisé il y à quelques semaines par votre précieuse aide.

Je m'explique, Mon classeur se remplit ligne par ligne suivant les mesures réceptionnées.
A partir de ces lignes, j'effectue une moyenne dans une autre cellule par la formule Excel => =MOYENNE(B1:B5000;0). La valeur de cette cellule est considérée dans mon programme comme poids de référence.

Malheureusement, certaines commandes dans mon entreprise se déroulant sur plusieurs jours, le poids des composants ou des cartons peux varier d'une façon relativement importante. J'aimerais donc qu'une action (J'ai déjà le bouton de reprise). Reconsidère les nouvelles valeurs enregistrées et calcule une nouvelle moyenne à partir de la dernière cellule enregistrée jusqu'à la fin de ma plage. J'ai tenté plusieurs petites ligne mais rien ne marche :/

Je m'en remet donc à votre aide précieuse :)

En vous remerciant d'avance.

J.

37 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
29 juin 2011 à 09:04
Bonjour,

Pas vraiment clair, mais d'instinct :

Intéresse-toi à la fonction Excel NBVAL


____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
29 juin 2011 à 09:11
ou crée une fonction personnalisée si nécessaire.
Mais si tu veux de l'aide pour la créer, il nous faudra des bexplications plus précises que celles données (avec exemple succinct si besoin est d'un exemple pour s'expliquer)

____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
0
shinrei69 Messages postés 75 Date d'inscription dimanche 13 mars 2011 Statut Membre Dernière intervention 30 juin 2011
29 juin 2011 à 09:17
Bonjour et merci de répondre aussi vite.

Je vais essayer de détailler :)

Donc, j'ai deux cas de figures qui s'offrent à moi.
- Soit il s'agit d'une nouvelle commande, au quel cas mon classeur se réinitialise et une cellule calcule la moyenne d'une plage (de B2 à B5000).

- Soit, il s'agit d'une reprise (commande sur plusieurs jours). Ou mon classeur enregistre à partir de la dernière cellule active (qui est totalement aléatoire) toujours dans la même plage.

Ces deux parties la fonctionnent.

Dans le premier cas de figure, la formule me convient parfaitement puisqu'elle fait, comme demandé, la moyenne de la plage.

Dans le deuxième cas, elle ne me convient plus, puisque suivant les jours, tout les poids varient infimement.


Ce que je veux, c'est que lorsque j'appuie sur le bouton "début", la formule => =MOYENNE(B1:B5000;0) s'applique.

Et lorsque j'appuie sur le bouton "reprise", ce soit une formule du style =MOYENNE(LastactiveCells:B5000,0)


J'espère avoir été assez clair :/

J.
0
shinrei69 Messages postés 75 Date d'inscription dimanche 13 mars 2011 Statut Membre Dernière intervention 30 juin 2011
29 juin 2011 à 10:15
J'ai étudier la fonction NBVAL comme tu me le conseillais.


Je pense que ce doit être possible de résoudre mon problème en appliquant dans un premier cas. La formule =MOYENNE(B1:B5000;0)

Puis en extrayant la valeur d'une case soumis à NBVAL dans une variable. (x ici)

Et ensuite en faisant redéfinissant ma case excel de telle façon : AVERAGE(x:B5000)

Mais je voit pas trop comment m'y prendre. (L'inconvénient de ne rien connaître en programmation, c'est pas les idées, c'est la manière)

J.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
29 juin 2011 à 11:08
Ce'est bien évidemment possible, dès lors que tu as mémorisé quelque part le point de départ :
La lecture de
cette discussion devrait te permettre un mise en oeuvre sans faille.

____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
0
shinrei69 Messages postés 75 Date d'inscription dimanche 13 mars 2011 Statut Membre Dernière intervention 30 juin 2011
29 juin 2011 à 12:01
Je peux faire en appuyant sur début :

Range("A1").Text = "=MOYENNE(B1:B5000;0)"


Appliquer une fonction NBVAL dans A2 par exemple

Dim nombredepesée as string
noombredepesée = Range("A2").Value

En cas de reprise :

Range("A1").Text = AVERAGE(nombredepesée:A5000)


C'est l'idée non?
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
29 juin 2011 à 12:33
C'est l'idée non?

Je pense que tu te doutes de la réponse que je fais habituellement : ===>> teste et tu sauras


____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
29 juin 2011 à 12:40
et tu n'appliques très manifestement pas ce que tu peux lire dans la discussion dont je t'ai donné le lien plus haut !
(c'est du moins ce que me donne à penser ta variable noombredepesée.
Fais donc un effort de lecture, d'analyse et de compréhension. Ce sont (avant tout développement) les bases même de la mise en oeuvre d'un développement.
Je le dis avec beaucoup d'amitié et souhaite que tu n'interprêtes pas mes propos comme la marque de quoi que ce soit d'autre.


____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
0
shinrei69 Messages postés 75 Date d'inscription dimanche 13 mars 2011 Statut Membre Dernière intervention 30 juin 2011
29 juin 2011 à 12:47
Je le dis avec beaucoup d'amitié et souhaite que tu n'interprêtes pas mes propos comme la marque de quoi que ce soit d'autre.


Il n'y aucun problèmes venant de ma part ne t'inquiètes pas pour ça, je comprend totalement et admire même parfois.

Je vais essayer et rendre compte si problèmes il y a :)
0
shinrei69 Messages postés 75 Date d'inscription dimanche 13 mars 2011 Statut Membre Dernière intervention 30 juin 2011
29 juin 2011 à 12:54
Cells(30, 3).Value = Application.Average(Range(Cells(3, 6), Cells(ligne, 6))) 

Je ne voit pas trop comment adapter finalement.

Je ne voit nul part comment définir la cellule ou je veux afficher le résultat, ni comment définir dans quelle colonne je veux appliquer la moyenne.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
29 juin 2011 à 13:06
Cells(30, 3).Value = Application.Average(Range(Cells(3, 6), Cells(ligne, 6))) 

C'est pourtant simple :
1) Cells(30, 3) est la cellule d'affichage, que tu peux remplacer par (exemple pour la cellule A3 :
Range("A3).value
Tu peux même avoir, si tu le préfères, avoir ton résultat dans une variable nommée par exemple toto, ainsi :
toto = Application.Average(Range(Cells(3, 6), Cells(ligne, 6))) 

2) analyse la partie :
Range(Cells(3, 6), Cells(ligne, 6))
elle ne représente que la plage à laquelle appliquer ta moyenne !
C'est, dans ton cas : la plage Range("B": & dernière_ligne_mémorisée & ":B5000")
Allez : essaye donc.


____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
0
shinrei69 Messages postés 75 Date d'inscription dimanche 13 mars 2011 Statut Membre Dernière intervention 30 juin 2011
29 juin 2011 à 13:59
Voila ce que j'ai fait :

dernière_ligne_mémorisée = Range("G2").Value
Range("D2").Value = Application.Average(Range("B" & dernière_ligne_mémorisée) & ":B5000")


Mais ça me renvoit la valeur #VALEUR puisque je réinitialise mon classeur Excel à chaque démarrage si ce n'est pas une reprise :/
0
bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 15
29 juin 2011 à 14:02
Bonjour,

bon OK , j'arrive avec le travail mâché, mais c'est un peu comme si un snippet existait. J'utilise souvent une petite fonction perso pour ce type de besoin :

Donc voici la démo qui répond à ton besoin, plus la fonction:

Sub Demo()
    Dim MaColonne As String, DerniereValeur As String, MaPlage As Range
    MaColonne = "B"
    'recherche de la derniere valeur
    DerniereValeur = LastValue(MaColonne)
    '
    If Not DerniereValeur = vbNullString Then
        'on definit la plage de travail
        Set MaPlage = Range(MaColonne & "1:" & DerniereValeur)
        'y a t'il plus d'une valeur sur MaPlage
        If Application.WorksheetFunction.CountA(MaPlage) > 1 Then
            'si oui
            MsgBox Application.WorksheetFunction.Average(MaPlage) 'à remplacer par la cellule qui reçoit le résultat
        End If
    End If
End Sub

'la fameuse fonction:
Function LastValue(ByVal MaCol As String, Optional ByRef MaFeuil As Worksheet) As String  'recherche de la derniere valeur d'une colonne
    'cette fonction renvoi l'adresse de la derniere cellule non vide
    If MaFeuil Is Nothing Then Set MaFeuil = ActiveSheet
    LastValue = vbNullString
    On Error Resume Next
        LastValue = MaFeuil.Range(MaCol & Columns(MaCol).Cells.Count).End(xlUp).Address(False, False)
    On Error GoTo 0
End Function


A+
0
shinrei69 Messages postés 75 Date d'inscription dimanche 13 mars 2011 Statut Membre Dernière intervention 30 juin 2011
29 juin 2011 à 14:48
Hum je ne décode pas tout mais si je fait un copié collé en remplaçant par la cellule ça marche?

Je trouve étrange qu'il n'y ai pas de formules plus simples pour ça :O

Je pensait juste qu'en définissant la dernière cellule active je pourrais faire une moyenne en appliquant un Range("XX").Value = "= moyenne(Lastcell:B5000)"

:/
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
29 juin 2011 à 16:22
shinrei69 :
1) tu nas nune parenthèse (en rouge ici) de trop et une autre (en orange ici) en moins !
Range("D2").Value = Application.Average(Range("B" & dernière_ligne_mémorisée) & ":B5000"))
2) si j'ai bien compris, tu veux également éviter le cas où aucun N° de ligne ne figurerait en G2
Voilà donc :

dernière_ligne_mem = Range("G2").Value
 If dernière_ligne_mem > 0 Then
   Range("D2").Value = Application.Average(Range("B" & dernière_ligne_mem & ":B8"))
 Else
   Range("D2").Value = ""
 End If

Code à placer dans l'évènement que tu veux

____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
29 juin 2011 à 16:43
cortrige B8 en B5000 (bien sûr).


____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
0
shinrei69 Messages postés 75 Date d'inscription dimanche 13 mars 2011 Statut Membre Dernière intervention 30 juin 2011
29 juin 2011 à 16:48
Je me disait que je trouvais pas l'erreur aussi :O

Et donc par ce moyen je peux carrément enlever la fonction =MOYENNE toussa toussa dans la cellule non? :D
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
29 juin 2011 à 17:02
évidemment !

____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
29 juin 2011 à 17:32
Et quand tu y seras, on pourra passer à une fonction personnalisée en lieu et place (plus pratique). Mais j'attends que tu te sortes d'abord de ce que je t'ai déjà dit (et on y viendra ensuite).

____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
0
shinrei69 Messages postés 75 Date d'inscription dimanche 13 mars 2011 Statut Membre Dernière intervention 30 juin 2011
30 juin 2011 à 09:14
Erreur 1004 sur ta ligne ;O

J ai mis comme tu me l as conseillé le code suivant ;

dernière_ligne_mem = Range("G2").Value
 If dernière_ligne_mem > 0 Then
   Range("D2").Value = Application.Average(Range("B" & dernière_ligne_mem & ":B8"))
 Else
   Range("D2").Value = ""
 End If
0
Rejoignez-nous