Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/01/2012, 18h03   #1
Invité de passage
 
Inscription : janvier 2012
Messages : 5
Détails du profil
Informations forums :
Inscription : janvier 2012
Messages : 5
Points : 0
Points : 0
Par défaut Effacer colonnes en fonction de leur titres

Bonjour à tous,

Le VBA est nouveau pour moi et je rencontre quelques difficultés. J'ai essayé de chercher la réponse à mon problème sans succès, aussi, je me permets de faire appel à vous.

Je récupère un tableau avec un nombre de colonne variable. Certaines de ces colonnes ne m'intéressent pas et je souhaite donc les effacer en fonction du nom de l'entête de colonne.

Pour l'instant le code efface bien les 17 premières lignes qui me sont inutiles, puis là c'est le drame, c'est là que ça ne marche plus.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Sub Colreformat()
 
Dim Varcol As String
 
Varcol = "A"
 
Rows("1:17").Select
Selection.Delete Shift:=xlUp*
 
Range(Varcol & "1").Select
 
If Selection = "Numero" Or "Date" Then
Selection.Offset(0, 1).Select
Chr(Varcol) = Chr(Varcol) + 1
Range(Varcol & "1").Select
 
Else
 
ActiveCell.EntireColumn.Select
Selection.Delete Shift:=xlToLeft
Range(Varcol & "1").Select
 
End If
 
End Sub
Donc en fait, je veux simplement que le code lise successivement chaque entête de colonne, si elle correspond à une colonne que je souhaite garder, le système passe à la cellule suivante, sinon, il sélectionne la colonne entière l'efface et continue la lecture en re-sélectionnant la cellule titre.

D'avance merci de votre aide, car là je sèche
KillWill est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2012, 18h20   #2
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 867
Points : 1 867
Je ne rajoute pas les "Worksheets("...")", on va partir du principe que la macro s'exécute forcément sur la bonne feuille

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
Sub Colreformat()
 
Dim i As Integer
 
Rows("1:17").Delete
 
For i = UsedRange.Column + UsedRange.Columns.Count To 1 Step -1
  If Cells(1, i).Value <> "Numero" Or Cells(1, i).Value <> "Date" Then
    Columns(i).Delete
  End If
Next i
 
End Sub
__________________
« Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer
« Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste. » - Steve McConnell
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2012, 20h08   #3
Invité de passage
 
Inscription : janvier 2012
Messages : 5
Détails du profil
Informations forums :
Inscription : janvier 2012
Messages : 5
Points : 0
Points : 0
Merci beaucoup pour ta réponse ZebreLoup :cool:

Par contre j'ai juste une erreur lors du lancement de la Macro sur la ligne

Code :
For i = UsedRange.Column + UsedRange.Columns.Count To 1 Step -1
C'est une runtime error 424: Object required

En effet, désolé de ne pas avoir précisé, c'est pour lancer la macro directement à partir de la bonne Worksheet sur le doc d'origine que je récupère.

Juste un détail également est-ce que le fait que je soit sur MS Office sur Mac pose un problème?
KillWill est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2012, 20h38   #4
Expert Confirmé Sénior
 
Homme Daniel
aucune
Inscription : septembre 2011
Messages : 2 004
Détails du profil
Informations personnelles :
Nom : Homme Daniel
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : aucune

Informations forums :
Inscription : septembre 2011
Messages : 2 004
Points : 4 037
Points : 4 037
Bonsoir,

Il faut quand même spécifier la feuille pour "UsedRange", même s'il s'agit de la feuille active :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Sub Colreformat()
 
Dim i As Integer
 
Rows("1:17").Delete
With ActiveSheet
    For i = .UsedRange.Column + .UsedRange.Columns.Count To 1 Step -1
      If Cells(1, i).Value <> "Numero" Or Cells(1, i).Value <> "Date" Then
        Columns(i).Delete
      End If
    Next i
End With
 
End Sub
__________________
Cordialement.

Daniel

Citation:
La plus perdue de toutes les journées est celle où l'on n'a pas ri.
Chamfort
Daniel.C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2012, 14h34   #5
Invité de passage
 
Inscription : janvier 2012
Messages : 5
Détails du profil
Informations forums :
Inscription : janvier 2012
Messages : 5
Points : 0
Points : 0
Merci beaucoup Daniel

Je n'ai plus le message d'erreur par contre maintenant, cela m'effaces toutes mes colonnes sans distinction :dry:

Je ne comprends pas pourquoi cela ne prend pas en compte les titres de mes colonnes dans la première ligne.

Je suis vraiment désolé
KillWill est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2012, 14h38   #6
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 867
Points : 1 867
Désolé, il faut remplacer le Or par un And
__________________
« Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer
« Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste. » - Steve McConnell
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2012, 15h40   #7
Invité de passage
 
Inscription : janvier 2012
Messages : 5
Détails du profil
Informations forums :
Inscription : janvier 2012
Messages : 5
Points : 0
Points : 0
ZebreLoup, Daniel.C,

