Como renomear um arquivo simultaneamente no MS Office e excluir a versão antiga?


19

No Microsoft Office, ao desejar salvar um arquivo em um nome de arquivo diferente sem manter uma cópia do nome do arquivo anterior, isso requer duas etapas:

  • Primeiro, Arquivo -> Salvar como ... e selecione o novo nome. Uma cópia do arquivo é feita.
  • Em seguida, entre no Windows Explorer e exclua o arquivo antigo com o nome antigo.

Gostaria de simplificar essas etapas "renomeando" o arquivo, do próprio Office, em uma única etapa. Como eu pude fazer isso?

Para uma versão mais divertida e enigmática, consulte a Revisão 1 .


@ Ramhound Acho que não vejo como isso não é um problema com uma solução (Travis tem uma solução melhor do que o que estou fazendo e roviuser faz parecer que a melhor resposta é uma macro VBA - o que eu poderia fazer, eu não acho que para fazer isso por algum motivo - ou um VSTO real compilados add-on)
enderland

Simultâneo ? Bem, quando você obter a resposta, em seguida, contar a minha forma de estar em dois lugares ao mesmo tempo :-)
MDMoore313

Você não pode, porque a UE limitou a integração que a MS está autorizada a fazer entre seus produtos. Permitindo escritório para renomear um arquivo iria quebrar essas regras e torná-lo um monoply
Chad

@ Chade você está brincando aqui? Quero dizer, o OpenOffice também pode adicionar uma função de renomeação.
heinrich5991

Respostas:


12

A maneira "mais fácil" de responder a isso parece estar se baseando significativamente nessa resposta .

  1. Insira o seguinte código no modelo normal.dotm (encontrado no C:\Documents and Settings\user name\Application Data\Microsoft\TemplatesWindows 7 para Word)
  2. Salvar normal.dotm
  3. Adicione isso à barra de ferramentas quicklaunch no Word.
  4. Opcional - remapear um atalho de teclado para este
  5. Opcional - assine digitalmente seu modelo (recomendado)

Observe que, na verdade, isso move o arquivo antigo para a Lixeira em vez de lixeira completamente e também define o novo nome de arquivo de uma maneira muito 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

Bom trabalho. Perguntas e respostas como esta são o objetivo do SuperUser.
Xdumaine 03/03

Eu tenho usado isso extensivamente. Obrigado superusuário!
Enderland

11

Você não pode fazer isso com a funcionalidade incorporada. Como o escritório declara em sua documentação

Renomear um arquivo altera o nome do arquivo existente. Você não pode renomear um arquivo enquanto alguém o abre em qualquer programa. O arquivo deve ser fechado e, se for um arquivo compartilhado, deve ser registrado. Você pode salvar um arquivo aberto com um novo nome, mas uma cópia do arquivo com o nome original ainda existirá.

Parece que algo assim poderia ser criado criando uma função personalizada "Renomear como ..." com VSTO ou VBA (como na resposta de Oliver). Você apenas teria que programá-lo para salvar uma nova cópia e excluir a antiga.


6

Aqui está uma pequena macro VBA que juntei, que faz exatamente o que você deseja:

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

1
Crédito onde é devido. Eu não estava disposto a tentar isso. VBA é tão feio.
Xdumaine 03/03

4

Não, não é uma função integrada.

Uma solução alternativa seria salvar o arquivo com o novo nome. Depois, volte para Arquivo, Salvar como e exclua o arquivo antigo, o que o tornaria mais eficiente do que fechar seu documento, explorer, renomear, reabrir.


2
Essa é de longe uma opção melhor do que entrar nesse explorador para dirigir.
Enderland

3

Aqui está uma pequena variação na resposta do @Travis.

Novamente, não é uma função integrada.

  1. No Word, feche o arquivo, confirmando para salvar as alterações, se necessário.
  2. Ainda no Word, clique para abrir um arquivo.
  3. Navegue até o arquivo, se necessário, clique com o botão direito do mouse e renomeie-o.
  4. Enquanto ainda estiver na caixa de diálogo Abrir arquivo, abra o arquivo renomeado.

Esta solução:

  1. Elimina a longa unidade solitária no Windows Explorer para excluir o arquivo antigo.
  2. É apenas uma viagem para a caixa de diálogo Abrir / Salvar como do arquivo.
  3. Conclui a operação com apenas mais alguns cliques do mouse do que apenas a operação Salvar como.
  4. Também conclui a operação com apenas mais alguns cliques do mouse do que um VBA ou solução semelhante.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.