Création onglet vba à partir d'une liste

Nashou

XLDnaute Junior
Bonjour à tous,

Mon projet est le suivant :
Je souhaite créer des onglets en fonction d'une liste (bon ça je sais faire)
Exemple qui fonctionne :
Private Sub CommandButton4_Click()

Dim z As Integer
Dim shessai2 As Worksheet

For z = 1 To Range("A65536").End(xlUp).Row

If Not IsEmpty(Cells(z, 1)) Then

Set shessai2 = Sheets.Add(After:=Sheets(Sheets.Count))
shessai2.Name = Cells(z, 1).Value

End If

Next z

End Sub

Mais si une valeur de la colonne A est en double, je ne veux pas qu'il ajoute l'onglet, je veux qu'il passe au suivant.
Bref, je n'arrive pas à intégrer ça dans mon code ...

Si vous aviez le petit bout de code qu'il me manque ... ca serait un plaisir :)
Merci !
 

Pièces jointes

  • Macro création feuille.xls
    45 KB · Affichages: 366

Mat_

XLDnaute Nouveau
Re : Création onglet vba à partir d'une liste

Bonjour à Camarchepas et Roger2327,

Je joins mon fichier.

Pour ce quiconcerne le code, y'en a pas vraiment, je ne sais pas d'où partir du coup j'ai essayé en utilisant le code donné par pierrejean celui du post datant du 01/12/2010 à 13h22.
Mais ça ne fonctionne pas.

Une question aussi, c'est quoi la différence entre Sub et Private Sub ?

Dans le fichier que je joins, ce que je veux faire c'est créer des onglets à partir de ce qui est contenu dans les celulles de l'onglet "Données", dans les cellules C2:Cx.

Merci.
 

Pièces jointes

  • Boites de dérivation1.xlsm
    33 KB · Affichages: 58
  • Boites de dérivation1.xlsm
    33 KB · Affichages: 61
  • Boites de dérivation1.xlsm
    33 KB · Affichages: 63

ROGER2327

XLDnaute Barbatruc
Re : Création onglet vba à partir d'une liste

Re...

(...)
Je joins mon fichier.
(...)
Bonne idée !

(...)
Pour ce quiconcerne le code, y'en a pas vraiment, je ne sais pas d'où partir du coup j'ai essayé en utilisant le code donné par pierrejean celui du post datant du 01/12/2010 à 13h22.
Mais ça ne fonctionne pas.
(...)
Il s'agit de mon code, corrigé par pierrejean (bonjour).
Ça ne fonctionne pas parce que ce n'est pas écrit pour votre fichier.

(...)
Une question aussi, c'est quoi la différence entre Sub et Private Sub ?
(...)
Voyez d'abord l'aide fournie avec VBA (regardez la rubrique Sub). Si c'est insuffisant, revenez !

(...)
Dans le fichier que je joins, ce que je veux faire c'est créer des onglets à partir de ce qui est contenu dans les celulles de l'onglet "Données", dans les cellules C2:Cx.
(...)
Voyez le classeur joint. En cas de problème, n'hésitez pas à revenir.​


Bonne journée.


ℝOGER2327
#7683


Samedi 14 As 142 (Saint Pierre Bonnard, peintre des Phynances - fête Suprême Quarte)
26 Brumaire An CCXXIII, 5,0494h - pistache
2014-W46-7T12:07:07Z
 

Pièces jointes

  • Boites de dérivation1.xlsm
    42.3 KB · Affichages: 88
  • Boites de dérivation1.xlsm
    42.3 KB · Affichages: 68
  • Boites de dérivation1.xlsm
    42.3 KB · Affichages: 79

ROGER2327

XLDnaute Barbatruc
Re : Création onglet vba à partir d'une liste

Suite...


J'ai répondu trop rapidement et le code proposé est incorrect.
Pour tenir compte des cellules C2:Cx, il faut écrire​
Code:
  Colonne = "C" 'ou 3
  For z = 2 To Me.Cells(Me.Rows.Count, Colonne).End(xlUp).Row
et non​
Code:
  Colonne = "C" 'ou 3
  For z = 1 To Me.Cells(Me.Rows.Count, Colonne).End(xlUp).Row

