Vous utilisez un navigateur obsolète. Il se peut que ce site ou d'autres sites Web ne s'affichent pas correctement. Vous devez le mettre à jour ou utiliser un navigateur alternatif.
Boostez vos compétences Excel avec notre communauté !
Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force.
Apprenez, échangez, progressez – et tout ça gratuitement !
👉 Inscrivez-vous maintenant !
Pourriez-vous me dire s'il est possible par macro de supprimer des colonnes en fonction du contenu d'une cellule, SVP ?
J'ai un classeur contenant plusieurs colonnes allant de A à BZ, et je souhaiterai que certaines colonnes tels que D,F,K, AB, AG etc ... se suppriment si les cellules de la colonne D sont vides. En effet je veux également supprimer la colonne qui permet de faire la vérification.
Merci pour ta réponse.
C'est exactement ce que je souhaitais faire.
Merci beaucoup.
Si je peux abuser j'ai une autre question sur ce même classeur, je ne sais pas si je dois ouvrir un nouveau post pour cela.
J'ai une multitude de colonnes à faire remplir par des collègues, en fonction du service concerné certaines colonnes sont obligatoires d'autres pas.
A la fin de la saisie, je souhaite que ceux-ci cliquent sur un bouton qui génère un fichier texte.
Etant donné que les champs obligatoires ne sont pas les mêmes pour tout le monde, je supprime donc les colonnes vides pour ceux qui ne sont pas concernés (grace à ton bout de code c'est OK).
Ma question est comment conserver la longueur de mes colonnes même après la suppression ?
Normalement, la suppression de colonnes ne modifie pas la largeur des autres colonnes.
Si tu es amené à travailler par la suite sur ces feuilles, il peut être intéressant non pas de supprimer mais de masquer les colonnes inutiles ce qui permet de garder une disposition commune.
Dans ce cas, remplace ".Delete Shift:=xlToLeft"" par ".Hide"
Npta :Un petit fichier joint permet souvent de mieux comprendre le besoin (1 feuille par personne ?)
Merci pour vos réponses et d'avoir pris le temps de comprendre mon problème.
A vous lire et me relire je m'aperçois que je me suis mal exprimée.
En fait dans le fichier que je communique à mes collègues, je souhaites appliquer une longueur à chaque colonne qui n'est pas modifiable même si l'utilisateur la dépasse..
Le but final étant d'obtenir un fichier texte dont chaque champ à une longueur défini.
Je vous joins un exempel de fichier qui j'espère sera plus parlant.
En fait dans le fichier que je communique à mes collègues, je souhaites appliquer une longueur à chaque colonne qui n'est pas modifiable même si l'utilisateur la dépasse..
Le but final étant d'obtenir un fichier texte dont chaque champ à une longueur défini.
J'ai mis un fichier joint.
A la base je n'ai pas de fichier de travail avancé, je pose les questions avant de me lancer dans une chose dont je ne sais pas si cela est réalisable.
Aujourd'hui mes collègues m'envoient les infos par mail que je saisi à la main dans un fichier texte.
Mon but est de leur demander de remplir les infos dans un fichier excle que je transformerai en texte, ce qui m'évitera toute saisie.
Qu'est ce qui n'est pas clair dans mes questions ? Je me ferai un plaisir d'y répondre
Quel type d'exemple souhaites-tu que je t'envoi vu que je n'ai pas commencé ?
Salut loulou75 et le forum
Juste une remarque : la suppression des colonnes ne me semble pas une bonne idée. Il faudra que tu cherche dans quelle colonne tu veux transférer, et pas juste copier la ligne.
Ne connaissant pas tes compétences sur Excel, une proposition :
Clic-droit sur nom de l'onglet concerné>>visualiser le code, et tu colles la macro suivante :
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
'Déclaration ============================================
Dim Cel As Range, Plage As Range, Cel_1 As Range, X
'MEI ====================================================
Set Plage = Intersect(Target, Range([A2], Cells(Rows.Count, Cells(1, Columns.Count).End(xlToLeft).Column)))
'plage= intersection entre target et zone de A2 à dernière cellule de la dernière colonne non vide en ligne1
If Plage Is Nothing Then Exit Sub
'si plage reste vide, on sort
For Each Cel In Plage
'pour chaque cellule de plage
If Left(Cel, 1) = " " Or Right(Cel, 1) = " " Then Cel = Trim(Cel)
'suppression de tous les espaces de début et de fin s'ils existent
Select Case Cells(1, Cel.Column)
'variable case=titre de la colonne
Case "Nom"
If Len(Cel) > 30 Then
Cel = Left(Cel, 30)
If Cel_1 Is Nothing Then
Set Cel_1 = Cel
Else
Set Cel_1 = Union(Cel_1, Cel)
End If
End If
Case "Prenom"
If Len(Cel) > 35 Then
Cel = Left(Cel, 35)
If Cel_1 Is Nothing Then
Set Cel_1 = Cel
Else
Set Cel_1 = Union(Cel_1, Cel)
End If
End If
Case "2ème prénom"
If Len(Cel) > 35 Then
Cel = Left(Cel, 35)
If Cel_1 Is Nothing Then
Set Cel_1 = Cel
Else
Set Cel_1 = Union(Cel_1, Cel)
End If
End If
'Case "adresse"
Case "code postal"
If Len(Cel) > 5 Then
Cel = Left(Cel, 5)
If Cel_1 Is Nothing Then
Set Cel_1 = Cel
Else
Set Cel_1 = Union(Cel_1, Cel)
End If
End If
'Case "ville"
'Case "service"
'Case "fonction"
'Case "division"
End Select
'fin du test
Next Cel
'cellule suivante
If Not (Cel_1 Is Nothing) Then MsgBox "Attention les cellules suivantes ont été tronquées :" & Chr(13) _
& Chr(13) & Cel_1.Address(0, 0) & Chr(13), vbCritical + vbOKOnly, "- TRONCAGE CELLULE -"
End Sub
J'ai mis toutes les colonnes ayant un titre. Celles qui n'étaient pas précisées en taille (sauf pour la colonne prénom, qui doit être vraisemblablement calibrée à 35).
S'il y a des choses nébuleuses, ne pas hésiter à demander des explications.
Il vaut mieux passer pour un clown une fois que perdre des données parce qu'on a pas osé demander des explications 😛.
A+
J'ai un niveau débutant, je ne maitrise pas du tout, mais j'ai entendu parlé de toutes les facultés d'excel et je me suis dit pourquoi pas essayé.
J'ai lu ton code avec les commentaires (qui me sont bien utiles vu mon ignorance) et j'ai quelques questions.
Code:
'si plage reste vide, on sort
Est ce que le code qui suit ce commentaire veut dire que toutes les colonnes des cellules vides seront supprimées ?
Je ne souhaite pas masquer ou supprimer toutes les colonnes dont les cellules sont vides mais seulement quelques unes.
Ex : Si cellule B2 vide, masquer colonne F, G etc .. puis appliquer la longueur des colonnes qui suivent (la suite de ton code si j'ai bien compris).
Code:
'suppression de tous les espaces de début et de fin s'ils existent
Ca veut dire quoi ? Ca supprime quoi ?
Le reste de ton code je pense l'avoir compris.
Désolée pour mon incompétence.
Merci encore.
Je vais faire des tests avec ton code pour voir le résultat que j'obtiens et tenter de mieux comprendre (c'est en manipulant et en faisant des erreurs que je pense apprendre 🙂).
If Plage Is Nothing Then Exit Sub
'si plage reste vide, on sort
ça veut dire très exactement
si plage n'est rien, sortir de l'exécution de la macro en cours (aller directement à End Sub).
Plage = les cellules qui viennent d'être modifiées (plus exactement qui viennent de sortir d'un mode Édition) et qui appartiennent au Range de A2 à la première cellule non vide quand on est sur la dernière colonne de la page et qu'on va vers la gauche, à la dernière ligne de la feuille (ouf). Avant 2007 : dernière colonne : IV dernière ligne : 65536. mais 2007(et suivantes) autorise plus de lignes et de colonnes. Donc, suivant la version, on a deux limites => on est obligé de demander à Excel de les calculer au moment de l'exécution de la macro.
Rows.count : compter le nombre de lignes de la feuille = numéro de la dernière ligne de la feuille. Idem pour les colonnes
Est ce que le code qui suit ce commentaire veut dire que toutes les colonnes des cellules vides seront supprimées ? Non, on arrête simplement la macro
Je ne souhaite pas masquer ou supprimer toutes les colonnes dont les cellules sont vides mais seulement quelques unes. C'est ce que j'avais cru comprendre. Le problème d'une suppression est qu'on ne peut plus se référer à la place de la colonne (si on supprime C, D devient la 3ème). Donc, il faut se référer à quelque chose qui ne change pas si on supprime les colonnes, ou qu'on les remplit => j'ai pris comme référence les noms des titres en ligne 1.
'suppression de tous les espaces de début et de fin s'ils existent
Ça veut dire quoi ? Ça supprime quoi ? Demande de renseigner des cellules par une multitude de personnes => risque faramineux d'avoir des fautes de frappe.
" 12345 " : en admettant qu'on tape ça dans le code postal. On est dans le KK : si j'applique directement une limite de 5 caractères, vu que j'ai 2 espaces en premier et en dernier, je supprime à partir de 5 et j'ai " 123" Pas glop, pas glop.
donc, avant de commencer à tester les longueurs, je supprime les espaces de début et de fin
Trim(" 12345 ") donne "12345" (fonction SUPPRESPACE() en feuille de calcul).
Évidemment, ça ne pourra pas tout corriger. On part du principe que seuls ceux de début ou de fin sont non significatifs. Malheureusement, la nature humaine est ainsi faite qu'il s'en trouvera toujours qui sont gênés parce que le mot colle trop à gauche ou à droite et qu'un espace aère visuellement le texte 😉.
Pareil pour les titres : je suis parti du principe qu'on ne les retouchera pas et que je peux m'appuyer dessus comme référence.
Désolée pour mon incompétence...
Je vais faire des tests avec ton code pour voir le résultat que j'obtiens et tenter de mieux comprendre (c'est en manipulant et en faisant des erreurs que je pense apprendre 🙂)
quelques remarques anodines
- L'incompétent est celui qui ne cherche pas à progresser : je crois que ça découle d'une citation de Fucius, qui n'était pas trop con 😀
- Si tu ne veux jamais faire d'erreur... ne fais rien !
-C'est en se mouchant qu'on devient moucheron. Dans un lointain passé, un de mes prof me disait que faire des erreurs et les résoudre étaient les bases de l'apprentissage.
Faut pas croire, surtout sur Excel, je ne connais personne qui savait tout dès le départ. Tous ceux qui répondent aujourd'hui ont un lourd passé d'erreurs, heureusement, derrière eux.
C'est pour ça que je précise de ne jamais hésiter à demander des précisions ou des explications.
Une instruction mal interprétée finira toujours, suivant la loi de Murphy, par être mal utilisée et créer le chaos. Déjà qu'en l'ayant réellement comprise, il arrive qu'on ne pense pas à toutes les implications qui en découle, alors en l'utilisant à mauvais escient...
Pour la plupart des macros que je fais, je les testes dans les limites de ce qu'elles doivent faire.
En faisant ça, et en suivant le déroulement en pas-à-pas, on se rend souvent compte qu'on avait pas pensé à certaines implications. Donc, par exemple, je testais la longueur du code postal => facile, puisque que 5 caractères. sauf que si pas d'erreur, pas de range Cel_1 => message d'adresse de Cel_1 délivrais une erreur. Sauf que s'était camouflé, puisque je savais bien qu'il y avait 6 caractères.
Et puis je me suis rendu compte que l'erreur venait de la macro qui se relançait quand je tronquais sa longueur à 5, et qu'en re-testant elle ne trouvait plus d'erreur.
Je m'en serais rendu compte plus vite en faisant un test avec des données courtes... mais ça s'était pas intéressant, donc j'ai commencé par le nom 12045678901234567890123456789Abdc qui me donnait une erreur alors qu'il était corrigé correctement.
A+
Je ne comprends toutes remarques et je ne sais pas ce qui te pousse à ironiser sur mon problème.
Tu as écrit 2 posts sur mon fil pour à chaque fois ne rien dire de très aidant.
Si tu pouvais plutot me dire ce qui te déplait dans mon post, j'en prendrai note pour les prochaines fois.
Que tu ne souhaites pas m'aider c'est ton choix et tu en as le droit, mais que tu ironises gratuitement ca me dérange.
Si je souhaite appliquer des longueurs à mes colonnes c'est parceque au final je souhaite obtenir un fichier texte sans séparateur qui respecte ces longueurs.
- Navigue sans publicité - Accède à Cléa, notre assistante IA experte Excel... et pas que... - Profite de fonctionnalités exclusives Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel. Je deviens Supporter XLD
Assurez vous de marquer un message comme solution pour une meilleure transparence.