Se connecter avec
S'enregistrer | Connectez-vous

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

Dernière réponse : dans Programmation
Partagez

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.

  1. Sheets("Feuil1").Select
  2. Selection.Copy
  3. Sheets.Add
  4. ActiveSheet.Name = Range("A1") & Range("A2")



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

  1. Range("A1,A2,E7,G7,G9,E9,E11,G11,G13,E13").Select
  2. Selection.ClearContents
  3. Range("A1").Select


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

  1. ActiveWorkbook.Save


Pouvez-vous me dire ce qui ne va pas ?

Merci pour votre aide.

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

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

  1. Sub Archiver()
  2.  
  3. Dim nomE As String
  4. Dim plage As Range
  5. Dim dj As String
  6.  
  7. With Sheets("Feuil1")
  8.  
  9. nomE = .[A1]
  10. Set plage = Union(.[A1], .[A2])
  11. dj = Format(.[A2], "dd-mm-yyyy")
  12.  
  13. End With
  14.  
  15. Sheets("Feuil1").Copy after:=Sheets(Sheets.Count)
  16. Sheets(Sheets.Count).Name = nomE & "-" & dj
  17.  
  18. End Sub


Source : commentcamarche.net

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  )

zeb a dit :
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  )


Voilà c'est fait.

Merci pour ton aide.
Contenus similaires

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 :
  1. Set MaNouvelleFeuille = Worksheets("Feuil1").Copy(After:=Sheets(Sheets.Count))
  2. 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 :
  1. Worksheets("Feuil1").Copy After:=Sheets(Sheets.Count)
  2. 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).

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.

  1. Sub Archiver_compte_rendu_correctif()
  2.  
  3. valeur = Range("R4").Value
  4. Dim wkB As Workbook
  5.  
  6. 'Ouvrir le classeur archive
  7.  
  8. Set wkB = Workbooks.Open(ThisWorkbook.Path & "\Archives des systèmes\" & valeur & ".xlsm")
  9.  
  10. 'Ôter la protection du classeur archive
  11.  
  12. ActiveWorkbook.Unprotect Password:="1234"
  13.  
  14. 'Copier le compte-rendu dans le classeur archive et le nommer du nom de l'intervenant, la date et l'heure de saisit
  15.  
  16. ThisWorkbook.Sheets("Compte-rendu intervention corre").Copy After:=wkB.Sheets(1)
  17. 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")
  18.  
  19. 'Ôter la protection de toutes les feuilles
  20.  
  21. For Each Feuil In Sheets
  22. Feuil.Unprotect Password:="1234"
  23. Next
  24.  
  25. 'Copier la fonction maintenant() et la coller sous forme de texte
  26.  
  27. Range("O4").Select
  28. Selection.Copy
  29. Selection.PasteSpecial Paste:=xlPasteValues
  30.  
  31. 'Supprimer les colonnes contenants les instructions
  32.  
  33. Range("X2").ClearContents
  34. ActiveSheet.Shapes("Button 1").Delete
  35. ActiveSheet.Shapes("Button 2").Delete
  36.  
  37. ' Créer un lien de l'archive vers l'index
  38.  
  39. Range("W2").Select
  40. ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:="", _
  41. SubAddress:=Sheets(1).Name & "!B2", TextToDisplay:=Sheets(1).Name
  42.  
  43. With Selection.Font
  44. .Size = 16
  45. End With
  46.  
  47. With Selection
  48. .HorizontalAlignment = xlCenter
  49. .VerticalAlignment = xlCenter
  50.  
  51. End With
  52.  
  53. ' Créer un lien de l'index vers l'archive
  54.  
  55. Sheets("index").Select
  56. ActiveSheet.Cells(Rows.Count, "B").End(xlUp)(2).Select
  57. ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:="", _
  58. SubAddress:=Sheets(2).Name & "!B2", TextToDisplay:=Sheets(2).Name
  59.  
  60. With Selection.Font
  61. .Size = 16
  62. End With
  63. Rows("3:3").RowHeight = 27.75
  64. With Selection
  65. .HorizontalAlignment = xlCenter
  66. .VerticalAlignment = xlCenter
  67.  
  68. End With
  69.  
  70. 'Sauvegarder le classeur archive
  71.  
  72. ActiveWorkbook.Save
  73.  
  74. 'Fermer le classeur archive
  75.  
  76. ActiveWindow.Close
  77.  
  78. 'Ouvrir la fenetre compte rendu bien archivé
  79.  
  80. Load UserForm1
  81. UserForm1.Show
  82.  
  83. End Sub

Salut.

Les commentaires dans le code :
  1. valeur = Range("R4" ).Value
  2. Dim wkB As Workbook
  3.  
  4. '// Déclarer les variables, c'est bien. Fait le pour toutes.
  5. '// Utilise l'option explicit pour être sûr de ne pas en oublier
  6.  
  7.  
  8. 'Ouvrir le classeur archive
  9. Set wkB = Workbooks.Open(ThisWorkbook.Path & "\Archives des systèmes\" & valeur & ".xlsm" )
  10.  
  11. 'Ôter la protection du classeur archive
  12. ActiveWorkbook.Unprotect Password:="1234"
  13.  
  14. '// Très bon mot de passe :lol:
  15. '// Ne te fie pas à ce qui est actif ou pas. Ca peut changer.
  16. '// Tu as la variable wkB, utilise-la.
  17.  
  18.  
  19. 'Copier le compte-rendu dans le classeur archive et le nommer du nom de l'intervenant, la date et l'heure de saisit
  20. ThisWorkbook.Sheets("Compte-rendu intervention corre" ).Copy After:=wkB.Sheets(1)
  21. 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" )
  22.  
  23. 'Ôter la protection de toutes les feuilles
  24. For Each Feuil In Sheets
  25. Feuil.Unprotect Password:="1234"
  26. Next
  27.  
  28. 'Copier la fonction maintenant() et la coller sous forme de texte
  29. Range("O4" ).Select
  30. Selection.Copy
  31. Selection.PasteSpecial Paste:=xlPasteValues
  32.  
  33. '// Eh, tu es sûr d'être sur la bonne feuille ? Précise-la toujours.
  34. '// M'enfin, pourquoi sélectionner la cellule avant de la copier ?
  35. '// 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.
  36. Worksheets("Mafeuille").Range("O4" ).Value = Worksheets("Mafeuille").Range("O4" ).Value
  37.  
  38.  
  39. 'Supprimer les colonnes contenants les instructions
  40. Range("X2" ).ClearContents
  41. ActiveSheet.Shapes("Button 1" ).Delete
  42. ActiveSheet.Shapes("Button 2" ).Delete
  43.  
  44. '// Précise la feuille par son nom, son numéro ou par une variable y faisant référence. Toujours.
  45. '// Et ne te fie pas à ce qui est actif ou pas.
  46.  
  47.  
  48. ' Créer un lien de l'archive vers l'index
  49. Range("W2" ).Select '// <-- M'enfin pourquoi cette sélection ? grrr...
  50. ActiveSheet /* <-- grrr */ .Hyperlinks.Add Anchor:=Selection, Address:="", _
  51. SubAddress:=Sheets(1).Name & "!B2", TextToDisplay:=Sheets(1).Name
  52. With Selection /* <-- grrr */ .Font
  53. .Size = 16
  54. End With
  55.  
  56. '// Euh.... Range("W2").Font.Size = 16 directement, non ?
  57.  
  58. With Selection /* <-- grrr */
  59. .HorizontalAlignment = xlCenter
  60. .VerticalAlignment = xlCenter
  61. End With
  62.  
  63. ' Créer un lien de l'index vers l'archive
  64. Sheets("index" ).Select /* <-- grrr */
  65. ActiveSheet /* <-- grrr */ .Cells(Rows.Count, "B" ).End(xlUp)(2).Select /* <-- grrr */
  66. ActiveSheet /* <-- grrr */ .Hyperlinks.Add Anchor:=Selection /* <-- grrr */, Address:="", _
  67. SubAddress:=Sheets(2).Name & "!B2", TextToDisplay:=Sheets(2).Name
  68. With Selection.Font
  69. .Size = 16 '//...
  70. End With
  71.  
  72. Rows("3:3" ) /* <-- ! Rows(3) devrait suffire */ .RowHeight = 27.75
  73. With Selection /* <-- grrr */
  74. .HorizontalAlignment = xlCenter
  75. .VerticalAlignment = xlCenter
  76. End With
  77.  
  78. 'Sauvegarder le classeur archive
  79. ActiveWorkbook /* <-- grrr */ .Save
  80. 'Fermer le classeur archive
  81. ActiveWindow /* <-- grrr */ .Close
  82.  
  83. '// Attention, un classeur peut être visible plusieurs fois dans une même session Excel.
  84. '// Dans ce cas, il présente plusieurs fenêtre. Mais il n'est ouvert qu'une fois, bien sûr.
  85. '// Donc pour le fermer, il faut faire un Close sur le classeur lui même, pas sur une de ses fenêtres.
  86.  
  87.  
  88. 'Ouvrir la fenetre compte rendu bien archivé
  89. Load UserForm1
  90. UserForm1.Show

: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.

  1. Option Explicit
  2.  
  3. Sub Archiver_compte_rendu_correctif()
  4.  
  5. Dim valeur As String
  6. Dim wkB As Workbook
  7. Dim MaFeuille As Worksheet
  8.  
  9. '//Petite question : Je n'avais pas déclaré les variables valeur et Mafeuille comment ce fait-il que ça fonctionné ?
  10.  
  11. valeur = Range("R4").Value
  12.  
  13. 'Ouvrir le classeur archive
  14.  
  15. Set wkB = Workbooks.Open(ThisWorkbook.Path & "\Archives des systèmes\" & valeur & ".xlsm")
  16.  
  17. 'Ôter la protection du classeur archive
  18.  
  19. wkB.Unprotect Password:="1234"
  20.  
  21. 'Copier le compte-rendu dans le classeur archive et le nommer du nom de l'intervenant, la date et l'heure de saisit
  22.  
  23. ThisWorkbook.Sheets("Compte-rendu intervention corre").Copy After:=wkB.Sheets(1)
  24. Worksheets(2).Name = Format(Now, "dd.m.yy_hh\Hn") & "min" & Format(Now, "ss") & "_" & Worksheets("Compte-rendu intervention corre").Range("b4")
  25.  
  26. 'Ôter la protection de toutes les feuilles
  27.  
  28. For Each MaFeuille In Worksheets
  29. MaFeuille.Unprotect Password:="1234"
  30. Next
  31.  
  32. 'Copier la fonction maintenant() et la coller sous forme de texte
  33.  
  34. Worksheets(2).Range("O4").Value = Worksheets(2).Range("O4").Value
  35.  
  36. '//Je colle la fonction maintenant() sous forme de texte pour ne pas que la date change au moment où je vais consulter l'archive
  37.  
  38. 'Supprimer les colonnes contenants les instructions
  39.  
  40. Worksheets(2).Range("X2").ClearContents
  41. Worksheets(2).Shapes("Button 1").Delete
  42. Worksheets(2).Shapes("Button 2").Delete
  43.  
  44. 'Créer un lien de l'index vers l'archive
  45.  
  46. Worksheets(1).Cells(Rows.Count, "B").End(xlUp)(2).Hyperlinks.Add Anchor:=Worksheets(1).Cells(Rows.Count, "B").End(xlUp)(2), Address:="", _
  47. SubAddress:=Sheets(2).Name & "!B2", TextToDisplay:=Sheets(2).Name
  48.  
  49. With Worksheets(1).Cells(Rows.Count, "B").End(xlUp).Font
  50. .Size = 16
  51. End With
  52.  
  53. With Worksheets(1).Cells(Rows.Count, "B").End(xlUp)
  54. .HorizontalAlignment = xlCenter
  55. .VerticalAlignment = xlCenter
  56. End With
  57.  
  58. 'Sauvegarder le classeur archive
  59.  
  60. wkB.Save
  61.  
  62. 'Fermer le classeur archive
  63.  
  64. wkB.Close
  65.  
  66. 'Ouvrir la fenêtre compte rendu bien archivé
  67.  
  68. Load UserForm1
  69. UserForm1.Show
  70.  
  71. End Sub

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 :
  1. Dim Nom As String
  2. Nom = InputBox("Quel est ton nom ?")
  3. 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 :
  1. '// Code ridicule
  2. With Worksheets(1).Cells(Rows.Count, "B" ).End(xlUp).Font
  3. .Size = 16
  4. End With
  5.  
  6. '// Code simplifié
  7. Worksheets(1).Cells(Rows.Count, "B" ).End(xlUp).Font.Size = 16


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

Euh....
  1. '// Code ridicule
  2. With Worksheets(1).Cells(Rows.Count, "B" ).End(xlUp).Font
  3. .Size = 16
  4. End With
  5. With Worksheets(1).Cells(Rows.Count, "B" ).End(xlUp)
  6. .HorizontalAlignment = xlCenter
  7. .VerticalAlignment = xlCenter
  8. End With
  9.  
  10. '// Code simplifié
  11. With Worksheets(1).Cells(Rows.Count, "B" ).End(xlUp)
  12. .Font.Size = 16
  13. .HorizontalAlignment = xlCenter
  14. .VerticalAlignment = xlCenter
  15. End With


Euh.... Sauf que tu as réalisé 4 fois le même calcul :
  1. Worksheets(1).Cells(Rows.Count, "B" ).End(xlUp)

Donc il est pertinent d'utiliser une variable !

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


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

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

Voilà ma macro terminée.

  1. Option Explicit
  2.  
  3. Sub Archiver_compte_rendu_correctif()
  4.  
  5. Dim valeur As String
  6. Dim wkB As Workbook
  7. Dim MaFeuille As Worksheet
  8. Dim x As Range
  9.  
  10. valeur = Range("R4").Value
  11.  
  12. '// Ouvrir le classeur archive
  13.  
  14. Set wkB = Workbooks.Open(ThisWorkbook.Path & "\Archives des systèmes\" & valeur & ".xlsm")
  15. Set x = wkB.Worksheets(1).Cells(Rows.Count, "B").End(xlUp)
  16.  
  17. '// Ôter la protection du classeur archive
  18.  
  19. wkB.Unprotect Password:="1234"
  20.  
  21. '// Copier le compte-rendu dans le classeur archive et le nommer du nom de l'intervenant, la date et l'heure de saisit
  22.  
  23. ThisWorkbook.Sheets("Compte-rendu intervention corre").Copy After:=wkB.Sheets(1)
  24. wkB.Sheets(2).Name = Format(Now, "dd.m.yy_hh\Hn") & "min" & Format(Now, "ss") & "_" & ThisWorkbook.Sheets("Compte-rendu intervention corre").Range("b4")
  25.  
  26. '// Ôter la protection de toutes les feuilles
  27.  
  28. For Each MaFeuille In Worksheets
  29. MaFeuille.Unprotect Password:="1234"
  30. Next
  31.  
  32. '// Copier la fonction maintenant() et la coller sous forme de texte
  33.  
  34. wkB.Sheets(2).Range("O4").Value = Now
  35.  
  36. '// Supprimer les colonnes contenants les instructions
  37.  
  38. wkB.Sheets(2).Range("X2").ClearContents
  39. wkB.Sheets(2).Shapes("Button 1").Delete
  40. wkB.Sheets(2).Shapes("Button 2").Delete
  41.  
  42. '// Créer un lien de l'index vers l'archive
  43.  
  44. x(2, 1).Hyperlinks.Add Anchor:=x(2, 1), Address:="", SubAddress:=wkB.Worksheets(2).Name & "!B2", TextToDisplay:=wkB.Worksheets(2).Name
  45. x(2, 1).HorizontalAlignment = xlCenter
  46. x(2, 1).VerticalAlignment = xlCenter
  47. x(2, 1).Font.Size = 16
  48.  
  49. '// Sauvegarder le classeur archive
  50.  
  51. wkB.Save
  52.  
  53. '// Fermer le classeur archive
  54.  
  55. wkB.Close
  56.  
  57. '// Ouvrir la fenetre compte rendu bien archivé
  58.  
  59. Load UserForm1
  60. UserForm1.Show
  61.  
  62. End Sub
Posez votre question