Renommer une feuille à partir d'une cellule d'une autre feuille
Bonjour,
Je débute avec les macros et c'est plus compliqué que je ne pensais ;)
Je pense que j'aurai d'autres questions par la suite mais voici celle du moment.
J'ai copié la feuille qui s'appelle Rapport et j'ai donc maintenant une feuille qui s'appelle Rapport (2) que je souhaite maintenant la renommer à partir d'une cellule A1 qui se trouve sur une autre feuille, nommée Noms fichiers.
Voici ce que j'ai écrit :
Sheets("Rapport").Select
Sheets("Rapport").Copy Before:=Sheets(1)
Sheets("Rapport (2)").Select
Sheets("Rapport (2)").Name = Sheets("Noms fichiers").Range("A1").ValueExcel me dit:
Qu'est-ce que je fais de faux?
Merci d'avance pour votre aide!
Bonjour,
L'erreur que vous rencontrez semble suggérer que la valeur dans la cellule "A1" sur la feuille "Noms fichiers" ne respecte pas les critères de nommage des feuilles Excel. Assurez-vous que la valeur dans la cellule "A1" respecte ces critères.
Je suggère d'ajouter quelques contrôles pour vérifier que la cellule A1 contient bien une valeur valide :
Sub RenameSheet()
Dim newName As String
newName = Sheets("Noms fichiers").Range("A1").Value
If newName = "" Then
MsgBox "Le champ du nom est vide"
Exit Sub
ElseIf Len(newName) > 31 Then
MsgBox "Le nom dépasse 31 caractères"
Exit Sub
ElseIf newName Like "*[\/?*[ou]*" Then
MsgBox "Le nom contient des caractères non autorisés"
Exit Sub
End If
Sheets("Rapport").Copy Before:=Sheets(1)
ActiveSheet.Name = newName
End SubBonjour,
Merci pour votre réponse.
Alors ma cellule A1 est en effet particulière. Elle contient cette une date et une heure en mode aaaammjjhhmm.
Pour être précise, la cellule A1 contient la formule suivante: ='Réponses au formulaire 1'!A2 mais avec le format cité précédemment.
Car mon but est de nommer ma feuille selon la date et l'heure de remplissage d'un formulaire Forms dont j'importe les réponse sur la feuille "Réponse au formulaire".
ce que je ne comprends pas c'est que si je copie-colle la cellule A1 manuellement pour renommer ma feuille cela marche.
Je viens d'essayer de copier et coller-special-valeur avant de tenter de renommer la fiche avec cette cellule. Mais cela ne marche pas non plus. Maintenant la cellule A1 affiche toujours 202307061453 mais dans la zone de formule en haut cela affiche 06.07.2023 14:53:53 si je clique dessus. Et je suppose que c'est ce format qui ne convient pas.
Mais comment faire pour que cette date qui provient de l'horodateur du formulaire Forms puisse être utilisée pour nommer une feuille en mode aaaammjjhhmm?
Je ne sais pas si je suis claire :)
Merci d'avance!
A tester :
Sub RenameSheet()
Dim newName As String
newName = Format(Sheets("Noms fichiers").Range("A1").Value, "yyyymmddhhmm")
If newName = "" Then
MsgBox "Le champ du nom est vide"
Exit Sub
ElseIf Len(newName) > 31 Then
MsgBox "Le nom dépasse 31 caractères"
Exit Sub
ElseIf newName Like "*[\/?*[ou]*" Then
MsgBox "Le nom contient des caractères non autorisés"
Exit Sub
End If
Sheets("Rapport").Copy Before:=Sheets(1)
ActiveSheet.Name = newName
End SubWhaou, vous êtes génial! Ca fonctionne :)
Je ne suis pas sûre d'avoir tout bien compris mais l'essentiel c'est que vous m'avez sauvé mon après-midi car je me cassais vraiment la tête avec cette histoire.
Un très grand merci!
Je peux continuer à poser ma question suivante ici ou je refais un poste?
Voici la question: Je récupère des réponses à un formulaire Forms via Sheets et j'ai donc chaque série de réponse des participantes sur une ligne et à la ligne suivante les réponses de la personnes suivante, etc. Le nombre de réponses et donc de ligne va dépendre des jours. Ensuite j'ai une feuille appelée "Rapport" qui génère un rapport sur la base des réponses se trouvant sur la ligne 2 de la feuille "Réponse au formulaire" grâce à des formules. Je copie ensuite cette feuille "Rapport" et la renomme (grâce à votre aide). Finalement je copie les lignes en dessous de la première ligne de réponse (pour laquelle je viens donc de générer le rapport) et je viens les coller sur la ligne 2 afin de générer le rapport suivant et de recommencer. (je ne sais pas si c'était la meilleure approche mais il me semble que ça marche)
Ce qui serait génial serait de pouvoir faire cela en boucle jusqu'à ce qu'il n'y ait plus rien sur la ligne 2 et donc que tous les rapports aient été générés. Comment puis-je faire cela? (La question suivante, qui devrait être la dernière, est de savoir comment enregistrer ensuite tous mes rapports en PDF en leur donnant le nom de chaque feuille comme nom de fichier).
Ma macro est actuellement grâce à vous la suivante:
Sub test1107231448()
'
' test1107231448 Macro
'
Dim newName As String
newName = Format(Sheets("Noms fichiers").Range("A1").Value, "yyyymmddhhmm")
If newName = "" Then
MsgBox "Le champ du nom est vide"
Exit Sub
ElseIf Len(newName) > 31 Then
MsgBox "Le nom dépasse 31 caractères"
Exit Sub
ElseIf newName Like "*[\/?*[ou]*" Then
MsgBox "Le nom contient des caractères non autorisés"
Exit Sub
End If
Sheets("Rapport").Copy Before:=Sheets(1)
ActiveSheet.Name = newName
Columns("A:D").Select
Range("A12").Activate
Application.CutCopyMode = False
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Sheets("Réponses au formulaire 1").Select
Range("A3").Select
Range(Selection, Selection.End(xlDown)).Select
Range(Selection, Selection.End(xlToRight)).Select
Application.CutCopyMode = False
Selection.Copy
Range("A2").Select
ActiveSheet.Paste
Range("A2").Select
Selection.End(xlDown).Select
Selection.EntireRow.Delete
End SubJ'espère ne pas abuser de votre gentillesse et vous remercie pour l'aide déjà fournie!
Belle soirée!
C'est bon, désolée je crois que j'ai réussi.
Qu'en pensez vous de cette solution?
Sub test1107231448()
'
' test1107231448 Macro
'
Do
Dim newName As String
newName = Format(Sheets("Noms fichiers").Range("A1").Value, "yyyymmddhhmm")
If newName = "" Then
MsgBox "Le champ du nom est vide"
Exit Sub
ElseIf Len(newName) > 31 Then
MsgBox "Le nom dépasse 31 caractères"
Exit Sub
ElseIf newName Like "*[\/?*[ou]*" Then
MsgBox "Le nom contient des caractères non autorisés"
Exit Sub
End If
Sheets("Rapport").Copy Before:=Sheets(1)
ActiveSheet.Name = newName
Columns("A:D").Select
Range("A12").Activate
Application.CutCopyMode = False
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Sheets("Réponses au formulaire 1").Select
Range("A3").Select
Range(Selection, Selection.End(xlDown)).Select
Range(Selection, Selection.End(xlToRight)).Select
Application.CutCopyMode = False
Selection.Copy
Range("A2").Select
ActiveSheet.Paste
Range("A2").Select
Selection.End(xlDown).Select
Selection.EntireRow.Delete
Sheets("Réponses au formulaire 1").Select
Range("A2").Select
Loop Until IsEmpty(ActiveCell)
End SubEncore merci!
Il reste la question concernant la sauvegarde par contre ;)
Comment enregistrer ensuite tous mes rapports en PDF en leur donnant le nom de chaque feuille comme nom de fichier?
Si vous avez une idée à me suggérer.
Belle soirée
Bonjour Matra,
Pour enregistrer chaque feuille au format PDF, vous pouvez utiliser la méthode ExportAsFixedFormat. Voici comment vous pouvez modifier votre macro pour inclure cette étape :
Sub test1107231448()
'
' test1107231448 Macro
'
Do
Dim newName As String
newName = Format(Sheets("Noms fichiers").Range("A1").Value, "yyyymmddhhmm")
If newName = "" Then
MsgBox "Le champ du nom est vide"
Exit Sub
ElseIf Len(newName) > 31 Then
MsgBox "Le nom dépasse 31 caractères"
Exit Sub
ElseIf newName Like "*[\/?*[ou]*" Then
MsgBox "Le nom contient des caractères non autorisés"
Exit Sub
End If
Sheets("Rapport").Copy Before:=Sheets(1)
ActiveSheet.Name = newName
Columns("A:D").Select
Range("A12").Activate
Application.CutCopyMode = False
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Sheets("Réponses au formulaire 1").Select
Range("A3").Select
Range(Selection, Selection.End(xlDown)).Select
Range(Selection, Selection.End(xlToRight)).Select
Application.CutCopyMode = False
Selection.Copy
Range("A2").Select
ActiveSheet.Paste
Range("A2").Select
Selection.End(xlDown).Select
Selection.EntireRow.Delete
' Sauvegarder la feuille en tant que PDF
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
"C:\chemin\vers\vos\pdfs\" & newName & ".pdf", Quality:=xlQualityStandard, _
IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False
Sheets("Réponses au formulaire 1").Select
Range("A2").Select
Loop Until IsEmpty(ActiveCell)
End SubN'oubliez pas de remplacer "C:\chemin\vers\vos\pdfs\" par le chemin réel où vous voulez sauvegarder vos fichiers PDF.
Cette nouvelle ligne de code sauvegardera la feuille active (qui est la feuille que vous venez de créer et de renommer) au format PDF. Le nom du fichier PDF sera le même que le nom de la feuille. J'espère que cela vous aidera.
Bonjour,
Un énorme merci pour votre aide. Je n'ai pas encore eu le temps de tester. Je vais le faire la semaine prochaine et revenir vers vous si je vois un problème.
Beau weekend!
Bonjour,
Voilà, j'ai fait quelques modifications dans ma macro de base et déplacé le moment où la sauvegarde se fait car on était plus sur la bonne feuille. Tout marche!
Mais cela sauve dans le dossier "Rapports identification des dangers" au lieu de "2023". Avez-vous une idée pourquoi?
Sub test1107231448()
'
' test1107231448 Macro
'
Do
Dim newName As String
newName = Format(Sheets("Noms fichiers").Range("A1").Value, "yyyymmddhhmm")
If newName = "" Then
MsgBox "Le champ du nom est vide"
Exit Sub
ElseIf Len(newName) > 31 Then
MsgBox "Le nom dépasse 31 caractères"
Exit Sub
ElseIf newName Like "*[\/?*[ou]*" Then
MsgBox "Le nom contient des caractères non autorisés"
Exit Sub
End If
Sheets("Rapport").Copy Before:=Sheets(1)
ActiveSheet.Name = newName
Columns("A:D").Select
Range("A12").Activate
Application.CutCopyMode = False
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
' Sauvegarder la feuille en tant que PDF
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
"C:\Users\Aline\CloudStation\Activite_independante\Matra\Rapports identification des dangers\2023" & newName & ".pdf", Quality:=xlQualityStandard, _
IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False
Sheets("Réponses au formulaire 1").Select
Range("A3").Select
Range("A3:BI3").Select
Range(Selection, Selection.End(xlDown)).Select
Application.CutCopyMode = False
Selection.Copy
Range("A2").Select
ActiveSheet.Paste
Range("A2").Select
Selection.End(xlDown).Select
Selection.EntireRow.Delete
Sheets("Réponses au formulaire 1").Select
Range("A2").Select
Loop Until IsEmpty(ActiveCell)
End SubMerci encore pour tout et belle semaine!
Bonjour Matra,
Je pense que le chemin que vous avez fourni dans le code ne pointe pas vers le bon dossier.
La ligne de code qui sauvegarde le fichier est la suivante
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
"C:\chemin\vers\vos\pdfs\" & newName & ".pdf", Quality:=xlQualityStandard, _
IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=FalseDans cette ligne, "C:\chemin\vers\vos\pdfs\" est le chemin vers le dossier dans lequel vous souhaitez sauvegarder vos fichiers. Vous devrez remplacer ce chemin par le chemin vers le dossier "2023" où vous souhaitez réellement sauvegarder vos fichiers.
Supposons que le dossier "2023" est un sous-dossier du dossier "Documents" dans votre dossier utilisateur. Dans ce cas, vous voudriez changer le chemin pour qu'il ressemble à quelque chose comme ceci
"C:\Users\VotreNomUtilisateur\Documents\2023\" & newName & ".pdf"Remplacez "VotreNomUtilisateur" par votre véritable nom d'utilisateur sur votre ordinateur. Le chemin exact dépendra de votre configuration spécifique. Si vous ne savez pas quel est le chemin exact, vous pouvez généralement le trouver en naviguant jusqu'au dossier "2023" dans l'explorateur de fichiers, puis en copiant le chemin à partir de la barre d'adresse. J'espère que cela vous aidera !