MACRO POUR MOYENNER DE MANIERE SIMPLE UNE BASE DE DONNEES

Résolu
SERIEUXETCOOL Messages postés 336 Date d'inscription dimanche 3 avril 2011 Statut Membre Dernière intervention 12 juin 2012 - 1 août 2011 à 20:00
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 - 28 sept. 2011 à 09:59
(Dsl si je ne post pas au bon endroit, merci de déplacer)

Bonjour,

Je dispose d'un code sous VBA qui permet de me faire tourner une petite marco sous Excel. Ce code permet de supprimer certaines lignes présentes dans une base de données déjà existante.

Maintenant je cherche poursuivre le développement de cette macro en réalisant 2 fonctions supplémentaires.

-La première fonction est de faire une moyenne sur un ensemble particulier de lignes. Ces lignes vont varier de position suivant la base de données. Et elle ne seront pas au même nombre à chaque fois.

-La dernière fonction étant de remplacer les lignes qui auront servi à calculer les moyennes pas la valeur moyennée justement. Donc on fait une suppression de lignes et un remplacement de valeurs.

Je ne sais pas si je suis clair, de toute façon d'autres explications vont suivre si-après, plus le code pour voir mieux un petit exemple.

Voici le code existant qui permet de créer une petite base de données à titre d'exemple et de supprimer certaines lignes :
(elle fonctionne très bien)

Sub Macro1()
  Cells.Clear ' Vide la feuille

  Dim plage As Range, plage_a_supp As Range
  Dim nb As Long, n As Long, i As Long, j As Long, msg As String
  Dim t, ii As Byte

  t = Split("1 11 21 31") 'Permet de créer une petite table pour exemple
  For ii = 0 To 3
     Cells(t(ii), 1).Resize(10) = ii
     Cells(t(ii), 2).Resize(10) = [=TRANSPOSE({1,2,3,4,5,6,7,8,9,10})]
  Next ii
  n = ActiveSheet.UsedRange.Rows.Count 'Compte le nombre de lignes dynamiques
  nb = 4 'pour ôter 4 lignes en bas et 4 en haut
   If nb = 0 Then Exit Sub
   msg = ""
   For i = 2 To n + 1
     If Range("A" & i).Value = Range("A" & i - 1).Value Then
       If plage Is Nothing Then
         Set plage = Union(Range("A" & i - 1), Range("A" & i))
       Else
         Set plage = Union(plage, Range("A" & i))
       End If
     Else
       If plage.Rows.Count >= nb * 2 Then
         For j = 1 To nb
           If plage_a_supp Is Nothing Then
             Set plage_a_supp = Union(plage(1, 1), plage(plage.Rows.Count, 1))
           Else
             Set plage_a_supp = Union(plage_a_supp, plage(j, 1), plage(plage.Rows.Count + 1 - j, 1))
           End If
         Next
         Set plage = Range("A" & i)
         If Range("A" & i).Value = "" Then Exit For
       Else
         msg = msg & " - " & plage(1, 1).Value
         Set plage = Nothing
         If Range("A" & i).Value = "" Then Exit For
       End If
     End If
   Next
   If Not plage_a_supp Is Nothing Then
     plage_a_supp.Rows.EntireRow.Delete
   End If
   If msg <> "" Then
     MsgBox "les groupes suivants, d'un nombre non suffisant, " & _
     "n'ont pas été traités " & vbCrLf & Mid(msg, 3)
   End If
End Sub


Ce qu'il reste à faire...De manière générale j'ai une feuille excel avec les données suivantes :

Colonne1/Colonne2/Colonne3...
0 xxx xxx
0 xxx xxx
0 xxx xxx
1 xxx xxx
1 xxx xxx
1 xxx xxx
2 xxx xxx
2 xxx xxx
2 xxx xxx
3 xxx xxx
3 xxx xxx
3 xxx xxx

