XL 2010 Macro : supprimer une ligne dont la 1ere cellule est vide MAIS ...

jm480

XLDnaute Nouveau
Bonjour à toutes et tous,

Je suis nul en macros, parce que je n'en fais que trop rarement (🤐) mais en général je me débrouille avec le Forum...

J'ai ce fichier qui est généré par un robot (logs d'EDI).

J'ai réussi a faire un macro qui me supprime des colonnes inutiles.

Je veux supprimer les lignes qui présentent des cellules vides, mais qui ont quand même des données (cf les lignes avec les caractères en rouge).

Auriez vous une idée ???

Ce que j'ai trouvé sur le net fonctionne bien pour les lignes "totalement vides" mais ça ne marche pas quand il y a des données ....

MERCI beaucoup pour votre aide :)

CMAF-SLTSR20C WWOTHLCHFRFOS
26-mars-21
20-Feb-2125-Feb-21
janv-21​
01-mars-21​
CMAF-SLTSR20C WWOTHLCHFRFOS
26-mars-21​
20-Feb-2125-Feb-21
janv-21​
01-mars-21​
CMAF-SLTSR20C WWOTHLCHFRFOS
26-mars-21​
CMAF-SLTSR20VK70 HMMYPENUSCHS16-Apr-21
12-mars-21​
14-mars-21​
janv-21​
01-Apr-21CMAF-SLTSR20VK70 HMMYPENUSCHS16-Apr-21
12-mars-21​
14-mars-21​
janv-21​
01-mars-21​
CMAF-SLTSR20VK70 HMMYPENUSCHS16-Apr-21
CMAF-SLTSR20VK70 HMMYPENUSCHS02-May-21
24-mars-21​
24-mars-21​
Feb-2101-May-21CMAF-SLTSR20VK70 HMMYPENUSCHS02-May-21
24-mars-21​
24-mars-21​
mars-21​
01-May-21CMAF-SLTSR20VK70 HMMYPENUSCHS02-May-21
CMAF-SLTSR20C WWOIDBLWCAHAL21-Apr-21
22-mars-21​
22-mars-21​
Apr-2101-Apr-21CMAF-SLTSR20C WWOIDBLWCAHAL21-Apr-21
22-mars-21​
22-mars-21​
Apr-2101-Apr-21CMAF-SLTSR20C WWOIDBLWCAHAL21-Apr-21
22-mars-21​
22-mars-21​
Apr-2101-Apr-21CMAF-SLTSR20C WWOIDBLWCAHAL21-Apr-21
CMAF-SLTSR20C WWOMYPENUSCHS23-Apr-21
23-mars-21​
23-mars-21​
mars-21​
01-May-21CMAF-SLTSR20C WWOMYPENUSCHS
23-Apr-21​
 

Pièces jointes

  • Suivi Excel.xlsm
    27.7 KB · Affichages: 12
Dernière édition:

soan

XLDnaute Barbatruc
Inactif
@jm480

ton fichier en retour ; fais Ctrl e ➯ travail effectué ! :)

ça passe de 205 lignes à 160 lignes, soit 45 lignes en moins.

VB:
Sub Essai()
  Dim n&: n = Cells(Rows.Count, "K").End(3).Row: If IsEmpty([K1]) Then Exit Sub
  Dim t As Byte, j As Byte, i&: Application.ScreenUpdating = 0
  For i = n To 1 Step -1
    With Cells(i, 1)
      t = 0
      For j = 0 To 9 'pour les colonnes A à J, SAUF F, et PAS K
        If j <> 5 Then If Trim$(.Offset(, j)) = "" Then t = t + 1
      Next j
    End With
    If t = 9 Then Rows(i).Delete
  Next i
End Sub

j'ai mis Trim$() car beaucoup de cellules apparemment vides
contiennent en fait un espace !

soan
 

Pièces jointes

  • Suivi Excel.xlsm
    35.1 KB · Affichages: 4

job75

XLDnaute Barbatruc
Bonjour jm480, soan,

