VBA Supprimer Ligne
Bonjours a tous, ceci est le premier post sur le forum, mais je pense venir plus souvent pour mieux comprendre le vba.
J'ai donc des fichiers excel à traiter chacun possédants environ 1 millier de lignes.
Dance ce genre.
Et moi il faut que je nettoie ce genre de tableaux. Il faut que je regarde les lignes ayant un rtmed proche environ 0,001 et pour celles étant dans cette intervalle, il faut que je compare la moyenne du reste des colonnes sur la droite et que je ne garde que celle ayant la plus grande moyenne.
Donc avec un collègue nous avons un peu travaillé sur une macro mais maintenant nous somme bloqués, donc actuellement j'ai ca :
Sub Tri()
Dim RtmedAct As Double
Dim RtmedSuiv As Double
Dim Interval As Double
Dim k As Integer
Dim Avg As Integer
Interval = 0.001
Sheets("diffreport").Select
Dim RTMED(600, 1) As Double
For Col = 2 To 600
RTMED(Col, 0) = Range("C" & Col).Value
RTMED(Col, 1) = Range("S" & Col).Value
Next Col
Dim Comp(600, 1) As Double
For Col = 2 To 600
Comp(Col, 0) = 0
Comp(Col, 1) = 0
Next Col
For i = 0 To 600
RtmedAct = RTMED(i, 0)
k = 1
For j = 0 To 600
RtmedSuiv = RTMED(j, 0)
Comp(0, 0) = i
If RtmedSuiv < (RtmedAct + Interval) And RtmedSuiv > (RtmedAct - Interval) Then
Comp(k, 0) = j
Comp(k, 1) = Range("S" & j + 2)
k = k + 1
End If
Next j
For j = 0 To k - 1
Avg = Comp(0, 0)
If Comp(j, 1) > Comp(Avg, 1) Then
Avg = Comp(j, 0)
End If
Next j
For j = 0 To k - 1
If Comp(j, 0) <> Avg Then
Dim S As Integer
S = CInt(Comp(j, 0))
Sheets(Worksheets.Count).Range(S & ":" & S).ClearContents
'Rows("A" & S & ":ZZ" & S).ClearContents
'Rows(S).ClearContents
'Selection.Delete Shift:=xlUp
End If
Next j
For l = 0 To k
Comp(l, 0) = 0
Comp(l, 1) = 0
Next l
Next i
End SubMais quand je lance j'ai un probleme sur cette ligne Sheets(Worksheets.Count).Range(S & ":" & S).ClearContents qui ne veux pas effacer les lignes. Je n'ai pas commenté le code mais je peux le faire si quelqu'un le souhaite. J'ai une erreur du type 1004 Erreur définie par l'application ou par l'objet.
J'ai appris le vba aujourd'hui sur le tas, soyez donc indulgents ! Merci d'avance !
Edit Dan : supprimé Besoin d'aide dans titre du sujet
Bonjour
En admettant que S vaut 14 ,tu marques (en simplifiant) efface la zone 14 ?????
Soit tu notes la ligne complète
Sheets(Worksheets.Count).Rows(S).ClearcontentsSoit une zone
Sheets(Worksheets.Count).Range("A" & s & ":ZZ" & S).ClearcontentsUn fichier serait plus utile si tu veux de l'aide
Merci pour cette réponse rapide, donc voici mon fichier pour regarder
La fonction pièce jointe ne fonctionne pas donc voici le lien ovh.
Mais dans les deux cas je n'arrive pas à faire fonctionner cette commande.
Bonsoir
J'ai essayé de comprendre ta logique : Pas sur d'y être arrivé
Voici comme je vois ce programme, j'y ai mis des commentaires pour que tu essaies de suivre ma logique
Si pas ça tu jettes tout
Merci pour ta réponse. Je suis impréssioné par ce que tu as fait, c'est presque parfait.
La variable Avg sert a prendre la ligne de la moyenne la plus grande de l'ensemble des lignes qui sont dans l'intervalle.
Et ensuite il faut que je rajoute une boucle qui supprime les lignes vides.
Je regarde ton code pour essayer de tout comprendre mais dans l'ensemble c'est impréssionant ! Merci !
Je me suis peut etre mal exprimé. La variable Avg était pour pour prendre le numero de la ligne avec la moyenne la plus grande. Et ensuite on supprime les lignes autres que celle qui est dans Avg.
Bonsoir
Birdroun a écrit :La variable Avg sert a prendre la ligne de la moyenne la plus grande de l'ensemble des lignes qui sont dans l'intervalle.
C'est ce que j'avais compris et que j'ai essayé de faire
Birdroun a écrit :Et ensuite il faut que je rajoute une boucle qui supprime les lignes vides.
Dès que l'on compare 2 moyennes dans 2 lignes du groupe la moyenne la plus faible est éliminée
La ligne de la feuille Excel est effacée et la valeur dans le tableau RTMED est mis à 0
Mais quand je regarde les moyennes a la main, ce n'est pas la plus grande qui reste et je ne comprend pas d'ou cela vient.
Par exemple dans le cas de rtmed = 5.20885 la moyenne la plus grande correspond à 181670, soit la ligne avec un mzmed de 225,09 mais la macro me garde la ligne avec mzmed de 211,09. Mais dans pour d'autres lignes le script fonctionne bien.
En tout cas merci déjà pour tout ce que vous avez fait !
Bonjour
Tu fais bien de vérifier
Une erreur de variable J à la place de L
Remplaces la partie surlignée
If RtmedSuiv < (RtmedAct + Interval) And RtmedSuiv > (RtmedAct - Interval) Then
' on note La ligne et sa moyenne
Indice = Indice + 1
Comp(Indice, 0) = L ' Numéro de la ligne dans le tableau
Comp(Indice, 1) = RTMED(L, 1) ' Moyenne
End IfCe qui permet de voir que la meilleure moyenne est 3 520 371,79150639 à la ligne 8
Vérifies encore
Effectivement c'est parfait maintenant. Je vais essayer de bien mieux apprendre le vba sous excel, car quand on a beaucoup de données a traiter c'est juste parfait. En tout cas merci pour ce travail, j'aurais appris beaucoup et je vais essayer de trouver un bouquin et voir les tutos du site pour me perfectionner !
Merci beaucoup !