Comment renommer simultanément un fichier dans MS Office et supprimer l'ancienne version?

19

Dans Microsoft Office, lorsque vous souhaitez enregistrer un fichier sous un nom de fichier différent sans conserver une copie du nom de fichier précédent, cela nécessite deux étapes:

  • Tout d'abord, Fichier -> Enregistrer sous ... et sélectionnez le nouveau nom. Une copie du dossier est faite.
  • Ensuite, allez dans l'Explorateur Windows et supprimez l'ancien fichier avec l'ancien nom.

Je voudrais simplifier ces étapes en "renommant" le fichier, à partir d'Office lui-même, en une seule étape. Comment pourrais-je faire ça?

Pour une version plus divertissante et cryptique, voir la révision 1 .

enderland
la source
@Ramhound Je suppose que je ne vois pas comment ce n'est pas un problème avec une solution (Travis a une meilleure solution que ce que je fais et roviuser donne l'impression que la meilleure réponse est soit une macro VBA - ce que je pourrais faire, je n'a pas pensé à le faire pour une raison quelconque - ou un véritable complément VSTO compilé)
enderland
Simultané ? Eh bien, lorsque vous obtenez la réponse, dites-moi comment être à deux endroits à la fois :-)
MDMoore313
Vous ne pouvez pas parce que l'UE a limité l'intégration que MS est autorisée à faire entre ses produits. Permettre à un bureau de renommer un fichier enfreindrait ces règles et en ferait un monopole
Tchad
@Chad tu plaisantes ici? Je veux dire qu'OpenOffice pourrait simplement ajouter une fonction de changement de nom aussi.
heinrich5991

Réponses:

12

La façon «la plus simple» de répondre à cette question semble s'appuyer de manière significative sur cette réponse .

  1. Insérez le code suivant dans le modèle normal.dotm (trouvé dans C:\Documents and Settings\user name\Application Data\Microsoft\Templatespour Windows 7 pour Word)
  2. Enregistrer normal.dotm
  3. Ajoutez cela à la barre d'outils de lancement rapide dans Word.
  4. Facultatif - remappez un raccourci clavier à celui-ci
  5. Facultatif - signez numériquement votre modèle (recommandé)

Notez que cela déplace en fait l'ancien fichier vers la Corbeille plutôt que de le supprimer complètement et définit également le nouveau nom de fichier de manière très pratique.


Option Explicit

 'To send a file to the recycle bin, we'll need to use the Win32 API
 'We'll be using the SHFileOperation function which uses a 'struct'
 'as an argument. That struct is defined here:
Private Type SHFILEOPSTRUCT
    hwnd As Long
    wFunc As Long
    pFrom As String
    pTo As String
    fFlags As Integer
    fAnyOperationsAborted As Long
    hNameMappings As Long
    lpszProgressTitle As Long
End Type

 ' function declaration:
Private Declare Function SHFileOperation Lib "shell32.dll" Alias "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long

 'there are some constants to declare too
Private Const FO_DELETE = &H3
Private Const FOF_ALLOWUNDO = &H40
Private Const FOF_NOCONFIRMATION = &H10
Private Const FOF_SILENT = &H4

Function RecycleFile(FileName As String, Optional UserConfirm As Boolean = True, Optional HideErrors As Boolean = False) As Long
     'This function takes one mandatory argument (the file to be recycled) and two
     'optional arguments: UserConfirm is used to determine if the "Are you sure..." dialog
     'should be displayed before deleting the file and HideErrors is used to determine
     'if any errors should be shown to the user

    Dim ptFileOp As SHFILEOPSTRUCT
     'We have declared FileOp as a SHFILEOPSTRUCT above, now to fill it:
    With ptFileOp
        .wFunc = FO_DELETE
        .pFrom = FileName
        .fFlags = FOF_ALLOWUNDO
        If Not UserConfirm Then .fFlags = .fFlags + FOF_NOCONFIRMATION
        If HideErrors Then .fFlags = .fFlags + FOF_SILENT
    End With
     'Note that the entire struct wasn't populated, so it would be legitimate to change it's
     'declaration above and remove the unused elements. The reason we don't do that is that the
     'struct is used in many operations, some of which may utilise those elements

     'Now invoke the function and return the long from the call as the result of this function
    RecycleFile = SHFileOperation(ptFileOp)

End Function


