Suppresion de colonne en fonction de la valeur de la premiére li

Résolu
camcam1404 -  
camcam1404 Messages postés 64 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

J'aimerais supprimer les colonnes dont la première ligne ne s'intitule pas A, B,C, D ou E.

Pour cela j'ai écrit le code suivant mais quand je l'éxécute Excel plante.
Quelqu'un aurait une explication ?

Sub columnsdelete ()

Dim i as long
Dim lastcol as long

lastcol = Cells(1, Columns.Count).End(xlToLeft).Column

For i=4 to lastcol

If Cells (1,i) <> "A" or Cells (1,i) <> "B"; Cells (1,i) <> "C", Cells (1,i) <> "D"; Cells (1,i) <> "E" Then
Then Cells(1, i).EntireColumn.Delete
Enf if
next i
A voir également:

8 réponses

Reivax962 Messages postés 3672 Date d'inscription   Statut Membre Dernière intervention   1 011
 
Bonjour,

Dans cette ligne :
If Cells (1,i) <> "A" or Cells (1,i) <> "B"; Cells (1,i) <> "C", Cells (1,i) <> "D"; Cells (1,i) <> "E" Then 
, un coup tu sépares les termes par "or", un coup par ";", un coup par ","...
Est-ce qu'il ne faudrait pas uniformiser ça ?

Par ailleurs, fais attention sur ta variable "i". Je ne sais pas si tu supprimes la colonne ou son contenu, mais si tu supprimes la colonne elle-même, il ne faut pas incrémenter "i" puisque toutes les colonnes suivantes ont été décalées...

Xavier
0
camcam1404 Messages postés 64 Date d'inscription   Statut Membre Dernière intervention  
 
Bonjour,

oui il faut que j'uniformise tout ca. Et oui je souhaite supprimer la colonne entiére.
Merci!
0
ThauTheme Messages postés 1442 Date d'inscription   Statut Membre Dernière intervention   160
 
Bonjour Camcam, bonjour le forum,

Peut-être comme ça :
Sub columnsdelete()
Dim TV(1 To 5)
Dim I As Long
Dim J As Byte
Dim LastCol As Long

TV(1) = "A"
TV(2) = "B"
TV(3) = "C"
TV(4) = "D"
TV(5) = "E"
LastCol = Cells(1, Columns.Count).End(xlToLeft).Column
For I = LastCol To 4 Step -1
    For J = 1 To 5
        If Cells(1, I).Value = TV(J) Then GoTo suite
    Next J
    Columns(I).Delete
suite:
Next I
End Sub


Quand on supprime (ligne ou colonne) il est d'usage de partir de la dernière jusqu'à la première avec Step -1 pour assurer la prochaine (ligne ou colonne) avec Next I.

Et ton autre problème ? Tu n'as pas dis si ça fonctionnait pou pas...
0
camcam1404 Messages postés 64 Date d'inscription   Statut Membre Dernière intervention  
 
C'est noté !
0
f894009 Messages postés 17277 Date d'inscription   Statut Membre Dernière intervention   1 713
 
Bonjour tout le monde,

Sub columnsdelete()
    Dim i As Long
    Dim lastcol As Long

    lastcol = Cells(1, Columns.Count).End(xlToLeft).Column
    For i = 1 To lastcol
        If Cells(1, i) < "A" Or Cells(1, i) > "E" Then Cells(1, i).EntireColumn.Delete
    Next i
End Sub
0
camcam1404 Messages postés 64 Date d'inscription   Statut Membre Dernière intervention  
 
Merci mais je cherche quelque chose de plus "général" ou cas où il y aurait pas de liens entre les noms de la première ligne pour les colonnes à suppimer.
0
Patrice33740 Messages postés 8561 Date d'inscription   Statut Membre Dernière intervention   1 780
 
Bonjour,

Ou bien :
Sub columnsdelete()
Dim i As Long
Dim lastcol As Long
  With Worksheets(1)
    lastcol = .Cells(1, .Columns.Count).End(xlToLeft).Column
    For i = lastcol To 4 Step -1
      Select Case .Cells(1, i).Value
        Case "A", "B", "C", "D", "E"
        Case Else
          .Columns(i).Delete
      End Select
    Next i
  End With
End Sub 

