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 22710 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 avril 2024 - 14 août 2022 à 18:50
Bonjour à toutes et à tous,

Je suis confronté à un petit soucis de prog :

Je dois récupérer des données d'un fichier (A) pour les transposer vers une fichier de suivi (B).
Jusque là pas de soucis particulier...
Seulement voilà le nombre ainsi que le positionnement des colonnes de (A) varient d'une semaine à une autre, ce qui m'empêchent de récupérer mes données aisément.

Je me demandais alors s'il était possible "d'indicer" les colonnes non pas par sa position dans la feuille (A=1, B=2,...) mais par un test de nom à rechercher sur une ligne ?
En effet, chaque colonne possède un "titre" qui lui ne variera jamais et tous ces titres resteront invariablement sur la même ligne.


Auriez vous une piste à mon problème ?

En remerciant la communauté par avance.
Cdt,

19 réponses

melanie1324 Messages postés 1505 Date d'inscription vendredi 25 mai 2007 Statut Membre Dernière intervention 31 janvier 2018 154
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)
1

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

0
yg_be Messages postés 22710 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 avril 2024 1 474 > Jerome
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".

0
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
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.
0
melanie1324 Messages postés 1505 Date d'inscription vendredi 25 mai 2007 Statut Membre Dernière intervention 31 janvier 2018 154
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
0
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
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
melanie1324 Messages postés 1505 Date d'inscription vendredi 25 mai 2007 Statut Membre Dernière intervention 31 janvier 2018 154
8 oct. 2013 à 09:26
Bonjour,

tu peux tout à faire agir comme cela.
Ca me semble correct.
0
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
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.
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
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 :
Sub NommeColonnes()
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
Note : la ligne de titres est ici la ligne 3, à adapter.

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

0
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
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.
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
8 oct. 2013 à 13:36
Merci pour le code mais je ne penses pas qu'il soit adapté à ma situation...

As tu essayé???
0
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
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.
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
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 :
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...
0
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
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.
0
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
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.
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
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....
0
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
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" ?
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
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....
0
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
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 "$$")
0
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
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.
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
8 oct. 2013 à 18:54
Tu peux utiliser Replace.
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.
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
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

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

0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
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...
0
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
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.
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
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...
0
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
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 ?
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
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 :
Function ValideNom(ByVal Nom As String)
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
Tu peux ajouter ce que tu veux dans ce code...

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
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
11 oct. 2013 à 08:33
Salut,

Euuuhhh...
Merci???
0
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
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...)

@+
0