Excel Nom de copie de feuille 1 = contenu de cellules de feuille 1

kewan

Nouveau membre
Salut tout le monde.

J'ai besoin d’un petit coup de main.

Je suis professeur et j'aimerais créer un fichier Excel qui contient dans la première page un compte rendu d'intervention vierge.

Le but c'est que les élèves complètent le compte rendu, l'archive, le vide et l'enregistre.

Pour moi l'archivage consistera à faire une copie du compte rendu dans le même classeur et qu'il porte le nom de l'élève et la date du jour qu'il aura complété dans deux cellules du compte rendu.

Voilà le code que j'ai créé pour archiver le compte rendu celui-ci ne marche pas.

[cpp]Sheets("Feuil1").Select
Selection.Copy
Sheets.Add
ActiveSheet.Name = Range("A1") & Range("A2")[/cpp]


Voilà le code que j'ai créé pour effacer le compte rendu

[cpp]Range("A1,A2,E7,G7,G9,E9,E11,G11,G13,E13").Select
Selection.ClearContents
Range("A1").Select[/cpp]

Voilà le code que j'ai créé pour enregistrer le fichier

[cpp]ActiveWorkbook.Save[/cpp]

Pouvez-vous me dire ce qui ne va pas ?

Merci pour votre aide.
 

kewan

Nouveau membre
Salut tout le forum voilà c'est résolu

L'élève rentre son nom dans A1
Dans A2 la fonction =AUJOURDHUI()

[cpp]Sub Archiver()

Dim nomE As String
Dim plage As Range
Dim dj As String

With Sheets("Feuil1")

nomE = .[A1]
Set plage = Union(.[A1], .[A2])
dj = Format(.[A2], "dd-mm-yyyy")

End With

Sheets("Feuil1").Copy after:=Sheets(Sheets.Count)
Sheets(Sheets.Count).Name = nomE & "-" & dj

End Sub[/cpp]

Source :
 

zeb

Modérateur
Merci de ton retour.

-----------

Dis donc, prof, ne sais-tu pas que si un topic s'appelle Quelques règles simples à respecter -- /! A lire avant de poster ! , il peut être judicieux de le lire. Je t'invite donc à le faire, à découvrir qu'ici, on utilise une balise pour présenter son code, ce qui dispense d'avoir à choisir entre le rode foncé, le mauve ou le violet clair :sarcastic: et enfin à modifier tes messages pour respecter cette règle.

-----------

J'aurais des choses à dire sur ce code (que je ne peux pas lire en l'état, bien sûr :o )
 

kewan

Nouveau membre


Voilà c'est fait.

Merci pour ton aide.
 

zeb

Modérateur
Quelle aide ?
Pour l'instant, je fais mon agent de la sécurité :o

---------------------------

Ah, enfin un peu d'aide. :)

M 'enfin, quelle idée de réunir A1 et A2 pour ne rien en faire ?
Quant à aller mettre une formule Excel dans une cellule pour obtenir la date du jour, tu t'embêtes un max.
Enfin, pour pinailler, si tu as l'intention de programmer un peu plus sérieusement, apprends à indenter ton code.

Il faudrait écrire comme ceci :
Code:
Set MaNouvelleFeuille = Worksheets("Feuil1").Copy(After:=Sheets(Sheets.Count))
MaNouvelleFeuille.Name = ...

Las, le modèle objet du VBA/Excel est incomplet :pfff:
En bon chemin, les gars de Crosoft se sont arrêté nets !

Voilà ce que je te propose :
Code:
Worksheets("Feuil1").Copy After:=Sheets(Sheets.Count)
Worksheets(Sheets.Count).Name = Worksheets("Feuil1").Range("A1") & "-" & Format(Now, "dd-mm-yyyy")

C'est tout :)
Note l'utilisation judicieuse des Worksheets/Sheets qui n'amènent rien (sinon un peu de rigueur).
 

kewan

Nouveau membre
Salut zeb et tout le forum.

J'ai modifié mon projet. Voilà où j'en suis :

Je possède :

1 classeurs gabarit qui regroupe tous les documents vides (les comptes-rendus des interventions correctives et préventives)

1 classeur par système se trouvant dans l'atelier. Il y a au départ dans chaque classeur une seule feuille qui doit servir d'index.

Voilà comment cela doit fonctionner :

L'élève ouvre le classeur gabarit, saisit son compte-rendu et clic sur un bouton (contrôle de formulaire).

-Le compte-rendu saisit doit s'archiver dans le classeur du bon système (l'élève indique le nom du système en R4) et être nommé du nom de l'élève (saisit en B4) de la date et de l'heure

-l'index doit se mettre à jour

-le classeur doit être protégé, sauvegarder et fermé

-une fenêtre doit apparaitre pour indiquer que l'archivage c'est bien déroulé.

J'ai fait une macro qui réalise tout ça mais à ma façon :cry:. Et comme j'ai débuté il y a une semaine ça doit pas être terrible.

Je vous soumet mon œuvre pour que vous me disiez tout ce qu'il est possible d'améliorer.

Merci pour votre aide.

[cpp]Sub Archiver_compte_rendu_correctif()

valeur = Range("R4").Value
Dim wkB As Workbook

'Ouvrir le classeur archive

