suppression de ligne si cell contient lettre

  • Initiateur de la discussion Hervé
  • Date de début
H

Hervé

Guest
Bonjour à tous, je découvre tout juste ce site, et je suis en galere du type 'maitriser une macro excel en qqes heures est facile pour mon boss'

J'ai un tableau d'environ 15000 ligne (le nb de zéros est bon) et je voudrais supprimer les lignes dont la cellule de la colonne F (par exemple) contient une lettre et pas en chiffre en caractère numéro 3.
Je sais pas si je suis très explicite.

bref si F2 = 'BJ55'
je garde la ligne

si F5 = 'BJL4'
je supprime,

je insérer ca dans une macro qui tourne déjà sur le fichier, qqun pour m'aider?

merci d'avance
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Et Boum Pascal !!!

LOL

Sinon moi je passe par un Clear Complet de Cells, sûrement plus rapide que de remesurer la plage...

Si il y a de la mise en forme par contre Hervé peut faire
Cells.ClearContents 'et tout le monde il est content !

Bon App
@+Thierry
 
H

Hervé

Guest
pas de mise en forme, tout va bien, merci les gars, je voulais rajouter une condition du type

If Mid(Range('E' & x), 1, 2) = 'LQ' And Mid(Range('E' & x), 5, 1) = 'A' Then Rows(x).Delete