-Les données partent de 0 et vont jusqu'à X. X étant un nombre connu mais variable. C'est une série de nombre entier, ordonnée du plus petit au plus grand.
Chaque entier naturel est répété un certain nombre de fois. Dans mon exemple on compte de 0 à 3 en répétant chaque chiffre 3 fois. (c'est un exemple)

-Mon but est de calculer la moyenne sur certaines colonnes de la manière suivante. Je commence avec la première série de 0. Je fais la moyenne sur toute les lignes qui ont pour indice 0, j'insère une ligne, je note la moyenne et je supprimer toutes les valeurs qui m'on servi à calculer la moyenne. Je fais donc la moyenne pour la colonne A, B,C...

-Ensuite je passe à l'entier naturel suivant, les 1. Et ainsi de suite.

-A la fin je souhaite obtenir un fichier ne représentant que les moyennes

Colonne1/Colonne 2/Colonne3....
0 XXX XXXX
1 XXX XXXX
2 XXX XXXX
3 XXX XXXX

Pour ce faire, il faut bien sur réutiliser le même code précédent. Une première partie du code supprime un certains nombre de lignes et la deuxième partie du code doit pouvoir me calculer la moyenne sur chaque série d'entier naturel et l'afficher pour remplacer la série d'entier.

Je pense être clair mais si vous avez besoin de plus d'infos je suis la.

Merci pour votre aide.

PS : J'ai commencé en utilisant la fonction suivante qui fonctionne. Mais je ne parviens pas à l'intégrer dans une boucle.

Formule = Application.Average(Range("A" & i, ":A" & j))

90 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
25 sept. 2011 à 19:36
Bon

J'ai longuement regardé ton truc.

1) C'est cela que tu veux ? ===>> pas de problème ====>> je vais le faire après dîner.
2) Il va toutefois me falloir "stocker" une donnée supplémentaire par groupe (je sais maintenant laquelle).
Mais tu ne veux pas de colonne supplémentaire et je veux essayer d'éviter l'ajout d'une collection !
Question : as-tu sur ta feuille de travail des cellules dotées de commentaires (comments). Si non : parfait. Si oui : as-tu au moins une colonne dont toutes les cellules seraient sans commentaires ? (l'idéal serait la colonne A ou la colonne des différences.

Donne-moi cette réponse avant dîner, s'il te plait, car elle va conditionner mon approche.

Si impossible (toutes tes colonnes contenant une ou plusieurs cellules commentées), j'ai deux autres solutions (l'une avec une collection, l'autre par l'ajout puis la suppression d'une colonne avant la colonne A). Ces deux solutions sont plus lourdes et je préfèrerais les éviter.

Je t'attends, maintenant

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
SERIEUXETCOOL Messages postés 336 Date d'inscription dimanche 3 avril 2011 Statut Membre Dernière intervention 12 juin 2012 1
25 sept. 2011 à 21:42
Je sentais qu'il faudrait stoker des valeurs en plus si l'on désire faire la différence puis la suppression puis la moyenne. C'est bien pour sa que je ne voulais pas t'embêter autant.

Mais finalement vu la réflexion que tu m'a fait avoir sur le sujet, il semble évident de devoir faire ça bien. Donc si sa passe par une colonne en plus alors on va faire ainsi.

-Des cellules dotées de commentaires ??? Je ne connais pas ce genres de cellules. Je pense que sa doit être le genre de cellules qui quand on passe la souris dessus, alors une bulle apparait. J'ai pu voir ce genre de cellules par le passé. Je n'en ai pas actuellement mais peut être j'en mettrais pour guider l'utilisateur. Donc la réponse est NON pour le moment, mais peut être que oui par la suite.

-Concernant tes 2 solutions "lourdes", celle qui parle de collection ne me dit absolument RIEN. Et comme je ne sais pas ce que c'est je préfère que tu ne l'utilise pas s'il te plais. Je préfère garder la main sur la compréhension du code ;)
La solution ajout puis suppression de colonne est celle que je pensais faire dès le début. Même si elle est lourde en terme de temps de calcul il n'empêche qu'elle est facile à comprendre. Et donc elle me séduit car moi même j'y avais pensé.

Dans ce cas la, tu peut imaginer faire tes calculs intermédiaires dans une colonne très très très très à droite puis de couper ces valeurs et de les mettre dans la colonne différence ensuite. Sa ne me gène pas ainsi. Je n'utilise qu'une 50 aine de colonnes maxi.

-Enfin tu me demande si je dispose d'au moins une colonne sans commentaire. Alors oui tu peut te servir de la colonne que tu veux. La colonne A qui comporte les groupes, ou la colonne B qui contiens les différences. Sans aucun soucis. De toute manière, si je dois mettre des commentaires par la suite, c'est seulement après l'opération de différence, de suppression, de moyenne.

En gros ma Macro commence toujours par traiter la base de données, et seulement ensuite elle fait des mises en formes (ajout de couleurs, de colonnes, de lignes, de commentaires...)

Mon conseil commence soit par la méthode ou tu utilise la colonne des différences comme colonne disponible. Et sinon tu insère une colonne, que tu supprime ensuite.

Et voila^^
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
25 sept. 2011 à 21:50
Bien !
Je vais utiliser la colonne 100 comme tremplin et la supprimer in fine

A demain.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
SERIEUXETCOOL Messages postés 336 Date d'inscription dimanche 3 avril 2011 Statut Membre Dernière intervention 12 juin 2012 1
25 sept. 2011 à 22:34
La colonne 100 me conviens. Je n'y taperais jamais dedans à priori. Donc sa marche pour moi. En plus c'est un chiffre rond, facile à retenir donc parfait.

A demain alors.

Merci
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
26 sept. 2011 à 10:35
Dis-moi, André,

La stratégie par rajout d'une colonne (supprimée ensuite) ne peut être mise en oeuvre que si tu as une seule colonne de "différences". Dans le cas contraire (plusieurs colonnes) il faudrait ajouter et supprimer autant de colonnes qu'il y a de colonnes définies dans l'array colonnes_dif (ce qui deviendrait très lourd à gérer)

Alors ===>> question :
Ton outil n'azura-t-il toujours qu'une colonne dans l'array colonnes_dif ?

- si oui : je continue sur cette stratégie (bien avancée déjà)

- si non : je passe à la stratégie des commentaires, puisque tu n'as aucune cellule commentée (tu ne sais d'ailleurs même pas ce que c'est )

La gymnastique à faire étant de l'acrobatie, j'attends ta réponse pour continuer et éviter de risquer de faire deux gymnastiques au lieu d'une seule

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
SERIEUXETCOOL Messages postés 336 Date d'inscription dimanche 3 avril 2011 Statut Membre Dernière intervention 12 juin 2012 1
26 sept. 2011 à 13:06
Et bien coup de chance, dans modèle je n'aurais qu'une et une seule colonne consistant à faire ce genre de différence.

Donc dans mon "array colonnes_dif" je ne mettrais qu'une seule valeur de colonne.

Donc tu peux dérouler ta stratégie bien avancée^^


André

Ps : J'ai eu la curiosité d'aller voir ces fameuses cellules commentées...Et malgré que je n'en ai encore jamais utilisé, c'est bel et bien ce genre de cellules dont je t'ai parlé dans mon précédent post. Une cellule dans laquelle on y attache un commentaire qui apparait soit au passage de la souris dessus, soit qui est tout le temps affiché.
A moins que tu ne parle d'un autre truc, quand je tape "cellule commentée" sur Google je tombe bien sur la vision que j'en ai. Donc je le redis, je n'utilise pas de cellules commentées pour le moment, MAIS je serais très probablement amené à en utiliser pour guider l'utilisateur par la suite. Reste sur ta stratégie bien avancé, sa sera parfait ;)
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
26 sept. 2011 à 14:31
Bon !

