Microsoft 365 VBA contrôle cellule(s) vides(s) encadrée(s) par cellules non vides

spike29

XLDnaute Occasionnel
Bonjour le forum,

J'ai un tableau col "A:I" dans lequel un certain nombre de saisies vont avoir lieu.

Les données de ce tableaux vont être automatiquement archivées dans une Feuil d'archives puis tamisées vers un module statistiques.

Je tente en vain de mettre en place un code qui contrôle l'absence de ligne(s) vide entre deux lignes pleines (en effet un creux de ligne entre deux lignes pleine empêche une partie de l'archivage).
Mon code actuel ne permet de contrôler que l'absence de ligne vide (au singulier) encadrée par deux cellules non vides.

Ayant déjà constaté que certains utilisateurs laissent parfois plusieurs lignes non remplies je souhaiterai que le code puise détecter la présence d'une ou plusieurs cellules non remplies encadrées par des cellules non vides.

A noter que les utilisateurs n'ont pas forcément besoin d'utiliser les 19 lignes du tableau. Il faut donc que le code ne s'attende pas à avoir les 19 lignes du tableau remplies.

Ci-dessous mon code :

Étant donnée que certaines cellules peuvent être vides sur l'ensemble des lignes (cellule commentaires par exemple, car il n'y en a pas systématiquement), je suis partie sur le contrôle de cellule vide en prenant comme référence la colonne C (qui elle doit forcément être remplie) dès lors que l'on entame la saisie sur une ligne.

Mon besoin :

Si le code détecte dans la colonne C (entre les cellules 5:23) une ou plusieurs cellules vide(s) encadrée(s) par deux cellules non vide => Exit sub

Code:
Sub TEST()

With Sheets("TEST")

For y = 5 To 17
    
     If IsEmpty(Range("C" & y)) And Not IsEmpty(Range("C" & y + 1)) And Not IsEmpty(Range("C" & y - 1)) Then
     MsgBox "Il y a une ligne qui n'est visiblement pas remplie, merci de ne pas laisser de ligne vide MERCI !", vbCritical, "Contrôle lignes vides"
     Exit Sub
    
End If

Next y

End With


End Sub


En PJ un fichier d'exemple.

Merci d'avance pour votre aide.
 

Pièces jointes

  • TEST2.xlsm
    18.1 KB · Affichages: 13
Solution
Re,
Ce bout de code détecte s'il y a une cellule vide dans la colonne C

VB:
Sub TEST()
With Sheets("TEST")
Derligne = .Range("C1500").End(xlUp).Row
For y = 5 To Derligne
If IsEmpty(Range("C" & y)) Then
MsgBox "Il y a une ligne qui n'est visiblement pas remplie, merci de ne pas laisser de ligne vide MERCI !", vbCritical, "Contrôle lignes vides"
Exit Sub
End If
Next y
End With
End Sub

kingfadhel

XLDnaute Impliqué
Bon après-midi à tous,
essaye ce bout de code:

VB:
Sub TEST()
Dim y As Integer
For y = 5 To 23
If Cells(y, 3) = "" Then
If Cells(y - 1, 3) <> "" Then
MsgBox "Dernière ligne remplie: " & y - 1
Else
MsgBox "La ligne :" & y & " est une ligne qui n'est visiblement pas remplie, merci de ne pas laisser de ligne vide MERCI !", vbCritical, "Contrôle lignes vides"
Exit Sub
End If
End If
Next y
End Sub
 

kingfadhel

XLDnaute Impliqué
Re,
Ce bout de code détecte s'il y a une cellule vide dans la colonne C

VB:
Sub TEST()
With Sheets("TEST")
Derligne = .Range("C1500").End(xlUp).Row
For y = 5 To Derligne
If IsEmpty(Range("C" & y)) Then
MsgBox "Il y a une ligne qui n'est visiblement pas remplie, merci de ne pas laisser de ligne vide MERCI !", vbCritical, "Contrôle lignes vides"
Exit Sub
End If
Next y
End With
End Sub
 

job75

XLDnaute Barbatruc
Bonjour spike29, kingfadhel,

S'il s'agit de grouper les lignes non vides voyez le fichier joint et cette macro :
VB:
Sub Grouper()
Application.ScreenUpdating = False
With Sheets("TEST").[A4].CurrentRegion
    .Columns(1).EntireColumn.Insert 'insère une colonne auxiliaire
    .Columns(0) = "=SIGN(COUNTA(RC[2]:RC[" & .Columns.Count & "]))"
    Union(.Columns(0), .Cells).Sort .Columns(0), xlDescending 'tri pour grouper les lignes non vides en haut
    .Columns(0).EntireColumn.Delete 'supprime la colonne auxiliaire
End With
End Sub
A+
 

Pièces jointes

  • TEST(1).xlsm
    18.6 KB · Affichages: 5

spike29

XLDnaute Occasionnel
Bonjour le fil,

Merci à tous pour vos réponses.

@kingfadhel , ta seconde réponse répond complètement à ma demande.
@job75 , ta réponse est très intéressante dans la mesure où elle va au delà de mon besoin initial. Car plutôt de bloquer l'utilisateur en lui demandant d'apporter lui même la correction via un MsgBox, elle apporte automatiquement la correction qui va bien.

J'ai essayé d'adapter ton code afin que les colonnes A et I soit excluent de la plage de groupement de ligne.
Le groupement concernerait ainsi les colonnes B à I.
Mes connaissances en VBA étant ce qu'elles sont, je n'y suis pas parvenu.

Bonne journée
 

job75

XLDnaute Barbatruc
Bonjour spike29, le forum,
J'ai essayé d'adapter ton code afin que les colonnes A et I soit excluent de la plage de groupement de ligne.
Le groupement concernerait ainsi les colonnes B à I.
Ce n'est pas clair, faut-il exclure la colonne I ? Je suppose que non, fichier (2) :
VB:
Sub Grouper()
Application.ScreenUpdating = False
With Sheets("TEST").[A4].CurrentRegion
    If .Columns.Count = 1 Then Exit Sub
    .Columns(2).EntireColumn.Insert 'insère une colonne auxiliaire
    .Columns(2) = "=SIGN(COUNTA(RC[1]:RC[" & .Columns.Count - 2 & "]))"
    .Columns(2).Resize(, .Columns.Count - 1).Sort .Columns(2), xlDescending 'tri pour grouper les lignes non vides en haut
    .Columns(2).EntireColumn.Delete 'supprime la colonne auxiliaire
End With
End Sub
A+
 

Pièces jointes

  • TEST(2).xlsm
    18.3 KB · Affichages: 7

Discussions similaires