Access supprimer ligne quand cellule est vide ou égale à 0

k.Karim

XLDnaute Nouveau
o_O
Bonjour,
j'ai un petit problème concernant la sélection d'une plage spécifique dans un tableau pour supprimer les lignes d'une colonne dont la valeur de la quantité est égale à zéro (Sortie=0).
j'ai testé certaines solutions trouvées sur le net mais ce n'est pas ce que je recherche j'ai fais une formule(affiché dans le code en commentaire) avec la condition si ça ne marche pas j'ai testé une vba de JCGL du 29 juin 2010 sur ce forum
mais ce n'est pas exactement ce que je veux, car elle efface toutes les ligne vide de la feuille (qui contient des titres et le logo).
dans Mon tableau, de la ligne 8 à la ligne 17 contiennent des formules et ces formules doivent restées même si une ou plusieurs cellules sont vides ou contiennent une valeur nulle donc le test doit être sur une plage allant de la ligne 18 à la ligne 27.
j'espère avoir su exposé mon problème et merci de m'aider (^_^).
voici mon code:

Private Sub BoutonValidationSortie()
Dim Lig%
Application.ScreenUpdating = False
Sheets("Base de donnée Sortie").Visible = True
Sheets("Base de donnée Sortie").Select
ActiveSheet.Protect DrawingObjects:=False, Contents:=False, Scenarios:=False
'*********************************
' Enregistrement Dix Lignes Dimanche 26/09/2020 par karim
'*********************************
Rows("8:17").EntireRow.AutoFit
Range("A8:F17").Select

Selection.Copy
Range("18:27").Select
Selection.Insert Shift:=xlDown
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Rows("8:17").RowHeight = 0
'*********************************
'Enlever Lignes Vides contenant 0 en quantité par Karim le 27/09/2020
'**********************************************
' If Range("f18").Value = "0" Then Range("f18").EntireRow.Delete
' If Range("f19").Value = "0" Then Range("f19").EntireRow.Delete
' If Range("f20").Value = "0" Then Range("f20").EntireRow.Delete
' If Range("f21").Value = "0" Then Range("f21").EntireRow.Delete
' If Range("f22").Value = "0" Then Range("f22").EntireRow.Delete
' If Range("f23").Value = "0" Then Range("f23").EntireRow.Delete
' If Range("f24").Value = "0" Then Range("f24").EntireRow.Delete
' If Range("f25").Value = "0" Then Range("f25").EntireRow.Delete
' If Range("f26").Value = "0" Then Range("f26").EntireRow.Delete
' If Range("f27").Value = "0" Then Range("f27").EntireRow.Delete
' If Range("f28").Value = "0" Then Range("f28").EntireRow.Delete
' If Range("f29").Value = "0" Then Range("f29").EntireRow.Delete
' If Range("f30").Value = "0" Then Range("f30").EntireRow.Delete
'***********************************************
Application.ScreenUpdating = 0 'code tiré du net forum Excel Download de JCGL 29 juin 2010
For Lig = [f65536].End(xlUp).Row To 1 Step -1
If Range("F" & Lig).Value = 0 Then Rows(Lig).Delete
Next


'************************************************

Application.CutCopyMode = False
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
Range("A18").Select
Sheets("Base de Donnée Sortie").Select
'Sheets("Mise à Jour des Interventions").Select
Application.ScreenUpdating = True
MsgBox "La Sortie PR Enregistrée avec Succée: ", vbOKOnly + vbInformation, "Enregistrement Validé"


End Sub
 
Solution
Bonjour Karim,

Dans ton post #8, tu as écrit : « NB: pour ce correctif je vais l'étudier pour voir la différence. »

La différence est indiquée ci-dessous. Je préfère te l'indiquer car il y a certains détails qui sont subtils ! ;)

Avec For lig = 26 To 12 Step -1 : ça boucle sur les lignes 26 à 12, quelque soit le nombre de
lignes réel du tableau structuré, et peu importe qu'il soit plus court ou plus long ! si le tableau
est plus court, par exemple dernière ligne utilisée = ligne n° 20, alors ça va lire inutilement
les lignes 26 à 21 (de bas en haut), mais le...

k.Karim

