Faire une condition à partir du total de plage de cellulles [Résolu/Fermé]

Signaler
Messages postés
215
Date d'inscription
vendredi 28 novembre 2008
Statut
Membre
Dernière intervention
6 septembre 2020
-
Messages postés
215
Date d'inscription
vendredi 28 novembre 2008
Statut
Membre
Dernière intervention
6 septembre 2020
-
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

Messages postés
15430
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
24 novembre 2020
1 405
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 76687 internautes nous ont dit merci ce mois-ci

Messages postés
15430
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
24 novembre 2020
1 405
Bonjour,

test somme plage:

If Application.WorksheetFunction.Sum(Range("E" & i & ":T" & i)) = 0 Then
Messages postés
215
Date d'inscription
vendredi 28 novembre 2008
Statut
Membre
Dernière intervention
6 septembre 2020
14
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
Messages postés
15430
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
24 novembre 2020
1 405
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+
Messages postés
215
Date d'inscription
vendredi 28 novembre 2008
Statut
Membre
Dernière intervention
6 septembre 2020
14
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...
Messages postés
215
Date d'inscription
vendredi 28 novembre 2008
Statut
Membre
Dernière intervention
6 septembre 2020
14
Encore merci,
c'est très clair.
Bonne journée -
RESOLU ! et plus encore...