boucle avec création de feuille

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
 

Robert

XLDnaute Barbatruc
Repose en paix
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:D' & .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
 
A

ALI

Guest
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
 
A

ali

Guest
Difficile d'insérer mon fichier ! [file name=test_20051018181346.zip size=9095]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/test_20051018181346.zip[/file]
 

Pièces jointes

  • test_20051018181346.zip
    8.9 KB · Affichages: 13

Charly2

Nous a quittés en 2006
Repose en paix
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
 
A

Ali

Guest
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 !
 

Robert

XLDnaute Barbatruc
Repose en paix
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:D' & .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...
 

Discussions similaires