boucle avec création de feuille

  • Initiateur de la discussion Initiateur de la discussion ali
  • 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 !

A

ali

Guest
Bonjour, j'ai un ptit soucis en vb. En l'occurence j'essaye de créer un petite procédure en boucle. la procédure fonctionne ainsi :

je me positionne sur une cellule 'D2' d'une feuille nommée 'injection'
tant que la cellule active est différente des feuilles du classeur
je crée une nouvelle feuille qui portera le nom de l'activecell.value
sinon msgbox la feuille existe dèja.
ensuite je me place sur la cellule en dessous de D2 de la feuille 'injection' et je boucle à nouveau.

après plusieurs tests je n'arrive toujours pas à reselctionner la cellule en dessous de la cellule initiale 'D2'.

Ci-joint le fivhier qui pourra mieux vous aider.

Merci à vous, al
 
Bonjour Ali, bonjour le forum,

En attendant ton fichier qui ne vient pas, je te propose cette macro :


Sub Macro1()
Dim Cel As Range 'déclare la variable Cel
Dim x As Integer 'déclare la variable x

With Sheets('injection')
'boucle sur toutes les cellules Cel éditées de la colonne D
For Each Cel In .Range('D2😀' & .Range('D65536').End(xlUp).Row)
'boucle sur tous les onglets du classeur
For x = 1 To Sheets.Count
'condition : si l'onglet porte le même nom que la valeur de la cellule Cel
If Sheets(x).Name = Cel.Value Then
'message
MsgBox 'la feuille ' & Sheets(x).Name & ' existe déjà.'
'va à la balise 'suite' (sans ajouter de feuille)
GoTo suite
End If 'fin de la condition
Next x 'prochain onglet du classeur
'ajoute un onglet à la fin
ActiveWorkbook.Sheets.Add after:=Sheets(Sheets.Count)
ActiveSheet.Name = Cel.Value 'attribue la valeur de la cellule Cel au nom du nouvel onglet

suite: 'balise
Next Cel 'prochaine cellule de la colonne D
End With

End Sub

Message édité par: Robert, à: 18/10/2005 17:05
 
Merci beaucoup pour ta réponse, ca marche très bien !
Par contre j'ai oublié de préciser que lorsque ça crée une feuille dans la colonne D on peut rencontrer la même valeure et dans ce cas, il faut sauter cette valeure de façon à se retrouver dans la cellule duu dessous (une sorte de offset(1,0).

Bon je refais l'essai pour joindre le fichier !

Merci encore pour ton aide
 
Bonsoir Ali, Robert, le forum,

Je ne comprends pas ce que tu souhaites de plus car le code proposé par Robert correspond parfaitement à ta demande initiale : lorsqu'il rencontre une cellule dont une des feuilles porte le nom, il affiche un message et passe à la cellule suivante !

Par contre, tu aurais peut-être dû prévenir qu'il y avait des noms identiques mais pas forcément avec la même casse, ça pose effectivement des problèmes car si une feuille est nommée 'toto' et que l'on rencontre 'TOTO' dans la colonne D, la macro essaiera de la créer et tu auras un message d'erreur...

Tu peux modifier la ligne de test de la procédure de Robert :
If Sheets(x).Name = Cel.Value Then
qui deviendra
If UCase(Sheets(x).Name) = UCase(Cel.Value) Then
ce qui t'évitera les messages d'erreur...

Sinon, en ce qui concerne ta boucle initiale, pour que tu ne restes pas sur la cellule D2, il faut quand même que tu indiques, dans ta boucle, que tu changes de cellule 😉

Do While aaa <> ''
Sheets.Add after:=Sheets('menu')
ActiveSheet.Name = aaa
Sheets('injection').Select
selection.range('A2').select
' ou encore avec Offset...
Loop

Voili voilà

Amicalement
Charly
 
Bonsoir Charly, la réponse de Robert me va très bien, mais en fait si tu prends mon fichier test, tu remarqueras que ça ne crée pas toutes les feuilles de la colonne D. Pourtant il passe bien à la cellule du dessous !
 
Bonsoir Ali, Charly, bonsoir le forum,

Ali je ne comprends plus là. Je t'ai donné une réponse, puis Charly l'a modifiée pour qu'elle ne bugue plus et quand j'ouvre ton fichier il n'y a pas le code que je t'ai donné et tu dis que ça marche pas... Si tu prends ce code ci-dessous je te garantie que ça marche :

Sub Macro1()
Dim Cel As Range 'déclare la variable Cel
Dim x As Integer 'déclare la variable x

With Sheets('injection')
'boucle sur toutes les cellules Cel éditées de la colonne D
For Each Cel In .Range('D2😀' & .Range('D65536').End(xlUp).Row)
'boucle sur tous les onglets du classeur
For x = 1 To Sheets.Count
'condition : si l'onglet porte le même nom que la valeur de la cellule Cel
If UCase(Sheets(x).Name) = UCase(Cel.Value) Then
'message
MsgBox 'la feuille ' & Sheets(x).Name & ' existe déjà.'
'va à la balise 'suite' (sans ajouter de feuille)
GoTo suite
End If 'fin de la condition
Next x 'prochain onglet du classeur
'ajoute un onglet à la fin
ActiveWorkbook.Sheets.Add after:=Sheets(Sheets.Count)
ActiveSheet.Name = Cel.Value 'attribue la valeur de la cellule Cel au nom du nouvel onglet

suite: 'balise
Next Cel 'prochaine cellule de la colonne D
End With

End Sub

À part ça je voulais remercier Charly d'avoir pris la relève car je n'étais plus disponible. Malgré sa tête peu avenante, ça fait deux fois qu'on se croise et je sens qu'on va rire...
 
- 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
Assurez vous de marquer un message comme solution pour une meilleure transparence.

Discussions similaires

D
  • Question Question
Réponses
5
Affichages
248
Didierpasdoué
D
Réponses
5
Affichages
428
Retour