Sub renameAndDelete()

    ' Store original name
    Dim sOriginalName As String
    sOriginalName = ActiveDocument.FullName

    ' Save As
    Dim sFilename As String, fDialog As FileDialog, ret As Long
    Set fDialog = Application.FileDialog(msoFileDialogSaveAs)

    'set initial name so you don't have to navigate to
    fDialog.InitialFileName = sOriginalName

    ret = fDialog.Show

    If ret <> 0 Then
        sFilename = fDialog.SelectedItems(1)
    Else
        Exit Sub
    End If

    Set fDialog = Nothing

    'only do this if the file names are different...
    If (sFilename <> sOriginalName) Then
        'I love vba's pretty code
         ActiveDocument.SaveAs2 FileName:=sFilename, FileFormat:= _
            wdFormatXMLDocument, LockComments:=False, Password:="", AddToRecentFiles _
            :=True, WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts _
            :=False, SaveNativePictureFormat:=False, SaveFormsData:=False, _
            SaveAsAOCELetter:=False, CompatibilityMode:=14

        ' Delete original (don't care about errors, I guess)
        Dim hatersGonnaHate As Integer
        hatersGonnaHate = RecycleFile(sOriginalName, False, True)

    End If

End Sub
enderland
la source
Bon travail. Des questions et des réponses comme celle-ci sont ce que SuperUser propose.
xdumaine
J'utilise beaucoup cela. Merci superutilisateur!
enderland
11

Vous ne pouvez pas le faire avec des fonctionnalités intégrées. Comme le bureau l'indique dans sa documentation

Renommer un fichier modifie le nom de fichier d'un fichier existant. Vous ne pouvez pas renommer un fichier tant que quelqu'un l'a ouvert dans n'importe quel programme. Le fichier doit être fermé et s'il s'agit d'un fichier partagé, il doit être archivé. Vous pouvez enregistrer un fichier ouvert sous un nouveau nom, mais une copie du fichier avec le nom d'origine existera toujours.

Il semble que quelque chose comme cela pourrait être intégré en créant une fonction personnalisée "Renommer en tant que ..." avec VSTO ou VBA (comme dans la réponse d'Oliver). Il suffit de le programmer pour enregistrer une nouvelle copie puis de supprimer l'ancienne.

xdumaine
la source
6

Voici une petite macro VBA que j'ai jeté ensemble qui fait à peu près exactement ce que vous voulez:

Sub Macro1()
    ' Store original name
    Dim sOriginalName As String
    sOriginalName = ActiveDocument.FullName

    ' Save As
    Dim sFilename As String, fDialog As FileDialog, ret As Long
    Set fDialog = Application.FileDialog(msoFileDialogSaveAs)
    ret = fDialog.Show
    If ret <> 0 Then
        sFilename = fDialog.SelectedItems(1)
    Else
        Exit Sub
    End If
    Set fDialog = Nothing

    ' Don't replace the original file
    If sFilename = sOriginalName Then Exit Sub

     ActiveDocument.SaveAs2 FileName:=sFilename, FileFormat:= _
        wdFormatXMLDocument, LockComments:=False, Password:="", AddToRecentFiles _
        :=True, WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts _
        :=False, SaveNativePictureFormat:=False, SaveFormsData:=False, _
        SaveAsAOCELetter:=False, CompatibilityMode:=14

    ' Delete original
    Kill sOriginalName
End Sub
Der Hochstapler
la source
1
Un crédit là où il est dû. Je ne voulais pas essayer ça. VBA est si moche.
xdumaine
4

Non, ce n'est pas une fonction intégrée.

Une solution consiste à enregistrer le fichier sous le nouveau nom. Revenez ensuite à Fichier, Enregistrer sous et supprimez l'ancien fichier, ce qui le rendrait plus efficace que la fermeture de votre document, l'explorateur, le renommage, la réouverture.

Travis
la source
2
C'est de loin une meilleure option que d'entrer dans cet explorateur pour aller conduire.
enderland
3

Voici une légère variation sur la réponse @Travis.

Encore une fois, ce n'est pas une fonction intégrée.

  1. Dans Word, fermez le fichier, en confirmant d'enregistrer les modifications si nécessaire.
  2. Toujours dans Word, cliquez pour ouvrir un fichier.
  3. Accédez au fichier si nécessaire, cliquez avec le bouton droit sur le fichier et renommez-le.
  4. Dans la boîte de dialogue Ouvrir un fichier, ouvrez le fichier renommé.

Cette solution:

  1. Élimine le long lecteur solitaire dans l'Explorateur Windows pour supprimer l'ancien fichier.
  2. Il s'agit d'un seul trajet vers la boîte de dialogue Ouvrir / Enregistrer sous.
  3. Termine l'opération en quelques clics de souris de plus que la simple opération Enregistrer sous.
  4. Termine également l'opération avec seulement quelques clics de souris de plus qu'un VBA ou une solution similaire.
Kevin Fegan
la source