Dans ce genre de problème il vaut mieux utiliser cette méthode, très rapide grâce au tri de regroupement :
VB:
Sub Nettoyer()
Dim t, n&
t = Timer
Application.ScreenUpdating = False
With Sheets("DATA J").UsedRange
    .Columns(2).EntireColumn.Insert 'insère une colonne auxiliaire
    .Columns(2) = "=1/(TRIM(RC[-1])<>"""")"
    .Columns(2) = .Columns(2).Value 'supprime les formules
    .Sort .Columns(2), xlAscending, Header:=xlNo 'tri pour regrouper les valeurs d'erreur et accélérer
    On Error Resume Next 'si aucune SpecialCell
    With .Columns(2).SpecialCells(xlCellTypeConstants, 16)
        n = .Count
        .EntireRow.Delete 'suppression des valeurs d'erreur
    End With
    .Columns(2).EntireColumn.Delete 'supprime la colonne auxiliaire
    With .Parent.UsedRange: End With 'actualise la barre de défilement verticale
End With
Application.ScreenUpdating = True
MsgBox n & " ligne(s) supprimée(s) en " & Format(Timer - t, "0.00 \sec")
End Sub
Fichier joint, je l'ai testé en recopiant le tableau de 205 lignes sur 82 000 lignes.

La macro s'exécute chez moi en 0,4 seconde.

A+
 

Pièces jointes

  • Suivi Excel(1).xlsm
    36.6 KB · Affichages: 1

jm480

XLDnaute Nouveau
j'ai mis Trim$() car beaucoup de cellules apparemment vides
contiennent en fait un espace !

:oops:

J'ai bien fait de demander, je n'aurais jamais été capable de tout ça !

Je dois m'imprimer ça sur papier et vous poser des questions pour essayer de comprendre la logique, car le jour ou une colonne se rajoute, je serai complétement lourdé !

J'en rajoute 1 couche :

On me demande un rapport simplifié, c'est à dire avec UNIQUEMENT les valeurs "vide" (= on fait l'inverse de ce que j'ai demandé tout à l'heure).

A ce titre, j'aurais pensé à quelque chose :

1 bouton "simple"
1 bouton "détaillé"
1 bouton exporter la sélection (= ce qui est affiché) pour que l'utilisateur fasse ce qu'il veut.

Est ce que c'est cohérant ?

MERCI encore 👍
 

job75

XLDnaute Barbatruc
Re, bonsoir mapomme,

Oui avec un tableau VBA c'est très rapide aussi mais les formats (s'il y en a) ne sont pas conservés.

Pour finir, si l'on veut tester 9 cellules comme le fait soan on utilisera ce fichier (2) avec la formule :
VB:
.Columns(2) = "=1/(TRIM(RC[-1]&RC[1]&RC[2]&RC[3]&RC[4]&RC[6]&RC[7]&RC[8]&RC[9])<>"""")"
Sur 82 000 lignes c'est à peine plus long => 0,63 seconde.

Edit : ah tiens, mapomme a supprimé son message, dommage.

A+
 

Pièces jointes

  • Suivi Excel(2).xlsm
    36.8 KB · Affichages: 1
Dernière édition:

soan

XLDnaute Barbatruc
Inactif
@jm480 (bonsoir job75)

voici la nouvelle version du fichier. :)

* ouvre le fichier en lecture seule ; tu verras l'item pour faire ça en cliquant sur la petite flèche bas qui est à droite du bouton Ouvrir (qui est dans la boîte de dialogue « Ouvrir » un fichier).

* clique sur le bouton "Simple" ➯ Rapport simplifié, avec uniquement les lignes « vides » (45 lignes).

* ferme le fichier, puis ouvre-le de nouveau en lecture seule.

* clique sur le bouton "Détaillé" ➯ Rapport détaillé, toutes les lignes sauf les « vides » (160 lignes).​



pour l'export de fichier, je pense que tu parles d'un export en fichier .pdf ; ou peut-être en .csv ? dans les 2 cas, je te donne la même réponse : désolé, mais j'm'y connais pas bien en export de fichiers ; aussi, je laisse à un autre intervenant le soin de t'aider pour faire cela ; bonne chance ! 🍀


regarde aussi les 3 autres posts de @job75 : son post #5 ; son post #7 ; et son post #8. ;)

bizarre, tout à l'heure j'avais vu un post de @mapomme (salut), mais il l'a supprimé.

soan
 

Pièces jointes

  • Suivi Excel.xlsm
    35.1 KB · Affichages: 2

soan

XLDnaute Barbatruc
Inactif
@jm480, le fil,

Lis d'abord mon post précédent. :)

je mets ici le code VBA du fichier de mon post #9 :

VB:
Option Explicit

Private Sub Job(k As Byte)
  Dim n&: n = Cells(Rows.Count, "K").End(3).Row: If IsEmpty([K1]) Then Exit Sub
  Dim t As Byte, j As Byte, i&: Application.ScreenUpdating = 0
  For i = n To 1 Step -1
    With Cells(i, 1)
      t = 0
      For j = 0 To 9 'pour les colonnes A à J, SAUF F, et PAS K
        If j <> 5 Then If Trim$(.Offset(, j)) = "" Then t = t + 1
      Next j
    End With
    If k = 1 Then
      If t <> 9 Then Rows(i).Delete
    Else
      If t = 9 Then Rows(i).Delete
    End If
  Next i
End Sub

Sub RapSMP()
  Job 1
End Sub

Sub RapDTL()
  Job 2
End Sub

sur l'unique feuille de calcul "DATA J" : le bouton « Simple » appelle la sub RapSMP() (= rapport simplifié) ; et le bouton « Détaillé » appelle la sub RapDTL() (= rapport détaillé) ; ensuite, ces 2 subs appellent la sub privée Job() : l'utilisateur ne peut pas l'appeler directement, et c'est pas à lui de le faire ! 😛

soan
 

Discussions similaires