Calcul sur différentes plages variables

Bonjour à tous.

Je suis perdu dès l'instant où j'ai affaire à des plages variables.

J'ai bien réfléchi et n'ayant pas trouvé de solution moi même aux interrogations de mon dernier poste, j'ai décidé de tourner le problème autrement afin de rendre le travail plus digeste.

Je vous joins un fichier Test qui correspond en miniature à ce sur quoi je travaille actuellement.

Voici ma macro :

Sub calcul()

 Dim a As Range 'Jusque la pas de soucis
 Set a = Range("***" & Range("***").Row) 'Definir mes plages comme etant les cellules comprises entre *** et ***
 Debug.Print Application.WorksheetFunction.Average(a)
 Range(Cells(***,***+1), Cells(***, ***+1)) = Application.WorksheetFunction.Average(a)
 'Faire les calculs des moyennes des plages et mettre les resultats dans la colonne sur la droite, au meme emplacement
 Range("***:***").NumberFormat = "0.00" 'Choix des decimales
 Debug.Print Application.WorksheetFunction.StDev(a)
 Range(Cells(***,***+2), Cells(***, ***+2))= Application.WorksheetFunction.StDev(a)
 ' Faire les calculs d'ecart-type des plages et mettre les resultats dans la 2eme colonne sur la droite, au meme emplacement
 Range("***:***").NumberFormat = "0.00" ' Choix des decimales
  Range(Cells(***,***+3), Cells(***, ***+3))= Application.WorksheetFunction.Average(a) - 2 * Application.WorksheetFunction.StDev(a)
  'Calculs de limite basse dans la 3eme colonne sur la droite
 Range("***:***").NumberFormat = "0.00"
 Range(Cells(***,***+4), Cells(***, ***+4))= Application.WorksheetFunction.Average(a) + 2 * Application.WorksheetFunction.StDev(a)
 'Calculs de limite haute dans la 4eme colonne sur la droite
 Range("***:***").NumberFormat = "0.00"

End Sub

Comme vous pouvez le constater, elle n'est pas opérationnelle.

Je bloque sur deux points.

La première consisterait à mettre des séparateurs (ici *** dans mon fichier) qui serviraient de délimitations pour mes différentes plages de calcul. Les calculs seraient donc effectués puis les résultats placés comme je le souhaite dans la macro.

Et comme vous pouvez le voir, il y a différentes plages à calculer, une macro serait-elle en mesure de faire le calcul de différentes plages "variables" en même temps ? Je veux dire par là qu'elle ne s'arrêterait pas à la première plage calculée ?

Cordialement, Greggy

20test7.xlsm (12.56 Ko)

Bonjour,

Cela m'a l'air un peu cafouilleux, surtout en ce qui concerne la définition des plages...

Si tu peux expliquer de façon concise ce que tu veux obtenir et à partir de quelles plages : les astérisques ne m'évoquent rien !

Et pourquoi tu fais en VBA des calculs (utilisant les formules Excel) aisés à faire par formules ?

(Ça c'est parce que si je considère que l'utilisation de VBA n'est pas justifiée, je m'abstiens ! )

Ah ! J'apprécierais aussi que tu indentes ton code.

Cordialement.

Bonjour,

entièrement d'accord pour l'indentation..

si tu penses continuer en vba, ceci doit être utile:

P.

Bonjour à vous et merci de vous pencher sur mon problème

Sur mon exemple, il faudrait calculer les moyennes, écart-types et limites des 2 plages de données qui sont délimitées par les ***

et que les résultats soient situés dans les colonnes sur la droite.

Mais j'ai mis aussi des astérisques dans les cell(,) alors qu'ils n'y ont pas leur place. Ceux là servaient à indiqer les coordonnées des cellules.

J'espère que je ne vous perds pas

Pour faire simple, j'essaye de trouver une alternative à mon problème présent ici : https://forum.excel-pratique.com/excel/macro-conformite-et-carte-de-controle-t77366.html

Je pense que j'ai été assez explicite sur cette demande, même si j'avoue que ça paraît compliqué à comprendre.

Voici le fichier excel sur lequel je travaille :