J'ai poussé le bouchon (bien que pas à la pêche) un peu plus loin et ai réussi à mettre en place un artifice qui m'a permis de ne pas passer par une colonne "rajoutée/puis supprimée" tremplin !

Je ne te cache pas que tu auras plutôt mal au crâne, si tu cherches à en cerner l' "acrobatie" qui articule ce raisonnement ! Il marche bien et fais exactement ce que tu souhaites (tel que tu l'as défini).

Voici la totalité de ce que doit contenir ton Module1, maintenant (procéde par écrasement total).
Mets-y TES paramètres.

On y va ===>>>
Option Explicit
Sub DIFFERENCE_SUPPRESSION_MOYENNE()

Sheets("MACRO").Select

Cells.Clear ' Vide la seule feuille restante
ActiveSheet.DrawingObjects.Delete 'Supprime les graphs et les boutons d'actions de la seule feuille active

    Cells(1, 1).Value = "COLONNE DES GROUPES"
    Cells(2, 1).Value = 0
    Cells(3, 1).Value = 0
    Cells(4, 1).Value = 0
    Cells(5, 1).Value = 0
    Cells(6, 1).Value = 0
    Cells(6, 1).Value = 0
    Cells(7, 1).Value = 1
    Cells(8, 1).Value = 1
    Cells(9, 1).Value = 1
    Cells(10, 1).Value = 1
    Cells(11, 1).Value = 1
    Cells(12, 1).Value = 1
    Cells(13, 1).Value = 1
    
    Cells(1, 2).Value = "COLONNE DES DIFFERENCES"
    Cells(2, 2).Value = 16.1
    Cells(3, 2).Value = 16.15
    Cells(4, 2).Value = 16.2
    Cells(5, 2).Value = 16.3
    Cells(6, 2).Value = 16.35
    Cells(6, 2).Value = 16.45
    Cells(7, 2).Value = 16.5
    Cells(8, 2).Value = 16.51
    Cells(9, 2).Value = 16.52
    Cells(10, 2).Value = 16.54
    Cells(11, 2).Value = 16.57
    Cells(12, 2).Value = 16.58
    Cells(13, 2).Value = 16.59
    
    Cells(1, 3).Value = "COLONNE DES MOYENNES"
    Cells(2, 3).Value = 1
    Cells(3, 3).Value = 2
    Cells(4, 3).Value = 3
    Cells(5, 3).Value = 4
    Cells(6, 3).Value = 5
    Cells(6, 3).Value = 6
    Cells(7, 3).Value = 1
    Cells(8, 3).Value = 2
    Cells(9, 3).Value = 3
    Cells(10, 3).Value = 4
    Cells(11, 3).Value = 5
    Cells(12, 3).Value = 6
    Cells(13, 3).Value = 7
    
    Range("B2:B13").Select
    Selection.NumberFormat = "0.00"
    
    
    Dim feuille_donnees As String
    Dim colonne_groupes As String, a_partir_ligne As Integer, ecreter_de_combien As Long
    Dim col_groupes As Variant, colonnes_moyennes As Variant, colonnes_diff As Variant, col_tremplin As Integer
  
  ' ==============================c'est ici que tu définis la feuille des données ==========================================
  feuille_donnees = "MACRO" ' <<<<<========= le nom exact de la feuille contenant les groupes à traiter
  ''c'est ici, que tu définis les autres paramètres =========================================
  colonne_groupes = "A" '<<<<<<<======== ici : la colonne des groupes
  a_partir_ligne = 2 '<<<<<<============ ici : la ligne où commencent les groupes
  ecreter_de_combien = 3 '<<<<======= ici : de combien écréter en haut et en bas de chaque groupe
  colonnes_moyennes = Array("C") '<<<<=== ici : énumération des colonnes où faire la moyenne ("") si aucune
  colonnes_diff = Array("B") ' <<<<<===== ici : la SEULE  colonne où faire ta "différences" ("") si aucune
  col_groupes = Array(colonne_groupes) ' ---->> ça, c'est pour le code. Ne t'en préoccupe pas.
  '==========================================================================================================================
  
  
  ' ________________________________________ les gardes-fou, maintenant ________________________________________________
  
  If ActiveSheet.Name <> feuille_donnees Then
    MsgBox "cette opération ne doit être lancée que si la feuille " & feuille_donnees & " est la feuille active"
    Exit Sub
  End If
  If verif(col_groupes, colonne_groupes, a_partir_ligne, "colonne des groupes") = False Then Exit Sub
  If verif(colonnes_moyennes, colonne_groupes, a_partir_ligne, "colonne à moyenne") = False Then Exit Sub
  If verif(colonnes_diff, colonne_groupes, a_partir_ligne, "colonne à différence") = False Then Exit Sub
  '______________________________________________________________________________________________________________________
  
  
  ' ------------------------------ si l'exécution atteint ce point, c'est que tout est cohérent -------------------------
  ' ------------------------------ on y va donc -------------------------------------------------------------------------
  ' ---------------------------------------------"écrétant" d'abord------------------------------------------------------
  epurer colonne_groupes, a_partir_ligne, ecreter_de_combien, col_tremplin, colonnes_diff
  ' ----------------------------------------puis en traitant le reste (écart(s) et moyenne(s) ---------------------------
   MsgBox "On vient d'épurer"
    on_amenage colonne_groupes, a_partir_ligne, colonnes_moyennes, colonnes_diff
    ActiveSheet.Buttons.Add(440, 15, 120, 45).Select
    Selection.OnAction = "BASE_DE_DONNEES_FINALE"
    Selection.Characters.Text = "BASE DE DONNEES INNITIALE"
    ActiveSheet.Buttons.Add(600, 15, 120, 45).Select
    Selection.OnAction = "DIFFERENCE_SUPPRESSION_MOYENNE"
    Selection.Characters.Text = "BASE DE DONNEES FINALE"
