Macro pour supprimer des lignes d'un tableau à partir de valeur

Macro pour supprimer des lignes d'un tableau à partir de valeur - VB/VBA/VBS - Programmation

Marsh Posté le 14-08-2007 à 17:48:00    

Bonsoir à tous,
 
Voici mon tableau :
 
http://img142.imageshack.us/img142/6827/macroexcelxt0.th.png
 
 
Quelqu'un pourrait-il m'aider pour créer une macro toute simple sous excel qui supprimerait dans la 1ère colonne, les lignes contenant les valeurs 5 et 409 ainsi que les lignes se trouvant juste au dessus et au dessous de ces valeurs. (sachant que je veux supprimer ces lignes sur toute la largeur de mon tableau qui comprend plus de deux colonnes).
 
Je veux pouvoir modifier ensuite cette macro pour d'autres valeurs que 5 et 409...
 
 
Merci d'avance et bonne soirée.
 
brutor2


Message édité par brutor2 le 14-08-2007 à 17:48:16
Reply

Marsh Posté le 14-08-2007 à 17:48:00   

Reply

Marsh Posté le 14-08-2007 à 19:19:49    


tu vas devoir
recuperer les valeurs
msgbox ; len ; mid ; instr ( si tu rentres 1;409;150)
recuperer les lignes correspondantes
puis supprimer
 
 
et pour l'ensemble utiliser ces structures
for i=1 to 15000 i etant le num de ligne
next
un if  (ton test)  then (suppression)else
 
avec l'enregisteur de macro donne nous un bout de code mais ca metnnerai que quelqu'un te donne la solution toute faite
 
bon courage
a+
 

Reply

Marsh Posté le 14-08-2007 à 19:53:48    

86vomito33 a écrit :


tu vas devoir
recuperer les valeurs
msgbox ; len ; mid ; instr ( si tu rentres 1;409;150)
recuperer les lignes correspondantes
puis supprimer
 
 
et pour l'ensemble utiliser ces structures
for i=1 to 15000 i etant le num de ligne
next
un if  (ton test)  then (suppression)else
 
avec l'enregisteur de macro donne nous un bout de code mais ca metnnerai que quelqu'un te donne la solution toute faite
 
bon courage
a+
 


 
Bonsoir,
 
Merci de ton attention...  
 
Mais il est vrai que j'ai oublié de préciser que mes notions sont limitées.
J 'espèrais profiter de l'expérience des autres, n'ayant pas les capacités suffisantes pour maîtriser les macros sous excel,
 
En disant que personne ne donnera une solution toute faite veux-tu dire que la solution est trop hardue ?
Ou bien que l'on n'accepte pas de donner de solution sans proposition ?
 
Bonne soirée...


Message édité par brutor2 le 14-08-2007 à 19:54:13
Reply

Marsh Posté le 14-08-2007 à 21:51:52    

Bonsoir,
 
selectionnes avec la touche ctrl   les valeurs que tu veux voir disparaître (les premières de chaque, pas toutes)
lance la macro suivante
 
Sub clear()
Dim ddr(5)
 
i = 0
For Each dd In Selection
i = i + 1
ddr(i) = dd.Value
 
Next
For j = 1 To i
With Worksheets(1).Range("a:a" )
    Set c = .Find(ddr(j), LookIn:=xlValues)
    If Not c Is Nothing Then
        firstAddress = c.Address
        Do
         
        rr = c.Row
        Range("A" & rr - 1 & ":A" & rr + 1).Select
        Selection.EntireRow.Select
        Selection.Delete
            Set c = .Find(ddr(j), LookIn:=xlValues)
        Loop While Not c Is Nothing
    End If
End With
Next j
End Sub
 
Si tu as un soucis pour la selection multiple, on pourra faire par question
Cordialement

Reply

Marsh Posté le 15-08-2007 à 00:34:21    

Bonsoir,
 
Merci pour ton aide.
 
Cela fonctionne parfaitement...  :bounce:  
 
Mais peut-on remplacer la sélection multiple par une série de valeur correspondante aux valeurs dans mes cellules sélectionnées ? :??:  
 
Cordialement

Reply

Marsh Posté le 15-08-2007 à 07:53:14    

Bonjour,
oui
c'est ce que suggérait 86vomito33  
 
