Résolu supprimer ligne avec cellules contigues de D à A pour les cellules de la colonne D vide.

Amandiers

Nouveau membre
Bonjour à tous, voila je tourne en rond après plusieurs jours de recherche sur les forums, alors un peu d'aide serait bien venue. Voici mon problème :
sous excel j'ai un tableau de A à D, avec plusieurs milliers de lignes.
je souhaite supprimer toutes les lignes dont la cellule en D est vide.
Cela parait simple, mais petite difficulté en colonne B j'ai des cellules fusionnées, je ne peux pas les de-fusionner sous peine de perdre les infos qui me sont indispensable.
J'ai compris qu'il faut faire une recherche du bas vers le haut et mon idée était de sélectionner en remontant la cellule vide en D, de la prendre en cellule active, d'étendre la sélection de D vers A et de supprimer à ce moment la sélection. puis de passer à la cellule suivante en remontant.
si une demande existe déjà, je ne l'ai pas trouvée, merci de m'aiguiller.
note : j'ai de faibles connaissances et j'aurais aimé écrire une macro en ce sens.
D'avance Merci
 

drul

Obscur pro du hardware
Staff
Salut, tu as déjà pondu qqch ? si oui poste ici, c'est toujours mieux de partir de ton code.

Question: j'ai bien le problème avec les cellules en B, mais la réaction doit être laquelle ? on "défusionne les cellules en B" ? ou on ne supprime pas (beaucoup plus simple) ?
 

Amandiers

Nouveau membre
Bonjour drul, merci pour ton intervention : J'explique , je dois trier un relevé bancaire contenant beaucoup d'informations pour ne garder que les lignes au crédit du compte c.a.d. avec le +, les lignes qui m'intéressent ont en colonne B des cellules fusionnées dont je veux garder les informations pour rapprochement.
si je n'en ai pas dis ou mis plus, c'est que j'ai vu qu'il y avait des règles à suivre et qu'après lecture cela ne me semble pas très facile à appliquer pour les non initiés, de la à dire que l'on est un peu pommé !Alors d'avance toutes mes excuses si je ne fais pas comme il faut !
alors j'ai enchainé plusieurs macros pour formater le tableau, pour supprimer les lignes avec un '-', pour supprimer les lignes simples indésirables. ce qui me reste à résoudre, c'est de supprimer les lignes dont la case en D est vide et qui contient pour une cellule en D plusieurs lignes fusionnées en B. je ne sais pas si c'est clair.
en fait manuellement cela revient à clicquer sur une cellule vide en D, étendre la sélection avec la souris jusqu'en A et de supprimer l'ensemble sélectionné, en faisant cela sur tous le fichier bien sûr donc avec une boucle.

je vais essayer de coller le bidouillage que j'ai fait :

Macro : projetBANCAIRE qui enchaine les Macros :
VIRFORMATCOLONNE = mise au format des Largeurs colonnes et hauteur lignes
APOURSELECTION01 = crée la colonne F avec 1 si valeur en colonne C = « - »
ANEWSUPLIGNE = supprime toutes les lignes avec « 1 » en colonne F « ligne individuelle »
VIRSUPPRIMELIGNESEULE = Macro qui supprime bien ligne seule
A1selectionDversb = macro en cours de test qui doit finir de nettoyer le fichier

Code:
Sub projetBANCAIRE()
'
' projetBANCAIRE Macro  ENCHAINEMENT DES MACROS POUR TRAITEMENT RELEVE BANCAIRE
VIRFORMATCOLONNE
ApourSELECTION01
ANEWsupligne
VIRSUPPRIMELIGNESEULE
A1selectionDversb
A1selectionDversb
A1selectionDversb
A1selectionDversb
A1selectionDversb
End Sub



Sub VIRFORMATCOLONNE()
'
' VIRFORMATCOLONNE Macro
' Mise en forme colonnes A à D
    Columns("A:D").Select
    Selection.ColumnWidth = 40
    With Selection
        .HorizontalAlignment = xlCenter
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
    End With
