Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2021 Sauvegarde onglet

nano33320

XLDnaute Junior
Bonjour,

Dans le cadre d'un outil en développement, je souhaite sauvegarder à la fermeture du classeur un onglet "Liste de Noms" en "*.xlsx" => sans macro
le code de la macro est :
VB:
Sub Sauv_ListeDeNoms()
    Dim chemin, DateSauv, Fichier1, Fichier2, index, nom As String

    aaaa = Year(Date)
    mm = Month(Date)
    mm = Format(mm, "00")
    jj = Day(Date)
    jj = Format(jj, "00")
    hh = Hour(time)
    hh = Format(hh, "00")
    m = Minute(time)
    m = Format(m, "00")
    index = "Liste de Noms"
    chemin = ThisWorkbook.Path
    Sheets("Liste de Noms").Copy  [COLOR=rgb(0, 0, 0)] 'export de l'onglet ("Liste de Noms") du fichier à sauvegarder[/COLOR]
    DateSauv = aaaa & "/" & mm & "/" & jj & "-" & hh & ":" & m
    Fichier1 = index & "_" & DateSauv & ".xlsx"
    Fichier2 = chemin & "\" & Fichier1
    Application.DisplayAlerts = False
    ActiveWorkbook.SaveAs Filename:=Fichier2, FileFormat:=xlOpenXMLWorkbook
    ActiveWorkbook.Close SaveChanges:=False
    Application.DisplayAlerts = True
    ActiveWindow.Close
End Sub

Ma macro plante sur la ligne : ActiveWorkbook.SaveAs Filename:=Fichier2, FileFormat:=xlOpenXMLWorkbook
avec le message

en debug

le classeur de sauvegarde est bien créé avec l'onglet ("Liste de Noms"),
le chemin existe,
Fichier2 donne bien le nom du fichier de sauvegarde avec le bon chemin...
MAIS ça plante...
Merci de votre aide
Nano
 

TooFatBoy

XLDnaute Barbatruc
Bonjour,

Essaye ça :
VB:
Sub Sauv_ListeDeNoms()
Dim aaaa$, mm$, jj$, hh$, m$
Dim index$, chemin$, DateSauv$, Fichier1$, Fichier2$

    aaaa = Year(Date)
    mm = Format(Month(Date), "00")
    jj = Format(Day(Date), "00")
    hh = Format(Hour(Time), "00")
    m = Format(Minute(Time), "00")
    index = "Liste de Noms"
    chemin = ThisWorkbook.Path

    Sheets("Liste de Noms").Copy  ' Export de l'onglet ("Liste de Noms") du fichier à sauvegarder

    DateSauv = aaaa & ChrW(8260) & mm & ChrW(8260) & jj & "_" & hh & "h" & m
    Fichier1 = index & "_" & DateSauv & ".xlsx"
    Fichier2 = chemin & "\" & Fichier1

    Application.DisplayAlerts = False
    ActiveWorkbook.SaveAs Filename:=Fichier2, FileFormat:=xlOpenXMLWorkbook
    ActiveWorkbook.Close SaveChanges:=False
    Application.DisplayAlerts = True
    ActiveWindow.Close

End Sub


Je pense que c'est parce que le "/" est un caractère interdit dans les noms de fichiers.
Toutafé ! De même que ":".
 
Dernière édition:

nano33320

XLDnaute Junior
Bonjour [COLOR=rgb(41, 105, 176)][B]TooFatBoy[/B][/COLOR] et Drenreb,

La version proposé par TooFatBoy fonctionne parfaitement,
j'ai pu l'intégrer facilement à mon projet
un grand MERCI

J'admire l'élégance du début de codage...
Mes compétences en programmation s'arrêtent bien avant.
Par curiosité et pour me perfectionner (ça ne me fera pas de mal...), où puis-je trouver des infos pour simplifier les déclarations avec "$" ?
Vous avez certainement raison pour les "/" et ":". Toutefois, j'ai simplement réutilisé une partie de code qui fonctionne, sur un autre classeur, avec le "/" ... ???
Encore une fois un Très Grand Merci
Cdlt
Nano
 

Staple1600

XLDnaute Barbatruc
Bonjour le fil