Set wkB = Workbooks.Open(ThisWorkbook.Path & "\Archives des systèmes\" & valeur & ".xlsm")

'Ôter la protection du classeur archive

ActiveWorkbook.Unprotect Password:="1234"

'Copier le compte-rendu dans le classeur archive et le nommer du nom de l'intervenant, la date et l'heure de saisit

ThisWorkbook.Sheets("Compte-rendu intervention corre").Copy After:=wkB.Sheets(1)
Worksheets(2).Name = Format(Now, "dd.m.yy") & "_" & Format(Now, "hh") & "H" & Worksheets("Compte-rendu intervention corre").Range("AA2") & "min" & Format(Now, "ss") & "_" & Worksheets("Compte-rendu intervention corre").Range("b4")

'Ôter la protection de toutes les feuilles

For Each Feuil In Sheets
Feuil.Unprotect Password:="1234"
Next

'Copier la fonction maintenant() et la coller sous forme de texte

Range("O4").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues

'Supprimer les colonnes contenants les instructions

Range("X2").ClearContents
ActiveSheet.Shapes("Button 1").Delete
ActiveSheet.Shapes("Button 2").Delete

' Créer un lien de l'archive vers l'index

Range("W2").Select
ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:="", _
SubAddress:=Sheets(1).Name & "!B2", TextToDisplay:=Sheets(1).Name

With Selection.Font
.Size = 16
End With

With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter

End With

' Créer un lien de l'index vers l'archive

Sheets("index").Select
ActiveSheet.Cells(Rows.Count, "B").End(xlUp)(2).Select
ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:="", _
SubAddress:=Sheets(2).Name & "!B2", TextToDisplay:=Sheets(2).Name

With Selection.Font
.Size = 16
End With
Rows("3:3").RowHeight = 27.75
With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter

End With

'Sauvegarder le classeur archive

ActiveWorkbook.Save

'Fermer le classeur archive

ActiveWindow.Close

'Ouvrir la fenetre compte rendu bien archivé

Load UserForm1
UserForm1.Show

End Sub
[/cpp]
 

zeb

Modérateur
Salut.

Les commentaires dans le code :
Code:
valeur = Range("R4" ).Value 
Dim wkB As Workbook 

'// Déclarer les variables, c'est bien. Fait le pour toutes.
'// Utilise l'option explicit pour être sûr de ne pas en oublier


'Ouvrir le classeur archive
Set wkB = Workbooks.Open(ThisWorkbook.Path & "\Archives des systèmes\" & valeur & ".xlsm" )

'Ôter la protection du classeur archive
ActiveWorkbook.Unprotect Password:="1234" 

'// Très bon mot de passe :lol: 
'// Ne te fie pas à ce qui est actif ou pas. Ca peut changer.
'// Tu as la variable wkB, utilise-la.


'Copier le compte-rendu dans le classeur archive et le nommer du nom de l'intervenant, la date et l'heure de saisit
ThisWorkbook.Sheets("Compte-rendu intervention corre" ).Copy After:=wkB.Sheets(1)
Worksheets(2).Name = Format(Now, "dd.m.yy" ) & "_" & Format(Now, "hh" ) & "H" & Worksheets("Compte-rendu intervention corre" ).Range("AA2" ) & "min" & Format(Now, "ss" ) & "_" & Worksheets("Compte-rendu intervention corre" ).Range("b4" )

'Ôter la protection de toutes les feuilles
For Each Feuil In Sheets
    Feuil.Unprotect Password:="1234"
Next

'Copier la fonction maintenant() et la coller sous forme de texte
Range("O4" ).Select
    Selection.Copy
        Selection.PasteSpecial Paste:=xlPasteValues

'// Eh, tu es sûr d'être sur la bonne feuille ? Précise-la toujours.
'// M'enfin, pourquoi sélectionner la cellule avant de la copier ?
'// Et utilise Now qu'on te dit. Sauf que dans d'autres cas, ça peut être une bonne idée de fixer la valeur à la place de la formule.
Worksheets("Mafeuille").Range("O4" ).Value = Worksheets("Mafeuille").Range("O4" ).Value


'Supprimer les colonnes contenants les instructions
Range("X2" ).ClearContents
ActiveSheet.Shapes("Button 1" ).Delete
ActiveSheet.Shapes("Button 2" ).Delete

'// Précise la feuille par son nom, son numéro ou par une variable y faisant référence. Toujours.
'// Et ne te fie pas à ce qui est actif ou pas.


' Créer un lien de l'archive vers l'index
Range("W2" ).Select '// <-- M'enfin pourquoi cette sélection ? grrr...
ActiveSheet /* <-- grrr */ .Hyperlinks.Add Anchor:=Selection, Address:="", _
SubAddress:=Sheets(1).Name & "!B2", TextToDisplay:=Sheets(1).Name
With Selection /* <-- grrr */ .Font
    .Size = 16
End With

'// Euh.... Range("W2").Font.Size = 16 directement, non ?

With Selection /* <-- grrr */
    .HorizontalAlignment = xlCenter
    .VerticalAlignment = xlCenter
End With

' Créer un lien de l'index vers l'archive
Sheets("index" ).Select /* <-- grrr */
ActiveSheet /* <-- grrr */ .Cells(Rows.Count, "B" ).End(xlUp)(2).Select /* <-- grrr */
ActiveSheet /* <-- grrr */ .Hyperlinks.Add Anchor:=Selection /* <-- grrr */, Address:="", _
SubAddress:=Sheets(2).Name & "!B2", TextToDisplay:=Sheets(2).Name
With Selection.Font
    .Size = 16 '//...
End With
    
Rows("3:3" ) /* <-- !  Rows(3) devrait suffire */ .RowHeight = 27.75
With Selection /* <-- grrr */
    .HorizontalAlignment = xlCenter
    .VerticalAlignment = xlCenter
End With

'Sauvegarder le classeur archive
ActiveWorkbook /* <-- grrr */ .Save
'Fermer le classeur archive
ActiveWindow /* <-- grrr */ .Close

'// Attention, un classeur peut être visible plusieurs fois dans une même session Excel.
'// Dans ce cas, il présente plusieurs fenêtre. Mais il n'est ouvert qu'une fois, bien sûr.
'// Donc pour le fermer, il faut faire un Close sur le classeur lui même, pas sur une de ses fenêtres.


'Ouvrir la fenetre compte rendu bien archivé
Load UserForm1
UserForm1.Show
 

kewan

Nouveau membre
:hello: zeb

Merci pour ton aide désolé de t'avoir fait grogner autant :)

Voilà où j'en suis j'ai réalisé les modifications que tu m'as conseillés, j’espère correctement.

[cpp]Option Explicit

Sub Archiver_compte_rendu_correctif()

Dim valeur As String
Dim wkB As Workbook
Dim MaFeuille As Worksheet

'//Petite question : Je n'avais pas déclaré les variables valeur et Mafeuille comment ce fait-il que ça fonctionné ?

valeur = Range("R4").Value

'Ouvrir le classeur archive

Set wkB = Workbooks.Open(ThisWorkbook.Path & "\Archives des systèmes\" & valeur & ".xlsm")

'Ôter la protection du classeur archive

wkB.Unprotect Password:="1234"

'Copier le compte-rendu dans le classeur archive et le nommer du nom de l'intervenant, la date et l'heure de saisit

ThisWorkbook.Sheets("Compte-rendu intervention corre").Copy After:=wkB.Sheets(1)
Worksheets(2).Name = Format(Now, "dd.m.yy_hh\Hn") & "min" & Format(Now, "ss") & "_" & Worksheets("Compte-rendu intervention corre").Range("b4")

'Ôter la protection de toutes les feuilles

For Each MaFeuille In Worksheets
MaFeuille.Unprotect Password:="1234"
Next

'Copier la fonction maintenant() et la coller sous forme de texte

Worksheets(2).Range("O4").Value = Worksheets(2).Range("O4").Value

'//Je colle la fonction maintenant() sous forme de texte pour ne pas que la date change au moment où je vais consulter l'archive

'Supprimer les colonnes contenants les instructions

Worksheets(2).Range("X2").ClearContents
Worksheets(2).Shapes("Button 1").Delete
Worksheets(2).Shapes("Button 2").Delete

'Créer un lien de l'index vers l'archive

Worksheets(1).Cells(Rows.Count, "B").End(xlUp)(2).Hyperlinks.Add Anchor:=Worksheets(1).Cells(Rows.Count, "B").End(xlUp)(2), Address:="", _
SubAddress:=Sheets(2).Name & "!B2", TextToDisplay:=Sheets(2).Name

With Worksheets(1).Cells(Rows.Count, "B").End(xlUp).Font
.Size = 16
End With

With Worksheets(1).Cells(Rows.Count, "B").End(xlUp)
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
End With

'Sauvegarder le classeur archive

wkB.Save

'Fermer le classeur archive

wkB.Close

'Ouvrir la fenêtre compte rendu bien archivé

Load UserForm1
UserForm1.Show

End Sub[/cpp]
 

zeb

Modérateur
Salut,

Le BASIC n'impose pas la déclaration des variables.
Aussi, quand il en rencontre une pour la première fois, il l'a crée avec le type Variant, et c'est tout.

Sauf que les débutants, les étourdis, voire les Zebs qui font cinquante choses en même temps (boulot professionnel, boulot personnel, modération du forum, réponse aux débutants, recherche pour les moins débutants, etc.) ne sont pas à l'abri d'une faute de frappe :
Code:
Dim Nom As String
Nom = InputBox("Quel est ton nom ?")
MsgBox "Bonjour, " & Non & "."
Et voilà !
Ajoute l'Option Explicit et tu n'auras pas à chercher l'erreur.

----------------

Quelques pinaillages de ma part :

L'indentation, c'est pas encore ça.

Tu jongles entre deux classeurs. N'écris pas Worksheets sans préciser s'il s'agit de ThisWorkbook ou de wbK.

Utilise les With si tu veux, mais n'en abuse pas :
Code:
'// Code ridicule
With Worksheets(1).Cells(Rows.Count, "B" ).End(xlUp).Font
    .Size = 16
End With

'// Code simplifié
Worksheets(1).Cells(Rows.Count, "B" ).End(xlUp).Font.Size = 16

Code:
Worksheets(2).Range("O4" ).Value = Worksheets(2).Range("O4" ).Value
Très bien, sauf que tu aurais pu écrire :
Code:
Worksheets(2).Range("O4" ).Value = Now
;)

Euh....
Code:
'// Code ridicule
With Worksheets(1).Cells(Rows.Count, "B" ).End(xlUp).Font
    .Size = 16
End With
With Worksheets(1).Cells(Rows.Count, "B" ).End(xlUp)
    .HorizontalAlignment = xlCenter
    .VerticalAlignment = xlCenter
End With

'// Code simplifié
With Worksheets(1).Cells(Rows.Count, "B" ).End(xlUp)
    .Font.Size = 16
    .HorizontalAlignment = xlCenter
    .VerticalAlignment = xlCenter
End With

Euh.... Sauf que tu as réalisé 4 fois le même calcul :
Code:
Worksheets(1).Cells(Rows.Count, "B" ).End(xlUp)
Donc il est pertinent d'utiliser une variable !

Code:
Dim x As Range
....
Set x = wb.Worksheets(1).Cells(Rows.Count, "B" ).End(xlUp)
x(2, 1).Hyperlinks.Add Anchor:=x(2, 1), Address:="", SubAddress:=wb.Worksheets(2).Name & "!B2", TextToDisplay:=wb.Worksheets(2).Name
x.Font.Size = 16
x.HorizontalAlignment = xlCenter
x.VerticalAlignment = xlCenter

Voilà :)
T'es un peu moins débutant, cher professeur ;)
 

kewan

Nouveau membre
Eh bien merci beaucoup zeb pour ton aide et toutes tes explications.

Voilà ma macro terminée.

[cpp]Option Explicit

Sub Archiver_compte_rendu_correctif()

Dim valeur As String
Dim wkB As Workbook
Dim MaFeuille As Worksheet
Dim x As Range

valeur = Range("R4").Value

'// Ouvrir le classeur archive

Set wkB = Workbooks.Open(ThisWorkbook.Path & "\Archives des systèmes\" & valeur & ".xlsm")
Set x = wkB.Worksheets(1).Cells(Rows.Count, "B").End(xlUp)

'// Ôter la protection du classeur archive

wkB.Unprotect Password:="1234"

'// Copier le compte-rendu dans le classeur archive et le nommer du nom de l'intervenant, la date et l'heure de saisit

ThisWorkbook.Sheets("Compte-rendu intervention corre").Copy After:=wkB.Sheets(1)
wkB.Sheets(2).Name = Format(Now, "dd.m.yy_hh\Hn") & "min" & Format(Now, "ss") & "_" & ThisWorkbook.Sheets("Compte-rendu intervention corre").Range("b4")

'// Ôter la protection de toutes les feuilles

For Each MaFeuille In Worksheets
MaFeuille.Unprotect Password:="1234"
Next

'// Copier la fonction maintenant() et la coller sous forme de texte

wkB.Sheets(2).Range("O4").Value = Now

'// Supprimer les colonnes contenants les instructions

wkB.Sheets(2).Range("X2").ClearContents
wkB.Sheets(2).Shapes("Button 1").Delete
wkB.Sheets(2).Shapes("Button 2").Delete

'// Créer un lien de l'index vers l'archive

x(2, 1).Hyperlinks.Add Anchor:=x(2, 1), Address:="", SubAddress:=wkB.Worksheets(2).Name & "!B2", TextToDisplay:=wkB.Worksheets(2).Name
x(2, 1).HorizontalAlignment = xlCenter
x(2, 1).VerticalAlignment = xlCenter
x(2, 1).Font.Size = 16

'// Sauvegarder le classeur archive

wkB.Save

'// Fermer le classeur archive

wkB.Close

'// Ouvrir la fenetre compte rendu bien archivé

Load UserForm1
UserForm1.Show

End Sub[/cpp]
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 098
Messages
6 717 055
Membres
1 586 282
Dernier membre
Yannick3553
Partager cette page
Haut