Sub clear()
Dim ddr() As String
ib = InputBox("entrer les valeurs séparées par des ;  " )
 ddr = Split(ib, ";" )
 
i = UBound(ddr)
For j = 0 To i
With Worksheets(1).Range("a:a" )
    Set c = .Find(ddr(j), LookIn:=xlValues)
    If Not c Is Nothing Then
        firstAddress = c.Address
        Do
         
        rr = c.Row
        Range("A" & rr - 1 & ":A" & rr + 1).Select
        Selection.EntireRow.Select
        Selection.Delete
            Set c = .Find(ddr(j), LookIn:=xlValues)
        Loop While Not c Is Nothing
    End If
End With
Next j
End Sub
 
 
Cordialement

Reply

Marsh Posté le 15-08-2007 à 12:45:44    

seniorpapou a écrit :

Bonjour,
oui
c'est ce que suggérait 86vomito33  
 
Sub clear()
Dim ddr() As String
ib = InputBox("entrer les valeurs séparées par des ;  " )
 ddr = Split(ib, ";" )
 
i = UBound(ddr)
For j = 0 To i
With Worksheets(1).Range("a:a" )
    Set c = .Find(ddr(j), LookIn:=xlValues)
    If Not c Is Nothing Then
        firstAddress = c.Address
        Do
         
        rr = c.Row
        Range("A" & rr - 1 & ":A" & rr + 1).Select
        Selection.EntireRow.Select
        Selection.Delete
            Set c = .Find(ddr(j), LookIn:=xlValues)
        Loop While Not c Is Nothing
    End If
End With
Next j
End Sub
 
 
Cordialement


 
 
Bonjour Seniorpapou,
 
 
Tout simplement génial !!!!  
 
Un très grand merci, pour un grand Monsieur.
 
J'aimerais trouvé le temps d'apprendre mais je pars de trop loin...
 
Une dernière petite question si je n'abuse pas trop de ton temps.
 
Si au lieu de la boîte de dialogue qui demande les valeurs; je voulais mettre ces valeurs directement dans la macro (toujours les même lignes avec les même valeurs à supprimer).
Comment faudrait-il la modifier?
 
Mille fois Merci et bonne journée
 
Cordialement

Reply

Marsh Posté le 15-08-2007 à 13:56:44    


 
Sub clear()
Dim ddr() As String
ib = InputBox("entrer les valeurs séparées par des ;  " )
 ddr = Split(ib, ";" )

dim ddr() as string
ddr(1)="1"
ddr(2)="408"
etc...
 
i = UBound(ddr)
For j = 0 To i
With Worksheets(1).Range("a:a" )
    Set c = .Find(ddr(j), LookIn:=xlValues)
    If Not c Is Nothing Then
        firstAddress = c.Address
        Do
         
        rr = c.Row
        Range("A" & rr - 1 & ":A" & rr + 1).Select
        Selection.EntireRow.Select
        Selection.Delete
            Set c = .Find(ddr(j), LookIn:=xlValues)
        Loop While Not c Is Nothing
    End If
End With
Next j
End Sub
 
 
Cordialement

Message cité 1 fois
Message édité par 86vomito33 le 15-08-2007 à 13:57:36
Reply

Marsh Posté le 15-08-2007 à 18:32:44    

Bonjour,
 
Je voudrais réaliser une macro Excel qui viendrait chercher une liste de valeurs (coordonnées X&Y) et à l'aide d'un bouton je pourrais visualiser sur un graphique le tracé point par point afin de visualiser l'ensemble obtenue
 
Quelqu'un aurait ca sous la main. Je ne suis pas bon en VBA et c'est quelque chose que j'aurais vraiment besoin...

Reply

Marsh Posté le 15-08-2007 à 19:56:51    

86vomito33 a écrit :


 
Sub clear()
Dim ddr() As String
ib = InputBox("entrer les valeurs séparées par des ;  " )
 ddr = Split(ib, ";" )

dim ddr() as string
ddr(1)="1"
ddr(2)="408"
etc...
 
i = UBound(ddr)
For j = 0 To i
With Worksheets(1).Range("a:a" )
    Set c = .Find(ddr(j), LookIn:=xlValues)
    If Not c Is Nothing Then
        firstAddress = c.Address
        Do
         
        rr = c.Row
        Range("A" & rr - 1 & ":A" & rr + 1).Select
        Selection.EntireRow.Select
        Selection.Delete
            Set c = .Find(ddr(j), LookIn:=xlValues)
        Loop While Not c Is Nothing
    End If