Un grand, ennnnoooooorrrrrrrmmmmeeee, MERCI!!

Ca marche super!!

Big Up et pour la peine, vous avez le droit à votre ligne de Cool



Merci car sans vous là sincère j'étais séché et cette Macro va vraiment me rendre la vie plus facile
KillWill est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2012, 12h23   #8
Invité de passage
 
Inscription : janvier 2012
Messages : 5
Détails du profil
Informations forums :
Inscription : janvier 2012
Messages : 5
Points : 0
Points : 0
Re-Salut,

Juste un dernier Challenge sur lequel j'ai besoin d'aide. La Macro marche super jusqu'à 26 variables. Mais sur la worksheet sur laquelle je travaille, il me faut faire un If avec 40 différentes possibilités à comparer.

Le problème est que je ne peux pas tout mettre sur une seule ligne, après la 26ième variable ça passe à la ligne et cela me met une erreur.

J'ai du coup essayé de remplacer le If par un Case, par contre cela ne semble pas fonctionner. Pouvez-vous m'aider pour le Case?

Voilà ce que j'ai essayé

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Sub Colreformat()
 
Dim i As Integer
 
Rows("1:17").Delete
With ActiveSheet
    For i = .UsedRange.Column + .UsedRange.Columns.Count To 1 Step -1
 
      Select Case Cells(1, i).Value
 
      Case Is <> "Numéro"
      Columns(i).Delete
 
      Case Is <> "Date"
      Columns(i).Delete
 
'... j'ai dupliqué les cases pour mes 40 variables mais au lieu de fonctionner comme le If cela m'efface toute les colonnes :(
 
      End Select
    Next i
End With
 
End Sub
D'avance merci pour votre aide
KillWill est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2012, 12h57   #9
Membre éprouvé
 
Homme Franck PRESSE
Inscription : août 2010
Messages : 202
Détails du profil
Informations personnelles :
Nom : Homme Franck PRESSE
Âge : 38
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : août 2010
Messages : 202
Points : 444
Points : 444
Bonjour à tous,
Excusez l'incruste...
Lorsque tu arrives en bout de ligne VBA, un peu avant même, tu peux passer à la ligne en mettant un espace puis _.

Pour ton problème, je stockerais les noms des colonnes à conserver dans un Array (var tableau), les transmettrais dans un objet dictionnary, pour pouvoir utiliser la méthode Exists.
Ca donnerais quelque chose comme [tu peux remarquer au passage comment je passe à la ligne dans l'Array]
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Dim i As Integer
Dim monDico
Dim EntetesAgarder()
 
'là je n'ai touché à rien
Rows("1:17").Delete
'tu mets ici les noms contenus dans la 1ère ligne des colonnes
'que tu souhaites CONSERVER. Les passages à la ligne sont ici évidents.
        '---- début de la "ligne" ----
EntetesAgarder = Array("Numéro", "Date", "ville", "adresse1", _
    "adresse2", "telephone", _
    "n°SECU", "visio")
        '---- fin de la ligne --------
'création d'un objet Dictionnary qui permet de traiter les doublons
Set monDico = CreateObject("Scripting.Dictionary")
'remplissage du dico
For i = 0 To UBound(EntetesAgarder)
    monDico(EntetesAgarder(i)) = ""
Next
With ActiveSheet
    For i = .UsedRange.Column + .UsedRange.Columns.Count To 1 Step -1
        'Si la valeur de Cells(i, 1) n'existe pas dans mon dico, c'est qu'il
        'ne s'agit pas d'une entête à garder, donc....
        If Not monDico.Exists(.Cells(1, i).Value) Then
            '... on supprime la colonne
            .Columns(i).Delete
        End If
    Next i
End With
Tu dis...
!!! Mise en garde : lorsque tu copie du code VBA (ou autre) sur Internet, il convient de tester sur une copie du classeur, ceci afin d'éviter de perdre des données et donc du temps... Notamment losque dans le code tu vois un "Delete"...
__________________
Cordialement,
Franck P.


Ps : n'oubliez pas de placer vos posts comme "résolus" () si tel est le cas...
pijaku est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2012, 13h20   #10
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 867
Points : 1 867
Effectivement, l'utilisation d'un dictionnaire est sans doute le plus propre.
Sinon tu aurais aussi pu faire :
Code :
1
2
3
4
5
6
Select Case Cells(1, i).Value
Case "Numéro", "Date", "autreTruc", "autreChose" ', ...
  'On ne fait rien
Case Else
  Columns(i).Delete
End Select
Et pour que tes messages soient plus clairs, quand tu écris du code, il faut le mettre entre balises. Pour cela, tu sélectionnes ton code et tu cliques sur le "#" au dessus de la zone de texte.
__________________
« Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer
« Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste. » - Steve McConnell
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h24.


 
 
 
 
Partenaires

Hébergement Web