ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 2963|回复: 3

[分享] vba将word另存为一份不含宏的新文档的方法

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-4-22 09:05 | 显示全部楼层 |阅读模式
本帖最后由 jesqiu 于 2020-4-22 09:54 编辑

需求:用vba格式化word文档后,需要另存为一份标题命名的、不含宏的新文档,找了很多资料,没有找到更好的方法,后来自己琢磨出来了,分享给大家。
代码需要注意地方两点,也是浪费我很多时间的地方,一是如果采用标题之类作为文件名,因为包括了回车符(换行符)导致代码一直报错,需要先删掉才能保存成功。
第二点,微软官方文档SaveAs2例子的人机交互有点不是很友好,直接用InputBox让用户输入文件名(见中间注释掉的代码)。所以考虑用dialog弹出另存的对话框,由用户选择文件类型和修改文件名(默认默认为文件内容的第一行(标题),减少手工劳动),但又有新的问题,dialog的.execute命令会直接将当前文档另存为新文档,导致VBA宏代码等也跟着到新文档,徒增文件体积。而我希望不要把宏代码带到新文档,采用声明一个新的文档对象,并且把当前文档的内容复制过去的形式,再使用了SaveAs2方法另存为新生成的文档对象。
上面的代码很好的结合了两方的优点,解决了缺点,完美!匆忙写好,没有仔细测试,如果发现有问题,请大家帮忙完善,谢谢。
中间注释掉对文件名处理部分,留给有需要的人参考。

  1. <blockquote>Sub 另存为不含宏的文档()
复制代码





TA的精华主题

TA的得分主题

 楼主| 发表于 2020-4-22 09:07 | 显示全部楼层
晕,好像论坛粘贴代码的功能不完善,显示不完整。

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空格

'    '摘抄自微软官方文档的一个例子
'    Dim intPos As Integer
'    intPos = InStrRev(strDocName, ".")
'    '此处删除后缀名,后续另存为对话框中选择文件类型后再加上后缀名
'    If intPos = 0 Then
'        ' 如果文档还未保存,问用户输入文件名
'        strDocName = InputBox("请输入要保存的文件名:")
'    Else
'        '删除原来的后缀名并添加新的后缀名
'        strDocName = Left(strDocName, intPos - 1)
'        strDocName = strDocName & ".docx"
'    End If
   
    '采用复制内容到新文档的形式,避免将宏代码带到新文档
    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

TA的精华主题

TA的得分主题

发表于 2020-4-22 12:05 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
strDocName用在哪了?

TA的精华主题

TA的得分主题

发表于 2020-4-22 12:31 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-24 12:08 , Processed in 0.027689 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表