IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

(VBA) Utiliser nom de feuille comme variable [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé
    Avatar de Kaera
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2011
    Messages : 185
    Par défaut (VBA) Utiliser nom de feuille comme variable
    Bonjour à toutes et à tous !

    Nouvelle sur le forum, vous pouvez m'appeler Kaera !

    Mon problème est le suivant :

    J'ai un certain nombre de feuilles nommées numériquement (1, 2, 3 ,4...).
    Chaque feuille paire contient des infos que je veux copier et coller sur la feuille impaire qui la précède.

    Concrètement, en mots, ça donne par exemple :
    Sélectionner feuille 2
    Copier "A1:D5"
    Sélectionne feuille 1
    Coller sur "A1:D5"

    Sélectionner feuille 4
    Copier "A1:D5"
    Sélectionne feuille 3
    Coller sur "A1:D5"

    Etc.

    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub test()
    Dim sh As Worksheet
     
        For Each sh In ThisWorkbook.Worksheets
     
            If sh.Name Mod 2 = 0 Then
            sh.Range("A25:D26").Copy
            ActiveSheet.Previous.Select
            Selection.Range("A25:D26").Paste
            ActiveSheet.Next.Select
            ActiveSheet.Next.Select
            End If
        Next sh
    NB : j'ai écrit deux fois "ActiveSheet.Next.Select" sinon ça va tourner en boucle sur les deux premières feuilles !

    Erreur "incompatibilité de type" sur l'utilisation du sh.Name Mod 2 ...
    Auriez-vous des solutions ?
    Je ne parviens pas à définir sh.Name comme variable

    Un grand merci d'avance.

  2. #2
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 109
    Par défaut
    Salut et bienvenu
    Je procéderais plutôt comme ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub test()
    Dim sh As Worksheet
    Dim iName As Integer
     
        'On boucle de 2 en 2 (step 2)
        'Il faudra peut-être corrigé la valeur retournée par le .count
        For iName = 2 To ThisWorkbook.Worksheets.Count Step 2
            'On pointe la feuille ayant la valeur pour nom
            Set sh = ThisWorkbook.Worksheets(CStr(iName))
            'On copie les donnée dans la feuille précédente
            sh.Range("A25:D26").Copy ThisWorkbook.Worksheets(CStr(iName - 1))
        Next
    J'ai juste un doute sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ThisWorkbook.Worksheets.Count
    ça ne retournera pas forcement la bonne valeur en fonction du nombre d'onglet présent dans le classeur qui ne font pas partie des onglets ayant un valeur numérique en tant que nom.

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  3. #3
    Membre éclairé
    Avatar de Kaera
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2011
    Messages : 185
    Par défaut
    Bonjour Qwazerty !

    Merci de ton accueil et merci pour ton aide.
    J'ai appliqué ton code dans ma macro mais il en résulte une erreur "La méthode Copy de la classe Range" sur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sh.Range("A25:D26").Copy ThisWorkbook.Worksheets(CStr(iName - 1))
    ? ?

    Merci d'avance !

    Kaera

  4. #4
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 109
    Par défaut
    Oupss

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            sh.Range("A25:D26").Copy ThisWorkbook.Worksheets(CStr(iName - 1)).Range("A25:D26")
    Par contre si tu ne veux copier que les valeur contenues dans les cellule, sans la mise en forme, tu peux aussi mettre ça à la place

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Feuil1.Range("A25:D26").Value = Feuil2.Range("A25:D26").Value
    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  5. #5
    Membre éclairé
    Avatar de Kaera
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2011
    Messages : 185
    Par défaut
    J'ai pensé à ce que tu as mis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Feuil1.Range("A25:D26").Value = Feuil2.Range("A25:D26").Value
    Mais je ne peux pas indiquer "Feuil1" (ou Feuil2, etc...) parce que le nom de mes feuilles varie. J'ai un nombre de feuilles qui peut varier (je peux en avoir 6 comme je peux en avoir 24!) et le traitement doit se faire pour toutes les feuilles.


    J'ai appliqué la modification que tu m'as donnée mais j'ai une erreur "l'indice n'appartient pas à la sélection" sur la ligne :
    Set sh = ThisWorkbook.Worksheets(CStr(iName))


    Merci d'avance

  6. #6
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 109
    Par défaut
    Décidément... je dis que des bêtises ce matin...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub test()
    Dim sh As Worksheet
    Dim iName As Integer
     
        'On boucle de 2 en 2 (step 2)
        'Il faudra peut-être corrigé la valeur retournée par le .count
        For iName = 2 To ThisWorkbook.Worksheets.Count Step 2
            'On pointe la feuille ayant la valeur pour nom
            Set sh = ThisWorkbook.Worksheets(CStr(iName))
            'On copie les donnée dans la feuille précédente
            ThisWorkbook.Worksheets(CStr(iName - 1)).Range("A25:D26").Value = sh.Range("A25:D26").Value
        Next
    End Sub
    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  7. #7
    Membre éclairé
    Avatar de Kaera
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2011
    Messages : 185
    Par défaut
    C'est dingue ! Ton code fonctionne impec puisque les copier/coller sont effectués exactement comme il faut mais il me pointe quand même la même erreur (indice qui n'appartient pas à la sélection) sur la ligne dont je t'ai parlé dans mon précédent message.
    Pourquoi générer une erreur si pourtant le code est exécuté comme il faut ?


    Merci d'avance

  8. #8
    Expert confirmé
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Par défaut
    Bonjour,


    Parceque tu donnes en index un string ?

    vois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Set sh = ThisWorkbook.Worksheets("Feuil" & CStr(iName))
    Cordialement,

    Ps : si le côté technique de la réponse = OK ou pas => pensez à cliquer sur les pouces et quand question résolue à la taguer résolue

    Didier

  9. #9
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 109
    Par défaut
    Salut

    @Ormonth: Possible, mais pourtant
    Citation Envoyé par Kaera
    J'ai un certain nombre de feuilles nommées numériquement (1, 2, 3 ,4...).
    Donc je doute que ça vienne de la.

    Par contre comme je l'ai mis en commentaire dans le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ThisWorkbook.Worksheets.Count
    n'est peut etre pas très heureux, il retourne le nombre total de feuille du classeur.
    Or, imaginons le cas suivant
    des feuilles numérotées de 1 à 10 plus 2 autre feuilles "Accueil" et "Options"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ThisWorkbook.Worksheets.Count
    renvoie 12 et donc dans la boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ThisWorkbook.Worksheets(CStr(iName))
    Tente de faire référence à une feuille nommée "12"... qui n'existe pas.

    Sans connaitre les besoin exact, je ne sais pas quoi te proposer, le nombre d'onglets numériques est il fixe?

    L'erreur survenant à la dernière occurrence de la boucle For, ce qui explique que tous les autres onglets ont déjà été traités sans erreur

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  10. #10
    Expert confirmé
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Par défaut
    Bonjour,

    @exact Qwazerty

    en adaptant ton code ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    Option Explicit
    Option Base 1
    Sub test2()
    Dim sh As Worksheet
    Dim tbo()As Variant
    Dim iName As Long
    Dim iName As Long
     
    For Each sh In ThisWorkbook.Worksheets
    If IsNumeric(sh.Name) Then
        ReDim tbo(Val(sh.Name))
        tbo(Val(sh.Name)) = sh.Name
    End If
    Next sh
    For iName = 2 To UBound(tbo) Step 2
        'On pointe la feuille ayant la valeur pour nom
        Set sh = ThisWorkbook.Worksheets(CStr(iName))
        'On copie les donnée dans la feuille précédente
        ThisWorkbook.Worksheets(CStr(iName - 1)).Range("A25:D26").Value = sh.Range("A25:D26").Value
    Next
     
    End Sub
    Cordialement,

    Ps : si le côté technique de la réponse = OK ou pas => pensez à cliquer sur les pouces et quand question résolue à la taguer résolue

    Didier

  11. #11
    Membre éclairé
    Avatar de Kaera
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2011
    Messages : 185
    Par défaut
    Bonjour Ormonth, re Qwazerty,

    Ca fonctionne à merveille !
    Merci beaucoup à vous deux, et merci Ormonth pour les tuyaux, je découvre tout juste le forum et je n'ai pas encore acquis ces réflexes !

    See ya !

  12. #12
    Expert confirmé
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Par défaut
    Bonjour,

    plus concis en mélangeant le tout.. à tester :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub test3()
    Dim sh As Worksheet
     
    For Each sh In ThisWorkbook.Worksheets
    If IsNumeric(sh.Name) Then
        If sh.Name Mod 2 = 0 Then
        '    ReDim tbo(Val(sh.Name))
             'On pointe la feuille ayant la valeur pour nom
            Set sh = ThisWorkbook.Worksheets(sh.Name)
            'On copie les donnée dans la feuille précédente
            ThisWorkbook.Worksheets(CStr(sh.Name - 1)).Range("A25:D26").Value = sh.Range("A25:D26").Value
        End If
    End If
    Next sh
    Cordialement,

    Ps : si le côté technique de la réponse = OK ou pas => pensez à cliquer sur les pouces et quand question résolue à la taguer résolue

    Didier

  13. #13
    Membre éclairé
    Avatar de Kaera
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2011
    Messages : 185
    Par défaut
    Re bonjour,

    C'est ce que j'avais testé au tout départ, avant de venir chercher de l'aider sur le forum :
    mais ça me générait une erreur parce qu'il refusait le sh.Name utilisé avec un modulo. Si vous me le proposez, je suppose que la syntaxe est donc pourtant correcte ! Serais-je victime de discrimination de la part d'Excel ?

    Merci en tout cas

  14. #14
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 109
    Par défaut
    Salut
    Non pas de discrimination c'est juste que certain de tes onglets doivent avoir un nom qui ne peut être transformé en valeur numérique et donc aucune opération ne peut être effectuée "Accueil" Mod 2.
    Avant de faire le teste Ormonth a d'abord regardé si la nom de la feuille pouvait être interprété par VB comme étant numérique (IsNumeric).

    Par contre, si tu utilises For Next, cette ligne devient inutile
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set sh = ThisWorkbook.Worksheets(sh.Name)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub test3()
    Dim sh As Worksheet
     
    For Each sh In ThisWorkbook.Worksheets
      If IsNumeric(sh.Name) Then
        If sh.Name Mod 2 = 0 Then
            'On copie les donnée dans la feuille précédente
            ThisWorkbook.Worksheets(CStr(sh.Name - 1)).Range("A25:D26").Value = sh.Range("A25:D26").Value
        End If
      End If
    Next
    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  15. #15
    Membre éclairé
    Avatar de Kaera
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2011
    Messages : 185
    Par défaut
    J'aurais dû y penser ! (à IsNumeric)

    Des membres qui prennent le temps d'expliquer clairement tout en étant agréables...j'y suis j'y reste !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Toutes versions] formule vba avec nom de feuille variable
    Par leptitdave dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 28/08/2009, 11h30
  2. Nom d'onglet comme variable
    Par mimic50 dans le forum Excel
    Réponses: 4
    Dernier message: 29/11/2007, 14h06
  3. [VBA-E]Nom de feuille
    Par illight dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 22/09/2006, 16h42
  4. [VBA E] nom de feuille dans une combobox
    Par zoumzoum59 dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 20/06/2006, 19h53
  5. [VBA-E]type de donnée range en vba utilisée dans une feuille
    Par Yoyo51 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 30/03/2006, 10h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo