J'ai sur une feuille un tableau croisé feuille/colonne, pour chaque feuille si l'on sélectionne YES rien ne se passe, mais si l'on sélectionne NO je voudrai que les colonnes correspondantes dans les autres feuilles du classeur soient supprimées.
J'ai mis un exemple plus clair dans ce fichier Excel sur ce lien : http://cjoint.com/14ju/DGvn4lVzQhI.htm
J'ai ajouté un bouton pour contenir la macro, sauf que je ne sais pas par où commencer :$
Pourriez vous m'aider sur ce sujet, toute aide est la bienvenue.
Merci
A voir également:
VBA-Excel07:Suppression de colonnes après sélection d'une valeur
Pas besoin de bouton, voici le code à placer
dans le module de la feuille"Feuille X" :
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, [B2:E5]) Is Nothing Then Exit Sub
If Target.Count > 1 Then Exit Sub
If Target.Value = "YES" Then Exit Sub
Call Supprime_Colonnes(Target.EntireRow.Cells(1, 1).Value, _
Target.EntireColumn.Cells(1, 1).Value)
End Sub
Private Sub Supprime_Colonnes(feuille As String, colonnes As String)
Dim i As Long
With Worksheets("Feuille " & feuille).UsedRange.Rows(1)
For i = .Cells.Count To 1 Step -1
If InStr(1, .Cells(1, i).Formula, colonnes) = 1 Then
.Cells(1, i).EntireColumn.Delete
End If
Next i
End With
End Sub
Bonjour Patrice,
Pourrais tu m'aider stp sur le même sujet mais en integrant cette fonctionnalité dans une macro ?
J'ai déjà une macro qui crée des feuilles automatiquement, et je voudrai qu'après avoir selectionné les NO, et cliqué sur le bouton exécutant cette macro, que les feuilles soient générées sans les colonnes . càd que la suppression des colonnes se fasse apres la génération de ces feuilles. Est ce faisable avec le même code?
Tu n'as pas mis d'explications sur le mode d'emploi et le mode de fonctionnement désiré !
J'ai donc essayé de comprendre ce que tu voulais faire, en analysant ton code mais comme ça fonctionne mal ....
OUAAA :D... c'est même mieux que ce que je voulais, je n'avais pas pensé à l'option d'ajout des noms des feuilles dans feuilleX automatiquement pour moi cette partie se faisait manuellement, mais j'aime comment c'est automatisé, de plus pour les YES/NO j'aime bien le fait que tu as gardé la 1ere fonctionnalité càd supprimer les colonnes apres la création des feuilles, et tu as ajouté celle que j'ai proposé de supprimer les colonnes lors de leur création. je vais essayé de comprendre le "comment" mnt... Je te remercie infiniment Patrice, c'est super gentil de ta part :)
Bonjour Patrice,
une derniere demande stp :)
J'ai ajouté une nouvelle colonne qui fait référence a 2 feuilles valA et valB,
Dans la feuille "Donnees" si on a valA et YES pour des lignes, je voudrai qu'une macro aille dans cette feuille valA et récupére les valeurs qui se trouve dans tout le range E:W et les collent dans les feuilles précedemment générées (aaa1, eee2 ..etc).
Même chose si la valB et YES sont selectionnés.
N.B:il se peut qu'il y'a 2 champs semblables où un se trouve dans la feuille varA et l'autre dans varB (car leur données dans le range E:W peut différer).
+ On peut ajouter ces modifications soit dans la marco déjà existante "RemplirFeuille" soit dans un nouveau bouton.
J'avais déja essayé de créer la macro dans un nouveau bouton, mais je me perd enormément :/
Private Sub Worksheet_Change(ByVal Target As Range)
par :
Private Sub Worksheet_Change(ByVal Target As Range)
Dim r As Range
Dim c As Range
Set r = Intersect(Me.UsedRange, Me.UsedRange.Offset(1, 1))
If Intersect(Target, r.Cells) Is Nothing Then Exit Sub
For Each c In Intersect(Target, r.Cells).Cells
If c.Value = "NO" Then
Call Supprime_Colonnes(c.EntireRow.Cells(1, 1).Value, c.EntireColumn.Cells(1, 1).Value)
End If
Next c
End Sub
Merci pour ta réponse, Alors j'ai essayé de placer ce code après le code de la macro, ça ne change rien (les colonnes selectionnées ne sont pas supprimées), et si j'enleve le "sub" il me pose erreur dans le "me".usedRange .. J'ai surement mal placé la procédure. Comment puis je integrer cette procédure au "Sub" déjà existant de ma macro ? càd exécuter le sub generant les feuilles et juste apres excuter le sub qui sert à supprimer les colonnes.?
Il ne faut pas mettre ce code dans ta macro ni dans un module simple mais remplacer toute l'ancienne macro
Private Sub Worksheet_Change(ByVal Target As Range)
que je t'avais proposée en #4, située dans le module de la "Feuille X", par la nouvelle macro ci -dessus.
Cela mettra à jour les feuilles automatiquement à condition que tu créé les nouvelles feuilles avant de mettre à jour les NO correspondants sur la Feuille X
Oui en fait c'est cela que je dois changer, l'utilisateur doit d'abord selectionner les NO, et ensuite cliquer sur le bouton pour generer les feuilles sans les colonnes. C'est pourquoi j'ai pensé inclure ce code dans la macro existante. Quand je teste avec le dernier code il tombe en erreur puisqu'il ne trouve pas les feuilles. :( helpppp
JE RÉPÈTE : pour que ça fonctionne, il faut que les feuilles sont créées avant d'écrire leur nom et les YES ou NO dans la feuille X
Autrement dit, il faut que ta macro ajoute d'abord la nouvelle feuille et ensuite mette à jour la ligne correspondante dans la feuille X
Il n'y a pas besoin de faire appel, il s'agit d'une procédure évènementielle qui s'exécute automatiquement à chaque modification de la feuille X, que cette modification soit manuelle ou effectuée par ta macro, la seule condition est le respecter la chronologie des événement, c'est c-à-dire que ta macro d'ajout doit :
- ajouter la nouvelle feuille (et éventuellement définir son nom),
- ajoute son nom en début de ligne sur la Feuille X
puis
- mettre à jour les YES et NO (manuellement ou à la fin de la macro)
Il y a un problème avec la colonne commentaire qui contient certaines données dans la feuille Données et d'autres dans la nouvelle feuille (valA ou valB),.
Pourquoi deux commentaires différents ? Comment doit-on les traiter ? Lequel est le bon ?
En fait les colonnes qui sont sur la feuille varA et varB sont les mêmes que sur les feuilles générées (aaa1 eee2...), donc le but c'est que le contenu du range ("E":"W") de la feuille varA soit copié dans le range ("E":"W") des feuilles aaa1, eee2...quand c'est (VRAI + varA)
idem pour (VRAI + varB).
la colonne Commentaire de la feuille "données" n'aura aucun role, et ne sera pas copié.
il faut ajouter les données de la feuille var (et déclarer la nouvelle variable w)
'- ajouter les données de la feuille var
On Error Resume Next
Set w = Worksheets(c.EntireRow.Cells(1, colSrc).Value)
On Error GoTo 0
If Not w Is Nothing Then
d.EntireRow.Cells(1, colVal).Resize(1, nbC_Val).Value = _
w.Cells(2, colVal).Resize(1, nbC_Val).Value
End If
Cependant, il me semble que tu n'as pas fait une analyse globale de ce que tu voudrais et donc tu écris le cahier des charges au fur et à mesure de l'avancement du projet !
C'est une mauvaise approche, car à force de poser les cataplasmes les uns sur les autres on obtient une véritable usine à gaz et on finit par être obligé de tout reprendre à zéro.
En fait c'est le client qui demande a chaque fois des changements :s
J'ai testé en plusieurs reprises en appliquant ton code sur mon fichier, je vois que les données sont répétées, ou mal récupérés ... je vois que les données de la première ligne sont répétées dans d'autres lignes, et ne prend pas les valeurs des 2 feuilles varA ou varB comme il faut.
Je vais essayer de plonger encore plus pour voir d'ou vient le souci...
Bonjour Patrice,
Je me permets de te déranger encore une fois :) . En fait selon ce que j'ai compris, les lignes à copier depuis varA et varB sont copiés par ordre descendant, meme si je ne sais pas pourquoi il sont dupliquées dans plusieurs lignes !!
Est t il possible d'ajouter une condition qui permet de:
-Parcourir chaque valeur de la colonne A ligne par ligne
-Comparer cette valeur par celle de la colonne A de la feuille varA/varB, si les valeurs sont semblables, copier tout le range E:W dans les feuilles a générer.
Comme ça les données de VarA et VarB seront cohérent avec le champ "Nom" correspondant de la feuille "Données".
Re, voici mes réponses:
-Dans la feuille "Donnees" seul le champ "Nom" de la colonne "A" est à copier dans aaa1, eee2...etc
-Les feuilles varA et varB seront déjà rempli manuellement, nous n'auront qu'à en copier les données de la plage E:P et les coller dans les feuilles générées aaa1, eee2...etc dans les lignes correspondantes à chaque "Nom". (juste une précision comme indiqué dans les feuilles, c'est que les valeurs qu'il faut comparer dans Donnees sont en Maj+espace alors que sur varA et varB il sont en Min+'_')
Pour les champs vides, ils seront remplies manuellement, donc on a pas à les toucher.
-Les champs à copier de "Donnees" => "Nom"
-Les champs à copier de "varA" et "varB" => tous ceux de la plage "E:P"
-En fait les intitulés de champs de varA et varB sont les mêmes que dans Feuille_exemple voire les feuilles aaa1, eee2 qui seront générées. Depuis varA et varB, nous aurons seulement besoin des données de la plage "E:P" dépendemment de la valeur "Nom" qu'on devra comparer à celle de la feuille "Donnees".
-Comme j'ai mis dans l'exemple pour le "Nom" = Siml Trad, cette valeur existe 2 fois dans Donnees, mais chacune appartient à une des feuilles varA ou varB, donc selon ce qui a été définit dans "Source" + VRAI = la macro devra récupérer les données "E:P" equivalentes.
Une fois le résultat obtenu, le client sera content moi je serai contente et toi aussi :-D .. J'espere apprendre mieux le VBA pour ne plus avoir à te déranger ;-)
Cordialement
Patrice
Pourrais tu m'aider stp sur le même sujet mais en integrant cette fonctionnalité dans une macro ?
J'ai déjà une macro qui crée des feuilles automatiquement, et je voudrai qu'après avoir selectionné les NO, et cliqué sur le bouton exécutant cette macro, que les feuilles soient générées sans les colonnes . càd que la suppression des colonnes se fasse apres la génération de ces feuilles. Est ce faisable avec le même code?