Как одновременно переименовать файл в MS Office и удалить старую версию?

19

В Microsoft Office, когда требуется сохранить файл под другим именем без сохранения копии предыдущего имени файла, для этого необходимо выполнить два шага:

  • Сначала выберите Файл -> Сохранить как ... и выберите новое имя. Копия файла производится.
  • Затем зайдите в Windows Explorer и удалите старый файл со старым именем.

Я хотел бы упростить эти шаги, «переименовав» файл из самого Office за один шаг. Как я мог это сделать?

Для более интересной и загадочной версии см. Редакцию 1 .

enderland
источник
@Ramhound Я думаю, я не вижу, как это не проблема с решением (у Трэвиса есть лучшее решение, чем то, что я делаю, и roviuser делает его лучшим ответом - это макрос VBA - что я мог бы сделать, я не думал сделать это по какой-то причине - или скомпилированному дополнению
VSTO
Одновременно ? Хорошо, когда вы получите ответ, скажите мне, как быть в двух местах одновременно :-)
MDMoore313
Вы не можете этого сделать, потому что ЕС ограничил интеграцию, которую MS имеет право делать между своими продуктами. Разрешение офису переименовывать файл нарушит эти правила и сделает его монопольным
Чад
@ Ты что, шутишь? Я имею в виду, что OpenOffice может просто добавить функцию переименования.
heinrich5991

Ответы:

12

«Самый простой» способ ответить на этот вопрос, по-видимому, значительно опирается на этот ответ .

  1. Вставьте следующий код в шаблон normal.dotm (находится в C:\Documents and Settings\user name\Application Data\Microsoft\TemplatesWindows 7 для Word)
  2. Сохранить нормальный. Дотм
  3. Добавьте это на панель быстрого запуска в Word.
  4. Необязательно - переназначить сочетание клавиш на это
  5. Необязательно - цифровая подпись вашего шаблона (рекомендуется)

Обратите внимание, что это фактически перемещает старый файл в корзину вместо полной очистки, а также устанавливает новое имя файла очень удобным способом.


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
источник
Хорошая работа. Подобные вопросы и ответы - вот что такое SuperUser.
xdumaine
Я использовал это широко. Спасибо суперпользователь!
enderland
11

Вы не можете сделать это со встроенной функциональностью. Как констатирует офис в своей документации

Переименование файла изменяет имя файла существующего файла. Вы не можете переименовать файл, если кто-то открыл его в любой программе. Файл должен быть закрыт, и если это общий файл, он должен быть зарегистрирован. Вы можете сохранить открытый файл с новым именем, но копия файла с исходным именем все еще будет существовать.

Кажется, что-то подобное может быть встроено путем создания пользовательской функции «Переименовать в ...» с помощью VSTO или VBA (как в ответе Оливера). Вам просто нужно запрограммировать его, чтобы сохранить новую копию, а затем удалить старую.

xdumaine
источник
6

Вот небольшой макрос VBA, который я скомбинировал, который делает в точности то, что вы хотите:

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
источник
1
Кредит, где это должно. Я не был готов попробовать это. VBA такой уродливый.
xdumaine
4

Нет, это не встроенная функция.

Одно из возможных решений - сохранить файл с новым именем. Затем вернитесь в File, Save As и удалите старый файл, который сделает его более эффективным, чем закрытие документа, проводник, переименование, повторное открытие.

Travis
источник
2
Это, безусловно, лучший вариант, чем отправиться за рулем в этот исследователь.
enderland
3

Вот небольшой вариант ответа @Travis.

Опять же, это не встроенная функция.

  1. В Word закройте файл, подтвердив сохранение изменений, если это необходимо.
  2. Все еще в Word, нажмите, чтобы открыть файл.
  3. При необходимости перейдите к файлу, щелкните файл правой кнопкой мыши и переименуйте его.
  4. Находясь в диалоговом окне «Открыть файл», откройте переименованный файл.

Это решение:

  1. Удаляет длинный одинокий диск в проводнике Windows для удаления старого файла.
  2. Есть только одна поездка в диалог открытия файла / сохранения.
  3. Завершает операцию всего несколькими щелчками мыши, чем операция «Сохранить как».
  4. Также завершает операцию всего несколькими щелчками мыши, чем VBA или аналогичное решение.
Кевин Феган
источник