Donnée d'une colonne en fonction du nom d'une feuille

Bonjour la team,

Tout d'abord merci d'avance pour votre aide

J'expose mon besoin :

1. Dans ma macro Je créer des colonnes en fonction des feuilles active exemple si j'ai une feuille qui se nomme Paris2023 alors il va créer une colonne avec intitulé Paris2023 (colonne I4)

2. J'ai besoin de mettre dans la feuille "ville" dans la colonne" I5" "J5" etc.. (jusqu'à la dernière colonne et dernière ligne de la colonne A) la donnée de la feuille associé qui se trouve dans la colonne P4 (exemple si dans la colonne I4 j'ai Paris2023 alors récupère dans la feuille Paris2023 la donnée de la colonne "P4" ainsi de suite .....

3. Idem dans la colonne I6 J6 etc.. (jusqu'à la dernière colonne et dernière ligne de la colonne A) de la feuille ville rechercher selon l'ID dans la feuille associé et mettre donnée de la colonne AA

exemple de formule =RECHERCHEV($A6;Paris2023!$C$4:$AA$10000;25;FAUX)

Le problème c'est que le noms des feuilles changent, c'est dynamique donc il faut un code dynamique la est ma grande difficulté comment le faire matcher avec les colonnes.

image

exemple :

J'espère avoir été clair Merci d'avance pour votre expertise

9participation.xlsm (28.93 Ko)

Bonjour,

Formule en I6 à tirer vers la droite et vers le bas:

=SIERREUR(RECHERCHEV($A6;INDIRECT(I$4&"!$C$4:$AA$418");25;FAUX);"")

Cdlt

Bonjour Arturo83,

Merci beaucoup pour la formule elle fonctionne parfaitement je vais essayer de l'adapter dans un code VBA du coup pour l'automatiser sur toutes les lignes

Il me reste du coup la colonne I5

Merci encore

Bonjour Arturo83,

petite question stp j'ai modifier la formule pour lui de chercher dans toute la colonne A (j'ai mis A:A au lieu de A$6 ce qui marche parfaitement) par contre j'ai voulu mettre aussi C:C au lieu de C$4; pour rechercher dans toute la colonne C mais la plus rien ne s'affiche. Peux tu m'orienter sur mon erreur ? Merci d'avance

=SIERREUR(RECHERCHEV($A:A;INDIRECT(I$4&"!$C:C;$AA$10000");25;FAUX);"")

Bonsoir tout le monde,

Pas certain d'avoir tout compris....

Un essai...

8tonton95.xlsm (32.25 Ko)

Cordialement,

Bonjour Xsorsankukai,

Tu as parfaitement bien compris, c'est exactement ce que je voulais Merci beaucoup.

Pour bien comprendre/apprendre et m'aider pour la maintenance est-il possible de me détailler les lignes de la macro stp ? si c'est pas trop demander

je veux faire une petite modif car la colonne "A" ID dans la feuille "Ville" sera remplis manuellement pour servir de base (donnée à jour) pour la formule (parce que la si je comprend bien ça copie toutes les ID de la colonne C de toutes les feuilles)

Merci encore

Concernant ces 2 remarques:

Il me reste du coup la colonne I5

en I5 et à tirer vers la droite:

=INDIRECT(I$4&"!P4")

j'ai mis A:A au lieu de A$6 ce qui marche parfaitement

je n'ai jamais mis "A$6" mais "$A6"

Pour la 3ème remarque je n'ai pas encore regardé.

Edit: Zut, j'ai zappé la réponse de Xorsankukai que je salue, apparemment il a répondu à toutes les questions.

Bonne soirée

Re,


Salut Arturo83, , je ne voulais pas m'imposer, mais comme tu proposais une solution par formules, je voulais compléter avec une proposition macro, .


ID dans la feuille "Ville" sera remplis manuellement

Tu n'as pas besoin de la macro MajID.

La macro test commentée:

Sub test() 'crée les colonnes
 Dim tb(), i%, k%, dl%, dc%
 Dim plage As Range

 Application.ScreenUpdating = False 'désactive le rafraichissement de l'écran

  With Sheets("Ville") 'agit sur cette feuille
   dl = .Range("A" & Rows.Count).End(xlUp).Row 'dernière ligne en fonction de la colonne A
    If Sheets.Count > Sheets("Ville").Index Then 'si il y a des feuilles après Ville
     dc = Sheets.Count - Sheets("Ville").Index 'définit dernière colonne dc (nb feuilles - indice de la feuille Ville)
     'définit plage de la cellule I6 à dernière ligne,dernière colonne (pour les formules)
     Set plage = Sheets("Ville").Range(.Cells(6, 9), .Cells(dl, 9 + dc))

     k = 0 'indice de départ du tableau tb
      For i = Sheets("Ville").Index + 1 To Sheets.Count 'boucle sur les feuilles ,en commençant après la feuille Ville
       ReDim Preserve tb(1 To 2, 1 To k + 1) 'redimensionne le tableau tb (2 lignes, k colonnes)
        tb(1, k + 1) = Sheets(i).Name 'nom de la feuille en 1ére colonne
        tb(2, k + 1) = Sheets(i).Range("P4") 'formation suivie en seconde ligne
        k = k + 1 'incrémente l'indice k
      Next i 'feuille suivante

     If k > 0 Then 'si indice k>0
      'on efface les données et les mises en forme des colonnes I à Z
     .Columns("I:Z").ClearContents: .Columns("I:Z").Interior.Color = xlNone: .Columns("I:Z").Font.ColorIndex = xlAutomatic
      'on écrit les données du tableau tb à partir de la cellule I4 redimensionnée, police en gras
     .Cells(4, "I").Resize(2, k) = tb: .Cells(4, "I").Resize(2, k).Font.Bold = True
     'couleur bleue + police en blanc pour la premère ligne
     .Cells(4, "I").Resize(1, k).Interior.ColorIndex = 5: .Cells(4, "I").Resize(1, k).Font.ColorIndex = 2
     'formules R1C1 sur la plage
      plage.FormulaR1C1 = "=IFERROR(VLOOKUP(RC1,INDIRECT(R4C &""!$C:$AA""),25,FALSE),"""")"
     End If 'fin de la condition k>0
    End If 'fin de la condition nombre feuille > indice feuille ville
   Erase tb: Set plage = Nothing 'libère la mémoire
  End With
End Sub
7tonton95-v2.xlsm (34.36 Ko)

Cordialement,

Bonjour la team,

Arturo83 et Xorsankukai, merci infiniment c'est juste parfait vous êtes des monstres

j'ai adapté le code dans le fichier originale nikel merci beaucoup faut juste que je regarde pourquoi il veut pas aligner et centrer jusqu'à la dernière colonne (petit bug ?) il faut aussi que je rajoute un renvoi à la ligne (pour bien ajuster le texte)

J'aurai 2 petites modifs à faire svp

==> La 1ere besoin : c'est de remplacer l'indice de départ : au lieu de mettre le nom de la feuille mettre à partir de la 12eme feuille (parce que le nom de la feuille peux changer à tout moment)

     k = 0 'indice de départ du tableau tb
      For i = Sheets("Ville").Index + 1 To Sheets.Count 'boucle sur les feuilles ,en commençant après la feuille Ville

==> La 2 besoins : c'est de lui dire de parcourir toutes les feuilles et si la colonne X contient le mot Conforme ou Conformes alors mettre la colonne en jaune sinon en Bleu dans la feuille "Ville" ( à partir de la colonne I5 jusqu'à la dernière ) exemple en PJ

Merci d'avance !!!!!!!!!!!!!

11tonton95-v3.xlsm (34.03 Ko)

Bonjour et bonne année à tous ,

Nouvel essai....donc à partir de la feuille 12....+ couleur sur les colonnes...en fonction de X4 (sur les feuilles) ?

8tonton95-v4.xlsm (34.13 Ko)

Cordialement,

Merci Xsorsankukai,

Presque ça il faut pas mettre en couleur toutes les lignes mais juste mettre la couleur à partir de I5 (juste la 5 -ème ligne) jusqu'à la dernière colonne colonne

Exemple :

image

Re,

mettre en couleur la 5 -ème ligne

Ok, ça devrait être bon cette fois-ci,

10tonton95-v4-2.xlsm (34.08 Ko)

Cordialement,

Xorsankukai merci beaucouppppppppp t'es un monstre

J'essaie encore de comprendre ton code il est vraiment riche c'est trop balèze pour mon faible niveau

Une question si mon besoin évolue exemple je décale une colonne je doit plus commencer à partir de la colonne I5 mais J5. Qu'es que je doit changer dans le code j'ai fait des tests non concluant en remplaçants par exemple :

Cells(6, 9), .Cells(dl, 9 + dc)) par Cells(6, 11), .Cells(dl, 11 + dc))

.Cells(3, "I").Resize(3, k) = tb: .Cells(4, "I") par . Cells(3, "K").Resize(3, k) = tb: .Cells(4, "K")

image

tu peux aussi m'expliquer la variable : Dim tb(), i%, k%, dl%, dc%, x%

Merci d'avance, pour ta lumière

Re,

Merci pour le retour, , je ne suis pas un expert non plus,

tu peux aussi m'expliquer la variable : Dim tb(), i%, k%, dl%, dc%, x%

  • tb est un tableau,

les % indique une variable integer (https://www.excel-pratique.com/fr/vba/variables).

  • I pour la boucle sur les feuilles,
  • K pour les lignes du tableau tb,
  • dl pour définir la dernière ligne de la feuille ville , à partir de la colonne A
  • dc pour définir la dernière colonne de la plage en fonction des colonnes à créer.
  • x est utilisé pour boucler sur les colonnes rajoutées.

Une question si mon besoin évolue exemple je décale une colonne je doit plus commencer à partir de la colonne I5 mais J5. Qu'es que je doit changer dans le code

En Rose, le code actuel, à partir de la colonne I

En Vert, d'après ton exemple, à partir de la colonne J

image

Cordialement,

xsorsankukai merci beaucoup pour ta lumière ton code est très très intéressants je vais bien le décortiquer pour apprendre

Je viens d'adapter le code à mon fichier originale c'est juste excellent. Il y a juste un hic c'est que le mot dans la colonne x peut contenir le mot sous différentes forme Majuscule ou Minuscule voir contenir une phrase contenant ce mot (exemple : "Conforme" ou "Conformes / Formation/ (Annuelle)" ou CONFORME/SECURITE etc....

Le problème du coup c'est qu'avec cette ligne de commande n'est pas dynamique

tb(1, k + 1) = IIf(UCase(Sheets(i).Range("X4")) Like "CONFORME*", 6, 8) 'code couleur

D'avance, merci pour ton aide

Bonjour Tonton95, le forum,

Du coup, je ne sais plus pour quel critère tu souhaites la couleur jaune ?

  • Actuellement (sauf erreur de ma part), le code ne tient pas compte de la casse (majuscule ou minuscule) car j'utilise Ucase .
  • Ensuite, le fait d'avoir rajouté une étoile à CONFORME fait qu'à partir du moment ou la cellule commence par conforme, la couleur sera jaune, mais ce n'est peut-être pas ce que tu souhaites ?
8tonton95.xlsm (38.49 Ko)

Cordialement,

Xorsankukai, merci pour ton retour

Je viens de faire le test en minuscule mais c'est non concluant j'ai plus la couleur jaune dès que je fait une modif sur le mot.

Effectivement, le mot peut être soit au début soit au milieu soit à la fin

Exemple de cas possible :

"Conforme"

"Conformes / Formation/ (Annuelle)"

SECURITE/CONFORME/LSC

PCC / LSC / conforme

etc...

Re,

Effectivement, le mot peut être soit au début soit au milieu soit à la fin

Dans ce cas, il faut une étoile avant et après conforme...

tb(1, k + 1) = IIf(UCase(Sheets(i).Range("X4")) Like "*CONFORME*", 6, 8)

Pour les majuscules/minuscules, je ne comprends pas, j'ai fait l'essai, ça fonctionne....

6tonton95.xlsm (41.55 Ko)

Cordialement,

Re,

Merci beaucoup!!! avec une étoile avant et après ça fonctionne bien par contre je suis obligé de le mettre comme ci-dessous (en Majuscule) bizarrement en minuscule ça fonctionne pas chez moi. (exemple en PJ voir le module 2 pour test en minuscule et module 1 pour test)

https://learn.microsoft.com/fr-fr/office/vba/language/reference/user-interface-help/ucase-function

tb(1, k + 1) = IIf(UCase(Sheets(i).Range("X4")) Like "*CONFORME*", 6, 8) 'code couleur

==> J'ai une question aussi stp si jamais j'ai besoin de faire évoluer le code selon le besoin suivant (j'ai juste tester en rajoutant des lignes mais sans succès)

Exemple :

si contient Conforme mettre code couleur 6 et police en gras et Noir

si contient LIST mettre code couleur 7 et police en surligné Gras et Blanc

si contient RH mettre code couleur 10 et police en Italique et Noir

image

Bonjour tonton95, le forum,

Dans le code , tu a écrit : " *conforme*", donc c'est normal que cela ne fonctionne pas avec Ucase...

Ucase transforme le texte en MAJUSCULE, donc on dit si Majuscule(texte) = "*conforme*", alors couleur jaune.

Dans ce cas, il te faut Lcase...donc soit :

tb(1, k + 1) = IIf(LCase(Sheets(i).Range("X4")) Like "*conforme*", 6, 8) 'code couleur

soit

tb(1, k + 1) = IIf(UCase(Sheets(i).Range("X4")) Like "*CONFORME*", 6, 8) 'code couleur

On peut aussi essayer pour assurer le coup:

tb(1, k + 1) = IIf(UCase(Sheets(i).Range("X4")) Like UCase("*CONFORME*"), 6, 8) 'code couleur

ou

tb(1, k + 1) = IIf(LCase(Sheets(i).Range("X4")) Like LCase("*CONFORME*"), 6, 8) 'code couleur

Pour l'autre demande, je regarde dès que j'ai un moment,

Cordialement,

Rechercher des sujets similaires à "donnee colonne fonction nom feuille"