Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionOption 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
A quel endroit de ton code, définis tu ton zéro absolu ?
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à
For Each R In plage.Rows Cells(R.Row, dif(0)).Value = Cells(plage.Row + plage.Rows.Count - 1, 2).Value - deb Next
If dif(0) <> "" Then deb = Range(dif(0) & plage.Row + plage.Rows.Count - 1)
(16H45-16H05)=40 Min
Toi tu as fait la différence entre la dernière valeur du groupe 0 et la première valeur du groupe
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.
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
-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 !!!!
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.
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
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.
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.
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
epurer colonne_groupes, a_partir_ligne, ecreter_de_combien, col_tremplin, colonnes_diff
epurer colonne_groupes, a_partir_ligne, ecreter_de_combien, col_tremplin, colonnes_diff, depart
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
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 !
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 = ""
If nb = 0 Then Exit Sub
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 )