Microsoft 365 Enregistrer copie d'un fichier avec pour nom le contenu d'une cellule excel (macro)

Alstroemeria

XLDnaute Nouveau
Bonjour,
j'ai dans la cellule H3 un mot
j'aimerais lorsque j'appuie sur un bouton déclenchant une macro, que mon fichier excel enregistre une copie de ce fichier avec pour nom le contenu de cette cellule H3.

Cependant Excel identifie le contenu de cette cellule comme étant vide

Ma macro :
Dim nomFichier As String
nomFichier = Trim(Range("H3").Value)
If nomFichier = "" Then
nomFichier = "DefaultName"
End If
ActiveWorkbook.SaveCopyAs Filename:="L:\Cooperation\Travaux Sur Programmes\2024\Requetes G07\" & nomFichier & ".xlsm"

lorsque je fais ça, mon fichier est crée et nommé DefaultName bien que la cellule H3 possède du texte. Ce code prouve qu'excel voit cette cellule comme vide mais dans l'idéal j'aimerais un code plus simple qui ne prenne même pas en compte la possibilité que H3 soit vide. Du genre :

Dim nomFichier As String
nomFichier = Range("H3").Value
ActiveWorkbook.SaveCopyAs Filename:="L:\Cooperation\Travaux Sur Programmes\2024\Requetes G07\" & nomFichier & ".xlsm"

Mais avec ce code, excel me crée la copie avec comme nom ".Xlsm"

et si je fais le code suivant d'une seule ligne :
ActiveWorkbook.SaveCopyAs Filename:="L:\Cooperation\Travaux Sur Programmes\2024\Requetes G07\nomFichier.xlsm"

excel crée la copie avec comme nom ''nomFichier" mais ce n'est pas ce que je veux.

Je ne vois pas quoi faire

Infos supp :
initialement dans ma cellule, j'avais une formule qui me renvoyait du texte mais je me suis dit que le problème venait peut être de la formule donc j'ai écris du texte directement dedans. un seul mot sans caractère spécial ni espace (exemple : Oui) mais ça marche pas quand même
 

piga25

XLDnaute Barbatruc
Bonjour,
Peut-être comme cela:
VB:
Sub Sauvegarder()
    Dim nomFichier As String
    Dim formatFichier As String

    ' Vérifier si la cellule H3 contient une valeur
    If IsEmpty(Range("H3")) Then
        MsgBox "La cellule H3 est vide. Veuillez saisir un nom de fichier.", vbExclamation
        Exit Sub
    End If

    ' Définir le format de fichier (ajuster selon vos besoins)
    formatFichier = ".xlsm" ' Ou ".xlsx", ".csv", etc.

    ' Construire le nom de fichier complet
    nomFichier = "L:\Cooperation\Travaux Sur Programmes\2024\Requetes G07\" & Range("H3").Value & formatFichier

    ' Enregistrer le classeur
    On Error Resume Next ' Gérer les erreurs d'enregistrement
    ActiveWorkbook.SaveCopyAs Filename:=nomFichier
    On Error GoTo 0

    If Err.Number <> 0 Then
        MsgBox "Une erreur s'est produite lors de l'enregistrement : " & Err.Description, vbCritical
    Else
        MsgBox "Le classeur a été enregistré avec succès.", vbInformation
    End If
End Sub
 

Alstroemeria

XLDnaute Nouveau
j'ai réussi à faire ce que je voulais en créant une nouvelle macro sinon !

en fait je mettais ce code à la suite d'un autre, mais quand je les sépare en 2 macros distinctes ça fonctionne. Je vois pas pourquoi ils interfèrent entre eux mais bon au moins ça marche maintenant
 

TooFatBoy

XLDnaute Barbatruc
je devrais mettre quoi comme titre ? je trouvais que c'était en lien o_O
Visiblement non : dans ton message #1 il n'est nul part question d'une cellule nommée.



en fait je mettais ce code à la suite d'un autre, mais quand je les sépare en 2 macros distinctes ça fonctionne.
Déjà qu'on n'avait pas de fichier à étudier, si en plus le code que tu nous donnes ne correspond pas au vrai code, je ne vois pas bien ce qu'on peut faire.


Je vois pas pourquoi ils interfèrent entre eux mais bon au moins ça marche maintenant
Sans classeur il n'y a quasiment aucune chance qu'on puisse te dire où est ton erreur.
 

Alstroemeria

XLDnaute Nouveau
Visiblement non : dans ton message #1 il n'est nul part question d'une cellule nommée.
message #1 c'est le message où je décris le problème ? je me demande si on parle de la même chose, car je parle de la cellule nommée directement après ''Bonjour''. C'est le premier truc que je dis :( et j'en reparle à la fin

Déjà qu'on n'avait pas de fichier à étudier, si en plus le code que tu nous donnes ne correspond pas au vrai code, je ne vois pas bien ce qu'on peut faire.
Je ne peux pas partager ce fichier
le code que j'avais mis avant celui de copie est le suivant :

Sub FORMAT()
'
' FORMAT Macro
'
Sheets("Base").Range("A2:AL100000").ClearContents
Sheets("Suivi des ordres internes").Select
Range("A43:AL43").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.copy
Sheets("Base").Select
Range("A2").Select
ActiveSheet.Paste
Range("A2").End(xlDown).Offset(1, 0).Select
Sheets("Suivi des projets").Select
Range("A45:AL45").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.copy
Sheets("Base").Select
ActiveSheet.Paste
Range("AM2").Select
Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select
Selection.FillDown
Sheets("TCD Pilotes").Select
ActiveWorkbook.RefreshAll
ActiveWorkbook.Save
End Sub

j'utilise pas les cellules concernées dans le code de copie dans celui-ci, donc je vois pas vraiment d'où vient l'interférence 🤔
 

TooFatBoy

XLDnaute Barbatruc
message #1 c'est le message où je décris le problème ?
Oui, c'est bien ça.

je me demande si on parle de la même chose, car je parle de la cellule nommée directement après ''Bonjour''. C'est le premier truc que je dis :( et j'en reparle à la fin
On peut donner un Nom à une plage de cellules et cette plage peut bien sûr être constituée d'une seule cellule.

Tu peux par exemple appeler la cellule H3 "Prénom" et ensuite utiliser son Nom dans les formules qui deviennent plus faciles à comprendre.
Ainsi, la cellule nommée "Prénom" est à l'adresse H3.

Ce que je veux donc dire par rapport au titre, c'est que tu n'enregistres pas ton fichier avec le nom d'une cellule, mais avec le mot qu'elle contient. 😉



Quant à ta macro :
- tu devrais utiliser la balise code dans ton message pour qu'elle soit plus lisible,
- tu devrais éviter les Select qui sont inutiles et ralentissent la macro.

Et la cellule H3 que tu utilises dans l'autre macro se trouve dans quelle feuille ?
 
Dernière édition:

Alstroemeria

XLDnaute Nouveau
Ce que je veux donc dire par rapport au titre, c'est que tu n'enregistres pas ton fichier avec le nom d'une cellule, mais avec le mot qu'elle contient.
ah d'accord, j'ai modifié

- tu devrais éviter les Select qui sont inutiles et ralentissent la macro.

ok je ferai un test prochainement, je savais pas !

Et la cellule H3 que tu utilises dans l'autre macro se trouve dans quelle feuille ?
elle se trouve dans la feuille Suivi des ordres internes
c'est également dans cette feuille que j'ai mis mon bouton pour déclencher l'autre macro

c'est un peu embêtant d'avoir 2 boutons (1 pour chaque macro), j'aimerais bien changer ça

merci pour tes retours
 

TooFatBoy

XLDnaute Barbatruc
Pour résumer :
- ta cellule H3 est sur la feuille "Suivi des ordres internes",
- tes deux macros s'enchaînent,
- la dernière feuille sélectionnée dans la première macro est la feuille "TCD Pilotes".

Donc, tu n'es pas dans la bonne feuille quand ta deuxième macro s'exécute.
Pour corriger ça, tu peux spécifier quelle feuille utiliser dans ta deuxième macro.
 

Alstroemeria

XLDnaute Nouveau
Pour résumer :
- ta cellule H3 est sur la feuille "Suivi des ordres internes",
- tes deux macros s'enchaînent,
- la dernière feuille sélectionnée dans la première macro est la feuille "TCD Pilotes".

Donc, tu n'es pas dans la bonne feuille quand ta deuxième macro s'exécute.
Pour corriger ça, tu peux spécifier quelle feuille utiliser dans ta deuxième macro.
oui c'est ça
oui je peux toujours mettre la ligne de code m'affichant la feuille TCD Pilote dans la 2ème macro plutôt que la première
mais autrement, tu ne vois pas la raison pour laquelle je ne peux pas faire les 2 macro en 1 seule ? ou sinon, un moyen pour lancer la 2eme macro automatiquement dès que la 1ere se termine ? 🤔
 

TooFatBoy

XLDnaute Barbatruc
Autre remarque : il n'est pas conseillé d'appeller une macro du même nom qu'une instruction VBA. ;)

Tes deux macros avec la balise code :
VB:
Sub FORMAT()
' FORMAT Macro

    Sheets("Base").Range("A2:AL100000").ClearContents

    Sheets("Suivi des ordres internes").Select
    Range("A43:AL43").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.copy

    Sheets("Base").Select
    Range("A2").Select
    ActiveSheet.Paste
    Range("A2").End(xlDown).Offset(1, 0).Select

    Sheets("Suivi des projets").Select
    Range("A45:AL45").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.copy

    Sheets("Base").Select
    ActiveSheet.Paste
    Range("AM2").Select
    Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select
    Selection.FillDown

    Sheets("TCD Pilotes").Select
    ActiveWorkbook.RefreshAll
    ActiveWorkbook.Save

End Sub

VB:
Sub TaMacro()
'
Dim nomFichier As String

    nomFichier = Trim(Range("H3").Value)
    If nomFichier = "" Then
        nomFichier = "DefaultName"
    End If
    ActiveWorkbook.SaveCopyAs Filename:="L:\Cooperation\Travaux Sur Programmes\2024\Requetes G07\" & nomFichier & ".xlsm"

End Sub
 

TooFatBoy

XLDnaute Barbatruc
mais autrement, tu ne vois pas la raison pour laquelle je ne peux pas faire les 2 macro en 1 seule ? ou sinon, un moyen pour lancer la 2eme macro automatiquement dès que la 1ere se termine ? 🤔
Tu peux faire une macro qui appelle tes deux macros l'une après l'autre.


oui je peux toujours mettre la ligne de code m'affichant la feuille TCD Pilote dans la 2ème macro plutôt que la première
Ca ne changera rien.
Mais tu peux, comme je le disais plus haut, spécifier quelle feuille utiliser dans ta deuxième macro.
 

Discussions similaires

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
314 450
Messages
2 109 731
Membres
110 553
dernier inscrit
loic55