Jak jednocześnie zmienić nazwę pliku w MS Office i usunąć starą wersję?

19

W pakiecie Microsoft Office, jeśli chcesz zapisać plik pod inną nazwą bez przechowywania kopii poprzedniej nazwy, zrobienie tego wymaga dwóch kroków:

  • Najpierw Plik -> Zapisz jako ... i wybierz nową nazwę. Zostanie utworzona kopia pliku.
  • Następnie przejdź do Eksploratora Windows i usuń stary plik o starej nazwie.

Chciałbym uprościć te kroki, zmieniając nazwę pliku z samego pakietu Office w jednym kroku. Jak mogłem to zrobić?

Bardziej zabawna i tajemnicza wersja znajduje się w wersji 1 .

kraina krańca
źródło
@Ramhound Chyba nie rozumiem, jak to nie jest problem z rozwiązaniem (Travis ma lepsze rozwiązanie niż to, co robię, i roviuser sprawia, że ​​najlepszą odpowiedzią jest albo makro VBA - co mogę zrobić, ja z jakiegoś powodu nie pomyślałem o tym - ani o prawdziwym dodatku skompilowanym w VSTO)
enderland
Jednoczesny ? Cóż, kiedy otrzymasz odpowiedź, powiedz mi, jak być w dwóch miejscach jednocześnie :-)
MDMoore313
Nie możesz, ponieważ UE ograniczyła integrację, którą MS może dokonać między swoimi produktami. Zezwolenie urzędowi na zmianę nazwy pliku złamałoby te zasady i uczyniło go monoply
Chad
@Czy żartujesz sobie tutaj? Mam na myśli, że OpenOffice może po prostu dodać funkcję zmiany nazwy.
heinrich5991

Odpowiedzi:

12

„Najprostszy” sposób na udzielenie odpowiedzi wydaje się znacznie opierać na tej odpowiedzi .

  1. Wstaw następujący kod do szablonu normal.dotm (znaleziony w C:\Documents and Settings\user name\Application Data\Microsoft\TemplatesWindows 7 dla Word)
  2. Zapisz normal.dotm
  3. Dodaj to do paska narzędzi szybkiego uruchamiania w programie Word.
  4. Opcjonalnie - przypisz skrót klawiaturowy do tego
  5. Opcjonalnie - podpisuj cyfrowo swój szablon (zalecane)

Zauważ, że to faktycznie przenosi stary plik do Kosza, a nie całkowicie usuwa śmieci, a także ustawia nową nazwę pliku w bardzo wygodny sposób.


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
kraina krańca
źródło
Dobra robota. Takie pytania i odpowiedzi są na tym właśnie polega SuperUser.
xdumaine
Używałem tego szeroko. Dzięki superuser!
enderland
11

Nie możesz tego zrobić dzięki wbudowanym funkcjom. Jak stwierdza biuro w swojej dokumentacji

Zmiana nazwy pliku zmienia nazwę istniejącego pliku. Nie można zmienić nazwy pliku, gdy ktoś ma go otworzyć w dowolnym programie. Plik musi być zamknięty, a jeśli jest to plik udostępniony, należy go zarejestrować. Możesz zapisać otwarty plik pod nową nazwą, ale kopia pliku o oryginalnej nazwie nadal będzie istnieć.

Wygląda na to, że coś takiego można wbudować, tworząc niestandardową funkcję „Zmień nazwę jako ...” za pomocą VSTO lub VBA (jak w odpowiedzi Olivera). Wystarczy go zaprogramować, aby zapisać nową kopię, a następnie usunąć starą.

xdumaine
źródło
6

Oto małe makro VBA, które rzuciłem razem, które robi dokładnie to, czego chcesz:

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
źródło
1
Kredyt tam, gdzie jest należny. Nie chciałem tego próbować. VBA jest taki brzydki.
xdumaine
4

Nie, to nie jest wbudowana funkcja.

Jednym z rozwiązań byłoby zapisanie pliku pod nową nazwą. Następnie wróć do opcji Plik, Zapisz jako i usuń stary plik, co uczyni go bardziej wydajnym niż zamknięcie dokumentu, eksplorator, zmiana nazwy, ponowne otwarcie.

Travis
źródło
2
Jest to zdecydowanie lepsza opcja niż wsiadanie do tego odkrywcy, aby rozpocząć jazdę.
kraina krańca
3

Oto niewielka odmiana odpowiedzi @Travis.

Znowu nie jest to wbudowana funkcja.

  1. W programie Word zamknij plik, w razie potrzeby potwierdź zapisanie zmian.
  2. Nadal w programie Word kliknij, aby otworzyć plik.
  3. W razie potrzeby przejdź do pliku, kliknij go prawym przyciskiem myszy i zmień jego nazwę.
  4. Będąc nadal w oknie dialogowym Otwórz plik, Otwórz plik o zmienionej nazwie.

To rozwiązanie:

  1. Eliminuje długi samotny dysk w Eksploratorze Windows, aby usunąć stary plik.
  2. Jest tylko jedna podróż do okna dialogowego Otwórz plik / Zapisz jako.
  3. Wykonuje operację tylko kilkoma kliknięciami myszy niż tylko operacja Zapisz jako.
  4. Kończy również operację za pomocą zaledwie kilku kliknięć myszą niż VBA lub podobne rozwiązanie.
Kevin Fegan
źródło