Faire une condition à partir du total de plage de cellulles

Résolu
Mouftie Messages postés 234 Statut Membre -  
Mouftie Messages postés 234 Statut Membre -
Bonjour,
je voudrais supprimer les lignes si toutes les données de la ligne sont à 0 et effacer les données, quand une partie seulement est à 0
J'ai écris :
Sub SuppLgVide()
'Si aucune acivité sur un jour, on supprime la ligne
'Si aucune activité dans un domaine (DA, DP ou GRC) on vide les zéros
Dim TabloSem As Range, FinSem As Integer, DebSem As Integer
Dim Lg As Range, i As Long
FinSem = Sheets("BdD").Range("A65000").End(xlUp)(1).Row
DebSem = Sheets("BdD").Range("U" & FinSem).End(xlUp).Row + 1
For i = DebSem To FinSem 'Each Lg In TabloSem
If Range("E" & i).Value = 0 And Range("F" & i).Value = 0 Then Rows.Delete
Next i
End Sub
cela fonctionne, mais j'ai une 20e de cellules à tester, ça fait beaucoup de And...
Peut-on faire une somme du style si la somme de range("E" & i & ":T" & i) =0 alors on supprime ?
L'idéal pour moi serait d'utiliser le système
si SUM(TabBdD[#This_Row,[ContTrait]:[PostTraitT]]) = 0 alors on supprime, sachant que this row est i
Car j'ai d'autres actions à mener selon cette méthode

d'avance merci pour votre aide

6 réponses

  1. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
     
    Re,

    Par contre, j'ai oublie une chose tres importante:

    For i = DebSem To FinSem

    doit etre remplacer par:

    For i = 1 To TabloSem.Rows.Count 'sinon il y a decalage dans les donnees si pas ligne 1 en premier ex: si DebSem=7----> tout faux

    '--------------------------------------------------
    Pour correspondances de colonnes

    C'est tout simple: A-->1, B--->2, etc ...

    '--------------------------------------------------
    Mais, car il y a un mais. Dans tous les cas ce sont les "colonnes" du tableau mis en memoire qui sont a prendre en compte.
    Dans votre cas vous mettez en memoire une zone de cellules qui commence en A, la pas de probleme les "colonnes" du tableau correspondent aux colonnes excel.

    Si par exemple la zone de cellules et : "E2:U12"

    les "colonnes" de donnees correspondant aux colonnes E et T d'excel seront decalee de 5: E correspond a la colonne 1 du tableau et T correspond a la colonne 16 du tableau

    SomVide = Application.WorksheetFunction.Sum(TabloSem.Range(Cells(i, 1), Cells(i, 16)))
    1
  2. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
     
    Bonjour,

    test somme plage:

    If Application.WorksheetFunction.Sum(Range("E" & i & ":T" & i)) = 0 Then
    0
  3. Mouftie Messages postés 234 Statut Membre 17
     
    Bonjour F894009,
    Merci, voici ce que ça donne
    Sub SuppLgVide()
    'Si aucune acivité sur un jour, on supprime la ligne
    'Si aucune activité dans un domaine (DA, DP ou GRC) on vide les zéros pour les moyennes
    Dim TabloSem As Range, FinSem As Integer, DebSem As Integer
    Dim SomVide As Double, SomDA As Double, SomDP As Double, SomGRC As Double
    Dim i As Long
    Application.ScreenUpdating = False 'stop rafraichissement ecran
    FinSem = Sheets("BdD").Range("A65000").End(xlUp)(1).Row
    DebSem = Sheets("BdD").Range("U" & FinSem).End(xlUp).Row + 1
    Set TabloSem = Sheets("BdD").Range("A" & DebSem & ":V" & FinSem)
    For i = DebSem To FinSem 'Each Lg In TabloSem
    SomVide = Application.WorksheetFunction.Sum(Range("E" & i & ":T" & i))
    SomDA = Application.WorksheetFunction.Sum(Range("E" & i & ":J" & i))
    SomDP = Application.WorksheetFunction.Sum(Range("K" & i & ":Q" & i))
    SomGRC = Application.WorksheetFunction.Sum(Range("R" & i & ":T" & i))
    If SomDA = 0 Then
    Range("E" & i & ":J" & i).Clear
    If SomDP = 0 Then
    Range("K" & i & ":Q" & i).Clear
    If SomGRC = 0 Then
    Range("R" & i & ":T" & i).Clear
    If SomVide = 0 Then
    Rows(i).EntireRow.Delete
    End If
    End If
    End If
    End If
    Next i
    Application.ScreenUpdating = True
    End Sub
    Cela fonctionne, mais je me demande si cela ne peut pas être optimisé ?
    Si non ma question portait également sur l'utilisation des champs du tableau excel, au lieu de range("E" & i & ":T" & i), ne peut-on pas utiliser un "truc" comme
    Application.WorksheetFunction.Sum(Tablo1[ row i,[Champs1:Champs5]])
    Merci de ta réponse
    0
  4. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
     
    Bonjour,

    Ca marche pas tout a fait comme ca, mais ca y ressemble.

    ex:
    pour
    SomVide = Application.WorksheetFunction.Sum(Range("E" & i & ":T" & i))

    ca donne ceci: un peu moins parlant si pas de commentaire, mais plus rapide en execution
    SomVide = Application.WorksheetFunction.Sum(TabloSem.Range(Cells(i, 5), Cells(i, 20)))

    A+
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Mouftie Messages postés 234 Statut Membre 17
     
    Re Bonjour F894009,
    Merci beaucoup, c'est exactement ce que je voulais ; sinon, au niveau de ma procédure, il n'y a pas plus simple que tous ces if ?

    Et sans abuser une autre question d'ordre général (mais je suis autodidacte et je cherche à prendre les bonnes habitudes...)
    comment faites-vous pour vous y retrouver avec les cells(i, 20) ? comment savez-vous que 20 correspond à la colonne T ou inversement que la colonne T est la 20ème.
    De même dans les formules RC[-2] ; vous avez un tableau devant les yeux ? c'est l'expérience ?
    Je n'ai jamais lu un mot là dessus et c'est un mes cauchemards...
    0
  7. Mouftie Messages postés 234 Statut Membre 17
     
    Encore merci,
    c'est très clair.
    Bonne journée -
    RESOLU ! et plus encore...
    0