End Sub
Public Sub epurer(ByVal col As String, ByVal ligne As Integer, ByVal nb As Integer, ByVal col_tremplin As Integer, ByVal dif)
  Dim deb As Single
  Dim plage As Range, plage_a_supp As Range
  Dim n As Long, i As Long, j As Long, msg As String
   
   n = Range(col & Rows.Count).End(xlUp).Row
   If nb = 0 Then Exit Sub
   msg = ""
   For i = ligne + 1 To n + 1
     If Range(col & i).Value = Range(col & i - 1).Value Then
       If plage Is Nothing Then
         Set plage = Union(Range(col & i - 1), Range(col & i))
       Else
         Set plage = Union(plage, Range(col & i))
       End If
     ElseIf Not plage Is Nothing Then
          Dim R As Range
          If dif(0) <> "" Then
            For Each R In plage.Rows
              Cells(R.Row, dif(0)).Value = Cells(plage.Row + plage.Rows.Count - 1, 2).Value - deb
            Next
          End If
          If dif(0) <> "" Then deb = Range(dif(0) & plage.Row + plage.Rows.Count - 1)
         If plage.Rows.Count > (nb * 2) + 1 Then
           For j = 1 To nb
             If plage_a_supp Is Nothing Then
               Set plage_a_supp = Union(plage(1, 1), plage(plage.Rows.Count, 1))
             Else
               Set plage_a_supp = Union(plage_a_supp, plage(j, 1), plage(plage.Rows.Count + 1 - j, 1))
             End If
           Next
           Set plage = Range(col & i)
           If Range(col & i).Value = "" Then Exit For
          Else
            msg = msg & " - " & plage(1, 1).Value
            Set plage = Nothing
            If Range(col & i).Value = "" Then Exit For
          End If
      Else
        msg = msg & " - " & Cells(i - 1, 1).Value
     End If
   Next
   If Not plage_a_supp Is Nothing Then
     plage_a_supp.Rows.EntireRow.Delete
   End If
   If msg <> "" Then
     MsgBox "les groupes suivants, d'un nombre non suffisant, " & _
     "n'ont pas été traités " & vbCrLf & Mid(msg, 3)
   End If
End Sub
Public Sub on_amenage(ByVal col As String, ByVal ld As Integer, ByVal moy, ByVal dif)
 
 Dim deb As Long, n As Long, i As Long, combien As Long, k As Long, j As Long
 Dim plage As Range, plage_a_supp As Range
 Dim elmt
 deb = Range(col & ":" & col).Column
 n = Range(col & Rows.Count).End(xlUp).Row
 For i = ld + 1 To n + 1
   If Range(col & i).Value = Range(col & i - 1).Value Then
     If plage Is Nothing Then
       Set plage = Union(Range(col & i - 1), Range(col & i))
     Else
       Set plage = Union(plage, Range(col & i))
     End If
   Else
     If Not plage Is Nothing Then
       combien = plage.Rows.Count
       If combien > 1 Then
         If UBound(moy) > 0 Then
           For Each elmt In moy
             k = Range(elmt & ":" & elmt).Column - deb + 1
             plage.Cells(1, k) = WorksheetFunction.Average(plage.Columns(k))
           Next
         End If
         For j = 2 To combien
             If plage_a_supp Is Nothing Then
               Set plage_a_supp = plage(j, 1)
             Else
               Set plage_a_supp = Union(plage_a_supp, plage(j, 1))
             End If
          Next
       End If
       Set plage = Nothing
     End If
   End If
 Next
 If Not plage_a_supp Is Nothing Then
   plage_a_supp.Rows.EntireRow.Delete
 End If
