Plage longueur variable [VBA]

Fermé
Jul - 30 sept. 2011 à 22:19
 Jul - 4 oct. 2011 à 14:48
Bonjour à tous !
Je passe beaucoup de temps si un problème pas si compliqué ...

J'ai un fichier .txt que j'importe vers Excel.
La première colonne fait référence au numéro de polygone, dans lequel il y a plusieurs valeurs.
La deuxième colonne - les valeurs.

Ex.
Poly Valeur
1 ___ 4,5
1 ___ 5,0
1 ___ 6,2
2 ___ 3,4
2 ___ 5,6
2 ___ 6,4
2 ___ 8,2
... ...

Donc... Je veux trouver la moyenne pour le polygone 1, la moyenne pour le polygone 2 , ect...
Comme ils incarnent différentes cardinalités de valeurs, chaque plage doit prendre en comprendre le nombre d'éléments dans la première colonne.

Comment je peux programmer ça en VBA ???

4 réponses

michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
Modifié par michel_m le 2/10/2011 à 11:50
Bonjour à tous,

sans VBA et avec formules matricielles (ordre des numéros indifférent)
https://www.cjoint.com/?3JclWxtLMz3
Michel
1
Mytå Messages postés 2973 Date d'inscription mardi 20 janvier 2009 Statut Contributeur Dernière intervention 20 décembre 2016 942
2 oct. 2011 à 15:27
Salut le forum

Une variante en formule : Moy_Poly.xls

Mytå
0
Hey !
Pas bête vos trucs ! (Héhé !)
J'avais complètement oublié qu'on pouvait faire des fonctions de ce type [assez complètes] simplement dans la bar de formule en haut....
Ça devrait simplifier des choses.
J'ai pris une partie du problème à part, histoire de pouvoir mieux comprendre la logique.
J'ai pris quelques heures sur chacune des solutions que vous m'avez suggérées.

J'aime particulièrement ton exemple Michel puisqu'il tient compte que les polygones ne seront probablement pas en ordre dans la liste de gauche.
Ensuite, je ne sais pas pourquoi - je n'arrive pas à glisser vers le bas (!)
Je vais charger mon fichier pour vous montrer ce qui se passe. C'est à la page 3...
Rien ne s'affiche quand je glisse la fonction de D2 vers D3, malgré la notice "Ctrl+Maj+Enter"

Et pour terminer, y'a un truc dont je ne vous avais pas parlé, il y a en faite plusieurs "groupe de polygones " - C'est-à-dire qu'il y a 19 groupes de 12 polygones, ça fait une boucle de plus, probablement basée sur la même logique casse-tête sur laquelle je m'arrache les cheveux - [Quand il y a un changement dans cette colonne -> Passe à la prochaine cellule pour l'écriture]

On comprend mieux le portrait général en consultant les pages 1 et 2 (intitulées respectivement 20100705 et stats) sur lesquelles j'ai écris des commentaires pour m'assurer d'être clair.

Encore une fois, merci mille fois de votre aide, ce forum m'est vraiment très utile !

http://cjoint.com/?AJcwHtCp1XI
0
Mytå Messages postés 2973 Date d'inscription mardi 20 janvier 2009 Statut Contributeur Dernière intervention 20 décembre 2016 942
Modifié par Mytå le 2/10/2011 à 23:47
Re le forum

Jul, mon fichier tient compte aussi du fait que les polygones ne sont pas en ordre dans la saisie.

Plage nommées sur la feuille 20100705
Groupe.......=DECALER($A$1;;;NBVAL($A:$A)) 
Poly.........=DECALER($B$1;;;NBVAL($A:$A)) 
Valeur.......=DECALER($C$1;;;NBVAL($A:$A)) 

Formule en B2 de la feuille Stat (A recopier sur ton tableau)
=SOMMEPROD((Groupe=B$1)*(Poly=$A2)*Valeur)/SOMMEPROD((Groupe=B$1)*(Poly=$A2))

Inconvénient le temps de recalcul va être assez long.

Mytå
0
Mytå Messages postés 2973 Date d'inscription mardi 20 janvier 2009 Statut Contributeur Dernière intervention 20 décembre 2016 942
Modifié par Mytå le 2/10/2011 à 23:51
Re le forum

Jul, avec les formules il faut aussi ajuster les plages de travail.
Il est fortement recommandé d'utiliser des plage nommées.
=SI(MIN(SI(A$1:A$100>D1;A$1:A$100))=0;"";MIN(SI(A$1:A$100>D1;A$1:A$100)))

Ici de A1 à A100 et ton tableau est beaucoup plus grand.
Mytå
0
C'est super ! Merci !
0
eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 7 212
30 sept. 2011 à 23:21
Bonsoir,

Comme ils incarnent différentes cardinalités de valeurs, chaque plage doit prendre en comprendre le nombre d'éléments dans la première colonne.
Restons simples, dis-nous ce que tu veux calculer ;-)
eric
0
Mytå Messages postés 2973 Date d'inscription mardi 20 janvier 2009 Statut Contributeur Dernière intervention 20 décembre 2016 942
1 oct. 2011 à 03:58
Salut le forum

Avec une fonction personnalisée
Function MoyPolygone(champ, champcritere, critere)
Dim MonDico As Object
Dim I As Byte, Valeur As Double
Application.Volatile
  Set MonDico = CreateObject("Scripting.Dictionary")
  Valeur = 0
  For I = 1 To champ.Count
    If UCase(champcritere(I).Value) = UCase(critere) Then
    If Not MonDico.Exists(champ(I).Value) Then _
      MonDico.Add champ(I).Value, champ(I).Value
      Valeur = Valeur + champ(I)
    End If
   Next I
   MoyPolygone = Valeur / MonDico.Count
End Function

Utilisation : =MoyPolygone($B$4:$B$10;$A$4:$A$10;1)

Mytå
0
Oui, vous avez raison !
Je reformule mon truc:
Chaque fois que ça change de chiffre dans la colonne de gauche - j'imprime la moyenne dans la cellule appropriée sur l'autre page Excel, et je recommence une autre moyenne, qui sera à son tour imprimée vers sa cellule appropriée sur l'autre page Excel et ainsi de suite...
Du genre - il lit 1 - 1 - 1 - 1 ... et toute les valeurs associée rentre dans la plage "=MOYENNE(A1;Ax)...." // ensuite -Hop- on arrive à 2 et là il change de cellule sur l'autre page Excel pour recommencer le même processus....
Truc particulier c'est le nombre de valeurs qui sont associées à 1 n'est pas le même que le nombre de valeurs qui sont associées à 2 et ainsi de suite.

Voilà,
Et pour ce qui est du code ci-haut, j'vais commencer à l'étudier mais comme je ne connais pas VBA j'y mettrai un certain temps.

Merci ! Votre aide est appréciée !
0