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


19

У Microsoft Office, якщо потрібно зберегти файл до іншого імені файлу, не зберігаючи копію попереднього імені файлу, для цього потрібно два кроки:

  • Спочатку Файл -> Зберегти як ... і виберіть нове ім'я. Робиться копія файлу.
  • Потім увійдіть у Провідник Windows та видаліть старий файл зі старим іменем.

Я хотів би спростити ці кроки шляхом "перейменування" файлу від самого Office в один крок. Як я міг це зробити?

Більш розважальну та виразну версію див. У версії 1 .


@Ramhound Я думаю, я не бачу, як це не проблема з рішенням (Travis має краще рішення, що те, що я роблю, і roviuser, здається, найкращою відповіддю є або макрос VBA - що я можу зробити, я чомусь не думав цього робити - або фактично доповнений
VSTO збір

Одночасно ? Що ж, коли ви отримаєте відповідь, то скажіть мені, як бути в двох місцях одразу :-)
MDMoore313

Не можна, тому що ЄС обмежив інтеграцію, яку МС дозволяють здійснювати між своїми продуктами. Дозволення офісу перейменувати файл порушить ці правила і зробить його монопольним
Чад

@Chad ти тут жартуєш? Я маю на увазі, що OpenOffice також може просто додати функцію перейменування.
heinrich5991

Відповіді:


12

"Найпростіший" спосіб відповісти на це, схоже, істотно спирається на цю відповідь .

  1. Вставте наступний код у шаблон normal.dotm (знайдено в C:\Documents and Settings\user name\Application Data\Microsoft\TemplatesWindows 7 для Word)
  2. Збережіть normal.dotm
  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

Хороша робота. Такі питання та відповіді - це те, про що йдеться у SuperUser.
xdumaine

Я широко використовую це. Дякую суперперу!
Ендерленд

11

Ви не можете цього зробити із вбудованою функціональністю. Як заявляє офіс у своїй документації

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

Здається, щось подібне можна вбудувати, створивши власну функцію "Перейменувати як ..." за допомогою VSTO або VBA (як у відповіді Олівера). Вам просто доведеться запрограмувати її, щоб зберегти нову копію, а потім видалити стару.


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

1
Кредит, де це належить. Я не хотів це пробувати. VBA така потворна.
xdumaine

4

Ні, це не вбудована функція.

Одна з проблем - зберегти файл з новим іменем. Потім поверніться до «Файл», «Зберегти як» та видаліть старий файл, який би зробив його більш ефективним, ніж закриття документа, Explorer, перейменування, повторне відкриття.


2
Це набагато кращий варіант, ніж потрапляти в того дослідника, щоб їхати за кермом.
Ендерленд

3

Ось незначна зміна відповіді на @Travis.

Знову ж таки, це не вбудована функція.

  1. У Word закрийте файл, підтвердивши, якщо потрібно зберегти зміни.
  2. Ще в Word натисніть, щоб відкрити файл.
  3. Перейдіть до файлу, якщо необхідно, клацніть правою кнопкою миші файл та перейменуйте його.
  4. Ще в діалоговому вікні «Відкрити файл», відкрийте перейменований файл.

Це рішення:

  1. Усуває довгий самотній диск у Windows Explorer, щоб видалити старий файл.
  2. Це лише одна поїздка до діалогового вікна "Відкрити / зберегти-як".
  3. Завершує операцію лише декількома клацаннями миші, ніж лише операція Save-As.
  4. Також завершує операцію лише декількома клацаннями миші, ніж VBA або подібне рішення.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.