0
camcam1404 Messages postés 64 Date d'inscription   Statut Membre Dernière intervention  
 
Ca fonctionne. Merci !
0
camcam1404 Messages postés 64 Date d'inscription   Statut Membre Dernière intervention  
 
Une autre question !

Est ce qu'il serait possible d'entrer le "case" par le biais d'une boite de dialogue ?
J'aimerais que l'utilisateur soit libre de choisir les colonnes qu'il veut garder.

(je cherche =D)
0
Patrice33740 Messages postés 8561 Date d'inscription   Statut Membre Dernière intervention   1 780
 
Beaucoup de choses sont possible, comme par exemple la solution de ThauThème (bonjour ...), Il faut préciser ton besoin, le texte testé est-il susceptible de changer (par exemple "Test" au lieu de "A") ? Combien de colonnes concernées au maximum ....
0
camcam1404 Messages postés 64 Date d'inscription   Statut Membre Dernière intervention  
 
Encore une question !
Dans le cas ou la premiére ligne contient A mais pas uniquement.
Il faut que j'utilise autre chose que value.
Se serait donc un Like ?
Mais j'aime la structure du programme avec le Select.
Tu sais comment je pourrai contourner l´utilisation du Like dans ce cas ?
0

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

Posez votre question
ThauTheme Messages postés 1442 Date d'inscription   Statut Membre Dernière intervention   160
 
Re,

Une solution avec une UserForm nommée UserForm1 :

Sub columnsdelete()
UserForm1.Show
End Sub


L'Userform1 contient :
- 1 Label avec le texte : "Sélectionnez dans la liste les colonnes que vous souhaitez garder."
- 1 ListBox nommée ListBox1
- 1 CommandButton nommé CommandButton1, texte : "Valider"
- 1 CommandButton nommé CommandButton2, texte : "Annuler"



Le code de l'UserForm :
Private Sub UserForm_Initialize()
Me.Caption = "SUPPRESSION"
Me.ListBox1.ListStyle = fmListStyleOption
Me.ListBox1.MultiSelect = fmMultiSelectMulti
Me.ListBox1.AddItem "A"
Me.ListBox1.AddItem "B"
Me.ListBox1.AddItem "C"
Me.ListBox1.AddItem "D"
Me.ListBox1.AddItem "E"
End Sub

Private Sub CommandButton1_Click()
Dim I As Long
Dim J As Byte
Dim LastCol As Long
  
With Worksheets(1)
    LastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
    For I = LastCol To 4 Step -1
        For J = 1 To 5
            If .Cells(1, I).Value = Me.ListBox1.List(J) Then GoTo suite
        Next J
        .Columns(I).Delete
suite:
    Next I
End With
Unload Me
End Sub

Private Sub CommandButton2_Click()
Unload Me
End Sub


la procédure Sub columnsdelete ouvre l'UserForm. L'utilisateur coche dans la liste la ou les colonnes qu'il souhaite garder et valide...

0
camcam1404 Messages postés 64 Date d'inscription   Statut Membre Dernière intervention  
 
Bonjour ThautTheme,

Si j'ai bien compris pour chaque bouton la structure du programme doit etre:
Private Sub Nom du bouton
Unload me
End sub

Cependant le Sub columsdelete doit apparaitre quelque part non ?
0
ThauTheme Messages postés 1442 Date d'inscription   Statut Membre Dernière intervention   160
 
Re,

Non, t'as pas bien compris... Le code de l'Userform se trouve dans le composant VBA Userform1. Cela signifie qu'il te faudra insérer une UserForm dans ton fichier avec les différents contrôles que j'ai cités, puis y copier/coller le code que je t'ai donné pour elle...
Le Sub columsdelete reste là où tu l'avais mis précédemment mais son code ne contient plus que la ligne pour l'ouverture de l'UserForm.
C'est à la validation de l'UserForm que se fait le traitement.
C'est toi qui a fourni Sub columsdelete dans ton premier post, je n'ai fait que l'utiliser pour te simplifier les choses (enfin, je pensais)...
0
camcam1404 Messages postés 64 Date d'inscription   Statut Membre Dernière intervention  
 
ok je vais me pencher la dessus.
Merci pour le coup de pouce !
0
camcam1404 Messages postés 64 Date d'inscription   Statut Membre Dernière intervention  
 
Bonjour ThauTeme,

voilà maintenant je sais créer des Userform ! :)

Mais en exécutant le programme, j'ai une erreur de type 381 à la ligne 21 qui apparait.
Tu saurais pourquoi ?
0
Patrice33740 Messages postés 8561 Date d'inscription   Statut Membre Dernière intervention   1 780
 
Remplaces :
        For J = 1 To 5
Par
        For J = 0 To 4
0
camcam1404 Messages postés 64 Date d'inscription   Statut Membre Dernière intervention  
 
La numérotation d´un tableau commence toujours à 0. J'avais pas pris ca en compte !
Mais que les sélection soient cochées ou non, les colonnes apparaissent toujours quand à l'éxécution code..
0
michel_m Messages postés 16602 Date d'inscription   Statut Contributeur Dernière intervention   3 314
 
Bonjour tt le monde

on va jusqu'à quelle colonne ? Z, AZ, BZ..... XFD ?

 Michel
0
camcam1404 Messages postés 64 Date d'inscription   Statut Membre Dernière intervention  
 
jusqu´a la colonne MQ
0
Patrice33740 Messages postés 8561 Date d'inscription   Statut Membre Dernière intervention   1 780 > camcam1404 Messages postés 64 Date d'inscription   Statut Membre Dernière intervention  
 
Combien et quel type d'intitulé est-on susceptible de chercher ?
0
camcam1404 Messages postés 64 Date d'inscription   Statut Membre Dernière intervention  
 
Beaucoup !

56 Colonnes a garder: point commun premiére ligne contient le mot "Rouge"
84 Colonnes: point a garder commun premiére ligne contient le mot "Bleu"
84 Colonnes a garder : point commun premiére ligne contient le mot "Vert"
28 Colonnes a garder:point commun premiére ligne contient le mot "Orange"
28 Colonnes a garder:point commun premiére ligne contient le mot "Jaune"
28 Colonnes a garder:point commun premiére ligne contient le mot "Turquoise"
28 Colonnes a garder:point commun premiére ligne contient le mot "Beige"
14 Colonnes a garder:point commun premiére ligne contient le mot "Violet"

peux importe que le mot "Rouge" soit en majuscule, minuscule etc
0
Patrice33740 Messages postés 8561 Date d'inscription   Statut Membre Dernière intervention   1 780 > camcam1404 Messages postés 64 Date d'inscription   Statut Membre Dernière intervention  
 
à garder ou à supprimer ?
0
camcam1404 Messages postés 64 Date d'inscription   Statut Membre Dernière intervention  
 
à garder

Par exemple:
je choisis de garder les 28 colonnes qui contiennent en premiére ligne le mot "beige" donc les 56+ 84*2+28*3+14 colonnes vont etre supprimé.
0
Patrice33740 Messages postés 8561 Date d'inscription   Statut Membre Dernière intervention   1 780
 
Bonjour,

Essaies ce code :
Private Sub UserForm_Initialize()
  Me.Caption = "SUPPRESSION"
  Me.ListBox1.ListStyle = fmListStyleOption
  Me.ListBox1.MultiSelect = fmMultiSelectMulti
  Me.ListBox1.AddItem "A"
  Me.ListBox1.AddItem "B"
  Me.ListBox1.AddItem "C"
  Me.ListBox1.AddItem "D"
  Me.ListBox1.AddItem "E"
End Sub

Private Sub CommandButton1_Click()
Dim I As Long
Dim J As Byte
Dim LastCol As Long
Dim Suppr As Boolean
  With Worksheets(1)
    LastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
    For I = LastCol To 4 Step -1
      Suppr = True
      For J = 0 To 4
        If Me.ListBox1.Selected(J) Then
          If .Cells(1, I).Value = Me.ListBox1.List(J) Then Suppr = False
        End If
      Next J
      If Suppr Then .Columns(I).Delete
    Next I
  End With
  Unload Me
End Sub

Private Sub CommandButton2_Click()
  Unload Me
End Sub 


Un fichier exemple :
https://www.cjoint.com/c/GABj7IFEDXA
0
camcam1404 Messages postés 64 Date d'inscription   Statut Membre Dernière intervention  
 
Ca marche !

Merci Patrice 33740
0