¿Cómo cambiar el nombre de un archivo simultáneamente en MS Office y eliminar la versión anterior?

19

En Microsoft Office, cuando desee guardar un archivo en un nombre de archivo diferente sin conservar una copia del nombre del archivo anterior, hacerlo requiere dos pasos:

  • Primero, Archivo -> Guardar como ... y seleccione el nuevo nombre. Se hace una copia del archivo.
  • Luego, vaya al Explorador de Windows y elimine el archivo antiguo con el nombre anterior.

Me gustaría simplificar estos pasos "renombrando" el archivo, desde Office, en un solo paso. ¿Cómo podría hacer esto?

Para una versión más entretenida y críptica, vea la Revisión 1 .

Enderland
fuente
@Ramhound Supongo que no veo cómo esto no es un problema con una solución (Travis tiene una mejor solución que lo que estoy haciendo y roviuser hace que parezca que la mejor respuesta es una macro VBA, lo que podría hacer, yo no pensé en hacer esto por alguna razón, o un complemento compilado VSTO real)
enderland
Simultáneo ? Bueno, cuando
recibas
No puede porque la UE ha limitado la integración que MS puede hacer entre sus productos. Permitir que la oficina cambie el nombre de un archivo infringiría esas reglas y lo convertiría en un monoply
Chad
@ Chad, ¿estás bromeando aquí? Quiero decir que OpenOffice también podría agregar una función de cambio de nombre también.
heinrich5991

Respuestas:

12

La forma "más fácil" de responder esto parece basarse significativamente en esta respuesta .

  1. Inserte el siguiente código en la plantilla normal.dotm (que se encuentra en C:\Documents and Settings\user name\Application Data\Microsoft\TemplatesWindows 7 para Word)
  2. Guardar normal.dotm
  3. Agregue esto a la barra de herramientas de inicio rápido en Word.
  4. Opcional: reasigna un atajo de teclado para esto
  5. Opcional: firme digitalmente su plantilla (recomendado)

Tenga en cuenta que esto realmente mueve el archivo antiguo a la Papelera de reciclaje en lugar de tirarlo a la basura completamente y también establece el nuevo nombre del archivo de una manera muy conveniente.


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
fuente
Buen trabajo. Preguntas y respuestas como esta son de lo que se trata SuperUser.
xdumaine
He estado usando esto ampliamente. Gracias superusuario!
enderland
11

No puede hacer esto con la funcionalidad integrada. Como indica la oficina en su documentación

Cambiar el nombre de un archivo cambia el nombre de un archivo existente. No puede cambiar el nombre de un archivo mientras alguien lo tenga abierto en cualquier programa. El archivo debe estar cerrado, y si es un archivo compartido, debe estar registrado. Puede guardar un archivo abierto con un nuevo nombre, pero seguirá existiendo una copia del archivo con el nombre original.

Parece que algo como esto podría incorporarse creando una función personalizada "Cambiar nombre como ..." con VSTO o VBA (como en la respuesta de Oliver). Solo tendría que programarlo para guardar una nueva copia y luego eliminar la anterior.

xdumaine
fuente
6

Aquí hay una pequeña macro de VBA que reuní que hace exactamente lo que quieres:

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
fuente
1
Crédito donde es debido. No estaba dispuesto a probar esto. VBA es tan feo.
xdumaine
4

No, no es una función integrada.

Una solución sería guardar el archivo con el nuevo nombre. Luego regrese a Archivo, Guardar como y elimine el archivo anterior, lo que lo haría más eficiente que cerrar su documento, explorador, renombrar, reabrir.

Travis
fuente
2
Esta es, con mucho, una mejor opción que entrar en ese explorador para conducir.
enderland
3

Aquí hay una ligera variación en la respuesta de @Travis.

Nuevamente, no es una función incorporada.

  1. En Word, cierre el archivo y confirme que guarda los cambios si es necesario.
  2. Aún en Word, haga clic para abrir un archivo.
  3. Navegue hasta el archivo si es necesario, haga clic derecho en el archivo y cámbiele el nombre.
  4. Mientras todavía está en el cuadro de diálogo Abrir archivo, abra el archivo renombrado.

Esta solución:

  1. Elimina el largo disco solitario en el Explorador de Windows para eliminar el archivo antiguo.
  2. Es solo un viaje al cuadro de diálogo Abrir / Guardar archivo como.
  3. Completa la operación con solo unos pocos clics más del mouse que solo la operación Guardar como.
  4. También completa la operación con solo unos pocos clics más del mouse que un VBA o una solución similar.
Kevin Fegan
fuente