Nom du fichier automatique
Bonjour à tous.
Je travaille sur un fichier Excel qui est modifié régulièrement et qui doit être renommé à chaque fois.
Nous renommons le fichier en fonction des dernière changement effectué sur ce fichier.
Chaque action est énuméré dans un onglet "Changlog" et nous renseignons la dernière version.
Je veux donc automatiser cela afin d'éviter les erreur humaine.
Voici mon code qui est en erreur :
Sub Workbook_Activate()
'sélection de la dernière cellule non vide de la colonne B
Dim VersionDoc As Single
VersionDoc = Sheets(Feuil2).Range("B" & Rows.Count).End(xlUp).Copy
SaveFileName = "Nom_de_mon_fichier" & "_" & Format(Date, "dd-mm-yyyy") & "_" & Format(Time, "hh-mm") & "_" & "=VersionDoc" & ".xlsm"
ActiveWorkbook.SaveAs Filename:=SaveFileName
End SubEt J'ai une erreur sur ma variable "VersionDoc" :
Erreur d’exécution '13':
Incompatibilité de type
Merci d'avance pour vos réponses.
Bonjour,
C'est le .Copy à la fin de cette instruction qui n'a rien à faire ici.
Une contribution :
Sub Workbook_Activate()
Dim VersionDoc As Integer, SaveFileName As String
'sélection de la dernière cellule non vide de la colonne B
VersionDoc = Sheets("Feuil2").Range("B" & Rows.Count).End(xlUp) 'Nombre entier désignant la version
SaveFileName = "Nom_de_mon_fichier_" & Format(Now, "dd-mm-yyyy-hh-mm") & "_" & VersionDoc & ".xlsm"
ActiveWorkbook.SaveAs Filename:=SaveFileName
End SubPS :
- Je verrais plutôt ce code dans un événement "BeforeClose" pour enregistrer avant la fermeture du fichier.
- Pour valoriser le contenu d'une variable VBA, les guillemets sont à proscrire car ils délimitent justement du texte qu'il n'y a pas lieu d'interpréter (donc si on écrit "=VersionDoc", VBA écrit
=VersionDocet pas le contenu de cette variable).
Salut Pedro,
Merci de ton retour.
J'ai testé, toujours la même erreur sur la même ligne malgrès ton nouveau code :
Private Sub Workbook_Activate()
'sélection de la dernière cellule non vide de la colonne B
Dim VersionDoc As Integer, SaveFilName As String
VersionDoc = Sheets(Feuil2).Range("B" & Rows.Count).End(xlUp)
SaveFileName = "Nom_de_mon_fichier_" & "_" & Format(Date, "dd-mm-yyyy-hh-mm") & "_" & VersionDoc & ".xlsm"
ActiveWorkbook.SaveAs Filename:=SaveFileName
End SubJe tiens à ajouter que mon Nombre dans "VersionDoc" est un nombre à virgule exemple 1.02.
Merci pour le rappel de la variable je n'était pas encor arrivé jusque ce test là xD
Un "BeforeClose" why not, mais tu le met où ça... ?
Je tiens à ajouter que mon Nombre dans "VersionDoc" est un nombre à virgule exemple 1.02.
Dans ce cas, remplace le type "Integer" par le type "Single" dans la déclaration de cette variable. Si c'est bien un séparateur décimal ".", VBA ne reconnaîtra pas cette variable comme numérique, tu peux donc utiliser un type "String" dans ce cas.
Un "BeforeClose" why not, mais tu le met où ça... ?
Ton code est normalement placé dans le module ThisWorkbook, et lié à l’événement Activate, comme indiqué par le nom de ta macro. Actuellement, le code se déclenche donc dès que le classeur devient actif, ce qui peut arriver plusieurs fois lors d'une session Excel.
Je te conseille plutôt de modifier l’événement qui déclenche la macro, en utilisant le menu déroulant en haut à droite de l'éditeur VBA, à côté du nom actuel de ta macro.
PS : tu as fait un mix de ton instruction d'origine et de celle que je t'ai proposé. Je te conseille d'essayer celle proposée sans aucune modification.
SaveFileName = "Nom_de_mon_fichier_" & Format(Now, "dd-mm-yyyy-hh-mm") & "_" & VersionDoc & ".xlsm"J'ai toujours mon erreur "13" sur ma variable "VersionDoc".
Honnêtement je ne comprend pas...
Dans ce cas, remplace le type "Integer" par le type "Single" dans la déclaration de cette variable. Si c'est bien un séparateur décimal ".", VBA ne reconnaîtra pas cette variable comme numérique, tu peux donc utiliser un type "String" dans ce cas.
Yes j'en avais déduit la même chose merci.
Ton code est normalement placé dans le module ThisWorkbook, et lié à l’événement
Activate, comme indiqué par le nom de ta macro. Actuellement, le code se déclenche donc dès que le classeur devient actif, ce qui peut arriver plusieurs fois lors d'une session Excel.Je te conseille plutôt de modifier l’événement qui déclenche la macro, en utilisant le menu déroulant en haut à droite de l'éditeur VBA, à côté du nom actuel de ta macro.
Merci de tes indication claire j'ai trouvé facillement.
PS : tu as fait un mix de ton instruction d'origine et de celle que je t'ai proposé. Je te conseille d'essayer celle proposée sans aucune modification.
SaveFileName = "Nom_de_mon_fichier_" & Format(Now, "dd-mm-yyyy-hh-mm") & "_" & VersionDoc & ".xlsm"
C'est rectifié, je n'avais pas fait attention à cela... merci.
Merci pour tes réponse en tout cas
Il y avait une erreur d'inattention de ma part, voilà la version intégrant toutes les modifications préconisées :
Private Sub Workbook_BeforeClose(Cancel As Boolean)
'Déclaration des variables
Dim VersionDoc As String, SaveFileName As String
On Error GoTo GestionErr
VersionDoc = Sheets("Feuil2").Range("B" & Rows.Count).End(xlUp) 'Dernière cellule non vide en colonne B de l'onglet "Feuil2"
SaveFilename="Nom_de_mon_fichier_" & Format(Now, "dd-mm-yyyy-hh-mm") & "_" & VersionDoc & ".xlsm"
ActiveWorkbook.SaveAs Filename:=SaveFileName, FileFormat:= 52 'Enregistrement sous le nouveau nom
Exit Sub
GestionErr:
MsgBox "L'enregistrement sous le nom : " & SaveFileName & " a échoué !"
Cancel = True 'Annule la fermeture du classeur
End SubIl y avait une erreur d'inattention de ma part, voilà la version intégrant toutes les modifications préconisées :
Private Sub Workbook_BeforeClose(Cancel As Boolean) 'Déclaration des variables Dim VersionDoc As String, SaveFileName As String On Error GoTo GestionErr VersionDoc = Sheets("Feuil2").Range("B" & Rows.Count).End(xlUp) 'Dernière cellule non vide en colonne B de l'onglet "Feuil2" SaveFilename="Nom_de_mon_fichier_" & Format(Now, "dd-mm-yyyy-hh-mm") & "_" & VersionDoc & ".xlsm" ActiveWorkbook.SaveAs Filename:=SaveFileName, FileFormat = 52 'Enregistrement sous le nouveau nom Exit Sub GestionErr: MsgBox "L'enregistrement sous le nom : " & SaveFileName & " a échoué !" Cancel = True 'Annule la fermeture du classeur End Sub
Merci Pedro, tu as modifié tout mon code xD
En revanche ton message box me génère le message d'erreur mais ne cite pas le nom du fichier.
Il remonte juste :
L'enregistrement sous le nom : a échoué !
En revanche ton message box me génère le message d'erreur mais ne cite pas le nom du fichier.
Il remonte juste :
L'enregistrement sous le nom : a échoué !
C'est que la variable VersionDoc est vide. L'explication la plus plausible est qu'aucun de tes onglets ne s'appelle "Feuil2" et par conséquent que la plage à laquelle on se réfère n'existe pas. Il faut donc adapter le nom de l'onglet dans le code, ou le remplacer par sa position dans le classeur (par exemple, Sheets(2))
En revanche ton message box me génère le message d'erreur mais ne cite pas le nom du fichier.
Il remonte juste :
L'enregistrement sous le nom : a échoué !
C'est que la variable VersionDoc est vide. L'explication la plus plausible est qu'aucun de tes onglets ne s'appelle "Feuil2" et par conséquent que la plage à laquelle on se réfère n'existe pas. Il faut donc adapter le nom de l'onglet dans le code, ou le remplacer par sa position dans le classeur (par exemple,
Sheets(2))
Niquel cela fonctionne
Merci beucoup.
En revanche peut on ajouter cela quand l'utilisateur fait, "Save" ou "Save as" ?
En revanche peut on ajouter cela quand l'utilisateur fait, "Save" ou "Save as" ?
Rajouter "ça" quoi ? Je n'ai pas compris ce que tu souhaites.
Oui désolé mal écrit... rajouter le fait que quand l’utilisateur fasse "Enregistrer" ou bien "Enregistrer sous", que le nom du document soit par défaut celui définis par la macro ?
Tu peux ajouter le code suivant :
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
'Déclaration des variables
Dim VersionDoc As String, SaveFileName As String
On Error GoTo GestionErr
SaveAsUI = False 'N'affiche pas la boite de dialogue "enregistrer sous"
VersionDoc = Sheets("Feuil2").Range("B" & Rows.Count).End(xlUp) 'Dernière cellule non vide en colonne B de l'onglet "Feuil2"
SaveFileName = "Nom_de_mon_fichier_" & Format(Now, "dd-mm-yyyy-hh-mm") & "_" & VersionDoc & ".xlsm"
ActiveWorkbook.SaveAs Filename:=SaveFileName, FileFormat:=52 'Enregistrement sous le nouveau nom
Exit Sub
GestionErr:
MsgBox "L'enregistrement sous le nom : " & SaveFileName & " a échoué !"
Cancel = True 'Annule l'enregistrement du classeur
End SubAttention, ce code n'affiche plus la boite de dialogue "Enregistrer sous" (mais on peut adapter le code pour demander confirmation à l'utilisateur avant). Le nom du classeur enregistré est donc imposé, et le chemin (répertoire) est le même que le fichier contenant ce code.
Tu peux ajouter le code suivant :
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) 'Déclaration des variables Dim VersionDoc As String, SaveFileName As String On Error GoTo GestionErr SaveAsUI = False 'N'affiche pas la boite de dialogue "enregistrer sous" VersionDoc = Sheets("Feuil2").Range("B" & Rows.Count).End(xlUp) 'Dernière cellule non vide en colonne B de l'onglet "Feuil2" SaveFileName = "Nom_de_mon_fichier_" & Format(Now, "dd-mm-yyyy-hh-mm") & "_" & VersionDoc & ".xlsm" ActiveWorkbook.SaveAs Filename:=SaveFileName, FileFormat:=52 'Enregistrement sous le nouveau nom Exit Sub GestionErr: MsgBox "L'enregistrement sous le nom : " & SaveFileName & " a échoué !" Cancel = True 'Annule l'enregistrement du classeur End SubAttention, ce code n'affiche plus la boite de dialogue "Enregistrer sous" (mais on peut adapter le code pour demander confirmation à l'utilisateur avant). Le nom du classeur enregistré est donc imposé, et le chemin (répertoire) est le même que le fichier contenant ce code.
Tu es au TOP !!
Merci, en revanche Excel plante lorsque je fais la disquette en haut à gauche du programme
Il plante, c'est à dire ? Un message d'erreur ?
Chez moi ça fonctionne, post ton fichier ici si tu souhaites qu'on le teste.
PS : si ton problème est résolu, pense à valider le sujet.
Il plante, c'est à dire ? Un message d'erreur ?
Chez moi ça fonctionne, post ton fichier ici si tu souhaites qu'on le teste.
Excel mouline et me met (Ne répond pas).
Il plante, c'est à dire ? Un message d'erreur ?
Chez moi ça fonctionne, post ton fichier ici si tu souhaites qu'on le teste.
Excel mouline et me met (Ne répond pas).
Chez moi ça fonctionne sans problèmes...
Le code :
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
'Déclaration des variables
Dim VersionDoc As String, SaveFilName As String
On Error GoTo GestionErr
SaveAsUI = False 'N'affiche pas la boite de dialogue "enregistrer sous"
VersionDoc = Sheets("Changlog").Range("B" & Rows.Count).End(xlUp) 'Dernière cellule non vide en colonne B de l'onglet "Changelog"
SaveFileName = "S2-PDGS-TAS-DI-NDD-V11.Annex_C.SAB1_OBS Cloud_Connectivity_Matrix_" & Format(Date, "dd-mm-yyyy") & "_" & VersionDoc
ActiveWorkbook.SaveAs Filename:=SaveFileName, FileFormat:=52 'Enregistrement sous le nouveau nom
Exit Sub
GestionErr:
MsgBox "L'enregistrement sous le nom : " & SaveFileName & " a échoué !"
Cancel = True 'Annule l'enregistrement du classeur
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
'Déclaration des variables
Dim VersionDoc As String, SaveFilName As String
On Error GoTo GestionErr
VersionDoc = Sheets("Changlog").Range("B" & Rows.Count).End(xlUp) 'Dernière cellule non vide en colonne B de l'onglet "Changelog"
SaveFileName = "S2-PDGS-TAS-DI-NDD-V11.Annex_C.SAB1_OBS Cloud_Connectivity_Matrix_" & Format(Date, "dd-mm-yyyy") & "_" & VersionDoc
ActiveWorkbook.SaveAs Filename:=SaveFileName, FileFormat:=52 'Enregistrement sous le nouveau nom
Exit Sub
GestionErr:
MsgBox "L'enregistrement sous le nom : " & SaveFileName & " a échoué !"
Cancel = True 'Annule la fermeture du classeur
End SubLe fichier :
Il plante, c'est à dire ? Un message d'erreur ?
Chez moi ça fonctionne, post ton fichier ici si tu souhaites qu'on le teste.
Excel mouline et me met (Ne répond pas).
Chez moi ça fonctionne sans problèmes...
Ah tu met les deux .... ok my bad...
Ceci étant (fait le test c'est peut être juste moi) mais quand je rajoute une ligne dans la feuille "Changlog" pour mettre la 2.4 par exemple et que je clique sur la disquette sa plante...
Je viens aussi d'avoir un crash d'Excel, je ne saurais l'expliquer.
Si d'autres ont une idée...
Je viens aussi d'avoir un crash d'Excel, je ne saurais l'expliquer.
Si d'autres ont une idée...
J'ai l'impression que comme on modifie la variable qu'il utilise pour sauvegarder il n'arrive pas à faire la part des choses, vue qu'il renomme le document sur lequel il travail...
Merci pour tout Pedro !! tu m'a énormément aidé !!
Je viens aussi d'avoir un crash d'Excel, je ne saurais l'expliquer.
Si d'autres ont une idée...
J'ai l'impression que comme on modifie la variable qu'il utilise pour sauvegarder il n'arrive pas à faire la part des choses, vue qu'il renomme le document sur lequel il travail...
Merci pour tout Pedro !! tu m'a énormément aidé !!
Petit UP si quelqu'un à une idée ... ?