Création d'onglets selon des critères de cellules

TEMAGOULTFARID

XLDnaute Occasionnel
Bonjour a vous tous,
ce que je souhaiterai si c'est possible,lorsque je clic sur l'icone 2 et me créée automatiquement les 12 onglets( qui représente les 12mois) lié a l'icone de la "fiche modèle" , de ne créé que les onglets lié au choix de la périodicité de D20:D31, comme dans l'exemple , les fichiers crées seront dans la cellellules A21/A24/A28,
je vous en PJ le fichier qui sera parlant.

Par avance merci
 

Pièces jointes

  • Poste 1.xlsm
    897.6 KB · Affichages: 11

laurent3372

XLDnaute Impliqué
Supporter XLD
Le module module21 ne se compile pas sur ma machine 64 bits car il est codé pour une machine 32 bits
VB:
[FONT=courier new]Declare Function SetWindowLong& Lib "user32" Alias "SetWindowLongA" ( _
  ByVal Hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long)
 
Private Declare Function GetWindowLong& Lib "user32" Alias "GetWindowLongA" ( _
  ByVal Hwnd As Long, ByVal nIndex As Long)
 
Declare Function SetWindowPos& Lib "user32" ( _
  ByVal Hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, _
  ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long)
 
Declare Function GetWindowRect& Lib "user32" (ByVal Hwnd As Long, lpRect As structRECT)[/FONT]
Cordialement,
--
LR
 

TEMAGOULTFARID

XLDnaute Occasionnel
Le module module21 ne se compile pas sur ma machine 64 bits car il est codé pour une machine 32 bits
VB:
[FONT=courier new]Declare Function SetWindowLong& Lib "user32" Alias "SetWindowLongA" ( _
  ByVal Hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long)

Private Declare Function GetWindowLong& Lib "user32" Alias "GetWindowLongA" ( _
  ByVal Hwnd As Long, ByVal nIndex As Long)

Declare Function SetWindowPos& Lib "user32" ( _
  ByVal Hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, _
  ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long)

Declare Function GetWindowRect& Lib "user32" (ByVal Hwnd As Long, lpRect As structRECT)[/FONT]
Cordialement,
--
LR
Bonjour Laurent, merci pour ton retour ,
et quel serait la solution , si solution ;
bonne journée a toi
 

TEMAGOULTFARID

XLDnaute Occasionnel
Bonjour,

Pour du user 32 en 64 bits, il faut déclarer la fonction comme "PtrSafe" :
VB:
Declare PtrSafe Function ...

Bonne continuation
Bonjour a toi ,
merci pour l'info et je suis allée sur différent site pour comprendre le passage du 32 en 64 et c'est très instructif. Cependant , je ne souhaite pas faire de bascule , car sur mon PC, cela fonctionne très bien , j'avais juste besoin d'une aide au titre de ce post et avec l'exemple fichier que mis a disposition.par avance, merci
 

TEMAGOULTFARID

XLDnaute Occasionnel
Bonjour,

Pour du user 32 en 64 bits, il faut déclarer la fonction comme "PtrSafe" :
VB:
Declare PtrSafe Function ...

Bonne continuation

Bonjour a toi xUpsilon, je vines de voir que c’était avec toi qui m'avais travailler sur ce fichier sur ce poste.
copier collet automatiquement selon onglet du classeur.xlsm
pourrait tu voir sur le fichier dans ce poste la faisabilité de ma demande si cela ne te dérange pas.
para avance merci
 

laurent3372

XLDnaute Impliqué
Supporter XLD
J'ai rajouté une condition dans la procédure:

VB:
Private Sub Copier_Nommer_Feuilles()
Dim oDat, i As Long
Call Test2

30    With [A20] 'Cellule à partir de laquelle sont placés les noms des feuilles _
      à créer. Il peut y en avoir autant qu'on veut.

40    If Cells(Rows.Count, .Column).End(xlUp).Cells(1, 1).Row < .Row Then GoTo E
         'Si toutes les cellules en-dessous de B11 sont vides, aller à E _
         (c'est-à-dire ne rien faire).

50    With Application: .ScreenUpdating = False: .Calculation = xlManual: .EnableEvents = False: End With
         'Ligne "technique" pour accélérer l'exécution.

60       oDat = Range(.Cells.Offset(-1, 0), Cells(Rows.Count, .Column).End(xlUp)).Value
            'Place dans le tableau oDat (une colonne) les valeurs de B11 à Bn, _
            où n est le numéro de la dernière ligne non vide de la colonne B.
        
70       For i = 2 To UBound(oDat, 1) 'Pour i variant de 2 au nombre de lignes _
            du tableau oDat...
            
            If [d20].Offset(i - 2).Value = "X" Then 'On ne traite que les lignes avec périodicité

75              On Error GoTo m 'Pour sortir de la procédure si la feuille modèle _
                   n'existe pas.
    
80              Sheets("Feuille_modèle").Copy After:=Sheets(Sheets.Count) 'Ajoute une copie _
                   de la feuille "Feuille_modèle" à la fin du classeur.
    
85              Sheets(Sheets.Count).[B2].Value = CStr(oDat(i, 1)) 'No comment.
      
90              On Error GoTo S 'Si une erreur se produit dans la ligne qui _
                   suit, elle est ignorée, et l'exécution continue à la ligne _
                   suivante après le traitement de l'erreur (ligne S).
    
100             Sheets(Sheets.Count).Name = CStr(oDat(i, 1)) '...renomme _
                   la feuille créée avec le nom qui est dans la ligne i de la _
                   première colonne du tableau oDat. Si une valeur est manquante _
                   dans le tableau oDat ou si ce nom existe déjà dans le classeur, _
                   une erreur se produit. Grâce à la ligne 90 cette erreur est _
                   ignorée et l'exécution du code continue.
    
110             On Error GoTo 0 'A partir d'ici, les éventuelles erreurs ne sont plus _
                   ignorées.
            End If
120        Next 'Reprendre l'exécution à la ligne 75 avec la valeur suivante de i, _
               tant que la dernière ligne du tableau oDat n'est pas atteinte.

130      With Application: .EnableEvents = True: .Calculation = xlAutomatic: .ScreenUpdating = True: End With
            'Ligne "technique" pour rétablir les paramètres modifiés à la ligne 5. _
            Le code fonctionne aussi si les lignes 5 et 14 sont supprimées, mais _
            l'exécution est plus lente.

E:    End With

Exit Sub

m:    MsgBox "Le nom de la feuille modèle est incorrect.": Resume E

      'Suppression de la feuille créée si une erreur survient ligne 100.
S:    With Application: .DisplayAlerts = False: Sheets(Sheets.Count).Delete: .DisplayAlerts = True: End With
   Resume Next

End Sub
 

Pièces jointes

  • Poste 1.xlsm
    954.1 KB · Affichages: 12

TEMAGOULTFARID

XLDnaute Occasionnel
J'ai rajouté une condition dans la procédure:

VB:
Private Sub Copier_Nommer_Feuilles()
Dim oDat, i As Long
Call Test2

30    With [A20] 'Cellule à partir de laquelle sont placés les noms des feuilles _
      à créer. Il peut y en avoir autant qu'on veut.

40    If Cells(Rows.Count, .Column).End(xlUp).Cells(1, 1).Row < .Row Then GoTo E
         'Si toutes les cellules en-dessous de B11 sont vides, aller à E _
         (c'est-à-dire ne rien faire).

50    With Application: .ScreenUpdating = False: .Calculation = xlManual: .EnableEvents = False: End With
         'Ligne "technique" pour accélérer l'exécution.

60       oDat = Range(.Cells.Offset(-1, 0), Cells(Rows.Count, .Column).End(xlUp)).Value
            'Place dans le tableau oDat (une colonne) les valeurs de B11 à Bn, _
            où n est le numéro de la dernière ligne non vide de la colonne B.
       
70       For i = 2 To UBound(oDat, 1) 'Pour i variant de 2 au nombre de lignes _
            du tableau oDat...
           
            If [d20].Offset(i - 2).Value = "X" Then 'On ne traite que les lignes avec périodicité

75              On Error GoTo m 'Pour sortir de la procédure si la feuille modèle _
                   n'existe pas.
   
80              Sheets("Feuille_modèle").Copy After:=Sheets(Sheets.Count) 'Ajoute une copie _
                   de la feuille "Feuille_modèle" à la fin du classeur.
   
85              Sheets(Sheets.Count).[B2].Value = CStr(oDat(i, 1)) 'No comment.
     
90              On Error GoTo S 'Si une erreur se produit dans la ligne qui _
                   suit, elle est ignorée, et l'exécution continue à la ligne _
                   suivante après le traitement de l'erreur (ligne S).
   
100             Sheets(Sheets.Count).Name = CStr(oDat(i, 1)) '...renomme _
                   la feuille créée avec le nom qui est dans la ligne i de la _
                   première colonne du tableau oDat. Si une valeur est manquante _
                   dans le tableau oDat ou si ce nom existe déjà dans le classeur, _
                   une erreur se produit. Grâce à la ligne 90 cette erreur est _
                   ignorée et l'exécution du code continue.
   
110             On Error GoTo 0 'A partir d'ici, les éventuelles erreurs ne sont plus _
                   ignorées.
            End If
120        Next 'Reprendre l'exécution à la ligne 75 avec la valeur suivante de i, _
               tant que la dernière ligne du tableau oDat n'est pas atteinte.

130      With Application: .EnableEvents = True: .Calculation = xlAutomatic: .ScreenUpdating = True: End With
            'Ligne "technique" pour rétablir les paramètres modifiés à la ligne 5. _
            Le code fonctionne aussi si les lignes 5 et 14 sont supprimées, mais _
            l'exécution est plus lente.

E:    End With

Exit Sub

m:    MsgBox "Le nom de la feuille modèle est incorrect.": Resume E

      'Suppression de la feuille créée si une erreur survient ligne 100.
S:    With Application: .DisplayAlerts = False: Sheets(Sheets.Count).Delete: .DisplayAlerts = True: End With
   Resume Next

End Sub
bonjour a toi ,
le fichier fonctionne nickel, je te remercie énormément pour ton implication, surtout que je viens de voir que tu me l'a envoyé a 1h30 , je suis gêné d'avoir pris de ton temps.Je présente mes excuses aux personnes de ton entourage de leurs avoir pris de ton temps précieux. je te souhaite une tres bonne journée
 

Discussions similaires

Statistiques des forums

Discussions
312 203
Messages
2 086 182
Membres
103 152
dernier inscrit
Karibu