XL 2010 VBA : Lire dans plusieurs feuilles placées dans le désordre

CISCO

XLDnaute Barbatruc
Bonsoir à tous

Pour résoudre un pb sur un autre fil, j'essaye de faire une macro (Arrêtez de rire, SVP :) !!!).

Pour cela, il me faut transférer des données placées dans diverses feuilles vers un tableau. Dans un premier temps, je l'ai fait avec une boucle sur les feuilles en question, avec le code
Code:
For Feuil = 1 To ActiveWorkbook.Sheets.Count
Worksheets(Worksheets(Feuil).Name).Activate
....
dans laquelle Feuil est un nombre entier.

Malheureusement, dans le vrai fichier, les feuilles s'appellent Nov, Déc, Janvier, Février... Oct et ne sont pas placées dans l'ordre (Nov correspond à Feuil20, Déc à Feuil21, Janvier à Feuil22, Février à Feuil23, Mars à Feuil24, Avril à Feuil25, Mai à Feuil13, Juin à Feuil12, Juillet à Feuil19, Août à Feuil14...).

J'ai fait un essai avec le code (dans lequel Feuil représente le nom de la feuille en cours)
Code:
    Feuil = "Nov"
    Feuilcomp = 1

  ...

While Feuil <> "X"
    Worksheets(Feuil).Activate
    ...
diverses actions permettant de remplir le tableau

Feuilcomp = Feuilcomp + 1

If Feuil = "Sept" Then Feuil = "X"
If Feuil = "Août" Then Feuil = "Sept"
If Feuil = "Juillet" Then Feuil = "Août"
If Feuil = "Juin" Then Feuil = "Juillet"
If Feuil = "Mai" Then Feuil = "Juin"
If Feuil = "Avril" Then Feuil = "Mai"
If Feuil = "Mars" Then Feuil = "Avril"
If Feuil = "Février" Then Feuil = "Mars"
If Feuil = "Janvier" Then Feuil = "Février"
If Feuil = "Déc" Then Feuil = "Janvier"
If Feuil = "Nov" Then Feuil = "Déc"

Wend
....

Cela fonctionne, mais je pense qu'il y a certainement plus efficace, plus concis... De plus, si quelqu'un change un peu le nom d'un des onglets en question, par exemple Sept en Septembre, cela ne fonctionne plus (puisque le premier nom, Sept, est écrit en dur dans le code). Est-ce que vous avez une proposition plus fine, plus polyvalente ?

D'avance merci.

Nov.JPG


@ plus
 
Dernière édition:

chris

XLDnaute Barbatruc
Bonjour

Si au moins les mois étaient homogènes ! Janvier en toutes lettres mais pas Septembre et la suite...

Je ferais une liste des 12 feuilles dans un tableau (array) dans l'ordre des mois et je ferais une boucle sur les items du tableau pour copier de chaque feuille vers ta cible.

Sinon, si on normalise les noms des mois on peut faire une boucle de 1 à 12 du style
Code:
For i = 1 To 12
    NOM = Format(CDate("1/" & i & "/2017"), "mmmm")
    ....
Next i
 

CISCO

XLDnaute Barbatruc
Bonsoir

Merci Chris et Hieu. Merci pour vos codes. Et oui, il faut que cela soit dans l'ordre donné, de Nov à Oct... Et oui, tous les noms ne sont pas construits de la même façon, mais ça, je peux le modifier... Je vais essayer de faire quelque chose avec tes propositions, Chris.

@ plus
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour CISCO :), à tous :),

Un autre essai basé sur les CodeName des feuilles (Feuil1, Feuil2, ..., Feuilnn,...) qui à priori ne changent pratiquement jamais. Si un code name est changé, c'est en mode création du projet et donc l'auteur en est le responsable et le sait.