D'autre part, malgré une rumeur lancée et entretenue par une flopée de "professionnels" autoproclamés, Value n'est pas la propriété par défaut d'un objet Range.
Il se trouve que VisualBasic est très tolérant et qu'il est parfois capable de deviner une propriété omise.
Par exemple :​
VB:
Sub prout()
Dim Plage As Variant
1:  Plage = Range("A1")
2:  Set Plage = Range("A1")
End Sub
À la ligne 1:, l'interpréteur devine que le programmeur veut récupérer la valeur de la cellule A1.
À la ligne 2:, il devine (car il y est fermement invité par l'instruction Set) qu'il faut attribuer une référence d'objet à la variable Plage. Ce qui prouve que Range("A1") sans propriété n'est pas nécessairement vu comme Range("A1").Value.​


Conclusion : Un objet Range n'a pas de propriété par défaut.


Pour être précis, on devrait écrire :​
Code:
Sub prout()
Dim Plage As Variant
1:  Plage = Range("A1").Value
2:  Set Plage = Range("A1").Cells
End Sub

Lorsqu'on sait ce que l'on fait, on peut bien sûr profiter du laxisme de VB et se contenter de la première écriture. Mais il faut en être conscient et ne pas croire les balivernes des "professionnels" évoqués plus haut, car, dans un module de feuille, on écrirait des inepties du genre :​
Code:
Sub prout()
1:  [A1] = "toto"
2:  Sheets.Add After:=Sheets(Sheets.Count)
3:  ActiveSheet.Name = Me.Cells(1, 1)
4:  Sheets(Me.Cells(1, 1)).Delete
End Sub
En supposant qu'il n'existe pas d'onglet nommé toto dans le classeur, pas de problème jusqu'à la ligne 4:.
À la ligne 3:, Me.Cells(1, 1) est interprété comme Me.Cells(1, 1).Value. Tout va bien...
Mais pas à la ligne 4:. On obtient une erreur d'exécution 13 commentée par Incompatibilité de type. L'interpréteur croit deviner que la propriété omise n'est pas Value mais, probablement, Cells...
Tout rentre dans l'ordre si on écrit :​
Code:
4:  Sheets(Me.Cells(1, 1).Value).Delete
Pour être propre, on écrit prudemment :​
Code:
Sub prout()
1:  [A1].Value = "toto"
2:  Sheets.Add After:=Sheets(Sheets.Count)
3:  ActiveSheet.Name = Me.Cells(1, 1).Value
4:  Sheets(Me.Cells(1, 1).Value).Delete
End Sub
ce qui dispense l'interpréteur d'imaginer des conneries et de se prendre les pieds dans le tapis.

Finalement, un code correct (parmi d'autres) pour la feuille Feuil1 (onglet "Données") du classeur Boîtes de dérivation1 peut s'écrire :​
Code:
Sub CommandButton4_Click()
Dim z&
Const Colonne$ = "C"
  For z = 2 To Me.Cells(Me.Rows.Count, Colonne).End(xlUp).Row
    If Not IsEmpty(Me.Cells(z, Colonne).Value) Then
      Sheets.Add After:=Sheets(Sheets.Count)
      On Error Resume Next
      ActiveSheet.Name = Me.Cells(z, Colonne).Value
      If Err.Number <> 0 Then
        Application.DisplayAlerts = False
        ActiveSheet.Delete
        Application.DisplayAlerts = True
      End If
      On Error GoTo 0
    End If
  Next z
End Sub

Pour supprimer les feuilles créées :​
Code:
Sub Effacer()
Dim z&
Const Colonne$ = "C"
  For z = 2 To Me.Cells(Me.Rows.Count, Colonne).End(xlUp).Row
    If Not IsEmpty(Me.Cells(z, Colonne).Value) Then
      Application.DisplayAlerts = False
      On Error Resume Next
      Sheets(Me.Cells(z, Colonne).Value).Delete
      On Error GoTo 0
      Application.DisplayAlerts = True
    End If
  Next z
End Sub
Attention ! C'est sans retour !


Bonne soirée.


ℝOGER2327
#7684


Samedi 14 As 142 (Saint Pierre Bonnard, peintre des Phynances - fête Suprême Quarte)
26 Brumaire An CCXXIII, 7,1965h - pistache
2014-W46-7T17:16:18Z
 
Dernière édition:

Mat_

XLDnaute Nouveau
Re : Création onglet vba à partir d'une liste

Re,

Merci pour les infos Roger2327, ça marche nickel, merci pour les différentes infos aussi.
Je vais analyser le code pour voir si j'arrive à comprendre, j'ai essayé de chercher des infos sur les macros hier mais j'ai dû mal chercher parce que j'avais trouvé des tutos que sur les déclarations de variable, je vais aller fouiller dans la partie VBA.

Merci beaucoup !
 

Discussions similaires

Statistiques des forums

Discussions
312 505
Messages
2 089 096
Membres
104 030
dernier inscrit
Angy