J'ai essayé de me passer du VBA mais je me suis vite retrouvé au pied du mur.

Les calculs de moyenne qui paraissaient si simples sont devenus un enfer dès l'instant où les valeurs de moyennes se modifiées quand je faisais glisser le bandeau. Et je ne souhaitais pas les fixer à l'aide des $, car ça empêche justement le glissement de bandeau.

Je m'excuse pour la non indentation de mes macros, je vais apprendre à le faire.

Je téléchargerai le logiciel chez moi, je doute que je puisse le faire sur mon lieu de travail.

Pour l'indentation, il suffit que tu uses de la touche Tab au bon moment.

Sur la marge : tu n'as que la déclaration de procédure (pour les plus répandues, Sub ou Function et End Sub ou End Function qui s'y mettent en plus automatiquement) et (s'il y en a) des étiquettes de lignes (un mot quelconque suivi de qui elles aussi vont se mettre automatiquement à la marge même si les tape ailleurs.

L'alignement Tab1 constitue l'alignement de base de ton code mais lorsque tu as des instructions particulières (regroupement, conditions, boucles... qui ont une entrée, éventuellement des paliers, et une sorties : With... End With, If... ElseIf... Else... End If, Select Case... End Select, For... Next, Do... Loop, etc... Ce qui est à l'intérieur de ces instructions passe en retrait Tab2. Et si des instructions similaires apparaissent au niveau Tab2, ce qui est mis à l'intérieur passe en Tab3, ainsi de suite.

Le résultat est que d'un seul coup d'oeil on détecte les blocs d'instructions, donc de fait la structure de la procédure, qui devient beaucoup plus facile à lire en interprétant la signification du code. Et on peut voir immédiatement s'il manque une fin d'instruction.

Je suis pour ma part plutôt contre le fait de sauter des lignes (sauf parfois exception...) car on a de ce fait moins de texte sous le regard sans bouger les yeux, et selon la taille de l'écran parfois sans être obligé de scroller.

Même chose pour les commentaires, si on est réduit à chercher le code au milieu des commentaires, on y passe beaucoup plus de temps. Je veux bien que ce soit utile à un débutant pour apprendre de lui traduire ce que fait chaque ligne, mais une fois qu'il a assimilé, cela peut s'effacer sans dommage. Les commentaires n'ont vraiment d'intérêt qu'en tant que balises pour aller directement à telle ou telle partie de la macro...

Je vais aller voir tes plages glissantes...

J'ai considéré que tu mettais des astérisques pour guider les aides éventuels, mais dans le code, son utilisation en tant que caractère joker fait qu'il vaut mieux ne pas l'utiliser à autre chose...

A+

Bonjour,

Je laisse ton gros fichier de côté... pour essayer de comprendre ta démarche de calcul sur le petit !

Nous avons des "***" en B5, B9 et B13, et pas de nombre dans ces cellules...

Le premier calcul doit-il prendre en compte B6:B8, et le second B10:B12 ?

Ou bien premier calcul : B6, 2e: B6:B7, 3e: B6:B8, et on passe à une autre série, 4e: B10, 5e: B10:B11, 6eB10:B12 ?

Ou bien on ajoute une ligne en continu, de B6, jusqu'à B12 ?

Maintenant, si ta plage n'est pas définie dans la macro par une référence, directe ou non, elle n'est pas définie du tout, donc aucune chance que cela puisse fonctionner. Ensuite, pour qu'elle glisse, il faut au moins définir un incrément... Je ne pense pas qu'il y ait de difficulté majeure à faire ça, mais je suis bien en peine tant que je n'ai pas compris de quelle plage on part pour glisser jusqu'où et comment !

Cordialement.

Bonjour MFerrand,

Concernant l'indentation, je télécharge le fichier demain soir et je m'y attellerai

En y ayant réfléchi, je pense que les seules indentations que je puisse faire sur cette macro sont les suivantes ?

Sub calcul()

 Dim a As Range

    Set a = Range("***" & Range("***").Row)
        Debug.Print Application.WorksheetFunction.Average(a)
        Range(Cells(***,***+1), Cells(***, ***+1)) = Application.WorksheetFunction.Average(a)
        Range("***:***").NumberFormat = "0.00"
        Debug.Print Application.WorksheetFunction.StDev(a)
        Range(Cells(***,***+2), Cells(***, ***+2))= Application.WorksheetFunction.StDev(a)
        Range("***:***").NumberFormat = "0.00"
        Range(Cells(***,***+3), Cells(***, ***+3))= Application.WorksheetFunction.Average(a) - 2 * Application.WorksheetFunction.StDev(a)
        Range("***:***").NumberFormat = "0.00"
        Range(Cells(***,***+4), Cells(***, ***+4))= Application.WorksheetFunction.Average(a) + 2 * Application.WorksheetFunction.StDev(a)
        Range("***:***").NumberFormat = "0.00"

End Sub

Nous sommes bien dans le premier cas, il doit y avoir le calcul de moyenne, écart-type, et limites de B6:B8, où les résultats devront se situer dans les colonnes sur la droite, au même emplacement.

Il en va de même de B10:B12.

Je souhaitais mettre un symbole de référence (ici des astérisques pour exemple) afin de délimiter les plages à calculer par la macro.

Etant donné qu'il y aura plusieurs plages qui viendront se rajouter dans le futur (de nouveaux lots d'échantillons), il faudra faire les calculs précédents pour les nouvelles plages. Je pense qu'il me faut une macro pour ça, je n'ai pas trouvé de solution en utilisant les formules.

Merci encore de ton implication.

Cordialement, Greggy

Bonjour,

Tu n'as besoin de rien pour indenter, juster d'utiliser la touche Tab...

Nous sommes bien dans le premier cas, il doit y avoir le calcul de moyenne, écart-type, et limites de B6:B8, où les résultats devront se situer dans les colonnes sur la droite, au même emplacement.

Il en va de même de B10:B12.

Cela fait 2 valeurs calculées. Sur quelles lignes doivent-elles être insérées ?

Symbole intermédiaire : à proscrire. Ce qu'il faut savoir : à quelle ligne débute normalement ta première série ?

Si tu sautes une ligne entre deux séries, qu'y a-t-il sur cette ligne normalement ?

Cordialement.

Oui je sais bien mais je souhaite savoir quand indenter exactement.

On va faire abstraction des limites.

Pour B6:B7, la moyenne doit être affichée de C6:C8, pour l'écart-type de D6:D8.

Pour B10:B12, la moyenne doit être affichée de C10:C12, pour l'écart-type de D10:D12.

Sur mon exemple, ma première série débute en B6.

Je souhaite mettre des symboles pour que la macro sache quand effectuer les calculs sur les différentes plages.

Car dans mon gros fichier, il y arrive qu'il n'y ait pas de valeurs partout dans la plage, ce qui fait des lignes vides au beau milieu d'une plage.

Si je saute une ligne entre deux séries, il n'y a rien normalement, sauf cas cité au dessus.

La macro ne pourrait donc pas savoir s'il s'agit d'une plage finie ou une ligne vide dans une plage.

J'espère que vous me comprenez.

Tu viens de me dire au post précédent, qu'il avait deux calculs à faire [sous-entendu pour la moyenne, les autres s'aligneront...)

