Indicage d'une colonne par un nom
Résolu/Fermé
Tom 44
Messages postés
47
Date d'inscription
mardi 30 juillet 2013
Statut
Membre
Dernière intervention
11 mars 2014
-
7 oct. 2013 à 10:40
yg_be Messages postés 23403 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 décembre 2024 - 14 août 2022 à 18:50
yg_be Messages postés 23403 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 décembre 2024 - 14 août 2022 à 18:50
A voir également:
- Indicage d'une colonne par un nom
- Déplacer une colonne excel - Guide
- Formule somme excel colonne - Guide
- Trier colonne excel - Guide
- Colonne word - Guide
- Triez cette liste par ordre alphabétique des villes et par note de la meilleure à la moins bonne. quel mot est formé par les 8 premières lettres de la colonne code ? ✓ - Forum Excel
19 réponses
melanie1324
Messages postés
1504
Date d'inscription
vendredi 25 mai 2007
Statut
Membre
Dernière intervention
31 janvier 2018
154
7 oct. 2013 à 11:10
7 oct. 2013 à 11:10
Bonjour,
tu peux tout à fait rechercher comme tu l'as indiqué en utilisant ce qu'on appelle une variable :
sub variable
dim colonne, ligne as variant
ligne = 2
colonne = 1
do while cells (ligne, colonne) <> "titre" ' tant que la cellule située en ligne 2 et colonne 1 est différent de titre
colonne = colonne +1 'on ajoute 1 à colonne pour passer à la colonne suivante
loop
a=magbox("La colonne où se trouve titre est " & colonne)
tu peux tout à fait rechercher comme tu l'as indiqué en utilisant ce qu'on appelle une variable :
sub variable
dim colonne, ligne as variant
ligne = 2
colonne = 1
do while cells (ligne, colonne) <> "titre" ' tant que la cellule située en ligne 2 et colonne 1 est différent de titre
colonne = colonne +1 'on ajoute 1 à colonne pour passer à la colonne suivante
loop
a=magbox("La colonne où se trouve titre est " & colonne)
Tom 44
Messages postés
47
Date d'inscription
mardi 30 juillet 2013
Statut
Membre
Dernière intervention
11 mars 2014
7 oct. 2013 à 11:46
7 oct. 2013 à 11:46
Bonjour Mélanie,
Merci pour l'astuce.
Par contre cela me permettra t il d'activer cette colonne afin que je puisse y récupérer les données que je cherche ?
Merci par avance.
Merci pour l'astuce.
Par contre cela me permettra t il d'activer cette colonne afin que je puisse y récupérer les données que je cherche ?
Merci par avance.
melanie1324
Messages postés
1504
Date d'inscription
vendredi 25 mai 2007
Statut
Membre
Dernière intervention
31 janvier 2018
154
7 oct. 2013 à 12:05
7 oct. 2013 à 12:05
Bonjour,
tu peux faire ce que tu veux en réutilisant la variable colonne par la suite, exemple :
sub variable
dim colonne, ligne as variant
sheets("Feuille1").select
ligne = 2
colonne = 1
do while cells (ligne, colonne) <> "titre" ' tant que la cellule située en ligne 2 et colonne 1 est différent de titre
colonne = colonne +1 'on ajoute 1 à colonne pour passer à la colonne suivante
loop
columns(colonne).copy sheets("Feuille2").columns(1)
' copie la colonne définie dans la variable colonne dans la feuille2 colonne 1
end sub
tu peux faire ce que tu veux en réutilisant la variable colonne par la suite, exemple :
sub variable
dim colonne, ligne as variant
sheets("Feuille1").select
ligne = 2
colonne = 1
do while cells (ligne, colonne) <> "titre" ' tant que la cellule située en ligne 2 et colonne 1 est différent de titre
colonne = colonne +1 'on ajoute 1 à colonne pour passer à la colonne suivante
loop
columns(colonne).copy sheets("Feuille2").columns(1)
' copie la colonne définie dans la variable colonne dans la feuille2 colonne 1
end sub
Tom 44
Messages postés
47
Date d'inscription
mardi 30 juillet 2013
Statut
Membre
Dernière intervention
11 mars 2014
8 oct. 2013 à 09:00
8 oct. 2013 à 09:00
Bonjour,
Ok merci pour l'info.
Par contre je me demandais s'il était possible de "stocker" plusieurs colonnes définies par autant de "titre" et ensuite les utiliser dans une macro de ce type :
Immeuble = 'données à récupérer dans la colonne stockée n°1
Workbooks(A_wbook).Activate
Sheets("XX").Activate 'a définir en fonction du nom de l'onglet cible
Cells(Liga, 1) = Immeuble 'a définir en fonction du numéro de la colonne cible
Workbooks(B_wbook).Activate
Adresse = 'données à récupérer dans la colonne stockée n°2
Workbooks(A_wbook).Activate
Sheets("XX").Activate 'a définir en fonction du nom de l'onglet cible
Cells(Liga, 1) = Immeuble 'a définir en fonction du numéro de la colonne cible
Workbooks(B_wbook).Activate
Etc...
Sachant que les Wbooks A & B sont déjà définis, ainsi que les plages des lignes à remplir.
Merci encore pour ton aide précieuse.
Ok merci pour l'info.
Par contre je me demandais s'il était possible de "stocker" plusieurs colonnes définies par autant de "titre" et ensuite les utiliser dans une macro de ce type :
Immeuble = 'données à récupérer dans la colonne stockée n°1
Workbooks(A_wbook).Activate
Sheets("XX").Activate 'a définir en fonction du nom de l'onglet cible
Cells(Liga, 1) = Immeuble 'a définir en fonction du numéro de la colonne cible
Workbooks(B_wbook).Activate
Adresse = 'données à récupérer dans la colonne stockée n°2
Workbooks(A_wbook).Activate
Sheets("XX").Activate 'a définir en fonction du nom de l'onglet cible
Cells(Liga, 1) = Immeuble 'a définir en fonction du numéro de la colonne cible
Workbooks(B_wbook).Activate
Etc...
Sachant que les Wbooks A & B sont déjà définis, ainsi que les plages des lignes à remplir.
Merci encore pour ton aide précieuse.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
melanie1324
Messages postés
1504
Date d'inscription
vendredi 25 mai 2007
Statut
Membre
Dernière intervention
31 janvier 2018
154
8 oct. 2013 à 09:26
8 oct. 2013 à 09:26
Bonjour,
tu peux tout à faire agir comme cela.
Ca me semble correct.
tu peux tout à faire agir comme cela.
Ca me semble correct.
Tom 44
Messages postés
47
Date d'inscription
mardi 30 juillet 2013
Statut
Membre
Dernière intervention
11 mars 2014
8 oct. 2013 à 09:48
8 oct. 2013 à 09:48
Ok je tenterai qqchose dans la journée.
Par contre penses tu qu'il soit nécessaire de passer par un recopiage "tampon" obligatoire des colonnes comme tu le programmais plus haut, ou est-il possible de les stocker "en mémoire" et ainsi les rappeler à la volée ?
Si tel est le cas, pourrais tu m'éclairer sur la procédure à suivre ?
Encore une fois merci pour ton aide.
Par contre penses tu qu'il soit nécessaire de passer par un recopiage "tampon" obligatoire des colonnes comme tu le programmais plus haut, ou est-il possible de les stocker "en mémoire" et ainsi les rappeler à la volée ?
Si tel est le cas, pourrais tu m'éclairer sur la procédure à suivre ?
Encore une fois merci pour ton aide.
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 752
8 oct. 2013 à 09:50
8 oct. 2013 à 09:50
Bonjour,
Je vous propose une petite variante...
Un code qui nomme toutes les colonnes en fonction du contenu de la ligne de titre :
Ensuite, pour votre copié-collé, il suffit d'indiquer le nom de la colonne à copier...
Exemple de copié-collé de la colonne nommée Magie vers la feuille Feuil2 colonne A :
Je vous propose une petite variante...
Un code qui nomme toutes les colonnes en fonction du contenu de la ligne de titre :
Sub NommeColonnes()Note : la ligne de titres est ici la ligne 3, à adapter.
Dim intCol As Integer, intDrCol As Integer, byLig As Byte
'Le numéro de la ligne contenant les titres :
byLig = 3
'Le numéro de la dernière colonne dont la ligne "byLig" est non-vide :
intDrCol = Cells(byLig, Cells.Columns.Count).End(xlToLeft).Column
'Boucle de la 1ère colonne (Colonne A) à la dernière (calculée ci-dessus)
For intCol = 1 To intDrCol
ActiveWorkbook.Names.Add Name:=Cells(byLig, intCol).Value, RefersTo:="=" & ActiveSheet.Name & "!" & Columns(intCol).Address
Next intCol
End Sub
Ensuite, pour votre copié-collé, il suffit d'indiquer le nom de la colonne à copier...
Exemple de copié-collé de la colonne nommée Magie vers la feuille Feuil2 colonne A :
Sub CopieColle()
Range("Magie").Copy Sheets("Feuil2").Range("A1")
End Sub
Tom 44
Messages postés
47
Date d'inscription
mardi 30 juillet 2013
Statut
Membre
Dernière intervention
11 mars 2014
8 oct. 2013 à 13:15
8 oct. 2013 à 13:15
Merci pour le code mais je ne penses pas qu'il soit adapté à ma situation...
Cependant, en revenant sur vos anciens posts je me posait la question suivante :
Est il possible que votre code suivant puisse rechercher plusieurs "titre" sur différentes colonnes d'une même ligne avant de venir copier le contenu de chacune d'entre elles sur la feuille suivante ?
Car si j'ai bien compris votre code il n'est possible de rechercher qu'un seul titre que l'on définit sur la variable colonne.
Ce que j'essaye d'adapter ne fonctionne pas (plusieurs boucles "similaires" à la suite recherchant des titres différents et collant leur contenu sur une autre feuille)
sub variable
dim colonne, ligne as variant
sheets("Feuille1").select
ligne = 2
colonne = 1
do while cells (ligne, colonne) <> "titre" ' tant que la cellule située en ligne 2 et colonne 1 est différent de titre
colonne = colonne +1 'on ajoute 1 à colonne pour passer à la colonne suivante
loop
columns(colonne).copy sheets("Feuille2").columns(1)
' copie la colonne définie dans la variable colonne dans la feuille2 colonne 1
end sub
Pensez vous que cela soit possible ?
Si oui, auriez vous une idée à me soumettre (comme vous vous en doutez surement mon niveau en codage reste malheureusement limité...)
Merci par avance pour votre engagement.
Cependant, en revenant sur vos anciens posts je me posait la question suivante :
Est il possible que votre code suivant puisse rechercher plusieurs "titre" sur différentes colonnes d'une même ligne avant de venir copier le contenu de chacune d'entre elles sur la feuille suivante ?
Car si j'ai bien compris votre code il n'est possible de rechercher qu'un seul titre que l'on définit sur la variable colonne.
Ce que j'essaye d'adapter ne fonctionne pas (plusieurs boucles "similaires" à la suite recherchant des titres différents et collant leur contenu sur une autre feuille)
sub variable
dim colonne, ligne as variant
sheets("Feuille1").select
ligne = 2
colonne = 1
do while cells (ligne, colonne) <> "titre" ' tant que la cellule située en ligne 2 et colonne 1 est différent de titre
colonne = colonne +1 'on ajoute 1 à colonne pour passer à la colonne suivante
loop
columns(colonne).copy sheets("Feuille2").columns(1)
' copie la colonne définie dans la variable colonne dans la feuille2 colonne 1
end sub
Pensez vous que cela soit possible ?
Si oui, auriez vous une idée à me soumettre (comme vous vous en doutez surement mon niveau en codage reste malheureusement limité...)
Merci par avance pour votre engagement.
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 752
8 oct. 2013 à 13:36
8 oct. 2013 à 13:36
Merci pour le code mais je ne penses pas qu'il soit adapté à ma situation...
As tu essayé???
As tu essayé???
Tom 44
Messages postés
47
Date d'inscription
mardi 30 juillet 2013
Statut
Membre
Dernière intervention
11 mars 2014
8 oct. 2013 à 13:40
8 oct. 2013 à 13:40
Oui tout à fait.
Alors comme je l'ai précisé je ne possède pas un niveau élevé en codage, mais à priori le code n'abouti pas.
En effet, lorsque je change le titre "Magie" par celui que je recherche aucun copier-coller n'apparait.
Ce qui me semble étrange c'est que la 1ère macro ne définit à aucun endroit le même titre (en l'occurence "Magie").
Cela vient sans doute de là...mais j'ai peut-être tort.
Alors comme je l'ai précisé je ne possède pas un niveau élevé en codage, mais à priori le code n'abouti pas.
En effet, lorsque je change le titre "Magie" par celui que je recherche aucun copier-coller n'apparait.
Ce qui me semble étrange c'est que la 1ère macro ne définit à aucun endroit le même titre (en l'occurence "Magie").
Cela vient sans doute de là...mais j'ai peut-être tort.
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 752
Modifié par pijaku le 8/10/2013 à 13:59
Modifié par pijaku le 8/10/2013 à 13:59
Oui.
La première macro que je t'ai donné (Sub NommeColonnes()) renomme les colonnes selon le contenu de leur troisième ligne (byLig = 3).
Tu peux déjà commencer par changer le numéro de la ligne de titres par byLig = 2...
Ensuite, des deux procédures que je t'ai donné, le but est de n'en faire qu'une seule.
Par exemple :
Ce code comporte cependant un inconvénient... Il ne peut pas, dans tes entêtes, y avoir un espace ou un tiret pour commencer le mot....
Mais tu sais, ce n'est qu'un exemple, tu peux très bien continuer avec le code de Melanie si tu le sens mieux...
La première macro que je t'ai donné (Sub NommeColonnes()) renomme les colonnes selon le contenu de leur troisième ligne (byLig = 3).
Tu peux déjà commencer par changer le numéro de la ligne de titres par byLig = 2...
Ensuite, des deux procédures que je t'ai donné, le but est de n'en faire qu'une seule.
Par exemple :
Sub MaMacroAMoi()
Dim intCol As Integer, intDrCol As Integer, byLig As Byte
Dim tabNomsCol(), intIndic As Integer, intColcolle As Integer
'---------- PROCÉDURE DE NOMMAGE DES COLONNES-----------
'Le numéro de la ligne contenant les titres :
byLig = 2 'A ADAPTER!!!!
'Le numéro de la dernière colonne dont la ligne "byLig" est non-vide :
intDrCol = Cells(byLig, Cells.Columns.Count).End(xlToLeft).Column
'Boucle de la 1ère colonne (Colonne A) à la dernière (calculée ci-dessus)
For intCol = 1 To intDrCol
'renomme les colonnes
ActiveWorkbook.Names.Add Name:=Cells(byLig, intCol).Value, RefersTo:="=" & ActiveSheet.Name & "!" & Columns(intCol).Address
Next intCol
'---------------FIN NOMMAGE COLONNES-----------------------
'--------------DÉFINITION DES COLONNES A COPIER------------
'A ADAPTER en plaçant les noms des entêtes.........
tabNomsCol = Array("NOM", "Prénom", "Adresse", "Téléphone", "Ville", "CodePostal", "Mail")
'--------------COPIE-COLLE ---------------------------------
'A partir de qu'elle colonne coller les données :
intColcolle = 2 'A ADAPTER ici on colle à partir de la colonne B
For intIndic = 0 To UBound(tabNomsCol)
Range(tabNomsCol(intIndic)).Copy Sheets("Feuil2").Cells(1, intColcolle)
intColcolle = intColcolle + 1
Next intIndic
End Sub
Ce code comporte cependant un inconvénient... Il ne peut pas, dans tes entêtes, y avoir un espace ou un tiret pour commencer le mot....
Mais tu sais, ce n'est qu'un exemple, tu peux très bien continuer avec le code de Melanie si tu le sens mieux...
Tom 44
Messages postés
47
Date d'inscription
mardi 30 juillet 2013
Statut
Membre
Dernière intervention
11 mars 2014
8 oct. 2013 à 13:49
8 oct. 2013 à 13:49
N'y aurait il pas quelque chose à remplacer dans le code suivant ?
RefersTo:="=" & ActiveSheet.Name & "!"
Je pense avoir loupé qqchose à ce niveau, une référence au titre et à l'onglet peut-être ?
Merci d'avance pour votre aide.
RefersTo:="=" & ActiveSheet.Name & "!"
Je pense avoir loupé qqchose à ce niveau, une référence au titre et à l'onglet peut-être ?
Merci d'avance pour votre aide.
Tom 44
Messages postés
47
Date d'inscription
mardi 30 juillet 2013
Statut
Membre
Dernière intervention
11 mars 2014
8 oct. 2013 à 15:27
8 oct. 2013 à 15:27
Je viens d'essayer d'adapter ta macro à mes besoins et malheureusement je tombe sur ceci :
Erreur d'execution '1004':
Le nom entré n'est pas valide.
Es-ce par ce que j'ai des "titres" comportant des espaces dans leur nom ?
Encore merci pour toute votre aide.
Erreur d'execution '1004':
Le nom entré n'est pas valide.
Es-ce par ce que j'ai des "titres" comportant des espaces dans leur nom ?
Encore merci pour toute votre aide.
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 752
8 oct. 2013 à 15:46
8 oct. 2013 à 15:46
Oui, c'est ce que je te disais plus haut : Ce code comporte cependant un inconvénient... Il ne peut pas, dans tes entêtes, y avoir un espace ou un tiret pour commencer le mot....
Tom 44
Messages postés
47
Date d'inscription
mardi 30 juillet 2013
Statut
Membre
Dernière intervention
11 mars 2014
8 oct. 2013 à 15:50
8 oct. 2013 à 15:50
Oui j'avais bien saisi que le mot ne devait pas "commencer" par un espace.
Cela est il aussi le cas si l'espace est au centre du "titre" ex: "Id PM" ?
Cela est il aussi le cas si l'espace est au centre du "titre" ex: "Id PM" ?
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 752
8 oct. 2013 à 16:16
8 oct. 2013 à 16:16
Ah, je me suis mal exprimé...
Il fallait comprendre :
- Le nom ne doit pas contenir d'espace (ni autre caractère non valide)
- Le nom doit commencer par une lettre ou un underscore (tiret du 8)
- etc : le nom ne doit pas être en conflit avec un nom prédéfini dans Excel....
Il fallait comprendre :
- Le nom ne doit pas contenir d'espace (ni autre caractère non valide)
- Le nom doit commencer par une lettre ou un underscore (tiret du 8)
- etc : le nom ne doit pas être en conflit avec un nom prédéfini dans Excel....
Tom 44
Messages postés
47
Date d'inscription
mardi 30 juillet 2013
Statut
Membre
Dernière intervention
11 mars 2014
8 oct. 2013 à 17:24
8 oct. 2013 à 17:24
Merci pour ta précision.
Est il alors possible qu'en début de code on puisse passer par une manoeuvre détournée consistant à remplacer tous les espaces par une suite de caractères (ex : " " par "$$")
Est il alors possible qu'en début de code on puisse passer par une manoeuvre détournée consistant à remplacer tous les espaces par une suite de caractères (ex : " " par "$$")
Tom 44
Messages postés
47
Date d'inscription
mardi 30 juillet 2013
Statut
Membre
Dernière intervention
11 mars 2014
8 oct. 2013 à 18:08
8 oct. 2013 à 18:08
Avec ce genre de code par exemple :
' Remplacement des espaces
Sub Remplacement()
Cells.Replace What:=" ", Replacement:="$$", LookAt:=xlPart, SearchOrder _
:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
End Sub
Merci pour vos conseils experts.
' Remplacement des espaces
Sub Remplacement()
Cells.Replace What:=" ", Replacement:="$$", LookAt:=xlPart, SearchOrder _
:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
End Sub
Merci pour vos conseils experts.
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 752
8 oct. 2013 à 18:54
8 oct. 2013 à 18:54
Tu peux utiliser Replace.
Par exemple, en remplaçant les espaces par rien (donc en les supprimant) :
Cependant, lors du copié collé, il ne faut pas oublier que les noms donnés à nos colonnes n'ont pas d'espaces... Donc deux choix, soit on en tienxs compte dans leur définition :
tabNomsCol = Array("NOM", "Prénom", "Adresse", "Téléphone", "Ville", "CodePostal", "Mail")
Ou alors on repasse par un Replace dans la ligne (je n'ai pas testé) :
L'idéal étant, bien sur, en fin de macro, de supprimer tous ces noms dans le classeur, pour obtenir un code propre.
Attention également à l'utilisation de ActiveSheet.Name. Je n'aime pas trop... L'idéal serait de déclarer, en début de procédure, une variable de type WorkSheet ou l'on stockerait l'objet "feuille" concerné par la copie...
Je reviens demain pour terminer cela si tu le veux bien.
Par exemple, en remplaçant les espaces par rien (donc en les supprimant) :
Replace(bla bla, " ", "")ça donnerait dans ton code :
Sub MaMacroAMoi()
Dim intCol As Integer, intDrCol As Integer, byLig As Byte
Dim tabNomsCol(), intIndic As Integer, intColcolle As Integer
'---------- PROCÉDURE DE NOMMAGE DES COLONNES-----------
'Le numéro de la ligne contenant les titres :
byLig = 2 'A ADAPTER!!!!
'Le numéro de la dernière colonne dont la ligne "byLig" est non-vide :
intDrCol = Cells(byLig, Cells.Columns.Count).End(xlToLeft).Column
'Boucle de la 1ère colonne (Colonne A) à la dernière (calculée ci-dessus)
For intCol = 1 To intDrCol
'renomme les colonnes
ActiveWorkbook.Names.Add Name:=Replace(Cells(byLig, intCol).Value, " ", ""), RefersTo:="=" & ActiveSheet.Name & "!" & Columns(intCol).Address
Next intCol
'---------------FIN NOMMAGE COLONNES-----------------------
'--------------DÉFINITION DES COLONNES A COPIER------------
'A ADAPTER en plaçant les noms des entêtes.........
tabNomsCol = Array("NOM", "Prénom", "Adresse", "Téléphone", "Ville", "Code Postal", "Mail")
'--------------COPIE-COLLE ---------------------------------
'A partir de qu'elle colonne coller les données :
intColcolle = 2 'A ADAPTER ici on colle à partir de la colonne B
For intIndic = 0 To UBound(tabNomsCol)
Range(tabNomsCol(intIndic)).Copy Sheets("Feuil2").Cells(1, intColcolle)
intColcolle = intColcolle + 1
Next intIndic
End Sub
Cependant, lors du copié collé, il ne faut pas oublier que les noms donnés à nos colonnes n'ont pas d'espaces... Donc deux choix, soit on en tienxs compte dans leur définition :
tabNomsCol = Array("NOM", "Prénom", "Adresse", "Téléphone", "Ville", "Code Postal", "Mail")
à remplacer par :
tabNomsCol = Array("NOM", "Prénom", "Adresse", "Téléphone", "Ville", "CodePostal", "Mail")
Ou alors on repasse par un Replace dans la ligne (je n'ai pas testé) :
Range(tabNomsCol(intIndic)).Copy Sheets("Feuil2").Cells(1, intColcolle)Comme ceci :
Range(Replace(tabNomsCol(intIndic), " ", "")).Copy Sheets("Feuil2").Cells(1, intColcolle)
L'idéal étant, bien sur, en fin de macro, de supprimer tous ces noms dans le classeur, pour obtenir un code propre.
Attention également à l'utilisation de ActiveSheet.Name. Je n'aime pas trop... L'idéal serait de déclarer, en début de procédure, une variable de type WorkSheet ou l'on stockerait l'objet "feuille" concerné par la copie...
Je reviens demain pour terminer cela si tu le veux bien.
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 752
9 oct. 2013 à 09:35
9 oct. 2013 à 09:35
Salut,
En cadeau, voici la procédure complète :
1- Lis bien les commentaires,
2- adapte ce qui est indiqué
3- Teste
En cadeau, voici la procédure complète :
1- Lis bien les commentaires,
2- adapte ce qui est indiqué
3- Teste
Sub MaMacroAMoi()
Dim intCol As Integer, intDrCol As Integer, byLig As Byte
Dim tabNomsCol(), intIndic As Integer, intColcolle As Integer
Dim shFeuilAcopier As Worksheet, shFeuilOuColler As Worksheet
'On définit la feuille contenant les données à copier
Set shFeuilAcopier = Worksheets("Feuil1") '*********A ADAPTER********
'On définit la feuille ou coller les données
Set shFeuilOuColler = Workbooks("Blabla").Worksheets("Machin") '*********A ADAPTER******** Nécessite que le classeur blabla soit ouvert!
With shFeuilAcopier 'On travaille Avec la feuille à copier
'---------- PROCÉDURE DE NOMMAGE DES COLONNES-----------
'Le numéro de la ligne contenant les titres :
byLig = 2 '*********A ADAPTER********
'Le numéro de la dernière colonne dont la ligne "byLig" est non-vide :
'Note : ne pas oublier le point devant Cells car il se rattache à shFeuilAcopier
intDrCol = .Cells(byLig, Cells.Columns.Count).End(xlToLeft).Column
'Boucle de la 1ère colonne (Colonne A) à la dernière (calculée ci-dessus)
For intCol = 1 To intDrCol
'Si la cellule en ligne 2 n'est pas vide :
If .Cells(byLig, intCol) <> "" Then
'Nomme les colonnes (Définir un nom)
ActiveWorkbook.Names.Add Name:=Replace(.Cells(byLig, intCol).Value, " ", ""), _
RefersTo:="=" & shFeuilAcopier.Name & "!" & .Columns(intCol).Address
End If
Next intCol
'---------------FIN NOMMAGE COLONNES-----------------------
'--------------DÉFINITION DES COLONNES A COPIER------------
tabNomsCol = Array("NOM", "Prénom", "Adresse", "Téléphone", "Ville", "Code Postal", "Mail") '*********A ADAPTER********
'--------------FIN DEFINITION------------------------------
'--------------COPIE-COLLE --------------------------------
'A partir de qu'elle colonne coller les données :
intColcolle = 2 '*********A ADAPTER******** ici on colle à partir de la colonne B
For intIndic = 0 To UBound(tabNomsCol)
.Range(Replace(tabNomsCol(intIndic), " ", "")).Copy shFeuilOuColler.Cells(1, intColcolle)
intColcolle = intColcolle + 1
Next intIndic
'---------------FIN COPIE-COLLE----------------------------
'-------------SUPPRESSION DES NOMS-------------------------
For intCol = 1 To intDrCol
'Si la cellule en ligne 2 n'est pas vide :
If .Cells(byLig, intCol) <> "" Then
.Range(Replace(.Cells(byLig, intCol).Value, " ", "")).Name.Delete
End If
Next
'-------------FIN SUPPRESSION NOMS-------------------------
End With
End Sub
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 752
9 oct. 2013 à 09:42
9 oct. 2013 à 09:42
Note : je n'ai pas étudié les autres caractéristiques des noms (pas de caractères non valides, pas en conflit avec Excel etc...).
J'ai juste traité les cellules vides et celles contenant des espaces...
J'ai juste traité les cellules vides et celles contenant des espaces...
Tom 44
Messages postés
47
Date d'inscription
mardi 30 juillet 2013
Statut
Membre
Dernière intervention
11 mars 2014
9 oct. 2013 à 10:01
9 oct. 2013 à 10:01
Merci beaucoup pour ce travail très pro.
Seulement voilà je viens d'adapter votre code à ma situation et au code suivant :
Set shFeuilOuColler = Workbooks("Vannes").Worksheets("Feuil1")
Il me répond que l'indice n'appartient pas à la sélection... que faut il en déduire ?
Merci pour votre aide.
Seulement voilà je viens d'adapter votre code à ma situation et au code suivant :
Set shFeuilOuColler = Workbooks("Vannes").Worksheets("Feuil1")
Il me répond que l'indice n'appartient pas à la sélection... que faut il en déduire ?
Merci pour votre aide.
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 752
9 oct. 2013 à 10:05
9 oct. 2013 à 10:05
Soit que :
1- le classeur "Vannes" n'est pas ouvert
2- la feuille "Feuil1" n'existe pas dans le classeur "Vannes"
3- Qu'il y a juste une petite erreur d'orthographe dans le nom du classeur ou de la feuille (parfois un espace se glisse incognito dans les noms)
4- Ton Excel veut peut être que tu précises l'extension du classeur .xls, .xlsx
5- etc...
1- le classeur "Vannes" n'est pas ouvert
2- la feuille "Feuil1" n'existe pas dans le classeur "Vannes"
3- Qu'il y a juste une petite erreur d'orthographe dans le nom du classeur ou de la feuille (parfois un espace se glisse incognito dans les noms)
4- Ton Excel veut peut être que tu précises l'extension du classeur .xls, .xlsx
5- etc...
Tom 44
Messages postés
47
Date d'inscription
mardi 30 juillet 2013
Statut
Membre
Dernière intervention
11 mars 2014
9 oct. 2013 à 10:04
9 oct. 2013 à 10:04
C'est bon je vient de me débrouiller...
Par contre je pense que ma ligne de titre comporte trop de caratères spéciaux (ex : N° / des tirets ainsi que des apostrophe) et du coup ces lignes de codes ne se valident pas :
ActiveWorkbook.Names.Add Name:=Replace(.Cells(byLig, intCol).Value, " ", ""), _
RefersTo:="=" & shFeuilAcopier.Name & "!" & .Columns(intCol).Address
Est il possible de cumuler les valeurs de "replace" les unes à la suite des autres ?
Par contre je pense que ma ligne de titre comporte trop de caratères spéciaux (ex : N° / des tirets ainsi que des apostrophe) et du coup ces lignes de codes ne se valident pas :
ActiveWorkbook.Names.Add Name:=Replace(.Cells(byLig, intCol).Value, " ", ""), _
RefersTo:="=" & shFeuilAcopier.Name & "!" & .Columns(intCol).Address
Est il possible de cumuler les valeurs de "replace" les unes à la suite des autres ?
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 752
9 oct. 2013 à 11:02
9 oct. 2013 à 11:02
Dans ce cas, je préconise l'utilisation d'une fonction de validation des noms.
Cette fonction est à placer dans le même module que la sub principale. Ce n'est pas une obligation mais ce sera plus simple. On va lui passer en paramètre toutes les entêtes. La fonction va effectuer tous les remplacements que tu souhaites qu'elle fasse et va retourner un nom "valide" dans la sub principale.
Le code de cette fonction :
L'appel de la fonction :
Ensuite, l'appel de la fonction, se fera dans la procédure principale comme ceci :
ActiveWorkbook.Names.Add Name:=ValideNom(.Cells(byLig, intCol).Value)
ou :
.Range(ValideNom(tabNomsCol(intIndic))).Copy
ou encore :
.Range(ValideNom(.Cells(byLig, intCol).Value)).Name.Delete
Le code de la Sub principale :
Cette fonction est à placer dans le même module que la sub principale. Ce n'est pas une obligation mais ce sera plus simple. On va lui passer en paramètre toutes les entêtes. La fonction va effectuer tous les remplacements que tu souhaites qu'elle fasse et va retourner un nom "valide" dans la sub principale.
Le code de cette fonction :
Function ValideNom(ByVal Nom As String)Tu peux ajouter ce que tu veux dans ce code...
Nom = Replace(Nom, "°", "")
Nom = Replace(Nom, "'", "")
Nom = Replace(Nom, " ", "")
Nom = Replace(Nom, "/", "")
Nom = Replace(Nom, "", "")
Nom = Replace(Nom, ":", "")
Nom = Replace(Nom, "*", "")
Nom = Replace(Nom, "?", "")
Nom = Replace(Nom, "|", "")
Nom = Replace(Nom, "<", "")
Nom = Replace(Nom, ">", "")
ValideNom = Nom
End Function
L'appel de la fonction :
Ensuite, l'appel de la fonction, se fera dans la procédure principale comme ceci :
ActiveWorkbook.Names.Add Name:=ValideNom(.Cells(byLig, intCol).Value)
ou :
.Range(ValideNom(tabNomsCol(intIndic))).Copy
ou encore :
.Range(ValideNom(.Cells(byLig, intCol).Value)).Name.Delete
Le code de la Sub principale :
Sub MaMacroAMoi()
Dim intCol As Integer, intDrCol As Integer, byLig As Byte
Dim tabNomsCol(), intIndic As Integer, intColcolle As Integer
Dim shFeuilAcopier As Worksheet, shFeuilOuColler As Worksheet
'On définit la feuille contenant les données à copier
Set shFeuilAcopier = Worksheets("Feuil1") '*********A ADAPTER********
'On définit la feuille ou coller les données
Set shFeuilOuColler = Workbooks("Blabla.xls").Worksheets("Machin") '*********A ADAPTER******** Nécessite que le classeur blabla soit ouvert!
With shFeuilAcopier 'On travaille Avec la feuille à copier
'---------- PROCÉDURE DE NOMMAGE DES COLONNES-----------
'Le numéro de la ligne contenant les titres :
byLig = 2 '*********A ADAPTER********
'Le numéro de la dernière colonne dont la ligne "byLig" est non-vide :
'Note : ne pas oublier le point devant Cells car il se rattache à shFeuilAcopier
intDrCol = .Cells(byLig, Cells.Columns.Count).End(xlToLeft).Column
'Boucle de la 1ère colonne (Colonne A) à la dernière (calculée ci-dessus)
For intCol = 1 To intDrCol
'Si la cellule en ligne 2 n'est pas vide :
If .Cells(byLig, intCol) <> "" Then
'Nomme les colonnes (Définir un nom)
ActiveWorkbook.Names.Add Name:=ValideNom(.Cells(byLig, intCol).Value), _
RefersTo:="=" & shFeuilAcopier.Name & "!" & .Columns(intCol).Address
End If
Next intCol
'---------------FIN NOMMAGE COLONNES-----------------------
'--------------DÉFINITION DES COLONNES A COPIER------------
tabNomsCol = Array("NOM", "Prénom", "Adresse", "Téléphone", "Ville", "Code Postal", "Mail") '*********A ADAPTER********
'--------------FIN DEFINITION------------------------------
'--------------COPIE-COLLE --------------------------------
'A partir de qu'elle colonne coller les données :
intColcolle = 2 '*********A ADAPTER******** ici on colle à partir de la colonne B
For intIndic = 0 To UBound(tabNomsCol)
.Range(ValideNom(tabNomsCol(intIndic))).Copy shFeuilOuColler.Cells(1, intColcolle)
intColcolle = intColcolle + 1
Next intIndic
'---------------FIN COPIE-COLLE----------------------------
'-------------SUPPRESSION DES NOMS-------------------------
For intCol = 1 To intDrCol
'Si la cellule en ligne 2 n'est pas vide :
If .Cells(byLig, intCol) <> "" Then
.Range(ValideNom(.Cells(byLig, intCol).Value)).Name.Delete
End If
Next
'-------------FIN SUPPRESSION NOMS-------------------------
End With
End Sub
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 752
11 oct. 2013 à 08:33
11 oct. 2013 à 08:33
Salut,
Euuuhhh...
Merci???
Euuuhhh...
Merci???
Tom 44
Messages postés
47
Date d'inscription
mardi 30 juillet 2013
Statut
Membre
Dernière intervention
11 mars 2014
14 oct. 2013 à 09:50
14 oct. 2013 à 09:50
Bonjour,
Désolé pour le temps de ma réponse.
Un grand merci pour votre travail qui fonctionne parfaitement bien, et encore merci pour votre patience avec les non-initiés (comme moi...)
@+
Désolé pour le temps de ma réponse.
Un grand merci pour votre travail qui fonctionne parfaitement bien, et encore merci pour votre patience avec les non-initiés (comme moi...)
@+
Modifié le 14 août 2022 à 18:21
Bonjour,
Je vois ce post avec 9 ans de retard, mais j'essaie quand même :-)
J'ai essayé ton code et il fonctionne très bien. Cependant avoir l'info sur un msgbox ne m'intéresse pas. Ce que je voudrais c'est que dès qu'il a trouvé mon "titre" via la boucle, il sélectionne toute la colonne afin que je puisse la renommer ?
dim colonne, ligne as variant
ligne = 1
colonne = 1
do while cells (ligne, colonne) <> "titre" ' tant que la cellule située en ligne 2 et colonne 1 est différent de titre
colonne = colonne +1 'on ajoute 1 à colonne pour passer à la colonne suivante
loop
a=magbox("La colonne où se trouve titre est " & colonne)
Je vous remercie pour votre aide
Cordialement
14 août 2022 à 18:50
bonjour,
Il est préférable de commencer une nouvelle discussion, dans laquelle tu expliqueras, entre autres, ce que tu appelles "renommer une colonne".