End Sub
Public Function verif(cols, colonne_groupes, a_partir_ligne, descr As String) As Boolean
  Dim derLig As Long
  Dim plage As Range
  Dim elmt As Variant
  verif = True
  If UBound(cols) = 0 Then Exit Function
  derLig = Range(colonne_groupes & Rows.Count).End(xlUp).Row
  For Each elmt In cols
    Set plage = Nothing
    On Error Resume Next
    Set plage = Range(elmt & a_partir_ligne & ":" & elmt & derLig).SpecialCells(xlCellTypeBlanks)
    If Not plage Is Nothing Then
      MsgBox "la " & descr & " " & elmt & " contient une cellule vide - Corrigez puis relancez, s'il vous plait !"
      verif = False
      On Error GoTo 0
    End If
  Next
End Function


Oufff !

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
tof3 Messages postés 5 Date d'inscription vendredi 28 septembre 2007 Statut Membre Dernière intervention 27 septembre 2011
26 sept. 2011 à 17:13
Salut,
Juste un petit exemple (on ne sais jamais si ça peut aider) de ce que l'on peut faire à partir d'excel pour ce genre de trie:
si tu as ton tableau initial dans l'onglet Feuil1, crées en un autre et mets :
en A1 =Feuil1!A1
en B1 =SI($A1="";"";MOYENNE(INDIRECT("Feuil1!"&ADRESSE(EQUIV($A1;Feuil1!$A:$A;0);COLONNE(B1))&":"&ADRESSE((EQUIV($A1;Feuil1!$A:$A));COLONNE(B1)))))
en A2 =SI(ESTERREUR(EQUIV(A1+1;Feuil1!A:A;0));"";A1+1)
en B2 =SI($A2="";"";MOYENNE(INDIRECT("Feuil1!"&ADRESSE(EQUIV($A2;Feuil1!$A:$A;0);COLONNE(B2))&":"&ADRESSE((EQUIV($A2;Feuil1!$A:$A));COLONNE(B2)))))

il suffit d'étirer les formules vers la droite et vers le bas

Je sais, cela reste manuel mais ces formules pourraient être coller par vba puis les cellules pourraient être copier et il faudrait coller que les valeurs ensuite
0
SERIEUXETCOOL Messages postés 336 Date d'inscription dimanche 3 avril 2011 Statut Membre Dernière intervention 12 juin 2012 1
26 sept. 2011 à 17:59
Merci tof3 pour l'info. Je laisse Ucfoutu prendre en compte ou non ta remarque. Moi sa me dépasse^^

Ucfoutu, j'ai commencé à réaliser quelques tests pour éprouver ton code. J'ai une première remarque. A quel endroit de ton code, définis tu ton zéro absolu ?

Si on prends l'exemple des poissons, le zéro absolu est : 16h05. Cette valeur est ESSENTIELLE car elle permet de réaliser la bonne différence pour le premier groupe. Hors dans ton code, le groupe 0 n'effectue pas la bonne différence tout simplement car je ne vois pas mentionner nul part ce zéro absolu. Toi tu as fait la différence entre la dernière valeur du groupe 0 et la première valeur du groupe. Or c'est faux. Si tu regarde le dessin des poissons dans mon Excel (Feuille 1), il faut prendre en compte le zéro absolu et non la première valeur trouvée.

Voila pourquoi je t'avais suggérer de placer dans le code un paramètre supplémentaire qui est : La valeur du zéro absolu que l'utilisateur décide de prendre.

Une autre manière simple de te rendre à l'évidence est la suivante. Si tu lance ton code paramétré sur l'exemple des poissons, alors la proposition de différence que tu fait n'est pas tout simplement pas la bonne pour le première groupe. Normal le zéro absolu n'est pas le bon ;)

Je me trompe ou j'ai juste en affirmant cela ?

André
0
SERIEUXETCOOL Messages postés 336 Date d'inscription dimanche 3 avril 2011 Statut Membre Dernière intervention 12 juin 2012 1
26 sept. 2011 à 18:21
Autre remarques :

-Déjà j'ai remarqué une petite erreur ridicule de ma part dans le code. Quand tu demande 0 lignes supprimées et que tu ne fait pas de moyenne ni de différence, alors la base de données proposées est différente de l'exemple des poissons. En effet j'ai oublié un saut de ligne dans le code engendrant un décalage de l'ensemble de la base de données. Bref ce n'est pas le plus grave. (je post ci après le lien contenant le fichier Excel avec toutes les dernières améliorations. Ce fichier Excel contient la dernière version de ton code Ucfoutu)