End With
Next j
End Sub
 
 
Cordialement


 
 
Bonsoir,
 
Merci de ton aide 86vomito33, mais cela ne marche pas...
 
Le débogueur s'arrête sur la ligne ddr(1)="1". et le message est "l'indice n'appartient pas à la sélection" !!!
 
Tu comprends pourquoi ???
 
Merci...
 
Cordialement

Reply

Marsh Posté le 15-08-2007 à 19:56:51   

Reply

Marsh Posté le 15-08-2007 à 20:09:20    

mets ddr(150) as string et c marche

Reply

Marsh Posté le 15-08-2007 à 20:31:19    

86vomito33 a écrit :

mets ddr(150) as string et c marche


 
J'ai fait comme tu m'as dit mais cela ne fonctionne pas ...  
 
399 et 761 sont les valeurs des lignes à supprimer.  
 
Sub clear()
ddr(150) As String
ddr(1) = "399"
ddr(2) = "761"
 
 
i = UBound(ddr)
For j = 0 To i
With Worksheets(1).Range("a:a" )
    Set c = .Find(ddr(j), LookIn:=xlValues)
    If Not c Is Nothing Then
        firstAddress = c.Address
        Do
         
        rr = c.Row
        Range("A" & rr - 1 & ":A" & rr + 1).Select
        Selection.EntireRow.Select
        Selection.Delete
            Set c = .Find(ddr(j), LookIn:=xlValues)
        Loop While Not c Is Nothing
    End If
End With
Next j
End Sub
 
 
Cordialement

Reply

Marsh Posté le 15-08-2007 à 20:38:58    

C'est une déclaration que tu fais donc tu dois mettre :
 
Dim ddr(150) As String
 
 ;)  

Reply

Marsh Posté le 15-08-2007 à 20:57:13    

ju65 a écrit :

C'est une déclaration que tu fais donc tu dois mettre :
 
Dim ddr(150) As String
 
 ;)  


 
Bonsoir,
 
Lorsque je mets Dim ddr(150) as string, la macro semble supprimer les trois premières lignes mais sans jamais s'arréter.
Et tout mon tableau disparaît ???
 
Cordialement

Reply

Marsh Posté le 16-08-2007 à 07:19:10    

Bonjour,
 
Dans la dernière proposition: i=150
comme on démarre de j= 0 et que tes données commencent à 1,   on a: ddr(0)="", le find trouve la première ligne vide comme étant celle que l'on recherche, donc on efface  
la premiére ligne vide , la suivante et la précédente qui est non vide et on recommence.
 
je te propose:
 
Sub clear()
 
 Dim ddr As Variant
 ddr = Array(399, 761)
 
 'ddr = Array("399", "761" )  est aussi utilisable lorsque la zone est une zone texte
   
i = UBound(ddr)
For j = 0 To i
With Worksheets(1).Range("a:a" )
    Set c = .Find(ddr(j), LookIn:=xlValues)
    If Not c Is Nothing Then
        'firstAddress = c.Address    inutile (vient d'un copier collé mal fait de ma part)
        Do
         rr = c.Row
         Range("A" & rr - 1 & ":A" & rr + 1).Select
         Selection.EntireRow.Select
         Selection.Delete
         Set c = .Find(ddr(j), LookIn:=xlValues)
        Loop While Not c Is Nothing
    End If
End With
Next j
End Sub
 
 
Cordialement

Message cité 1 fois
Message édité par seniorpapou le 16-08-2007 à 07:22:36
Reply

Marsh Posté le 16-08-2007 à 07:51:20    

seniorpapou a écrit :

Bonjour,
 
Dans la dernière proposition: i=150
comme on démarre de j= 0 et que tes données commencent à 1,   on a: ddr(0)="", le find trouve la première ligne vide comme étant celle que l'on recherche, donc on efface  
la premiére ligne vide , la suivante et la précédente qui est non vide et on recommence.
 
je te propose:
 
Sub clear()
 
 Dim ddr As Variant
 ddr = Array(399, 761)
 
 'ddr = Array("399", "761" )  est aussi utilisable lorsque la zone est une zone texte
   