XLDnaute Nouveau
Bonjour,
je viens de trouver une solution à mon problème qui consiste à créer un bouton avec une macro qui fonctionne très bien
un peu lourde, s'il y'a mieux je suis preneur ;)
voici le code:
Sub Bouton6_Clic()
'************************************************************************************
'si une ligne de la feuille de ("Base de Donnée Sortie") est égale à Zéro dans la colonne H elle sera supprimer ..
'Enlever Lignes Vides contenant 0 en quantité par Karim le 27/09/2020
'************************************************************************************
'On Error Resume Next
Dim ligne As Long
'lignes de code créer le 28/09/2020 et mise au point le 29/09/2020 à 07h:58
'********************************************************************************************************
'Cette procédure à pour effet de commencer à supprimer les lignes à compter de la dernière ligne de la sélection du tableau
'c'est pour cela l'inversion du code originel qui était du haut vers le bas pour plus d'efficacité.
'********************************************************************************************************
ligne = ligne + 21
Range("A22:F31").Select

For ligne = 31 To 31 ' Boucle sur les lignes.
If Cells(ligne, 6) <> "0" Then Exit For ' Sort de la boucle si
Selection.ListObject.ListRows(20).Delete 'l'indice 20 et le numéro de la ligne dans le tableau
Next ligne

For ligne = 30 To 31
If Cells(ligne, 6) <> "0" Then Exit For ' Sort de la boucle si
Selection.ListObject.ListRows(19).Delete 'l'indice 19 et le numéro de la ligne dans le tableau
Next ligne

For ligne = 29 To 31
If Cells(ligne, 6) <> "0" Then Exit For ' Sort de la boucle si
Selection.ListObject.ListRows(18).Delete 'l'indice 18 et le numéro de la ligne dans le tableau
Next ligne

For ligne = 28 To 31
If Cells(ligne, 6) <> "0" Or Cells(ligne, 6) <> "" Then Exit For ' Sort de la boucle si
Selection.ListObject.ListRows(17).Delete 'l'indice 17 et le numéro de la ligne dans le tableau
Next ligne

For ligne = 27 To 31
If Cells(ligne, 6) <> "0" Then Exit For ' Sort de la boucle si
Selection.ListObject.ListRows(16).Delete 'l'indice 16 et le numéro de la ligne dans le tableau
Next ligne

For ligne = 26 To 31
If Cells(ligne, 6) <> "0" Then Exit For ' Sort de la boucle si
Selection.ListObject.ListRows(15).Delete 'l'indice 15 et le numéro de la ligne dans le tableau
Next ligne

For ligne = 25 To 31
If Cells(ligne, 6) <> "0" Then Exit For ' Sort de la boucle si
Selection.ListObject.ListRows(14).Delete 'l'indice 14 et le numéro de la ligne dans le tableau
Next ligne

For ligne = 24 To 31
If Cells(ligne, 6) <> "0" Then Exit For ' Sort de la boucle si
Selection.ListObject.ListRows(13).Delete 'l'indice 13 et le numéro de la ligne dans le tableau
Next ligne

For ligne = 23 To 31
If Cells(ligne, 6) <> "0" Then Exit For ' Sort de la boucle si
Selection.ListObject.ListRows(12).Delete 'l'indice 12 et le numéro de la ligne dans le tableau
Next ligne

For ligne = 22 To 31
If Cells(ligne, 6) <> "0" Then Exit For ' Sort de la boucle si
Selection.ListObject.ListRows(11).Delete 'l'indice 11 et le numéro de la ligne dans le tableau
Next ligne


End Sub
 

Pièces jointes

  • Classeur1.xlsm
    133.7 KB · Affichages: 4

soan

XLDnaute Barbatruc
Inactif
Bonjour Karim,

Oooops ! :oops: j'viens d'voir dans mon code VBA une petite erreur :

J'avais mis cette instruction : For lig = 26 To 12 Step -1

alors que ça doit être : For lig = dlg To 12 Step -1

Code VBA complet (sans les commentaires) :

VB:
Option Explicit

Sub Bouton6_Clic()
  Dim dlg&, lig&: Application.ScreenUpdating = 0
  With ActiveSheet.ListObjects("TabBaseDonnee117")
    dlg = .ListRows.Count + 11
    For lig = dlg To 12 Step -1
      If Cells(lig, 6) = 0 Then .ListRows(lig - 11).Delete
    Next lig
  End With