End Sub

Sub ApourSELECTION01()
'
' ApourSELECTION01 Macro   crée une colonne F avec 1 si "-" dans la colonne C
    Range("F1").Select
    ActiveCell.FormulaR1C1 = "=COUNTIF(RC[-3],""*-*"")"
    Range("F1").Select
    Selection.AutoFill Destination:=Range("F1:F1000"), Type:=xlFillDefault
    Range("F1:F1000").Select
    ActiveWindow.LargeScroll Down:=-18
    ActiveWindow.SmallScroll Down:=-36
End Sub

Sub ANEWsupligne()
'
' ANEWsupligne Macro   supprime les lignes dont une valeur est egale a 1
  Rows("1:1").Select
    
    Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
    
Dim derniereligne As Integer
Dim i As Integer
'For i = [F65536].End(xlUp).Row To 2 Step -1
For i = Range("B" & Rows.Count).End(xlUp).Row To 2 Step -1
If Range("F" & i).Value = "1" Then Rows(i).EntireRow.Delete
Next i
Columns("F:F").Select
    Selection.Delete Shift:=xlToLeft
End Sub

Sub VIRSUPPRIMELIGNESEULE()
'
' Aencoursdetravail Macro
Dim i As Long
For i = Range("B65536").End(xlUp).Row To 1 Step -1
    If UCase(Cells(i, 2).Value) Like UCase("*REM CHQ*") _
    Or UCase(Cells(i, 2).Value) Like UCase("*REMCB*") _
    Or UCase(Cells(i, 2).Value) Like UCase("*VRST REF*") _
    Or UCase(Cells(i, 2).Value) Like UCase("*COMCB*") _
    Or UCase(Cells(i, 2).Value) Like UCase("*CHEQUE*") Then Rows(i).Delete
Next i
End Sub
'
Sub A1selectionDversb()
'
' A1selectionDversb Macro
'       
    ' se placer sur la dernière ligne contenant des données
    Range("D10000").End(xlUp).Select
    Do
        If IsEmpty(ActiveCell) Then
            ActiveCell.EntireRow.Delete
        End If
        ActiveCell.Offset(-1, 0).Select
    Loop Until ActiveCell.Row = 1
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
End Sub
voila ! merci pour votre effort par avance ! j'ai essayé de mettre un morceau de fichier à traiter mais je n'y suis pas parvenu. :??:
 

drul

Obscur pro du hardware
Staff
Ok, un exmple concret:
Admettons que B2:B4 soit fusionné
Si D4 est vide, alors je dois supprimer les lignes 2 à 4 (en tous c'est ce qui se passe si je le fais manuellement ...)
C'est bien ça ?
 

Amandiers

Nouveau membre


 

Amandiers

Nouveau membre
c'est presque cela, B2:B4 fusionné, c'est D2 qui s'y rapporte et qui est vide et oui je souhaite donc supprimer toute la ligne et comprend alors
A2 B2:B4 C2 D2
 

Amandiers

Nouveau membre
L'idée est de faire une macro qui recherche une cellule vide en D, qui prend cette cellule comme cellule active ( comme D2 ) qui étend la sélection de D2 à A2 comme avec la souris et qui efface cette sélection. (qui du coup efface les ligne B2:B4 fusionnées par voie de conséquence ) et bien sur macro qui boucle pour traiter tout le fichier.
 

drul

Obscur pro du hardware
Staff
Moi avec la souris quand je fais ça il me sélectionne toutes les cellules A2 à D4 ... (et c'est heureux sinon, tout se décalerait).
Je ne vois vraiment pas comment supprimer A2 B2:B4 et D2 sans perdre toute cohérence dans le fichier :??:
 

drul

Obscur pro du hardware
Staff
En partant de souce, tu t'attends à trouver Résultat1 ou Résultat2 dans l'exemple ci-dessous ?
 

Amandiers

Nouveau membre


 

Amandiers

Nouveau membre


 

Amandiers

Nouveau membre
nous avons du mal à nous comprendre, mon fichier n'est pas comme celui que tu as mis en exemple, je cherche le moyen de mettre un fichier image en exemple comme tu as fais mais je ne sais pas faire, peux-tu m'éclairer ?
 

Amandiers

Nouveau membre
voila je tente de mettre une image correspondante, tu as raison je voyais le fichier à l'envers



quand je suis donc en D sur la cellule +113,00 EUR , cela m'indique que je suis en D1. et c'est le groupe D1 à D5 qui est fusionné.
Comme C1 à C5 et A1 à A5.
tu remarques alors que les cellules B1 à B5 ne le sont pas, avec cette nouvelle vision des choses, la macro va être plus simple à écrire puisqu'il me faut maintenant recherche les cellules en D vides, les dé-fusionner dans tout le fichier puis sur le fichier résultant lancer une macro d'effacement de toutes les cellules vide en D toujours en bouclant sur tout le fichier.
Désolé c'est en analysant l'image que tu as mise que j'ai compris que je voyais les choses à l'envers.
Peux-tu m'aiguiller sur la macro qui doit :
recherche les cellules en D vides, les dé-fusionner dans tout le fichier puis sur le fichier résultant lancer une macro d'effacement de toutes les cellules vide en D toujours en bouclant sur tout le fichier.
je suis un peu pris par le temps au point de vu résultat et ton aide me serait précieuse.
 

drul

Obscur pro du hardware
Staff
Pour les images faut utiliser la balise [img] url de l'image ... [/img]
j'ai corriger ci dessus.
 

Amandiers

Nouveau membre
super merci j’espère que cela va te permettre de voir mon problème.
tu l'auras compris c'est donc les lignes en orange que je souhaite traiter.
 

drul

Obscur pro du hardware
Staff
Pourquoi veux-tu les défusionnés ? si on prend l'exemple ci dessus, il me semble que tu veux effacer les lignes 5 à 8 non ?
Si c'est bien cela pas besoin d'enlever le merge
 

Amandiers

Nouveau membre
l'idée initiale était de ne pas les dé-fusionner, de sélectionner la cellule en D6 vide, étendre la sélection jusqu’à A6, ce qui revient à sélectionner "A6 : D8" et d'effacer mais je n'y suis pas parvenu.
En supprimant directement la ligne entière à partir d'une recherche cellule vide exemple D6 trouvée sans étendre la sélection cela ne supprime que "A6 : D6" et il me reste les B7 et B8.
Maintenant avec la nouvelle approche, je vais reconsidérer le problème à moins qu'il n'y ait plus simple, je suis preneur !
 

drul

Obscur pro du hardware
Staff
Meilleure réponse
Une des grosses difficultés ici est que D12, D12, ... sont vides, mais en fait tu ne veux pas les supprimer
Il faut donc analyser chaque zone fusionné.
J'arrive à un truc du genre:
Code:
Sub test2()
Dim a As Range
Dim b As Integer
Set a = Cells(Rows.Count, "d").End(xlUp)
While a.MergeArea.Row > 1 'on traite toutes les lignes sauf la première
    b = a.MergeArea.Row
    If Cells(b, "d").Value = "" Then
        a.MergeArea.EntireRow.Delete
    End If
Set a = Cells(b, "d").Offset(-1, 0)
Wend
If Cells(a.MergeArea.Row, "d").Value = "" Then ' finalement on traite la première ligne
    a.MergeArea.EntireRow.Delete
End If

End Sub

N.B. excuses les noms de variables tout pourris ...
 

Amandiers

Nouveau membre


 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 134
Messages
6 718 055
Membres
1 586 393
Dernier membre
mathhh28
Partager cette page
Haut