i = UBound(ddr)
For j = 0 To i
With Worksheets(1).Range("a:a" )
    Set c = .Find(ddr(j), LookIn:=xlValues)
    If Not c Is Nothing Then
        'firstAddress = c.Address    inutile (vient d'un copier collé mal fait de ma part)
        Do
         rr = c.Row
         Range("A" & rr - 1 & ":A" & rr + 1).Select
         Selection.EntireRow.Select
         Selection.Delete
         Set c = .Find(ddr(j), LookIn:=xlValues)
        Loop While Not c Is Nothing
    End If
End With
Next j
End Sub
 
 
Cordialement


 
Bonjour Seniorpapou,
 
Merci cela fonctionne en partie car cela me supprime aussi des lignes avec des valeurs non déclarées.
 
Voici mon code avec toutes les valeurs à supprimer...
 
Sub clear()
 
 Dim ddr As Variant
 ddr = Array(5, 13, 409, 410, 411, 413, 414, 416, 417, 418, 419, 421, 432, 768, 771, 924)
 
 'ddr = Array("5", "409" )  est aussi utilisable lorsque la zone est une zone texte
   
i = UBound(ddr)
For j = 0 To i
With Worksheets(1).Range("a:a" )
    Set c = .Find(ddr(j), LookIn:=xlValues)
    If Not c Is Nothing Then
        'firstAddress = c.Address    inutile (vient d'un copier collé mal fait de ma part)
        Do
         rr = c.Row
         Range("A" & rr - 1 & ":A" & rr + 1).Select
         Selection.EntireRow.Select
         Selection.Delete
         Set c = .Find(ddr(j), LookIn:=xlValues)
        Loop While Not c Is Nothing
    End If
End With
Next j
End Sub
 
J'ai l'impression que cela me supprime des lignes où les chiffrescontenus correspondent à certaines valeurs déclarées.
exemple supprime 185, 285, 385, 751, 501 pour la valeur 5, 613 pour la valeur 13 etc...  
 
Vois-tu une solution ?
 
Merci encore.
 
Cordialement


Message édité par brutor2 le 16-08-2007 à 08:05:44
Reply

Marsh Posté le 16-08-2007 à 10:20:01    

bonjour,
essaie en remplaçant laligne: Set c = .Find(ddr(j),  LookIn:=xlValues)
 
par  Set c = .Find(ddr(j), lookat:=xlWhole, LookIn:=xlValues)
 
mais je suis étonné, j'ai testé avec des valeurs identiques,  elles ne sont pas supprimées.
peux-tu nous mettre par cjoin.com un fichier avec la premiére colonne seulement.?
Cordialement

Reply

Marsh Posté le 16-08-2007 à 11:57:47    

seniorpapou a écrit :

bonjour,
essaie en remplaçant laligne: Set c = .Find(ddr(j),  LookIn:=xlValues)
 
par  Set c = .Find(ddr(j), lookat:=xlWhole, LookIn:=xlValues)
 
mais je suis étonné, j'ai testé avec des valeurs identiques,  elles ne sont pas supprimées.
peux-tu nous mettre par cjoin.com un fichier avec la premiére colonne seulement.?
Cordialement


 
Alors là Bravo... cela marche parfaitement !!! :bounce:  :bounce:  :bounce:  
 
Voici un exemple de mon tableau avec la 1ère colonne (je n'ai pas réussi avec cjoin.com)
 
http://img175.imageshack.us/img175/7474/tableauem3.th.png
 
[img=http://img175.imageshack.us/img175/7474/tableauem3.th.png]
 
J'espère que c'est assez lisible.
 
Merci Seniorpapou...


Message édité par brutor2 le 16-08-2007 à 11:58:53
Reply

Marsh Posté le 16-08-2007 à 12:41:59    

Re,
 
content que cela fonctionne
Ton tableau, c'était pour tester avec la vraie structure, mais ce n'est plus nécessaire puisque cela fonctionne
@+

Reply

Marsh Posté le 16-08-2007 à 13:35:59    

seniorpapou a écrit :

Re,
 
content que cela fonctionne
Ton tableau, c'était pour tester avec la vraie structure, mais ce n'est plus nécessaire puisque cela fonctionne
@+


 
Encore merci pour ton aide.
 
Celav va me simplifier la vie... :hello:  :hello:  :hello:  

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed