Supprimer ligne avec condition

Résolu
avyrex1926 Messages postés 360 Date d'inscription dimanche 3 décembre 2006 Statut Membre Dernière intervention 3 janvier 2012 - 13 mai 2007 à 16:52
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 - 14 mai 2007 à 23:32
Bonjour,

Petite question, j'ai trouvé sur le forum pour supprimer une ligne vide:
Private
 Sub DeleteEmptyLines(XLS As Object) 
    Dim LastLine As Long, i As Long 

    LastLine = XLS.ActiveSheet.UsedRange.Row - 1 
    LastLine = LastLine + XLS.ActiveSheet.UsedRange.Rows.Count 

    For i = LastLine To 1 Step -1 
        If XLS.Application.WorkSheetFunction.CountA(XLS.Rows(i)) = 0 Then XLS.Rows(i).Delete
    Next i 
End Sub

Si il y a des données dans la colone A et B mais qu'il n'y à rien dans la colone C et D, je voudrais qu'il supprime la ou les ligne(s) completement.

Comment y arriver s.v.p?

Merci encore

29 réponses

cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
14 mai 2007 à 11:29
Est-ce que tu as déclaré et intialisé l'objet XLS ?
Si oui , que vaut cette variable ?

Si non, essaie peut-être comme ceci (et n'oublie pas le moins un)
    For i = LastLine To 1 Step - 1  '   -1, pas 1        If Cells(i, 3).Value vbNullString And Cells(i, 4).Value vbNullString Then
            Rows(i).Delete
        End If
    Next i

MPi
3
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
14 mai 2007 à 16:45
Tiens j'ai retrouvé le topic sur les fonctions Excel Depuis VB6 :
http://www.vbfrance.com/infomsg_VISUAL-BASIC_927302.aspx

@++

<hr size="2" width="100%" />
  --Mortalino--
Le mystérieux chevalier, ~Provençal, le Gaulois~
  
3
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
13 mai 2007 à 17:07
Re,

Private
 Sub DeleteEmptyLines(XLS As Object) 
    Dim LastLine As Long, i As Long 

    LastLine = XLS.ActiveSheet.UsedRange.Row - 1 
    LastLine = LastLine + XLS.ActiveSheet.UsedRange.Rows.Count 

    For i = LastLine To 1 Step -1 
        If XLS.Application.WorkSheetFunction.CountA(XLS.Rows(i)) = 0 Or _         (XLS.Cells(i, 3).Value vbNullString And XLS.Cells(i, 4).Value vbNullString) _
            Then XLS.Rows(i).Delete
    Next i 
End Sub

@++

<hr width="100%" size="2" />
  --Mortalino--
Le mystérieux chevalier, ~Provençal, le Gaulois~
  
0
avyrex1926 Messages postés 360 Date d'inscription dimanche 3 décembre 2006 Statut Membre Dernière intervention 3 janvier 2012 3
13 mai 2007 à 17:18
mortalino,

y a-t-il une raison pourquoi il me donne une erreur rendu à :

LastLine = XLS.ActiveSheet.UsedRange.Row - 1
    LastLine = LastLine + XLS.ActiveSheet.UsedRange.Rows.Count

Pourtant, il devrait fonctionner!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
13 mai 2007 à 17:25
Autant utiliser le bon vieux Range ;)
LastLine = Range("A65536").End(xlUp).Row

Ce code te parle  

@++

<hr width="100%" size="2" />
  --Mortalino--
Le mystérieux chevalier, ~Provençal, le Gaulois~
  
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
13 mai 2007 à 17:28
Avec la référence du classeur devant, bien sûr :
LastLine = XLS.ActiveSheet. Range("A65536").End(xlUp).Row

Par contre, le paramètre (XLS As Object) est à proscrire.
Autant utiliser le classeur, qui est (normalement) référencé ailleurs (dans la procédure appelante, je suppose) :

Private 
Sub DeleteEmptyLines(XLS As Excel.WorkBook)


@++

<hr width ="100%" size="2" />
  --Mortalino--
Le mystérieux chevalier, ~Provençal, le Gaulois~
  
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
13 mai 2007 à 18:46
 Bonjour à tous,