le premier pour B6:B8 ! je pouvais mettre d'office le résultat ligne 6 ou 8 mais je demande : tu trouves moyen de répondre que pour B6:B7 (?) le résultat s'affiche en C6:C8 !!!

Le résultat d'un seul calcul ne sera affiché que dans une seule cellule !

J'ai indiqué au départ toutes les possibilités car justement je ne comprenais pas ce que tu voulais calculer. Tu optes pour une des possibilités pour la remettre en cause immédiatement derrière.

Si tu manques à ce point de précision dans tes formulations logiques, pas étonnant que tu aies des difficultés !

D'autre part, je demande à quoi on reconnait qu'on passe d'une série à une autre. Oublie tes symboles et indique-moi à quoi tu le reconnais en regardant ton fichier !

Effectivement j'ai fais une erreur de frappe, ils'agit bien de B6:B8.

Il n'y a aucun moyen de l'afficher dans une plage de cellules sans que celui-ci s'adapte aux cellules adjacentes ?

Justement, il n'y a que l'opérateur qui sait quand on change de séries, et la macro ne peut pas le deviner.

On met en bleu la ligne juste avant la nouvelle série, comme sur le gros fichier.

C'est pourquoi j'ai pensé qu'il serait bon de trouver un moyen de délimiter les plages de valeurs pour que la macro sache quand et ou effectuer les calculs.

