Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/11/2011, 08h42   #1
Membre du Club
 
Avatar de Kaera
 
Femme
Étudiant
Inscription : novembre 2011
Messages : 102
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 22
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Santé

Informations forums :
Inscription : novembre 2011
Messages : 102
Points : 69
Points : 69
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 :
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.
Kaera est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2011, 08h59   #2
Expert Confirmé Sénior
 
Avatar de Qwazerty
 
Homme Stéphane
La très haute tension :D
Inscription : avril 2002
Messages : 2 446
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Âge : 32
Localisation : France

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

Informations forums :
Inscription : avril 2002
Messages : 2 446
Points : 4 620
Points : 4 620
Envoyer un message via MSN à Qwazerty
Salut et bienvenu
Je procéderais plutôt comme ça

Code :
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 :
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
HammerFest
Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer
Qwazerty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2011, 09h13   #3
Membre du Club
 
Avatar de Kaera
 
Femme
Étudiant
Inscription : novembre 2011
Messages : 102
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 22
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Santé

Informations forums :
Inscription : novembre 2011
Messages : 102
Points : 69
Points : 69
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 :
sh.Range("A25:D26").Copy ThisWorkbook.Worksheets(CStr(iName - 1))
? ?

Merci d'avance !

Kaera
Kaera est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2011, 09h18   #4
Expert Confirmé Sénior
 
Avatar de Qwazerty
 
Homme Stéphane
La très haute tension :D
Inscription : avril 2002
Messages : 2 446
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Âge : 32
Localisation : France

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

Informations forums :
Inscription : avril 2002
Messages : 2 446
Points : 4 620
Points : 4 620
Envoyer un message via MSN à Qwazerty
Oupss

Code :
        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 :
Feuil1.Range("A25:D26").Value = Feuil2.Range("A25:D26").Value
++
Qwaz
__________________

MagicQwaz := Harry Potter la baguette en moins
Le monde dans lequel on vit
HammerFest
Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer
Qwazerty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2011, 09h35   #5
Membre du Club
 
Avatar de Kaera
 
Femme
Étudiant
Inscription : novembre 2011
Messages : 102
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 22
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Santé

Informations forums :
Inscription : novembre 2011
Messages : 102
Points : 69
Points : 69
J'ai pensé à ce que tu as mis :
Code :
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
Kaera est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2011, 10h41   #6
Expert Confirmé Sénior
 
Avatar de Qwazerty
 
Homme Stéphane
La très haute tension :D
Inscription : avril 2002
Messages : 2 446
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Âge : 32
Localisation : France

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

Informations forums :
Inscription : avril 2002
Messages : 2 446
Points : 4 620
Points : 4 620
Envoyer un message via MSN à Qwazerty
Décidément... je dis que des bêtises ce matin...

Code :
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
HammerFest
Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer
Qwazerty est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 21/11/2011, 11h17   #7
Membre du Club
 
Avatar de Kaera
 
Femme
Étudiant
Inscription : novembre 2011
Messages : 102
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 22
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Santé

Informations forums :
Inscription : novembre 2011
Messages : 102
Points : 69
Points : 69
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
Kaera est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2011, 11h32   #8
Rédacteur
 
Avatar de Ormonth
 
Homme Didier GONARD
Formateur Développeur Office - indépendant
Inscription : février 2008
Messages : 2 353
Détails du profil
Informations personnelles :
Nom : Homme Didier GONARD
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Formateur Développeur Office - indépendant

Informations forums :
Inscription : février 2008
Messages : 2 353
Points : 4 685
Points : 4 685
Bonjour,


Parceque tu donnes en index un string ?

vois :
Code :
 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
__________________
Didier Gonard

Ps :
Pour noter positivement ou négativement un post, vous pouvez cliquer sur les pouces en bas à droite !
Tutoriels : Voir la liste de mes tutoriels et mon site pro sur ma Page DVP
N'oubliez pas de mettre : ..quand c'est le cas !
Ormonth est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2011, 12h04   #9
Expert Confirmé Sénior
 
Avatar de Qwazerty
 
Homme Stéphane
La très haute tension :D
Inscription : avril 2002
Messages : 2 446
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Âge : 32
Localisation : France

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

Informations forums :
Inscription : avril 2002
Messages : 2 446
Points : 4 620
Points : 4 620
Envoyer un message via MSN à Qwazerty
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 :
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 :
ThisWorkbook.Worksheets.Count
renvoie 12 et donc dans la boucle
Code :
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
HammerFest
Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer
Qwazerty est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 21/11/2011, 13h05   #10
Rédacteur
 
Avatar de Ormonth
 
Homme Didier GONARD
Formateur Développeur Office - indépendant
Inscription : février 2008
Messages : 2 353
Détails du profil
Informations personnelles :
Nom : Homme Didier GONARD
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Formateur Développeur Office - indépendant

Informations forums :
Inscription : février 2008
Messages : 2 353
Points : 4 685
Points : 4 685
Bonjour,

@exact Qwazerty

en adaptant ton code ainsi :

Code :
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
__________________
Didier Gonard

Ps :
Pour noter positivement ou négativement un post, vous pouvez cliquer sur les pouces en bas à droite !
Tutoriels : Voir la liste de mes tutoriels et mon site pro sur ma Page DVP
N'oubliez pas de mettre : ..quand c'est le cas !
Ormonth est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 21/11/2011, 13h16   #11
Membre du Club
 
Avatar de Kaera
 
Femme
Étudiant
Inscription : novembre 2011
Messages : 102
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 22
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Santé

Informations forums :
Inscription : novembre 2011
Messages : 102
Points : 69
Points : 69
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 !
Kaera est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2011, 13h26   #12
Rédacteur
 
Avatar de Ormonth
 
Homme Didier GONARD
Formateur Développeur Office - indépendant
Inscription : février 2008
Messages : 2 353
Détails du profil
Informations personnelles :
Nom : Homme Didier GONARD
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Formateur Développeur Office - indépendant

Informations forums :
Inscription : février 2008
Messages : 2 353
Points : 4 685
Points : 4 685
Bonjour,

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

Code :
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
__________________
Didier Gonard

Ps :
Pour noter positivement ou négativement un post, vous pouvez cliquer sur les pouces en bas à droite !
Tutoriels : Voir la liste de mes tutoriels et mon site pro sur ma Page DVP
N'oubliez pas de mettre : ..quand c'est le cas !
Ormonth est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2011, 15h17   #13
Membre du Club
 
Avatar de Kaera
 
Femme
Étudiant
Inscription : novembre 2011
Messages : 102
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 22
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Santé

Informations forums :
Inscription : novembre 2011
Messages : 102
Points : 69
Points : 69
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
Kaera est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2011, 15h25   #14
Expert Confirmé Sénior
 
Avatar de Qwazerty
 
Homme Stéphane
La très haute tension :D
Inscription : avril 2002
Messages : 2 446
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Âge : 32
Localisation : France

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

Informations forums :
Inscription : avril 2002
Messages : 2 446
Points : 4 620
Points : 4 620
Envoyer un message via MSN à Qwazerty
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 :
Set sh = ThisWorkbook.Worksheets(sh.Name)
Code :
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
HammerFest
Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer
Qwazerty est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 22/11/2011, 08h06   #15
Membre du Club
 
Avatar de Kaera
 
Femme
Étudiant
Inscription : novembre 2011
Messages : 102
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 22
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Santé

Informations forums :
Inscription : novembre 2011
Messages : 102
Points : 69
Points : 69
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 !
Kaera est déconnecté   Envoyer un message privé Réponse avec citation 20
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h44.


 
 
 
 
Partenaires

Hébergement Web