Bonjour Mortalino,
[auteurdetail.aspx?ID=926087 avyrex1926] 
a utilisé la source de PCPT (http://www.codyx.org/snippet_supprimer-lignes-vides-classeur_203.aspx)
Je viens de l'adapter pour vbs. Elle supprime bien toutes les lignes vides.
Petite question, car ne connaissant pas les fonctions d'Excel, je n'ai pas compris le
objExcel.Application.WorkSheetFunction.CountA(ObjExcel.Rows(i)) = 0
Je viens d'essayer ton ajout. C'est efficace.

jean-marc
0
avyrex1926 Messages postés 360 Date d'inscription dimanche 3 décembre 2006 Statut Membre Dernière intervention 3 janvier 2012 3
14 mai 2007 à 00:59
Bon voici quelque nouvelles,

J'ai fais plusieurs test, et toujours rien.

Bon si je récapitule, voici le script:

<hr size= "2" width="100%" />Private Sub DeleteEmptyLines_Click()
Dim LastLine As Long, i As Long

    LastLine = Range("C65536").End(xlUp).Row    LastLine LastLine XLS.ActiveSheet.Range("C65536").End(xlDown).Row
   
    For i = LastLine To 1 Step -1
        If XLS.Application.WorksheetFunction.CountA(XLS.Rows(i)) = 0 Or _         (XLS.Cells(i, 3).Value vbNullString And XLS.Cells(i, 4).Value vbNullString) _
            Then XLS.Rows(i).Delete
    Next i
End Sub
<hr size="2" width="100%" />
Il me crée toujours un bug rendu à: LastLine LastLine XLS.ActiveSheet.Range("C65536").End(xlDown).Row

Pourtant LastLine = la ligne 18 et dans mon fichier excel, la ligne 18 est la derniere ligne qui contient des données dans les colone C et D. À partire de la ligne 19, il y a des données dans la colone A et B mais pas dans les autres donc en théorie, il devrait les supprimer les lignes, mais non, il ne le fait pas.
0
avyrex1926 Messages postés 360 Date d'inscription dimanche 3 décembre 2006 Statut Membre Dernière intervention 3 janvier 2012 3
14 mai 2007 à 01:10
Désolé

Plutot :
<hr size="2" width="100%" />
Private Sub DeleteEmptyLines_Click()
Dim LastLine As Long, i As Long

    LastLine = Range("C65536").End(xlUp).Row
    LastLine = LastLine + XLS.ActiveSheet.Range("C65536").End(xlDown).Row
   
    For i = LastLine To 1 Step -1
        If XLS.Application.WorksheetFunction.CountA(XLS.Rows(i)) = 0 Or _         (XLS.Cells(i, 3).Value vbNullString And XLS.Cells(i, 4).Value vbNullString) _
            Then XLS.Rows(i).Delete
    Next i
End Sub
<hr size="2" width="100%" />
Et le probleme sur:
LastLine = LastLine + XLS.ActiveSheet.Range("C65536").End(xlDown).Row
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
14 mai 2007 à 02:50
Si tu veux avoir la dernière ligne de la colonne C, met en commentaire la ligne en bleu et ça devrait bien fonctionner
Utilise seulement cette ligne
    LastLine = Range("C65536").End(xlUp).Row

MPi
0
avyrex1926 Messages postés 360 Date d'inscription dimanche 3 décembre 2006 Statut Membre Dernière intervention 3 janvier 2012 3
14 mai 2007 à 03:07
Salut MPI,

J'ai modifié pour :

<hr size="2" width="100%" />Private Sub DeleteEmptyLines_Click()
Dim LastLine As Long, i As Long

   
    LastLine = Range("A65536").End(xlUp).Row
   
   
    For i = LastLine To 1 Step 1
        If XLS.Application.WorksheetFunction.CountA(XLS.Rows(i)) = 0 Or _         (XLS.Cells(i, 3).Value vbNullString And XLS.Cells(i, 4).Value vbNullString) _
            Then XLS.Rows(i).Delete
    Next i
End Sub
<hr size="2" width="100%" />Maintenant, y'a plus de message d'erreur mais il ne fais rien aussi. Il me supprime pas les lignes qui non pas de données dans les colone C et D.

Je continue de chercher moi aussi.

Merci pour ton aide 
0
avyrex1926 Messages postés 360 Date d'inscription dimanche 3 décembre 2006 Statut Membre Dernière intervention 3 janvier 2012 3
14 mai 2007 à 12:55
que veux tu dire par déclaré et intialisé l'objet XLS?

Parle tu de la référence?
0
avyrex1926 Messages postés 360 Date d'inscription dimanche 3 décembre 2006 Statut Membre Dernière intervention 3 janvier 2012 3
14 mai 2007 à 14:42
J'ai juste changé 2 valeurs et maintenant, ça fonctionne. Je sais pas pourquoi mais bon sa fonctionne.

Voici ce que j'ai changé (en bleu):

For i = LastLine To 1 Step - 1  '   -1, pas 1        If Cells(i, 11).Value vbNullString And Cells(i, <gras>12).Value</gras> vbNullString Then
            Rows(i).Delete
        End If
    Next i

Merci
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
14 mai 2007 à 15:06
Bref, t'étais en VBA Excel, et depuis le début on croyait que t'étais avec VB6...
Attention au thème lors de la dépose de la question (comme quoi, ça a son importance)

@++

<hr size="2" width="100%" />
  --Mortalino--
Le mystérieux chevalier, ~Provençal, le Gaulois~
  
0
avyrex1926 Messages postés 360 Date d'inscription dimanche 3 décembre 2006 Statut Membre Dernière intervention 3 janvier 2012 3
14 mai 2007 à 15:55
Je suis avec VB6 aussi.

Mais avec une base de données excel. 
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
14 mai 2007 à 16:03
Oui, c'est bien ce que je dis, t'es avec VBA (Visual Basic pour Applications) et non Visual Basic 6.0 Professionnel (indépendant, créer des exécutables, dll, dll ActiveX, etc..)

C'est 2 choses différentes et importantes à savoir. Dans ton code :
If Cells(i, 11).Value vbNullString And Cells(i, 12 ).Value vbNullString Then
            Rows(i).Delete

Si t'étais en VB6  ça ne fonctionnerait pas, il faudrait référencer Excel et le classeur avant, et de l'utiliser comme objet devant Cells, Rows, etc..

Dim xlApp As New Excel.Application, xlBook As Excel.WorkBook

Set xlBook = xlApp.WorkBooks.Open("C:\chemin\fichier.xls)
If xlBook. Cells(i, 11).Value vbNullString And <gras>xlBook.Cells(i, 12).Value</gras> vbNullString Then
            xlBook. Rows(i).Delete

Comme tu vois, les syntaxes différent légèrement.

En tout cas, tu as utiliser le snippet de PCPT (fait pour VB6), si tu avait utilisé le mien qui se trouvait juste au dessus, ça aurait fonctionné depuis le départ

@++

<hr size ="2" width="100%" />
  --Mortalino--
Le mystérieux chevalier, ~Provençal, le Gaulois~
  
0
avyrex1926 Messages postés 360 Date d'inscription dimanche 3 décembre 2006 Statut Membre Dernière intervention 3 janvier 2012 3
14 mai 2007 à 16:12
OK, je commence à comprend la différence là!

C'est tellement nouveau que j'ai de la difficulté à voir la différence.


Je me suis acheté un livre sur Microsoft Visual Basic 6 et je dois apprendre
les termes, mais bon, je vais y parvenir.


Merci pour l'explication et je vais essayer ta façon de faire, car je veux
rester le plus possible en vb6.


Je te donne des nouvelles là-dessus!


merci

 
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
14 mai 2007 à 16:17
Ok, pas de problème

Dis toi une chose, si tu doucle clique sur   une icone qui ressemble à ça, et qu'une interface s'ouvre, c'est VB6.
Si par contre, t'ouvre Excel (ou Word, Acess) et que tu fais Alt + F11 (ou menu Outil, Macro, Visual Basic Editor), c'est VBA !

Bonne apprentissage

@++

<hr size="2" width="100%" />
  --Mortalino--
Le mystérieux chevalier, ~Provençal, le Gaulois~
  
0
avyrex1926 Messages postés 360 Date d'inscription dimanche 3 décembre 2006 Statut Membre Dernière intervention 3 janvier 2012 3
14 mai 2007 à 16:30
J,ai justement cliqué sur un icone comme ça, donc on peut aussi utiliser du scritp vba dans vb6 alors ?
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
14 mai 2007 à 16:38
Oui, mais avec 2 conditions :
1/ Cocher la bonne référence : Microsoft Excel Object Library x.x  (x = version)
2/ Référncer l'application et le classeur Excel, comme je l'ai fait un peu plus haut

Si tu te débrouilles bien, tu pourras même utiliser les fonctions VBA dans VB6 (Cos, Tan, etc..) comme je l'ai montré récemment dans un autre post

Si tu veux un exemple concrêt, regarde dans mes sources Trieur de doublons, tu y trouveras du code pour ouvrir un fichier Excel existant, travailler dessus, et enregistrer une copie de celui-ci (enfin presque, sans les doublons) Tout cela en partant de VB6

@++

<hr size="2" width="100%" />
  --Mortalino--
Le mystérieux chevalier, ~Provençal, le Gaulois~
  
0
Rejoignez-nous