-Une autre choses qui n'est pas normale. Si l'on choisit deux valeurs d'écrêtement différentes (par exemple une fois on décide de supprimer 0 lignes puis on relance avec la suppression de 2 lignes) alors la colonne qui contient les différences change !!!!
Alors que de toute façon la colonne des différence ne doit JAMAIS voir sont contenu changer quel que soit la valeur des paramètres que l'utilisateur choisit (sauf le paramètre de zéro absolu).

-Il me semble que la moyenne ne se fait pas sont travail de manière correcte. Elle affiche une valeur entière alors que dans certains cas il devrait y avoir des virgules. J'ai vérifier le format des cellules et sa ne viens pas de la. Je n'ai pas vérifier ta formule pour les moyennes. Tu es sur d'avoir bien programmer la fonction moyenne ? Je n'en suis pas certain mais je pense qu'elle est fausse.

Pour le moment ce sont tous les "bugg" que je vois apparaître au premier abord.

On vas y arriver Ucfoutu. Rien ne semble impossible pour toi^^

André

Ps : le lien qui contient la dernière version améliorer de L'ENSEMBLE du fichier Excel. Donc utilise cette version si tu ne veux pas être embêté par la suite ;)

http://www.cijoint.fr/cjlink.php?file=cj201109/cijAIUgknN.xls
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
26 sept. 2011 à 19:13
A quel endroit de ton code, définis tu ton zéro absolu ?

ici :
Public Sub epurer(ByVal col As String, ByVal ligne As Integer, ByVal nb As Integer, ByVal col_tremplin As Integer, ByVal dif)
  Dim deb As Single '===========>>> deb = 0 à ce moment-là

puis toutes les lignes de la colonne B du groupe prennent la valeur de la dernière - deb ici :
For Each R In plage.Rows
              Cells(R.Row, dif(0)).Value = Cells(plage.Row + plage.Rows.Count - 1, 2).Value - deb
            Next

