Création de classeur copie onglets

Bonsoir à tous.

Mon fichiers de base s'appelle "amplitude_chauffeur"

il est composé de 3 feuilles dont seulement 2 seront copiées sur le nouveau classeur. (feuille "Preparation" et feuille "Semaines")

Le but est de créer un fichier secondaire nommé par rapport à 2 cellules du fichier principal ("année et mois")

Ce nouveau fichier comprendra la feuille "Preparation" et la feuille "Semaines" et une 3eme feuille qui sera "Semaines(2)" une copie de la feuille précédente.

Le tout déclenché par un bouton formulaire.

(j'avais choisi ce type de bouton car la personne à qui je dois filer ce fichier semblait avoir un vieux excel!)

Or apres la copie

la feuille semaine du nouveau fichier devrait se compléter par une boucle "for".

Pour dessiner les bordure et colorer les cellules.

or cette boucle n'est pas lue (je n'ai pas de message de bug du script non plus)

par contre la commande copie de cette feuille est exécutées alors qu'elle est apres la boucle.

voila un bout de code pour mieux visualiser l'affaire.

code dans un module c'est peut etre pas une bonne idée non plus....

(ça marchait bien au départ sans l'étape de création du nouveau fichier. J'arrivais à créer tout ce qu'il fallait sur le feuille semaine)

Sub Faire_Semaine()

Dim chemin As String, fichier As String
    Dim Prep As Worksheet
    Set Prep = Worksheets("Preparation")
    Dim Sem As Worksheet
    Set Sem = Worksheets("Semaines")

    Sem.Copy
    chemin = ThisWorkbook.Path
    ext = ".xlsm"
    ActiveWorkbook.SaveAs chemin & "\" & (Prep.Range("B2") & "-" & Prep.Range("D2") & ext), FileFormat:=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False

    ' activation classeur source
    Windows("Amplitude_chauffeurs.xlsm").Activate
    Sheets("Preparation").Select

    Sheets("Preparation").Copy Before:=Workbooks([B2].Value & "-" & [D2].Value & ext).Sheets(1)

Sheets("Semaines").Select '<= Apparemment ce truc n'y fait rien de plus du coup j'ai enlevé.

'ensuite je déclare mes variables
'puis je lance la boucle pour créer les cellules feuille "semaines"

for i=0 to la fin
'Bla bla bla
next

Range("U5").Value = fin ' <= Apparemment ce n'est pas lu non plus
Sheets("Semaines").Copy After:=Sheets("Semaines") '<= cette ligne semble lue puis que une seonde feuille "semaines(2)" est créée toute aussi vierge que la première et celle de départ. Mais elle est créer sur le nouveau fichier.

end sub

Je soupçonne un défaut d'activation du nouveau fichier mais là je sais pas trop comment le faire.

j'ai tenté ceci, avant la boucle, mais sans succès. (sans erreur non plus)

Workbooks([B2].Value & "-" & [D2].Value & ext).Activate

Si vous avez des idées je suis preneur...

je vous mets le fichier en PJ

++

Troph (complètement perdu)

Bonsoir

A tester

Alors écoute ça marche impecc et je te remercie vivement car j'y suis depuis 16h30 cette aprem et là je craquais...

par contre j'ai besoin d'une explication.

j'ai vu que tu avais raccourcis le chemin pour le nom du futur fichier.

Fichier = Prep.Range("B2") & "-" & Prep.Range("D2") & Ext

et mis mon "i" minuscule en majuscule et que tu l'avais déclaré comme une variable entière.

Dim Ext As String, I As Integer

il ne me semble pas avoir vu d'autre changement si ce n'est la copie de la feuille listes. que j'avais zappée. car elle ne m’intéressait plus après.

As-tu fais autre chose car je comprends pas comment tes changements ont permis que ça fonctionne.

autre chose

option explicit

en haut c'est cas ce truc ?

Troph en Quête de savoir

Bonjour

On commence par la fin

    Option Explicit

oblige à déclarer toutes les variables

    Dim Ext As String, I As Integer

Cela ne change pas ton i, mais c'est une habitude chez moi, de déclarer les variables en mélangeant majuscules et minuscules, ce qui permet de voir immédiatement si la variable que j'ai tapée est la bonne (c'est flagrant quand le nom de la variable est long)

Fichier = Prep.Range("B2") & "-" & Prep.Range("D2") & Ext

En procédant ainsi (en récupérant le nom du fichier dans une variable) on s'affranchit de sélectionner la bonne feuille du bon classeur pour récupérer les données dans les cellules

Exemple

    Sheets("Preparation").Copy Before:=Workbooks([B2].Value & "-" & [D2].Value & Ext).Sheets(1)
    Sheets("listes").Copy After:=Workbooks([B2].Value & "-" & [D2].Value & Ext).Sheets(1)

si tu n'as pas activé le bon classeur et la bonne feuille [B2] et [D2] peuvent pointer vers la mauvaise feuille du mauvais classeur

Donc la même chose en utilisant la variable

    ThisWorkbook.Sheets("Preparation").Copy Before:=Workbooks(Fichier).Sheets(1)
    ThisWorkbook.Sheets("listes").Copy After:=Workbooks(Fichier).Sheets(1)

est plus précis, en plus j'ai expressément désigné le classeur qui contient les pages

dernier truc que j'ai modifié

fin = Sheets("Preparation").Range("E3").Value

Ligne qui était en remarque

Génial merci pour cet éclairage !!!!

Par contre je coince encore.

De la même manière je voudrais créer (copier) un onglet pour chaque employé et lui donner le nom d'une cellule sur la première page.

J'ai donc utilisé un tableau pour avoir mes valeurs, mais là ou ça coince c'est q'à chaque fois j'ai une erreur sur

la ligne

redim tableau(1 to No) as string

je vous mets la partie du code rajoutée à la fin du module 3

''''''copie onglet Employé'''''

Workbooks(Fichier).Sheets("Preparation").Select

Dim plage As Range
Dim No As Integer
Dim Col As Integer

Col = 3

No = Sheets("Preparation").Range("E2").Value
Set plage = Sheets("Preparation").Range("C4:C" & 4 + No)
  Dim Tableau() As String
  ReDim Tableau(1 To No)

  'For Ctr = 1 To N
  '  Tableau(Ctr) = plage(Ctr)
 ' Next
Dim Ctr As Integer

  For Ctr = 1 To No
  Col = Col + 1
 Tableau(Ctr) = plage(Ctr)
    'Sheets("modele").Copy , Sheets(Sheets.Count)
    Sheets("Emp").Copy , Sheets(Sheets.Count)
    Sheets(Sheets.Count).Name = Tableau(Ctr)
    Sheets(Sheets.Count).Range("B4").Value = Sheets(Sheets.Count).Name 'envoie nom onglet dans cel B4
    Sheets(Sheets.Count).Tab.ColorIndex = Col
  Next

Ce bout de code marche très bien seul sur un fichier isolé, mais ne marche pas sur le fichier final (Le con !!! ça aurait été trop beau !!!)

J'ai une erreur 9 pointant la ligne indiqué avec la notification "L'indice n'appartient à la sélection"

Je suppose qu'il ne sait pas retrouver la bonne page mais quid je sèche.

je vous mets aussi le fichier en PJ pour les courageux.

Troph

Bonjour

A première vue modifies ton code

Col = 3

No = Sheets("Preparation").Range("E3").Value
Set plage = Sheets("Preparation").Range("C4:C" & 4 + No)
  Dim Tableau() As String
  ReDim Tableau(1 To No)

Yop

Bon j'ai changé le référencement et ça fonctionne.

Maintenant va falloir m'expliquer pkoi ça coince?

est-ce à cause du fait que sur la feuille Preparation en E3 j'ai une formule dans la cellule et non une valeur ?

++

Troph

Bonjour

Faut être clair

Trophinou a écrit :

et ça fonctionne

Trophinou a écrit :

pkoi ça coince?

Avant tu avais marqué E2 qui ne contenait rien, nada, que dalle, des nèfles, bernique etc ... donc

No = Sheets("Preparation").Range("E2").Value

renvoyait 0

Et le

ReDim Tableau(1 To No)

déclenchait l'alarme du côté de l’interpréteur VBA

Oups désolé, mes doigts ont fourché... dsl

il fallait lire pourquoi ça coinçait.

par contre j'essaye de comprendre les variables tableau (via les cours du site et autre) et là j'ai plus de mal mon neurone coince ...

sur un tableau unidirectionnel j'ai compris le systeme, mais lorsqu'il est multidirectionnel là je coince à fond.

1. première question

le nombre de colonnes est indépendante de la dimension si j'ai bien compris.

que l'on ait 2 colonnes ou 10 le tableau sera un tableau à 2 dimension. c'est bien ça ?

2. Si j'ai bien compris, un tableau de variable une fois constitué permet de transporter les variables d'une feuille à l'autre sans avoir à le redéfinir. Est bien cela ?

3. Si c'est cela

je voudrais pouvoir entrer dans mon tableau les valeurs des cellules d'une feuille excel

de A4 à C8 par exemple. donc 3 colonnes et 5 lignes. (ou plutot l'inverse)

sauf que je ne sais pas comment faire pour assigner mes valeurs de feuille excel dans chaque case ce P... de tableau.

j'ai tenté tout plein de chose, mais j'ai des truc bizarre parfois.

++

Troph

Apres testouille en tout genre et 100 000 plantages...

est-ce que ceci peut marcher? car quand je demande de m'afficher la valeur dans une msg box j'ai rien.

   Tableau(Ctr1, Ctr2) = Cells(1 + Ctr1, 4 + Ctr2)

PA palap pa pa pa aaaaaa

pa palap pa pa pa aaaaaaaaaaa

Bon a force de pugnacité et de persévérance j'y suis arrivé.... (Bon faut dormir maintenant))) <=oups parenthèses pas équilibrées !!!!

ça va bugger comme mon cerveau....

Sur un fichier à part bien sûr, c'est un premier pas maintenant va falloir intégrer le bazar au fichier final....

Par contre ma question 2 reste toujours valable

2. Si j'ai bien compris, un tableau de variable une fois constitué permet de transporter les variables d'une feuille à l'autre sans avoir à le redéfinir. Est bien cela ?

Je pourrais donc retrouver les valeurs des cases sur n'importe quelle feuille du classeur ?

Dim No As Integer

If Sheets("Preparation").Range("E3").Value <> "" Then

No = Sheets("Preparation").Range("E3").Value
Dim Tableau() As String
Dim Ctr1 As Integer, Ctr2 As Integer
Dim plage As Range
Set plage = Sheets("Preparation").Range("A" & 4 + No, "C" & 4 + No)

ReDim Tableau(0 To No, 2)

For Ctr1 = 0 To UBound(Tableau, 1)
   For Ctr2 = 0 To UBound(Tableau, 2)

    Tableau(Ctr1, Ctr2) = Cells(4 + Ctr1, 1 + Ctr2)
    Debug.Print Tableau(Ctr1, Ctr2)

    Next Ctr2
Next Ctr1
Else: Exit Sub
End If
 Next
Sheets("Preparation").Range("D15").Value = Tableau(1, 2)
Sheets("Preparation").Range("D16").Value = Tableau(5, 2)
Sheets("Preparation").Range("D17").Value = Tableau(3, 2)

End Sub

Voila le code. il n'est peut être pas très académique, mais il a le mérite de fonctionner.

++

Troph qui va se coucher.

Bises

Bonjour

Je ne comprends pas tout de ton code, et surtout ce que tu veux faire

A tester

Sub truc()
Dim No As Integer
Dim Tableau

  With Sheets("Preparation")
    If .Range("E3").Value = "" Then Exit Sub
    No = .Range("E3").Value

    Tableau = .Range("A4").Resize(No, 3)      ' No : nombre de ligne (employé), 3 nombre de colonne
  End With
  ' Dans tableau tu as les prénoms, Nom et les Noms d'onglet des employés
  ' Attention Base 1

  Debug.Print Tableau(1, 2)      ' Nom du 1er employé
  Debug.Print Tableau(3, 1)      ' Prénom du 3ème employé
  Debug.Print Tableau(5, 3)      ' Nom d'onglet du 5ème employé

End Sub
Rechercher des sujets similaires à "creation classeur copie onglets"