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 subJe 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).ActivateSi vous avez des idées je suis preneur...
je vous mets le fichier en PJ
++
Troph (complètement perdu)
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") & Extet mis mon "i" minuscule en majuscule et que tu l'avais déclaré comme une variable entière.
Dim Ext As String, I As Integeril 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 expliciten haut c'est cas ce truc ?
Troph en Quête de savoir
Bonjour
On commence par la fin
Option Explicitoblige à déclarer toutes les variables
Dim Ext As String, I As IntegerCela 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") & ExtEn 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").ValueLigne 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 stringje 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
NextCe 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").Valuerenvoyait 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 SubVoila 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