puis (en vue du prochain "passage", deb prend la dernière valeur du groupe précédent ici :
If dif(0) <> "" Then deb = Range(dif(0) & plage.Row + plage.Rows.Count - 1)

et ainsi de suite.
Et c'est cela, que tu demandais ! relis ton exemple/poissons.
(16H45-16H05)=40 Min

donc ===>> la dernière valeur du groupe - l'origine

J'ai fait cela car tu me disais que ton "zéro absolu" (deb, donc) était 0 dans ton cas.
Si tu préfères un autre point de départ : dis-lequel et je fais (en 2 coups de cuiller à pot).

Toi tu as fait la différence entre la dernière valeur du groupe 0 et la première valeur du groupe

Que nenni !
Si tu regarde le dessin des poissons dans mon Excel (Feuille 1), il faut prendre en compte le zéro absolu et non la première valeur trouvée.

Et c'est bien ce que j'ai fait ! en prenant comme point de départ 0, comme tu le demandais.

Je te réponds sur ton 2ème message ensuite.

A tof3 : je crains que tu n'aies pas cerné de quoi il s'agit !

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
SERIEUXETCOOL Messages postés 336 Date d'inscription dimanche 3 avril 2011 Statut Membre Dernière intervention 12 juin 2012 1
26 sept. 2011 à 19:51
Ah je viens de comprendre maintenant pourquoi après différence sa ne marchais pas. Quand j'utilisais ton code appliqué à l'exemple des poisson je trouvais que le groupe 0 avait une durée de 45 min. Alors qu'on devais trouver 40 min. Et cette "erreur" est du au fait que dans ton code tu as mis la valeur de 0 comme zéro absolu. Or dans l'exemple des poissons, le zéro absolu est 5^^. D'ou le petit décalage de 5 min.

Comme je n'avais pas vue à quel moment tu faisais intervenir le zéro absolu dans ton code je ne pouvais pas vérifier ce détail^^. Ce qui prouve la encore, qu'il serait très très judicieux de faire apparaître ce paramètre parmi les autres (Colonne des groupes, colonne de différence, écrêter de combien, nom de la feuille...)

Comme sa le paramètre apparait et je suis obligé d'y prêter attention. Donc s'il te plais, peux tu faire apparaître ce paramètre zéro absolu parmi les autres paramètres ? Au moins je serais capable de tester tout seul l'application des poissons, ou mon cas, ou tout autre cas de figure de manière aisée. Sa évitera également des erreurs de ma part.


Donc pour la colonne différence le "souci" semble levé. Mauvaise appréciation de ma part du zéro absolu. Tout simplement.

Oufff !


Pour la suite j'attends tes remarques. Je n'ai pas d'autres "bugg" que ceux dont je t'ai parlé pour le moment.

Ps : J’insiste, mais j'aimerais vraiment voir apparaître ce paramètre de réglage du zéro absolu (un nombre à virgule, donc un Long)
0
SERIEUXETCOOL Messages postés 336 Date d'inscription dimanche 3 avril 2011 Statut Membre Dernière intervention 12 juin 2012 1
26 sept. 2011 à 19:57
ah oui petite remarque qui peut avoir son importance...

Peux tu faire apparaître le paramètre de réglage du zéro absolu au même endroit que tous les autres paramètres (Colonne des groupes, colonne de différence, écrêter de combien, nom de la feuille...). Comme sa, je dispose de tous les réglages au même endroit et le risque de se tromper est moindre.

Car s'il faut que j'aille régler le paramètre de zéro absolu dans la procédure

Public Sub epurer(ByVal col As String, ByVal ligne As Integer, ByVal nb As Integer, ByVal col_tremplin As Integer, ByVal dif)
  
  Dim deb As Single
  Dim plage As Range, plage_a_supp As Range
  Dim n As Long, i As Long, j As Long, msg As String


Sa ne vas pas me plaire car je finirais par me tromper je le sais. Je préfère TOUT regrouper. Si possible bien entendu.

Cordialement,

André
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
26 sept. 2011 à 20:00
-Une autre choses qui n'est pas normale. Si l'on choisit deux valeurs d'écrêtement différentes (par exemple une fois on décide de supprimer 0 lignes puis on relance avec la suppression de 2 lignes) alors la colonne qui contient les différences change !!!!


Non ! la différence sera toujours la même, pour autant que tu repartes des mêmes données, quel que soit le nombre des lignes écrêtées. !*

Tu ne peux bien évidemment, sous peine de perdre toute logique, lancer deux fois le même traitement, l'un sur l'autre !

Il me semble que la moyenne ne se fait pas sont travail de manière correcte. Elle affiche une valeur entière alors que dans certains cas il devrait y avoir des virgules.

Montre un exemple qui ne correspondrait pas à ta demande, ici rappelée :
Dans l'ordre sa donne sa : J'ai une base de données, je commence par supprimer certaines lignes qui ne me servent pas du tout. Un fois ces lignes supprimées, j'obtiens une nouvelle base de données légèrement plus courte en termes de lignes. Sur cette dernière je procède à la moyenne de chaque série d'entier sans prendre en compte les lignes précédemment supprimées

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
26 sept. 2011 à 20:05
Au moins je serais capable de tester tout seul l'application des poissons, ou mon cas, ou tout autre cas de figure de manière aisée. Sa évitera également des erreurs de ma part.


Oublie l'exemple des poissons, qui est basé sur une notion d'heures et qui demanderait alors d'autres connaissances de ta part (et je doute que tu les aies )

Peux tu faire apparaître le paramètre de réglage du zéro absolu au même endroit que tous les autres paramètres (Colonne des groupes, colonne de différence, écrêter de combien, nom de la feuille...). Comme sa, je dispose de tous les réglages au même endroit et le risque de se tromper est moindre.

pas de problème !
Je fume ma clope et te dis quoi ajouter
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
26 sept. 2011 à 20:21
Voilà donc :
Dim feuille_donnees As String
    Dim depart As Single ' <<<<<====== ligne rajoutée ici
    Dim colonne_groupes As String, a_partir_ligne As Integer, ecreter_de_combien As Long

ecreter_de_combien = 3 '<<<<======= ici : de combien écréter en haut et en bas de chaque groupe
  
  depart = 0 ' <<<<<===== ligne rajoutée ici (et la valeur de ton choix, sous forme avec . comme séparateur décimal si utilisé, hein ...)
  
  colonnes_moyennes = Array("C") '<<<<=== ici : énumération des colonnes où faire la moyenne ("") si aucune


Ensuite :
remplacer
epurer colonne_groupes, a_partir_ligne, ecreter_de_combien, col_tremplin, colonnes_diff

par
 epurer colonne_groupes, a_partir_ligne, ecreter_de_combien, col_tremplin, colonnes_diff, depart

et remplacer :
Public Sub epurer(ByVal col As String, ByVal ligne As Integer, ByVal nb As Integer, ByVal col_tremplin As Integer, ByVal dif)
  Dim deb As Single


par

Public Sub epurer(ByVal col As String, ByVal ligne As Integer, ByVal nb As Integer, ByVal col_tremplin As Integer, ByVal dif, ByVal deb As Single)
' remarque bien : Dim deb as single a disparu d'ici, hein !


Voilà tout !

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
26 sept. 2011 à 21:11
E3n ce qui concerne maintenant ce que tu as remarqué lorsque tu n'écrête de rien :
L'explication est fort simple et elle est là :
n = Range(col & Rows.Count).End(xlUp).Row
   If nb = 0 Then Exit Sub ' <<<< la procédure d'écrêtement est purement et simplement abandonnée ici !
   msg = ""

Je ne pensais pas qu'il te viendrait à l'esprit de n'écrêter de rien, mais si tu veux également ce cas, je fais


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
26 sept. 2011 à 21:17
Déjà fait : si tu veux pouvoir écrêter de zéro ( ) il te suffit d'effacer la signe :
If nb = 0 Then Exit Sub

picétou !
Coût de cet effacement ? un peu (pas significatif) de ralentissement que j'avais voulu éviter


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
SERIEUXETCOOL Messages postés 336 Date d'inscription dimanche 3 avril 2011 Statut Membre Dernière intervention 12 juin 2012 1
26 sept. 2011 à 21:50
Bon j'ai réalisé les changements que tu me proposais pour le paramètre zéro absolu.

En définitive le programme ne fonctionne ne fonctionne pas très bien !

Seule la colonne des groupes fait son travail. La colonne des différences n'est pas correcte, ainsi que celle des moyennes.

Allons y pour les preuves :

- Numéro 1 la colonne différence. Quand je lance le code une première fois avec 0 lignes d’écrêtées, et si je relance le même code sur la même base de données initiale avec 2 lignes écrêtées alors on obtient un résultat différent sur la colonne des différences. Ce qui est faux car ce résultat est indépendant du nombre de lignes supprimées. Tu ne me crois pas ? Télécharge les photos suivantes et tu verras par toi même. (Tu peux aussi faire ces tests avec mon fichier Excel !)

Premier test :

http://www.cijoint.fr/cjlink.php?file= cj201109/cijhowqWKg.jpg
http://www.cijoint.fr/cjlink.php?file=cj201109/cijMPNLMa3.jpg

Groupe 0 : (16,45 - 16,05) = 0,4
Groupe 1 : (16,59 - 16,45) = 0,14

Ce n'est pas non plus ce que le code fait !

Puis deuxième test :

http://www.cijoint.fr/cjlink.php?file =cj201109/cijc0O0H7d.jpg
http://www.cijoint.fr/cjlink.php?file= cj201109/cijrXHSmD7.jpg
http://www.cijoint.fr/cjlink.php?file=cj201109/cijmvqpJrx.jpg


Ce n'est pas non plus ce que le code fait !


- Numéro 2 la colonne moyenne. Elle ne fonctionne pas non plus. Si tu repars des photos que tu viens de télécharger de mes 2 tests, tu peux t'amuser à calculer toi même la moyenne entre la base de données initiale et la base après écrêtement donc finale.
Tu constate que dans le premier test que j'ai fait (0 lignes écrêtées) alors la moyenne vaut

Groupe 0 : (1+2+3+4+5+6)/6 21/6 3,5
Groupe 1 : (1+2+3+4+5+6+7)/7 28/7 4

Ce n'est pas ce que le code fait !

Et lors de mon deuxième test (2 lignes écrêtées en haut et 2 en bas), la moyenne vaut :

Groupe 0 : (3+4)/2 7/2 3,5
Groupe 1 : (3+4+5)/3 12/3 4

Ce n'est pas non plus ce que le code fait !


Remarque :

Oublie l'exemple des poissons, qui est basé sur une notion d'heures et qui demanderait alors d'autres connaissances de ta part (et je doute que tu les aies )


Bien au contraire, l'exemple des poisson est un excellent exemple Ucfoutu. Que l'on parle d'heures, de secondes, de pommes, de maisons on s'en fou. Pourvu que l'on compte de la même manière sa marche. Donc tu pourrais par exemple convertir tes heures en secondes et tu n'aurais pas de problème avec l'exemple des poissons. La seule contrainte avec la gestion des heures, est que l'on utilise une base 6 pour compter le temps qui n'est pas nôtre base 10 que l'on connait mieux. Mais jongler entre une base 10 et 6 est faisable.

Dans notre exemple des poissons, il suffit de prendre des valeurs comprises entre [16h00,16H59]. Ainsi on reste dans notre base 10 traditionnelle sans embrouilles. C'est d'ailleurs pour sa que mon groupe ne va pas plus loin que 16H59. Après sa complique tout et ce n'est pas l'objet du sujet.

Conclusion :

L'exemple des poissons avec l'échelle de temps que tu as utilisée est BONNE pour notre exemple. Il suffit de remplacer le H des heures par une virgule pour s'affranchir des remarques. Ainsi 0,40 signifie 0H40 soit encore 40 Min.
Attention aux jugements trop hâtifs Ucfoutu ;). Je n'ai certes pas les connaissances suffisantes pour programmer mes pensées en vba, mais je dispose tout de même des capacités de réflexions nécessaires pour résoudre le problème dans sa globalité.


Je résume donc ou résident les problèmes qui semblent persister : Dans la colonne différence, ET dans la colonne moyenne.


Vois tu ou j'ai pu faire une erreur dans mon raisonnement; ou alors ou toi tu as pu omettre un détail ?


En tout cas on y est presque car sa prends vraiment une bonne forme la^^. Je remet encore une fois le dernier fichier Excel qui contient le dernier code valable. Si tu veux travailler dessus c'est idéal.


André

Ps : Le lien du fichier Excel
http://www.cijoint.fr/cjlink.php?file =cj201109/cijqhR1twd.xls
0
SERIEUXETCOOL Messages postés 336 Date d'inscription dimanche 3 avril 2011 Statut Membre Dernière intervention 12 juin 2012 1
26 sept. 2011 à 22:06
Merci pour la petite correction. En effet sa marche déjà mieux.

Avec cette correction tu as amélioré la colonne différence...MAIS uniquement concernant le premier groupe (le groupe 0). En effet, le groupe 1 continue d'avoir une différence qui n'est pas la bonne.

Je ne sais pas d'ou sa vient mais sa n'affiche pas la bonne valeur.


On les auras ces ptits Bugg lol...

Rien au sujet des moyennes ???
0
Rejoignez-nous