On repère les codename des feuilles correspondant aux mois (de janvier à décembre) et on les affecte à une constante NumCodeName du code VBA. (ça c'est fait une fois pour toute - sauf si on modifie un codename, dans ce cas on rectifiera la constante)

Ensuite une procédure Init_LesMois transforme cette constante en un tableau LesMois à portée publique.
Chaque élément (codename) de ce tableau LesMois est ensuite remplacé par le véritable nom de la feuille (nom de l'onglet).

Quand on écrit une procédure travaillant sur les feuilles des mois, il suffit d'exécuter en tête de la macro la procédure Init_LesMois qui crée le tableau public LesMois contenant les véritables noms des feuilles (ordonné de janvier à décembre).

Chaque fois qu'on lance Init_LesMois, les noms des Feuilles sont actualisés au sein du tableau LesMois. On peut donc changer les noms des mois (Jan ou Janvier ou January...) sans problème.

La procédure Exemple est un exemple d'utilisation (cliquer sur le bouton Exemple)

Attention! les indices du tableau Init_LesMois s'étendent de 0 à 11 (et non de 1 à 12)

Le code de module1:
VB:
Public LesMois   'variable globale
'Codename des feuilles correspondant aux mois de Janv. à Déc.
Const NumCodeName = "22 23 24 25 13 12 19 14 15 16 20 21"

Sub Init_LesMois()
Dim i&, k&

  'on crée le tableau des numéros de codenames
  LesMois = Split(NumCodeName)
  'on remplace chaque élément du tableau LesMois par le nom de la feuille
  'correspondant au codename
  For i = LBound(LesMois) To UBound(LesMois)  'pour chaque codename de LesMois
    For k = 1 To Worksheets.Count  'pour chaque feuille du classeur
      If Worksheets(k).CodeName = "Feuil" & LesMois(i) Then
        'le codename de la feuille d'index k est égal au codename LesMois(i)
        LesMois(i) = Worksheets(k).Name   'on remplace le codename par le nom de la feuille
        Exit For    'on sort de la boucle
      End If
    Next k
  Next i
End Sub

Le code de Exemple:
VB:
Sub Exemple()
Dim i&

  Init_LesMois

  'boucle sur les feuilles 'mois'
  For i = 0 To UBound(LesMois)
    With Sheets(LesMois(i))
      .Range("a1") = .Name
      .Range("a2") = Format(Now(), "dd mmm yyyy")
      .Range("a3") = Format(Now(), "hh:nn:ss")
    End With
  Next i
End Sub
 

Pièces jointes

  • CISCO- Mois en désordre- v1a.xlsm
    36.7 KB · Affichages: 43
Dernière édition:

CISCO

XLDnaute Barbatruc
Bonsoir à tous, bonsoir mapomme

Merci pour les explications : c'est bien plus "fin" que mon style habituel en VBA, mais je vais essayer de comprendre tout cela. Merci pour les détails, la progression, la pédagogie....

Au plaisir

@ plus

P.S : Pour le moment, je n'arrive pas à ouvrir la pièce jointe.
 
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Re CISCO,

Dans mon précédent message, j'ai changé le fichier pour un exemple plus parlant. On y parcourt les feuilles "mois" de janvier à décembre par le biais du tableau LesMois. Dans chaque feuille 'Mois', on met en A1 le nom de l'onglet, en A2 la date et en A3 l'heure.

On peut aussi trouver directement récupérer le nom véritable de la feuille du mois correspondant à juin. C'est LesMois(5). 5 car les indices du tableau LesMois vont de 0 à 11.
 
Dernière édition:

CISCO

XLDnaute Barbatruc
Bonjour à tous

Merci mapomme. J'ai pu télécharger la nouvelle pièce jointe et ça fonctionne comme je le veux. Vraiment pratique. "Compliqué" d'un point de vue "intellectuel", mais très court du point de vue lignes de code à mettre en action. Vraiment très bien.

Merci.

@ plus
 

Discussions similaires

Statistiques des forums

Discussions
312 177
Messages
2 085 973
Membres
103 073
dernier inscrit
MSCHOE16