Làm cách nào để đổi tên đồng thời một tệp trong MS Office và xóa phiên bản cũ?


19

Trong Microsoft Office, khi muốn lưu tệp vào một tên tệp khác mà không giữ một bản sao của tên tệp trước đó, việc này đòi hỏi hai bước:

  • Đầu tiên, Tệp -> Lưu dưới dạng ... và chọn tên mới. Một bản sao của tập tin được thực hiện.
  • Sau đó, vào Windows Explorer và xóa tệp cũ với tên cũ.

Tôi muốn đơn giản hóa các bước này bằng cách "đổi tên" tệp, từ chính Office, trong một bước. Làm thế nào tôi có thể làm điều này?

Để biết phiên bản giải trí và khó hiểu hơn, xem Bản sửa đổi 1 .


@Ramhound Tôi đoán tôi thất bại khi thấy đây không phải là vấn đề với giải pháp (Travis có một giải pháp tốt hơn là những gì tôi đang làm và roviuser làm cho nó có vẻ như câu trả lời hay nhất là macro VBA - tôi có thể làm đã không nghĩ làm điều này vì một số lý do - hoặc một tiện ích bổ sung được biên dịch VSTO thực tế)
enderland

Đồng thời ? Chà, khi bạn nhận được câu trả lời thì hãy nói cho tôi biết làm thế nào để ở hai nơi cùng một lúc :-)
MDMoore313

Bạn không thể vì EU đã giới hạn sự tích hợp mà MS được phép thực hiện giữa các sản phẩm của mình. Cho phép văn phòng đổi tên một tập tin sẽ phá vỡ các quy tắc đó và biến nó thành một cách đơn điệu
Chad

@Chad bạn đang đùa ở đây à? Ý tôi là OpenOffice cũng có thể thêm chức năng đổi tên.
heinrich5991

Câu trả lời:


12

Cách "dễ nhất" để trả lời điều này dường như được xây dựng đáng kể dựa trên câu trả lời này .

  1. Chèn mã sau vào mẫu normal.dotm (tìm thấy trong C:\Documents and Settings\user name\Application Data\Microsoft\TemplatesWindows 7 cho Word)
  2. Lưu bình thường.dotm
  3. Thêm phần này vào thanh công cụ quicklaunch trong Word.
  4. Tùy chọn - ánh xạ lại một phím tắt cho cái này
  5. Tùy chọn - ký điện tử mẫu của bạn (được khuyến nghị)

Lưu ý rằng điều này thực sự di chuyển tệp cũ vào Thùng rác thay vì bỏ rác hoàn toàn và cũng đặt tên tệp mới theo cách rất thuận tiện.


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

Làm tốt lắm. Các câu hỏi và câu trả lời như thế này là những gì SuperUser hướng tới.
xdumaine

Tôi đã được sử dụng rộng rãi này. Cảm ơn siêu người dùng!
thúc vào

11

Bạn không thể làm điều này với chức năng tích hợp. Như văn phòng nêu trong tài liệu của nó

Đổi tên một tệp thay đổi tên tệp của một tệp hiện có. Bạn không thể đổi tên một tập tin trong khi ai đó mở nó trong bất kỳ chương trình nào. Tệp phải được đóng và nếu đó là tệp chia sẻ, thì phải kiểm tra. Bạn có thể lưu tệp đang mở với tên mới, nhưng bản sao của tệp có tên gốc sẽ vẫn tồn tại.

Có vẻ như một cái gì đó như thế này có thể được xây dựng bằng cách tạo chức năng "Đổi tên thành ..." tùy chỉnh với VSTO hoặc VBA (như trong câu trả lời của Oliver). Bạn chỉ cần lập trình nó để lưu một bản sao mới sau đó xóa bản cũ.


6

Đây là một macro VBA nhỏ mà tôi đã tập hợp lại, nó thực hiện khá chính xác những gì bạn muốn:

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
Tín dụng khi đến hạn. Tôi đã không muốn thử điều này. VBA thật xấu xí.
xdumaine

4

Không, nó không phải là một chức năng được xây dựng.

Một cách giải quyết sẽ là lưu tệp với tên mới. Sau đó quay lại Tệp, Lưu dưới dạng và xóa tệp cũ sẽ giúp việc này hiệu quả hơn là đóng tài liệu, trình thám hiểm, đổi tên, mở lại.


2
Đây là một lựa chọn tốt hơn so với việc đi vào nhà thám hiểm đó để lái xe.
enderland

3

Đây là một biến thể nhỏ trên câu trả lời @Travis.

Một lần nữa, nó không phải là một chức năng tích hợp.

  1. Trong Word, đóng tệp, xác nhận để lưu các thay đổi nếu cần.
  2. Vẫn trong Word, bấm để mở tệp.
  3. Điều hướng đến tệp nếu cần, nhấp chuột phải vào tệp và đổi tên tệp.
  4. Trong khi vẫn trong hộp thoại Mở tệp, Mở tệp đã đổi tên.

Giải pháp này:

  1. Loại bỏ ổ đĩa cô đơn dài trong Windows Explorer để xóa tệp cũ.
  2. Chỉ có một chuyến đi đến hộp thoại Mở / Lưu tệp dưới dạng.
  3. Hoàn thành thao tác chỉ với một vài lần nhấp chuột hơn là thao tác Lưu dưới dạng.
  4. Cũng hoàn thành thao tác chỉ với một vài lần nhấp chuột so với VBA hoặc giải pháp tương tự.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.