web-dev-qa-db-ja.com

MS Officeでファイルの名前を変更すると同時に古いバージョンを削除するにはどうすればよいですか?

Microsoft Officeで、前のファイル名のコピーを保持せずにファイルを別のファイル名で保存する場合は、次の2つの手順が必要です。

  • まず、[ファイル]-> [名前を付けて保存...]を選択し、新しい名前を選択します。ファイルのコピーが作成されます。
  • 次に、Windowsエクスプローラーに移動し、古い名前の古いファイルを削除します。

Office自体からファイルの名前を1つのステップで「変更」することにより、これらのステップを簡略化したいと思います。どうすればこれを行うことができますか?

より面白くて不可解なバージョンについては、 リビジョン1を参照してください。

19
enderland

これに答える「最も簡単な」方法は、 この答え に大きく基づいているようです。

  1. 次のコードをnormal.dotmテンプレートに挿入します(Windows 7 forWordのC:\Documents and Settings\user name\Application Data\Microsoft\Templatesにあります)
  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
12
enderland

組み込みの機能ではこれを行うことはできません。オフィスが述べているように それはドキュメントです

ファイルの名前を変更すると、既存のファイルのファイル名が変更されます。誰かがプログラムでファイルを開いている間は、ファイルの名前を変更することはできません。ファイルを閉じる必要があり、共有ファイルの場合はチェックインする必要があります。開いているファイルを新しい名前で保存できますが、元の名前のファイルのコピーは引き続き存在します。

[〜#〜] vsto [〜#〜] またはVBA(Oliverの回答のように)を使用してカスタムの「名前を変更...」関数を作成することで、このようなものを組み込むことができるようです。新しいコピーを保存してから古いコピーを削除するようにプログラムする必要があります。

11
xdumaine

これが私が一緒に投げた小さな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
6
Der Hochstapler

いいえ、組み込み関数ではありません。

回避策の1つは、ファイルを新しい名前で保存することです。次に、[ファイル]、[名前を付けて保存]に戻り、古いファイルを削除します。これにより、ドキュメントを閉じたり、エクスプローラーを使用したり、名前を変更したり、再度開いたりするよりも効率的になります。

4
Travis

これは@Travisの回答のわずかなバリエーションです。

繰り返しますが、これは組み込み関数ではありません。

  1. Wordでファイルを閉じ、必要に応じて変更を保存することを確認します。
  2. まだWordで、クリックしてファイルを開きます。
  3. 必要に応じてファイルに移動し、ファイルを右クリックして名前を変更します。
  4. [ファイルを開く]ダイアログが表示されている間に、名前を変更したファイルを開きます。

このソリューション:

  1. 古いファイルを削除するためにWindowsエクスプローラーで長い孤独なドライブを排除します。
  2. [ファイルを開く/名前を付けて保存]ダイアログへの1回の移動です。
  3. [名前を付けて保存]操作よりもマウスを数回クリックするだけで操作を完了します。
  4. また、VBAまたは同様のソリューションよりもマウスを数回クリックするだけで操作を完了します。
3
Kevin Fegan