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 12/11/2011, 10h03   #1
Membre habitué
 
Avatar de GDMINFO
 
Inscription : avril 2007
Messages : 334
Détails du profil
Informations personnelles :
Âge : 32

Informations forums :
Inscription : avril 2007
Messages : 334
Points : 116
Points : 116
Par défaut Problème de boucle

Bonjour,

j'essaye de générer une nouvelle feuille dont le nom reprend l'élément contenu dans une des cellules de celle fournie au départ.

En l'occurence, après exécution je devrais avoir 6 nouvelles feuilles et les noms sont pris sur la ligne 3 de la colonne C à H.

Voici mon code :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
Sub ficheHoraire()
Dim monClasseur As Workbooks
Dim laFeuilleEnCours As Worksheet
Dim i As Integer
 
Dim laFeuilleAAjouter As Worksheet
 
 
For i = 3 To 8
Dim leNomDuFichier
 
If Cells(3, i).Value <> "" Then
leNomDuFichier = Cells(3, i).Value
Set laFeuilleAAjouter = Sheets.Add(After:=Sheets(Sheets.Count))
laFeuilleAAjouter.Name = leNomDuFichier
End If
Next i
 
End Sub
Le code s'exécute une première fois sans erreur mais il n'y a qu'une seule feuille générée, celle de la dernière colonne (i = 3), après il ne se passe plus rien. Est-ce que vous voyez où j'ai pu faire une erreur ?

Merci,

GDM.
GDMINFO est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/11/2011, 10h33   #2
Expert Confirmé Sénior
 
Avatar de mercatog
 
Inscription : juillet 2008
Messages : 5 848
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 5 848
Points : 13 907
Points : 13 907
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Sub ficheHoraire() 
Dim monClasseur As Workbooks 
Dim laFeuilleEnCours As Worksheet 
Dim i As Integer 
Dim laFeuilleAAjouter As Worksheet 
Dim leNomDuFichier  

With worksheets("Feuil1") ' ta feuille initiale
    For i = 3 To 8
      If .Cells(3, i).Value <> "" Then
          leNomDuFichier = .Cells(3, i).Value
          Set laFeuilleAAjouter = Sheets.Add(After:=Sheets(Sheets.Count))
          laFeuilleAAjouter.Name = leNomDuFichier
      End If
   Next i
End With
End Sub
C'est le problème de travailler avec les Range (cells) sans leur feuille mère
Quand tu ajoute une feuille, celli ci devient la feuille active et Cells(3,i) se rapporte désormais à cette nouvelle feuille
__________________
Cordialement.
mercatog est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 12/11/2011, 12h25   #3
Membre habitué
 
Avatar de GDMINFO
 
Inscription : avril 2007
Messages : 334
Détails du profil
Informations personnelles :
Âge : 32

Informations forums :
Inscription : avril 2007
Messages : 334
Points : 116
Points : 116
Par défaut Merci

Oui en effet je n'avais pas du tout pensé à cela....


Ca fonctionne très bien, merci beaucoup.

GDM.
GDMINFO est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/11/2011, 13h10   #4
Expert Confirmé Sénior
 
Avatar de mercatog
 
Inscription : juillet 2008
Messages : 5 848
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 5 848
Points : 13 907
Points : 13 907
Pour éviter de renommer une feuille par un nom déjà existant, il faudrait faire un test préalable.

Ci-après code qui permet de n'ajouter de feuille que si aucune feuille n'existe portant le même nom.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Sub FicheHoraire()
Dim Sh As Worksheet
Dim Nom As String
Dim i As Byte
 
Application.ScreenUpdating = False
With Worksheets("Feuil1") ' ta feuille initiale
    For i = 3 To 8
        Nom = .Cells(3, i).Value
        If Not Existe(Nom) Then
            Set Sh = Worksheets.Add(After:=Sheets(Sheets.Count))
            Sh.Name = Nom
            'ici pour travailler avec Sh (feuille qui vient d'être créée
            '.....
            Set Sh = Nothing
        End If
   Next i
   .Activate 'pour revenir à Feuil1
End With
End Sub
 
Private Function Existe(ByVal Str As String) As Boolean
Dim Sh As Object
 
If Str <> "" Then
    For Each Sh In ThisWorkbook.Sheets
        If Sh.Name = Str Then
            Existe = True
            Exit For
        End If
    Next Sh
End If
End Function
Ps: on peut aussi au préalable supprimer le feuille X et ajouter une nouvelle feuille qu'on nomme X (Au cas de mise à jour)
__________________
Cordialement.
mercatog est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 13/11/2011, 09h41   #5
Membre habitué
 
Avatar de GDMINFO
 
Inscription : avril 2007
Messages : 334
Détails du profil
Informations personnelles :
Âge : 32

Informations forums :
Inscription : avril 2007
Messages : 334
Points : 116
Points : 116
Par défaut Super

Oui c'est fort judicieux :-)

Une petite question, pourquoi avoir utilisé le type byte pour i ?

Et merci beaucoup !!

GDM
GDMINFO est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/11/2011, 13h12   #6
Expert Confirmé Sénior
 
Avatar de mercatog
 
Inscription : juillet 2008
Messages : 5 848
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 5 848
Points : 13 907
Points : 13 907
Parce que tu n'as que 6 feuilles à boucler et byte répond amplement à ce besoin.
Citation:
Les variables de type Byte sont stockées sous la forme d'un nombre de 8 bits (1 octet unique), non signé, compris entre 0 et 255.
__________________
Cordialement.
mercatog est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 19/11/2011, 09h32   #7
Membre habitué
 
Avatar de GDMINFO
 
Inscription : avril 2007
Messages : 334
Détails du profil
Informations personnelles :
Âge : 32

Informations forums :
Inscription : avril 2007
Messages : 334
Points : 116
Points : 116
Par défaut Merci

ok, merci beaucoup pour votre aide.

GDM.
GDMINFO est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h54.


 
 
 
 
Partenaires

Hébergement Web