Suppresion de colonne en fonction de la valeur de la premiére li [Résolu/Fermé]

Signaler
-
Messages postés
64
Date d'inscription
mardi 13 décembre 2016
Statut
Membre
Dernière intervention
9 septembre 2019
-
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

8 réponses

Messages postés
3628
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
22 septembre 2020
969
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
Messages postés
64
Date d'inscription
mardi 13 décembre 2016
Statut
Membre
Dernière intervention
9 septembre 2019

Bonjour,

oui il faut que j'uniformise tout ca. Et oui je souhaite supprimer la colonne entiére.
Merci!
Messages postés
1402
Date d'inscription
mardi 21 octobre 2014
Statut
Membre
Dernière intervention
13 septembre 2020
141
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...
Messages postés
64
Date d'inscription
mardi 13 décembre 2016
Statut
Membre
Dernière intervention
9 septembre 2019

C'est noté !
Messages postés
15349
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
22 septembre 2020
1 361
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
Messages postés
64
Date d'inscription
mardi 13 décembre 2016
Statut
Membre
Dernière intervention
9 septembre 2019

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.
Messages postés
8186
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
20 septembre 2020
1 471
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 

Messages postés
64
Date d'inscription
mardi 13 décembre 2016
Statut
Membre
Dernière intervention
9 septembre 2019

Ca fonctionne. Merci !
Messages postés
64
Date d'inscription
mardi 13 décembre 2016
Statut
Membre
Dernière intervention
9 septembre 2019

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)
Messages postés
8186
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
20 septembre 2020
1 471
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 ....
Messages postés
64
Date d'inscription
mardi 13 décembre 2016
Statut
Membre
Dernière intervention
9 septembre 2019

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 ?
Messages postés
1402
Date d'inscription
mardi 21 octobre 2014
Statut
Membre
Dernière intervention
13 septembre 2020
141
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...

Messages postés
64
Date d'inscription
mardi 13 décembre 2016
Statut
Membre
Dernière intervention
9 septembre 2019

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 ?
Messages postés
1402
Date d'inscription
mardi 21 octobre 2014
Statut
Membre
Dernière intervention
13 septembre 2020
141
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)...
Messages postés
64
Date d'inscription
mardi 13 décembre 2016
Statut
Membre
Dernière intervention
9 septembre 2019

ok je vais me pencher la dessus.
Merci pour le coup de pouce !
Messages postés
64
Date d'inscription
mardi 13 décembre 2016
Statut
Membre
Dernière intervention
9 septembre 2019

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 ?
Messages postés
8186
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
20 septembre 2020
1 471
Remplaces :
        For J = 1 To 5
Par
        For J = 0 To 4
Messages postés
64
Date d'inscription
mardi 13 décembre 2016
Statut
Membre
Dernière intervention
9 septembre 2019

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..
Messages postés
16212
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
23 septembre 2020
3 035
Bonjour tt le monde

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

 Michel
Messages postés
64
Date d'inscription
mardi 13 décembre 2016
Statut
Membre
Dernière intervention
9 septembre 2019

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
Messages postés
8186
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
20 septembre 2020
1 471 >
Messages postés
64
Date d'inscription
mardi 13 décembre 2016
Statut
Membre
Dernière intervention
9 septembre 2019

à garder ou à supprimer ?
Messages postés
64
Date d'inscription
mardi 13 décembre 2016
Statut
Membre
Dernière intervention
9 septembre 2019

à 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é.
Messages postés
8186
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
20 septembre 2020
1 471 >
Messages postés
64
Date d'inscription
mardi 13 décembre 2016
Statut
Membre
Dernière intervention
9 septembre 2019

La solution de ThauThème me semble parfaitement adaptée.
Messages postés
64
Date d'inscription
mardi 13 décembre 2016
Statut
Membre
Dernière intervention
9 septembre 2019

Oui il me semble aussi !
Je vais essyer ca.
Encore merci pour votre aide !
Messages postés
8186
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
20 septembre 2020
1 471
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
Messages postés
64
Date d'inscription
mardi 13 décembre 2016
Statut
Membre
Dernière intervention
9 septembre 2019

Ca marche !

Merci Patrice 33740