[Juste pour Infos ... et en soulevant la poussière ]
On pouvait rester sur XLD (ou plutôt se replonger dans celui d'antan )
Bonne lecture itou
[Juste pour Infos ... et en soulevant la poussière/]
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Ça pouvait quand même s'écrire de façon plus concise :
VB:
Sub SauvListeDeNoms()
   Sheets("Liste de Noms").Copy
   ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\Liste de Noms_" & _
      Format(Now, "yyyy" & ChrW$(8260) & "mm" & ChrW$(8260) & "dd-hh""h""mm"), _
      FileFormat:=xlOpenXMLWorkbook
   ActiveWorkbook.Close
   End Sub
 

patricktoulon

XLDnaute Barbatruc
Bonjour à tous
j'"ai testé le code de @TooFatBoy
reste un problème qui n'est pas géré
quand on l'execute il sauve bien le nouveau xlsx mais le fichier de la macro se ferme aussi
somme toute c'est peut être l'intention Ok sauf qu'il me reste une instance d'excel ouverte sans fichier
il faut donc fermer cette instance d'excel
sauf que si d'autre classeur son ouverts ca les fermerait aussi
il faut donc conditionner cette dernière fermeture

donc si vous permettez je compile le tout facon patosh en gérant ce détail somme toute important
VB:
Sub Sauv_ListeDeNoms()
    Dim WBK As Workbook, chemin$
    'bloque les alert et le rafraichissement d'ecran
    With Application: .DisplayAlerts = False: ScreenUpdating = False: End With
    
    'le chemin complet de destinnation
    chemin = ThisWorkbook.Path & "\Liste de Noms " & Replace(Format(Now, "yyyy / mm / dd_hh""h""mm"), "/", ChrW(8260))
    
    'copi l'onglet dans un nouveau classeur
    ThisWorkbook.Sheets("Liste de Noms").Copy
    
    'Enregistrement de ce nouveau classeur
    ActiveWorkbook.SaveAs Filename:=chemin, FileFormat:=xlOpenXMLWorkbook    'enregistre le nouveau classeur
    
    'fermeture de ce nouveau classeur
    ActiveWindow.Close
    
    'Ouf! Ouf! on laisse un peu Excel travailler
    DoEvents
    
    'maintenant reste le problème de l'instance d'excel sans fichier qui restait ouverte
    'quand on ferme le fichier de la macro
    'on va donc tester  combien il y a de classeurs ouverts
    'et selon le nombre 1 ou plus !!
    'on fermera juste le classeur sans enregistrer les modif
    'ou
    'on fermer"a l'"applic"ation excel directement
    
    'si tu veux fermer le classeur contenant la macro
    If Workbooks.Count > 1 Then    'si il y a d'autre classeur ouverts dans cet instance d'excel
        ActiveWindow.Close    'on le ferme sans enregistrer les modif
        Application.DisplayAlerts = True
    Else    'si il n'y a pas d'autre classeurs ouverts on ferme excel directement
        Application.Quit
    End If
End Sub
 

TooFatBoy

XLDnaute Barbatruc
Vous avez certainement raison pour les "/" et ":". Toutefois, j'ai simplement réutilisé une partie de code qui fonctionne, sur un autre classeur, avec le "/" ... ???
Ah oui, tu peux en être sûr et certain, Dranreb a raison, le problème vient bien des caractères spéciaux interdits.

Le "/" est réservé pour le changement de niveau dans l'arborescence du stockage (un dossier plus bas, ou un dossier plus haut).
De même pour le "\" en VBA dans Excel sur PC.

Le ":" est réservé pour séparer le nom de l'unité de stockage et le reste du chemin d'accès aux fichiers.

Normalement, les caractères jokers "?" et "*" sont également interdits.
Et il doit y en avoir d'autres, qui ne me viennent pas à l'esprit.


La version proposé par TooFatBoy fonctionne parfaitement
Ce n'est pas "ma" version. C'est tout simplement la tienne dans laquelle j'ai seulement remplacé les caractères interdits par des caractères (plus ou moins) autorisés.
 

TooFatBoy

XLDnaute Barbatruc
Par curiosité et pour me perfectionner (ça ne me fera pas de mal...), où puis-je trouver des infos pour simplifier les déclarations avec "$" ?
Ça, ce n'est pas important. C'est juste de la poudre aux yeux.

Ce qui est plus important, c'est de savoir qu'il ne suffit pas de typer en fin de ligne de déclaration pour typer toutes les variables de la ligne.
Chaque variable que l'on veut typer doit être typée indépendamment.
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…