Ou pour faire plus simple, il faudrait que la macro calcule la moyenne et l'écart-type de la plage active et qu'elle mette les résultats dans les colonnes sur la droite de la plage active. Est-ce faisable ?

J'essaye d'être le plus précis possible mais retranscrire à l'écrit une méthode n'est pas chose aisée ..

La ligne bleue indique-t-elle la dernière ligne d'une série ou la première ligne d'une nouvelle série ?

Et tu as encore oublié une question ! Un calcul produit un résultat. On peut mettre ce résultat sur la dernière ligne de la série, ailleurs, ou dans un tableau distinct prévu à cet effet.

Mais il faut me dire où je le mets exactement !

Ni l'une ni l'autre, la première ligne d'une nouvelle série est situées juste en dessous de la ligne bleue.

La ligne bleue contient les valeurs obtenues par des laboratoires de référence, il ne faut donc pas l'intégrer aux calculs.

Il faut mettre le résultat du calcul dans la cellule située sur la droite (pour la moyenne) de la première cellule de la série.

Quelque chose du genre ActiveCell(XX,XX+1) si possible, enfin j'essaye d'arriver à ce résultat là.

Et pour l'écart-type, ce serait du genre ActiveCell(XX,XX+2).

Donc une série se termine avant la ligne bleue et une nouvelle série commence après la ligne bleue.

OK pour résultat sur la première ligne de la série.

Et arrête de te casser la tête pour définir ta plage. ActiveCell n'est pas une définition sûre !!

Il faut normalement partir de la cellule qui démarre la première série de valeurs, et qui en principe doit être fixe.

Le reste suivra.

C'est cela.

Et qu'elle serait l'écriture VBA pour indiquer que l'on sélectionne la plage active, et que l'on effectue les calculs avec ?

Je suis d'accord, mais mon problème réside dans le fait qu'il n'y ait que l'opérateur qui sait quand une nouvelle série commence. Par conséquent, pas moyen de "fixer" la première valeur de la série.

Où alors il faudrait peut-être que l'opérateur indique via une question de la macro s'il commence une nouvelle série.

Merci encore de ta patience.

Soit la première cellule débutant la première série d'une feuille est fixe,

soit tes tableaux sont à repenser totalement.

Et bien je vais repenser le tableau autrement en laissant la première série de la feuille fixe

Je créerai une feuille pour chaque nouveau lot, ce qui permettra la non utilisation inutile d'une macro.

Pour ce qui est des tableaux, je suis tout à fait d'accord, ils ne sont pas fonctionnels mais j'ai voulu faire du neuf avec du vieux, en reprenant les tableaux précédents et en essayant d'automatiser le tout.

Il aurait été bien plus simple de recommencer à zéro.

Je te remercie pour le temps que tu m'as accordé.

Cordialement, Greggy

Tu es sûr !

Car si j'en crois ton gros fichier, le point de départ se situe en ligne 23, colonnes F, P, Z, AJ, AT. Ce qui paraît un positionnement assez régulier...

C'est a-priori de ces cellules dont je demande si elles sont fixes.

Oui, je vais partir du dernier lot en date. Et à chaque nouveau lot, une nouvelle feuille pré-remplie.

Le positionnement des valeurs et des résultats est bel et bien régulier, c'est la taille des lots qui ne l'est pas.

Ces cellules sont fixes, mais elles dépendent uniquement du premier lot.

C'était bien ma question : un point de départ fixe, ensuite on détecte la taille de la série et le passage à la suivante...

Bonne journée.

Rechercher des sujets similaires à "calcul differentes plages variables"