Bagaimana cara mengubah nama file secara bersamaan di MS Office dan menghapus versi lama?

19

Di Microsoft Office, ketika ingin menyimpan file ke nama file yang berbeda tanpa menyimpan salinan nama file sebelumnya, melakukannya memerlukan dua langkah:

  • Pertama, File -> Save As ... dan pilih nama baru. Sebuah salinan dari file tersebut dibuat.
  • Kemudian, masuk ke Windows Explorer dan hapus file lama dengan nama lama.

Saya ingin menyederhanakan langkah-langkah ini dengan "mengubah nama" file, dari Office itu sendiri, dalam satu langkah. Bagaimana saya bisa melakukan ini?

Untuk versi yang lebih menghibur dan samar lihat Revisi 1 .

enderland
sumber
@Ramhound Saya kira saya gagal melihat bagaimana ini bukan masalah dengan solusi (Travis memiliki solusi yang lebih baik bahwa apa yang saya lakukan dan roviuser membuatnya sepertinya jawaban terbaik adalah makro VBA - yang mungkin saya lakukan, saya tidak berpikir untuk melakukan ini karena alasan tertentu - atau pengaya yang dikompilasi VSTO yang sebenarnya)
enderland
Simultan ? Nah, ketika Anda mendapatkan jawabannya maka beri tahu saya bagaimana berada di dua tempat sekaligus :-)
MDMoore313
Anda tidak bisa karena UE membatasi integrasi yang diizinkan untuk dibuat MS di antara produk-produknya. Mengizinkan kantor mengubah nama file akan melanggar aturan itu dan menjadikannya monoply
Chad
@Chad kau bercanda di sini? Maksud saya OpenOffice hanya bisa menambahkan fungsi ganti nama juga.
heinrich5991

Jawaban:

12

Cara "termudah" untuk menjawab ini tampaknya secara signifikan membangun jawaban ini .

  1. Masukkan kode berikut ke templat normal.dotm (ditemukan di C:\Documents and Settings\user name\Application Data\Microsoft\Templatesuntuk Windows 7 untuk Word)
  2. Simpan normal.dotm
  3. Tambahkan ini ke toolbar quicklaunch di Word.
  4. Opsional - remap pintasan keyboard untuk ini
  5. Opsional - tandatangani templat Anda secara digital (disarankan)

Catatan ini benar-benar memindahkan file lama ke Recycle Bin daripada membuang sepenuhnya dan juga menetapkan nama file baru dengan cara yang sangat nyaman.


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
sumber
Kerja bagus. Pertanyaan dan jawaban seperti inilah yang menjadi tujuan SuperUser.
xdumaine
Saya telah menggunakan ini secara ekstensif. Terima kasih superuser!
enderland
11

Anda tidak dapat melakukan ini dengan fungsionalitas bawaan. Seperti yang dinyatakan kantor dalam dokumentasi itu

Mengganti nama file mengubah nama file dari file yang ada. Anda tidak dapat mengganti nama file saat seseorang membukanya di program apa pun. File harus ditutup, dan jika itu adalah file bersama, itu harus diperiksa. Anda dapat menyimpan file yang terbuka dengan nama baru, tetapi salinan file dengan nama asli masih ada.

Sepertinya sesuatu seperti ini dapat dibangun dengan membuat fungsi "Ubah nama Sebagai ..." dengan VSTO atau VBA (seperti dalam jawaban Oliver). Anda hanya perlu memprogramnya untuk menyimpan salinan baru kemudian menghapus yang lama.

xdumaine
sumber
6

Berikut ini adalah makro VBA kecil yang saya lempar bersama yang melakukan persis seperti yang Anda inginkan:

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
sumber
1
Terima kasih. Saya tidak mau mencoba ini. VBA sangat jelek.
xdumaine
4

Tidak, ini bukan fungsi bawaan.

Salah satu penyelesaiannya adalah menyimpan file dengan nama baru. Kemudian kembali ke File, Save As dan hapus file lama yang akan membuatnya lebih efisien daripada menutup dokumen Anda, explorer, mengubah nama, membuka kembali.

Travis
sumber
2
Ini adalah pilihan yang jauh lebih baik daripada masuk ke penjelajah itu untuk mengemudi.
enderland
3

Berikut ini sedikit variasi pada jawaban @Travis.

Sekali lagi, ini bukan fungsi bawaan.

  1. Di Word, tutup file, konfirmasikan untuk menyimpan perubahan jika perlu.
  2. Masih di Word, klik untuk Buka file.
  3. Arahkan ke file jika perlu, klik kanan file tersebut dan ganti namanya.
  4. Saat masih dalam dialog Buka File, Buka file yang diganti namanya.

Solusi ini:

  1. Menghilangkan drive panjang kesepian di Windows Explorer untuk menghapus file lama.
  2. Hanya satu perjalanan ke dialog File Open / Save-As.
  3. Menyelesaikan operasi dengan hanya beberapa klik mouse lebih dari sekedar operasi Save-As.
  4. Juga menyelesaikan operasi dengan hanya beberapa klik mouse daripada VBA atau solusi serupa.
Kevin Fegan
sumber