VBA操作WORD(六)另存為不含宏的文檔


 

Sub 另存為不含宏的文檔()
    Application.DisplayAlerts = False
    Application.ScreenUpdating = False

    Dim oDoc As Document
    Set oDoc = Word.ActiveDocument
    Dim oRng As Range
    Set oRng = oDoc.Content

    Dim sPath As String
    '默認存儲路徑,當前用戶桌面,注釋掉的是當前文檔路徑
    sPath = Environ("userprofile") & "\Desktop\" 'Word.ActiveDocument.Path & "\"

    '處理文件名
    Dim strDocName As String
    strDocName = ActiveDocument.Paragraphs(1).Range.Text '包含一個回車符
    strDocName = Replace(strDocName, Chr(13), "") 'chr(10)'刪除句末回車符,沒有trim空格
    
    '采用復制內容到新文檔的形式,避免將宏代碼帶到新文檔
    oRng.Select
    oRng.Copy
    Dim oDocTemp As Document
    Set oDocTemp = Word.Documents.Add
    With oDocTemp.Application.Selection
        .Paste
    End With
    
    'Dim vrtSelectedItem As Variant
    Dim fDialog As FileDialog
        Set fDialog = Application.FileDialog(msoFileDialogSaveAs)
    With fDialog
        .AllowMultiSelect = False
        .Filters.Clear '不清空會造成多次添加
        .Filters.Add "Word文件", "*.doc;*.docx;*.docm", 1
        .InitialFileName = sPath '& strDocName 'Left(vrtSelectedItem, Len(vrtSelectedItem) - 5)
        '返回值-1表示按下確認按鈕。如果沒有判斷,那么無論點擊哪個按鈕,均會保存文件到磁盤。
        If .Show = -1 Then
            'Set oDocTemp = Application.Documents.Save(vrtSelectedItem, ReadOnly:=True)'vrtSelectedItem為空
            '.Execute'execute是SaveAs對話框配套的保存命令,執行的是直接另存為操作,會把宏代碼帶到新文檔。改為調用SaveAs2方法完成存儲操作
            '.SelectedItems.Item(1)是對話框文件名修改后的名字。SelectedItems(1)為null
            oDocTemp.SaveAs2 filename:=.SelectedItems.Item(1), FileFormat:=wdFormatDocumentDefault
            oDocTemp.Close False
        End If
    End With
    Set fDialog = Nothing

    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
End Sub

上面代碼需要注意地方兩點,也是浪費我很多時間的地方,一是如果采用標題之類作為文件名,因為包括了回車符(換行符)導致代碼一直報錯,需要先刪掉才能保存成功。

第二點,微軟官方文檔SaveAs2例子的人機交互有點不是很友好,直接用InputBox讓用戶輸入文件名(見中間注釋掉的代碼)。所以考慮用dialog彈出另存的對話框,由用戶選擇文件類型和修改文件名(默認默認為文件內容的第一行(標題),減少手工勞動),但又有新的問題,dialog的.execute命令會直接將當前文檔另存為新文檔,導致VBA宏代碼等也跟着到新文檔,徒增文件體積。而我希望不要把宏代碼帶到新文檔,采用聲明一個新的文檔對象,並且把當前文檔的內容復制過去的形式,再使用了SaveAs2方法另存為新生成的文檔對象。

上面的代碼很好的結合了兩方的優點,解決了缺點,完美!上面的處理方法是原創,反正我沒看到過類似的解決方案。

中間注釋掉對文件名處理部分,留給有需要的人參考。

 

    '摘抄自微軟官方文檔的一個例子
    Dim intPos As Integer
    intPos = InStrRev(strDocName, ".")
    '此處刪除后綴名,后續另存為對話框中選擇文件類型后再加上后綴名
    If intPos = 0 Then
        ' 如果文檔還未保存,問用戶輸入文件名
        strDocName = InputBox("請輸入要保存的文件名:")
    Else
        '刪除原來的后綴名並添加新的后綴名
        strDocName = Left(strDocName, intPos - 1)
        strDocName = strDocName & ".docx"
    End If

 

--end--

--2020/4/22最后更新--


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM