InputBox pour renommer le nom d'une feuille

Résolu/Fermé
tchics Messages postés 6 Date d'inscription dimanche 27 janvier 2013 Statut Membre Dernière intervention 5 février 2013 - 27 janv. 2013 à 15:38
tchics Messages postés 6 Date d'inscription dimanche 27 janvier 2013 Statut Membre Dernière intervention 5 février 2013 - 5 févr. 2013 à 13:50
Bonjour,

Tout d'abord merci car, sans le savoir, vous m'aider depuis quelques jours dans l'avancé de mon projet.

Actuellement je bloque sur une macro qui pourrait renommer une feuille suite au renseignement d'une InputBox
Cette feuille est créer en dupliquant une feuille qui me sert de trame (donc nommer trame(2) de base)
voici le code actuel :

Sub Creer_unite_travail()

    Sheets("Trame").Select
    Sheets("Trame").Copy Before:=Sheets(1)
    
    Dim b As String 'déclare la variable b
b = InputBox("Nom de l'unité de travail ?", "Question ?")

'tentative dans une cellule : marche pas '    
   ActiveSheets.Range("B1").Value = b
'tentative de renommer la feuille active : marche pas'
    ActiveSheets.Name = b
    
End Sub


Vous l'aurez compris, je débute en vba

Merci de m'éclairez de vos lumières



4 réponses

Heliotte Messages postés 1491 Date d'inscription vendredi 26 octobre 2012 Statut Membre Dernière intervention 28 janvier 2013 92
27 janv. 2013 à 19:32
Bonsoir tchics,

Je pense que le plus facile est de poser la question et seulement après tu copies la feuille et la renomme.

Une façon de faire:

Private Sub RecupNomOnglet(Optional ByVal NouvelleFeuille As String = "")
    If(NouvelleFeuille="") Then Exit Sub
	'
	 Sheets("Trame").Copy After:=Sheets(Sheets.Count)
    ' Entre le nom du chantier ds la cellule A1
     Activesheet.Name = NomFeuille
End Sub


Tu fais appel à cette procédure comme ceci:

Call RecupNomOnglet("NomDeLaNouvelleFeuille")


Bon dimanche.
0
tchics Messages postés 6 Date d'inscription dimanche 27 janvier 2013 Statut Membre Dernière intervention 5 février 2013
28 janv. 2013 à 11:21
Bonjour Heliotte et merci de ta réponse

En creusant un peu j'ai trouvé une solution qui fonctionne apparemment
Voici le code (j'imagine qu'il doit y avoir mieux mais pour l'instant ça marche)

Sub Creer_unite_travail()
 ActiveSheet.Unprotect
'affiche la trame pour selection/copier/coller puis disparait'
    Sheets("Trame").Visible = True
    
    Sheets("Trame").Select
    Sheets("Trame").Copy Before:=Sheets(1)
    
    Sheets("Trame").Visible = False
    
    Dim b As String
    Dim c As String
    Dim d As String
    
b = InputBox("Nom de l'unité de travail ?", "Question ?", "Nom de l'unité")
        'impose de répondre'
        If Len(b) < 1 Then
        MsgBox ("Vous devez obligatoirement entrer un nom d'unité de travail")
        End If
        
        While Len(b) < 1
        MsgBox ("Vous devez obligatoirement entrer un nom d'unité de travail")
        b = InputBox("Nom de l'unité de travail ?", "Question ?")
        Wend
        
c = InputBox("Effectif de l'unité de travail ?", "Question ?")
d = InputBox("Nom du rédacteur ?", "Question ?")
    
Range("B1").Select
ActiveCell.FormulaR1C1 = b

Range("B2").Select
ActiveCell.FormulaR1C1 = c

Range("N1").Select
ActiveCell.FormulaR1C1 = d


ActiveSheet.Name = b
'couleur de l'onglet aléatoire'
ActiveSheet.Tab.Color = RGB(Int(256 * Rnd), Int(256 * Rnd), Int(256 * Rnd))

ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
        , AllowInsertingRows:=True, AllowDeletingRows:=True
    
End Sub  


Je suis ouvert aux critiques ;0)

Bonne journée
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
Modifié par pijaku le 28/01/2013 à 12:23
Bonjour,

1- la déclaration des variables se fait toujours en tête de procédure.
2- tu doublonnes ici :
b = InputBox("Nom de l'unité de travail ?", "Question ?", "Nom de l'unité")  
        'impose de répondre'  
        If Len(b) < 1 Then  
        MsgBox ("Vous devez obligatoirement entrer un nom d'unité de travail")  
        End If  
          
        While Len(b) < 1  
        MsgBox ("Vous devez obligatoirement entrer un nom d'unité de travail")  
        b = InputBox("Nom de l'unité de travail ?", "Question ?")  
        Wend

3- Les .Select sont inutiles
4- Si dans b est saisi le nom d'une feuille déjà existante, que se passe t'il avec ton code???
5- ne pas mettre, dans ton cas, de valeur par défaut dans l'inputbox b, sous risque de se retrouver avec une feuille nommée "Nom de l'unité"...

Correction envisagée :
Sub Creer_unite_travail()  
    Dim b As String  
    Dim c As String  
    Dim d As String  

 ActiveSheet.Unprotect  
'affiche la trame pour selection/copier/coller puis disparait'  
    With Sheets("Trame")  
        .Visible = True  
        .Copy Before:=Sheets(1)  
        .Visible = False  
    End With  
      
    While Len(b) < 1  
        b = InputBox("Nom de l'unité de travail ?", "Question ?")  
        If Len(b) < 1 Then  
            MsgBox ("Vous devez obligatoirement entrer un nom d'unité de travail")  
        End If  
        If FeuilleExiste(ThisWorkbook, b) Then  
            MsgBox "La feuille " & b & " existe déjà. Changez de nom."  
            b = ""  
        End If  
    Wend  
          
c = InputBox("Effectif de l'unité de travail ?", "Question ?")  
d = InputBox("Nom du rédacteur ?", "Question ?")  
      
Range("B1") = b  
Range("B2") = c  
Range("N1") = d  

ActiveSheet.Name = b  
'couleur de l'onglet aléatoire'  
ActiveSheet.Tab.Color = RGB(Int(256 * Rnd), Int(256 * Rnd), Int(256 * Rnd))  

ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _  
        , AllowInsertingRows:=True, AllowDeletingRows:=True  
End Sub  
'Fonction de Bbil, sources :  
'http://www.developpez.net/forums/d269391/logiciels/microsoft-office/excel/macros-vba-excel/vba-e-feuille-existe/  
Function FeuilleExiste(wk As Workbook, stFeuille) As Boolean  
 On Error Resume Next  
 FeuilleExiste = Not (wk.Sheets(stFeuille) Is Nothing)  
End Function 
0
tchics Messages postés 6 Date d'inscription dimanche 27 janvier 2013 Statut Membre Dernière intervention 5 février 2013
28 janv. 2013 à 12:29
Salut pijaku et merci ,

Effectivement je doublonne et je crache si même nom de feuille. Je vais tester tout ça et te ferait un retour. Au passage mes onglet sont de couleurs aléatoires car je n'ai pas réussi à leur imposer des couleurs différentes à chaque nouvelle création.
Aurait tu une piste (je suis sur que oui ^^)

Merci
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
Modifié par pijaku le 28/01/2013 à 13:32
Pour les couleurs des onglets...
- boucle sur toutes les feuilles,
- récupère les couleurs des onglets dans une variable tableau,
- boucle qui : créé aléatoirement une couleur et vérifie si cette couleur n'est pas déjà en place.

Ca donne quelque chose comme :
Sub Principale() 
Call AppliqueNouvelleCouleurOnglet(ActiveSheet) 
End Sub 

Sub AppliqueNouvelleCouleurOnglet(Feuille As Worksheet) 
Dim Wsh As Worksheet, Couleurs(), i As Integer, Flag As Boolean, Couleur As Long 

For Each Wsh In ThisWorkbook.Worksheets 
    ReDim Preserve Couleurs(i) 
    Couleurs(i) = Wsh.Tab.Color 
    i = i + 1 
Next Wsh 
Flag = False 
Do While Flag = False 
    Randomize 
    Couleur = RGB(Int(256 * Rnd), Int(256 * Rnd), Int(256 * Rnd)) 
    For i = LBound(Couleurs) To UBound(Couleurs) 
        If Couleur = Couleurs(i) Then 
            Flag = False 
            Exit For 
        End If 
        Flag = True 
    Next 
Loop 
Feuille.Tab.Color = Couleur 
End Sub
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
Modifié par pijaku le 28/01/2013 à 13:37
Je me rends compte que la méthode utilisée n'est pas valable...
En effet, les couleurs de type "Long" ne sont pas différenciées par excel... tu risques de te retrouver avec deux couleurs (13421619 et 13421620 par exemple) qui sont différentesz en programmation mais identique à la vue...
Je regarde cela de plus près...

De plus, la propriété ColorIndex ne laisse que 56 choix... Auras tu plus de 56 onglets??????
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
28 janv. 2013 à 14:12
Pour exemple, avec commentaires :
Sub AppliqueNouvelleCouleurOngletAleatoirement()
Dim Wsh As Worksheet
Dim Couleurs(55) As Integer, i As Integer, Coul As Integer
Dim Dico As Object

'teste le nombre d'onglets. Si > 56 on ne peux rien faire avec ce code.
If Sheets.Count > 56 Then MsgBox "Votre classeur contient trop de feuilles.": Exit Sub
'On remplit la variable tableau avec toutes les valeurs que peux prendre
'la propriété ColorIndex soit de 1 à 56
For i = 0 To 55
    Couleurs(i) = i + 1
Next
'L'objet Dictionary permet de générer des listes sans doublons
Set Dico = CreateObject("Scripting.Dictionary")
'On implémente notre dictionary avec les couleurs des onglets déjà existants
For Each Wsh In ThisWorkbook.Worksheets
    Dico(Wsh.Tab.ColorIndex) = ""
Next Wsh
Randomize
Do
    'On détermine une couleur aléatoirement
    Coul = CInt(Rnd * 55)
    'si cette couleur n'existe pas dans notre dictionary
    'En même temps on vérifie qu'il s'agit d'une couleur valide pour
    'la propriété ColorIndex (si > 0 et < 57)
    If Not Dico.exists(Coul) And Coul > 0 And Coul < 57 Then
        'si tout bon alors on l'applique à notre onglet
        ActiveSheet.Tab.ColorIndex = Coul
        'on sort de la boucle Do-Loop
        Exit Do
    End If
Loop
End Sub
0
tchics Messages postés 6 Date d'inscription dimanche 27 janvier 2013 Statut Membre Dernière intervention 5 février 2013
5 févr. 2013 à 13:50
Retour un peu tardif mais retour quand même ^^

Nickel ca fonctionne très bien.

Merci pour le coup de main
0