(en gros si la cellule contient LQxxA, xx peut varier, c'est aussi à dégager)

mais il a pas l'air d'aimer, qu'est-ce qui cloche (mis à part que je dois remplacer le E par la constante?


en tous cas vous etes géniaux, je vois le bout du tunnel, encore merci
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Re Hervé, Pascal, tout le monde !


Arf, nan nan nan !!!

Hervé on n'est plus sur un Objet Range, Fini, Finito, Ended, Kaput l'Objet Range.... On est sur un Tableau Array avec ma proposition 'Booster'...

Tu dois travailler dessus uniquement...

Comme Ceci

Mid(PlageSource(i, ColToScan)

[li]PlageSource = l' Array (Tableau en mémoire)[/li]

[li]i = La Ligne Scannée dans la boucle[/li]

[li]ColToScan = La Colonne à Scanner[/li]

Ok ?

De plus le raisonnement est inversé depuis ma proposition (et oui les informaticiens pensent toujours à l'envers !!!)

If IsNumeric(Mid(PlageSource(i, ColToScan), 3, 1)) Then

Cette ligne de code signifie que l'on teste si on garde la ligne et plus du tout si on delete la ligne...

Donc tu dois adapter dans ce sens, car le second Tableau Indexé Séquentiellement 'PlageCible' par la boucle représente la collection des lignes à conserver.... compris, capito, undertood, verstanden worden... LOL

Bon Courage
@+Thierry
 
H

Hervé

Guest
m'accablez pas non plus... pour le raisonnement à l'envers, et la plage source, je m'en étais rendu compte c'est donc deja modifié, voilà le code:


Sub NettoyeurDeLQxxA()
Dim PlageSource As Variant
Dim PlageCible() As Variant
Dim i As Long, x As Long
Dim NbCol As Byte
Dim C As Byte
x = 1

With ActiveSheet
NbCol = .Range('A1').End(xlToRight).Column
PlageSource = .Range(Cells(1, 1), Cells(.Range('A65536').End(xlUp).Row, NbCol))
End With

For i = 1 To UBound(PlageSource)
If Not Mid(PlageSource(i, ColToScan), 1, 2) = 'LQ' And Mid(PlageSource(i, ColToScan), 5, 1) = 'A' Then
ReDim Preserve PlageCible(UBound(PlageSource), NbCol)
For C = 1 To NbCol
PlageCible(x, C) = PlageSource(i, C)
Next
x = x + 1
End If
Next i

Cells.Clear
Range(Cells(1, 1), Cells(x, NbCol)) = PlageCible
End Sub



(je lance cette macro après celle que tu m'as envoyée tout a l'heure)
mais du coup il aime pas du tout la ligne

Range(Cells(1, 1), Cells(x, NbCol)) = PlageCible


du coup il me garde rien du tout...
 

PascalXLD

XLDnaute Barbatruc
Modérateur
Re

Tu peux tout mettre dans la même macro

Cela devrait donner cela si pas d'erreur LOL ;)

Code:
Option Explicit
Option Base 1

Const ColToScan As Byte = 5 '<= Soit 'E'...

Sub TheTerminator()
Dim PlageSource As Variant
Dim PlageCible() As Variant
Dim i As Long, x As Long
Dim NbCol As Byte
Dim C As Byte
x = 1

With ActiveSheet
NbCol = .Range('A1'Â'Â').End(xlToRight).Column
PlageSource = .Range(Cells(1, 1), Cells(.Range('A65536'Â'Â').End(xlUp).Row, NbCol))
End With

For i = 1 To UBound(PlageSource)
    If IsNumeric(Mid(PlageSource(i, ColToScan), 3, 1)) and  _
(Mid(PlageSource(i, ColToScan), 1, 2)<>'LQ' or Mid(PlageSource(i, ColToScan), 5, 1)<>'A'Â'Â')  Then
      ReDim Preserve PlageCible(UBound(PlageSource), NbCol)
        For C = 1 To NbCol
        PlageCible(x, C) = PlageSource(i, C)
        Next
    x = x + 1
    End If
Next i

Cells.Clear
Range(Cells(1, 1), Cells(x, NbCol)) = PlageCible
End Sub

Message édité par: Pascal76, à: 09/03/2005 12:14
 

_Thierry

XLDnaute Barbatruc
Repose en paix
re Pascal, Hervé, le Forum

Hervé, je pense que c'est parceque tu ne me connais pas encore assez, mais jamais je n'accable qui que ce soit, au contraire je m'amuse à essayer de faire dans la pédagogie rigolote même si parfois on peut le prendre pour du singlant.

Sinon donc sans tester, je pense que Pascalou t'as sorti d'affaire et que moi j'ai essayé de te faire franchir un cap dans la compréhension de ce code.

Bon Appétit
@+Thierry qui regrette bien de n'avoir pas eu le net dans les années 80 avec un internaute qui m'aurait accablé de la sorte pendant mes nuits blanches de galères
 
H

Hervé

Guest
merci pour tout, ca tourne bien... et vite...

merci pour la bete de course thierry


a+ Hervé qui est bien content d'avoir des internautes sympathiques pour débarbouiller la merde dans laquelle je me fous...
 
H

Hervé

Guest
Re-bonjour à tous, j'ai essayé d'adapter le code qu'on m'avait laissé, et qui tournait tres bien d'ailleurs,

en voulant rajouter une condition disant que:
si les 3 premiers caractères de la colonne 4 sont 'BER' ou 'ESP' ou 'PAD' ou... alors j'aimerai aussi garder les cellules, sauf que là il veut plus...
ca fait qqes heures que je cherche ce qui ne va pas dans ce code sans trouver l'erreur, qqun pourrait-il m'aider? thierry?

merci...


NB: voici le code:


Option Explicit
Option Base 1
Const ColToScan As Byte = 5 '<= Soit colonne 'E'
Const ColGamme As Byte = 4 '<= Soit colonne 'D'



Sub tri_des_gammes()

Sheets('Total').Select

Dim PlageSource As Variant
Dim PlageCible() As Variant
Dim i As Long, x As Long
Dim NbCol As Byte
Dim C As Byte
x = 1

With ActiveSheet
NbCol = .Range('A1').End(xlToRight).Column
PlageSource = .Range(Cells(1, 1), Cells(.Range('A65536').End(xlUp).Row, NbCol))
End With

For i = 1 To UBound(PlageSource)
If IsNumeric(Mid(PlageSource(i, ColToScan), 3, 1)) And _
(Mid(PlageSource(i, ColToScan), 3, 1) <> ' ') And _
(Mid(PlageSource(i, ColGamme), 1, 3) = 'BER') Or _
(Mid(PlageSource(i, ColGamme), 1, 3) = 'ESP') Or _
(Mid(PlageSource(i, ColGamme), 1, 3) = 'PAD') Or _
(Mid(PlageSource(i, ColGamme), 1, 3) = 'QUI') Or _
(Mid(PlageSource(i, ColGamme), 1, 3) = 'SER') Or _
(Mid(PlageSource(i, ColGamme), 1, 3) = 'TRE') Or _
(Mid(PlageSource(i, ColGamme), 1, 3) = 'TYR') Then
ReDim Preserve PlageCible(UBound(PlageSource), NbCol)
For C = 1 To NbCol
PlageCible(x, C) = PlageSource(i, C)
Next
x = x + 1
End If
Next i

Cells.Clear
Range(Cells(1, 1), Cells(x, NbCol)) = PlageCible



End Sub
 
H

Hervé

Guest
salut tout le monde,

je me permets de me répondre, parce que j'ai besoin de ce code, et que j'utilise un code qu'on m'a aidé à faire et que je ne maitrise pas tout à fait (c'est certainement pour ca que je ne trouve pas mon erreur), donc si l'erreur qui se trouve dans mon code semble évidente à qqun...svp... aidez-moi...

je vais continuer à chercher...
 

PascalXLD

XLDnaute Barbatruc
Modérateur
Bonjour

dans cette partie

For i = 1 To UBound(PlageSource)
If IsNumeric(Mid(PlageSource(i, ColToScan), 3, 1)) And _
(Mid(PlageSource(i, ColToScan), 3, 1) <> ' ') And _
(Mid(PlageSource(i, ColGamme), 1, 3) = 'BER') Or _

essaies plutot

For i = 1 To UBound(PlageSource)
If IsNumeric(Mid(PlageSource(i, ColToScan), 3, 1)) And _
(Mid(PlageSource(i, ColToScan), 3, 1) <> ' ') Or _
(Mid(PlageSource(i, ColGamme), 1, 3) = 'BER') Or _


Bon courage
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonjour Pascal, Hervé, le Forum

En plus de ce que t'explique Pascal, cette ligne là me choque aussi (sans faire de tests, mais...)

If IsNumeric(Mid(PlageSource(i, ColToScan), 3, 1)) And (Mid(PlageSource(i, ColToScan), 3, 1) <> ' ')

En clair tu écris ;

Si est numérique le 3ème Digit de la ligne/colonne à scanner ET si n'est pas un espace le même 3ème Digit...

En fait si c'est numérique... ce n'est pas un espace... non ?

Mais essaie aussi le Or proposé par Pascal, car là aussi c'est à tester...

Et même si tu n'es pas familié avec les codes, ce qui est normal si tu débutes, dans ce genre de Combinaison de Conditions, essaie toujours de les traduire en bon François et de les analyser car souvent c'est plus un problème de Logique que de Syntax...

Bonne Journée
@+Thierry

Message édité par: _Thierry, à: 15/03/2005 08:35
 

PascalXLD

XLDnaute Barbatruc
Modérateur
Pour rebondir sur ce que vient de dire thierry il serait bien que tes conditions soient claires dans ton esprit (et dans le notre ;) ) car sinon on va avoir des problèmes avec les And et Or et aussi les parenthèses qui doivent manquées quelque part

@ ++
 
H

Hervé

Guest
oki, j'explique, le code que thierry m'avait confectionné me permettait de vérifier le 3e caractère de la cellule de la colonne 5

Si la condition était vérifiée, il gardait la ligne correspondante. Au final, mon tableau se trouvait donc épuré des lignes qui ne m'intéressaient pas (celles dont le 3e caractère de la colonne 5 ne correspondait pas)

je me retrouve maintenant avec un tableau ou ca ne suffit plus, il faut aussi que je vérifie les 3 premiers caractères de la colonne 4. Si ces 3 caractères sont 'BER', 'ESP', 'PAD', ... alors il faut aussi garder les lignes (il faut que la condition sur la colonne 5 soit vraie aussi evidement)


j'ai essayé le or, ca ne fonctionne pas, la macro ne bug pas, mais elle passe au travers

si j'ai rajouté l'espace dans le code, c'est parce qu'il les gardait, le numeric ne suffisait pas.

là o&ugrave; j'ai un souci, c'est que le code, si je m'arrete à

If IsNumeric(Mid(PlageSource(i, ColToScan), 3, 1)) And _
(Mid(PlageSource(i, ColToScan), 3, 1) <> ' ') Then

alors ca passe nickel


c'est dès que je veux ajouter la condition sur la colonne 4 que ca merdoie...

et c'est la ligne là qu'il me met en jaune:

Range(Cells(1, 1), Cells(x, NbCol)) = PlageCible
 
H

Hervé

Guest
ok, je vais tenter de vous éclaircir la condition

'Si le 3e caractère de la cellule de la colonne 5 est un nombre ET

que ce n'est pas un espace (parce que chez moi il les gardait qd meme) ET

que les 3 premiers caractères de la cellule de la colonne 4 sont 'BER' OU

'ESP' OU

'TRE' OU

'SER'

Alors il doit garder les lignes et les recoller'

(selon la logique du code de thierry, si j'ai bien suivi)



j'espere que j'ai pu vous éclairer...
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 668
Messages
2 090 739
Membres
104 644
dernier inscrit
MOLOKO67