End Sub
Le fichier joint ci-dessous contient cette petite correction.

(j'espère que tu repasseras sur ce sujet pour voir ce petit rectificatif !)


soan
 

Pièces jointes

  • Classeur1.xlsm
    28.2 KB · Affichages: 8

k.Karim

XLDnaute Nouveau
Bonjour,
:Dmerci Soan pour ce correctif, ton premier code marche à merveille sauf que j'ai fait quelques modification pour l'adapter à supprime un certains nombre précis de lignes (soit seulement 10 lignes après la dixième ligne du tableau car les dix premières contiennent une formule) merci encore,
bonne journée.
à plus .
NB: pour ce correctif je vais l'étudier pour voir la différence.
 

k.Karim

XLDnaute Nouveau
Re bonjour Soan
je reconnaît que ton deuxième code supprime toute les lignes vide ou égale à Zéro (0) de la colonne "H" du tableau, cela me sera très utile pour faire de l'ordre dans mes prochains tableaux alors que le premier Code supprime qu' une sélection de lignes , merci mille fois encore ;)
 

soan

XLDnaute Barbatruc
Inactif
Bonjour Karim,

Dans ton post #8, tu as écrit : « NB: pour ce correctif je vais l'étudier pour voir la différence. »

La différence est indiquée ci-dessous. Je préfère te l'indiquer car il y a certains détails qui sont subtils ! ;)

Avec For lig = 26 To 12 Step -1 : ça boucle sur les lignes 26 à 12, quelque soit le nombre de
lignes réel du tableau structuré, et peu importe qu'il soit plus court ou plus long ! si le tableau
est plus court, par exemple dernière ligne utilisée = ligne n° 20, alors ça va lire inutilement
les lignes 26 à 21 (de bas en haut), mais le résultat de la macro sera quand même juste :
les bonnes lignes auront été supprimées
; si le tableau est plus long, par ex. dernière ligne
utilisée = ligne n° 30, alors les lignes 30 à 27 seront purement et simplement ignorées,
et bien sûr, le résultat de la macro sera faux : les lignes 30 à 27 qui contiennent 0 en
colonne F ne seront pas supprimées ! le résultat serait juste uniquement dans le cas où
aucune des lignes
30 à 27 ne contient 0 en colonne F, mais ce ne serait évidemment
qu'une pure coïncidence ! et la macro serait quand même boguée !


Avec For lig = dlg To 12 Step -1 : ça boucle sur les lignes nécessaires, quelle que soit
la longueur réelle du tableau structuré
, car juste avant cette instruction, j'ai mis :
dlg = .ListRows.Count + 11 ; sans + 11, dlg serait le nombre de lignes du tableau : 15 ;
mais il faut tenir compte du fait que la ligne d'en-têtes est en ligne 11 ; donc la 1ère
ligne de données du tableau est la ligne n° 1 + 11 = ligne n° 12 ; et la dernière ligne
de données du tableau est la ligne n° 15 + 11 = ligne n° 26 ; ainsi, avec dlg, c'est OK :
ça boucle de la dernière ligne du tableau structuré à la 1ère ligne, donc des lignes
26 à 12.

---------------------------------------------------------------------------------------------------

Comme tu as écrit que tu veux laisser intactes les dix premières lignes du tableau qui
contiennent des formules, il suffit de mettre : For lig = dlg To 22 Step -1 ; ainsi, les 10
lignes 12 à 21 ne seront pas « utilisées » par la boucle : elles resteront « intactes » ;
note aussi que si le calcul de dlg tombe avant 22, alors la boucle ne sera simplement
pas exécutée
; exemple : nombre de lignes réel du tableau : 10 ; dlg = 10 + 11 = 21 ;
For lig = dlg To 22 Step -1For lig = 21 To 22 Step -1 boucle non exécutée, car
avec Step -1 : 21 est déjà avant 22.


soan
 
Dernière édition:

k.Karim

XLDnaute Nouveau
:)
Bonsoir Soan,
un grand merci, en exécutant ton code pas à pas j'ai bien compris ton code et avec ton explication, je reconnais aucune ambiguïté n'est en suspend, tout est claire comme de l'eau de roche merci encore. ça sera mon code fétiche.
 

Discussions similaires