• Initiateur de la discussion Initiateur de la discussion _Thierry
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

_Thierry

XLDnaute Barbatruc
Repose en paix
Re Bonjour Tom, Bonjour Thomas, le Forum

ARf oui, j'ai fait vite mon copié/collé entre la BoucleOnSheets A & B, et je me suis fais avoir comme un bleu avec le i, puisqu'en sorti de boucle de For i = 1 to 3, i vaut 4... ce qui est logique car en sortie du dernier next i, il se produit une incrémentation du numero.

Pour ce qui est de choisir entre les boucles 'For Each XXX in YYYY' et 'For i = X to Y', les deux ne sont pas toujours applicables contrairement à l'exemple présent. De manière générale, on préfèrera, si on en a la possibilité, appliquer une méthode de boucle For Each Object in Objects.Collection qui représente une réélle instance aux objets ainsi spécifiés dans la Collection. C'est sûrement du chinois à lire, désolé, mais je suis à la bourre.

En clair, ici :
Dim WS As Worksheet
For Each WS In ThisWorkbook.Worksheets

On fait bien instance à un Object WorkSheet que l'on scanne dans une Collection des Objets WorkSheets de Ce Classeur...

Par Contre ici
Dim i As Byte
For i = 1 To ThisWorkbook.Worksheets.Count

On ne fait pas d'instance à une collection d'Objets, mais on va appeler à chaque tour de boucle la Feuille dont le numéro d'index est i ...

Sur une petite quantité on ne verra aucune difference, sinon la méthode For Each Object in Objects.Collection devrait être plus optimisée...

Sinon pour Tom, et bien pour Créer et Nommer tes onglets au noms des classeurs ouverts, il suffit de faire le même style de boucle :

Option Explicit

Sub BoucleOnSheetsA()
Dim WS As Worksheet
Dim WB As Workbook
Dim MyWB As Workbook
Dim TabName As String

Set MyWB = ThisWorkbook

For Each WB In Workbooks
   
If Not WB.Name = MyWB.Name Then
       
With MyWB
        .Worksheets.Add after:=Worksheets(Worksheets.Count)
       
        TabName = IIf(LCase(Right(WB.Name, 3)) = 'xls', Left(WB.Name, Len(WB.Name) - 4), WB.Name)
       
On Error GoTo Out
        .Worksheets(Worksheets.Count).Name = TabName
       
End With
       
End If
Next
Exit Sub

Out:

MsgBox 'La feuille ' & WB.Name & ' existe déja'
   
With Application
        .DisplayAlerts =
False
            Worksheets(Worksheets.Count).Delete
        .DisplayAlerts =
True
   
End With
End Sub

Je file je suis ultra à la bourre
Bonsoir
@+Thierry
 
salut,

oui il est possible de faire une boucle sur les onglets, ca donne quelque chose du style:

Code:
for i=1 to 5   '5 étant le nombre d'onglets présent dans ton classeur
    sheets(i).select   'selection de la feuille i
    ....                     'reste de ton code
next i

j'espere que je repond bien a ta question

@+
 
Bonjour Tom, le Forum

Humm, je ne comprends pas du tout ce que tu veux faire ? et surtout ce que tu entends par 'variable qui est un nom de fichier excel' ?

Une premiere boucle de base sur les feuilles :
Sub BoucleOnSheetsA()
Dim WS As Worksheet
Dim Compteur As Byte
Dim ListeWSName As String



For Each WS In ThisWorkbook.Worksheets
Compteur = Compteur + 1
ListeWSName = ListeWSName & WS.Name & vbCrLf
Next

MsgBox 'Il y a ' & Compteur & ' feuille dans ce Classeur :' & vbCrLf & ListeWSName

End Sub


Une variante :
Sub BoucleOnSheetsB()
Dim WS As Worksheet
Dim i As Byte
Dim ListeWSName As String

For i = 1 To ThisWorkbook.Worksheets.Count
ListeWSName = ListeWSName & Worksheets(i).Name & vbCrLf
Next

MsgBox 'Il y a ' & i & ' feuille dans ce Classeur :' & vbCrLf & ListeWSName

End Sub


Une troisième avec un nom de classeur en variable

Sub BoucleOnSheetsC()
Dim WS As Worksheet
Dim i As Byte
Dim ListeWSName As String
Dim WorkbookName As String
Dim WB As Workbook

WorkbookName = InputBox('Entrez un nom de classeur')

On Error GoTo Out
Set WB = Workbooks(WorkbookName)

   
For i = 1 To WB.Worksheets.Count
        ListeWSName = ListeWSName & WB.Worksheets(i).Name & vbCrLf
   
Next

MsgBox 'Il y a ' & i & ' feuille dans ce Classeur :' & vbCrLf & ListeWSName

Exit Sub
Out:
MsgBox 'Le classeur ' & WorkbookName & ' n
'est pas actuellement ouvert'
End Sub


Cette dernière ayant 'une variable en nom de classeur'...

Bon Aprèm
@+Thierry

Message édité par: _Thierry, à: 27/04/2005 14:36
 
Bonjour,

j'ai une question pour Thierry, mise à par le dernier exemple qui comporte une variable

dans quel cas est il plus util d'utiliser une boucle For Each plutot que For ...= ..To ??

car je debut et je ne comprend pas trop la mechanique faite derriere car je presume que excel ne travail pas de la même facon dans les 2 cas.

sinon au passage pour la version For i=1 to ThisWorkbook.Worksheets.Count

je n'ai pas le meme resulta (il me compte une feuille en plus que dans les autres)

donc c'est simple je me cré une variable ii = i-1 et je met ii dans le msg box au lieu de i mais pourquoi le resulta est il différent.


d'avance merci
Thomas
 
ce que j'appelle 'variable qui est un nom de fichier excel', c'est que j'aimerai que mes onglet portent les noms des fichiers exportés!
petit exemple:
fic1.xls
fic2.xls
fic3.xls
dans un fichier resultat.xls j'aimerai avoir trois onglets:fic1, fic2,fic3
merci

🙂 Sir_tom 🙂
 
Bonjour Thomas, Tom

Tiens je n'avais pas vu que ce Fil avait encore de l'activité, en plus je suis désolé mais évidemment j'avais commis une erreur dans mon code...

Pour Thomas, en fait je me suis fait avoir avec une erreur de débutant sur ma Boucle 'For i = 1 To X' en efeet en sortie de boucle, le dernier Next incrément toujours 'i' une fois de plus, de là ta différence. Il faudrait écrire 'MsgBox 'Il y a ' & i -1' ....

Pour ta question entre les cas où utiliser ces deux boucles, et bien en résumé c'est assez simple, VBA préfèrera toujours travailler sur des Objets Implicitemernt désignés/référencés/déclarés et par conséquent une boucle :

Dim MyObject As Object

For Each MyObject Objects.Collection

MyObject.Name = MyObject.Name & 'Tested'

Sera bien plus digeste pour VBA que de travailler sur l'index des objets comme ceci :

Dim i as Integer

For i = 1 to Objects.Collection.Count
Object(i).Name = Object(i).Name & 'Tested'


Maintenant cette 'optimisation' ne sera perceptible que sur une grande quantité d'objets, car sur une liste de Feuilles on ne verra pas la différence. Cependant VBA se 'fatiguera' moins avec la première boucle puisque dans celle là il ne fera instance une seule fois à la création des Objets 'MyObject' alors que dans la seconde boucle une instance de création d'Objet sera initiailisée à chaque passage sur 'Object(i)'

En général si on a la possibilité (ce qui n'est pas toujours le cas), on fera donc usage de For Each Object in Objects.Collection

NB tout ceci n'est applicable que sur des instance à des collections d'object, et ne sera pas applicable sur des Boucle sur des Tableaux où là on utilisera 'For i = 0 to Ubound(MonTablo)'

Donc voilà en espérant t'avoir éclairci Thomas.


Pour Tom et bien on peut faire une approche comme ceci si j'ai compris ton problème :

Sub OpenWorkBooksScanner()
Dim WB As Workbook
Dim WS As Worksheet

   
For Each WB In Workbooks
       
If Not WB.Name = ThisWorkbook.Name Then
           
For Each WS In WB.Worksheets
           
If WS.Index = 1 Then
            WS.Copy After:=ThisWorkbook.Sheets(Sheets.Count)
           
End If
           
Next WS
       
End If
   
Next WB
     
End Sub


Ce code copiera toutes les feuilles qui ont le premier index dans tous les classeurs ouvert vers le classeur où sera placée cette macro...

Bon Week End et désolé pour les délais de cette réponse jj'étais parti en déplacement.

@+Thierry
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
7
Affichages
448
Réponses
5
Affichages
572
Réponses
10
Affichages
658
Réponses
4
Affichages
721
Retour