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 Sub

Et 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 Sub

PS :

  • 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 =VersionDoc et 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 Sub

Je 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 Sub

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

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 Sub

Attention, 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 Sub

Attention, 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 Sub

Le 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 ... ?

Rechercher des sujets similaires à "nom fichier automatique"