ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 分页自动命名保存。

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-5-28 09:47 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
辛苦大神帮忙写一串代码,要求WORD在当前文件夹下自动分页保存,命名为“单位+姓名”(样表中涂红部分),先送上小花花。

样子.zip

13.63 KB, 下载次数: 5

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-5-28 10:52 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
找到了一个之前大神写好的代码,但是不会修改成我要的样子,有老师能帮忙修改一下吗?


Sub SaveAsFileByPage()

'分页保存,适用于WORD97及其以上版本
    Dim objShell As Object, objFolder As Object, strNameLenth As Integer
     Dim mySelection As Selection, myFolder As String, myArray() As String
     Dim ThisDoc As Document, myDoc As Document, strName As String, N As Integer
     Dim myRange As Range, PageString As String, pgOrientation As WdOrientation
     Dim sinLeft As Single, sinRight As Single, sinTop As Single, sinBottom As Single
     Dim ErrChar() As Variant, oChar As Variant, sinStart As Single, sinEnd As Single
     Const myMsgTitle As String = "ExcelHome_ShouRou"
     Dim vbYN As VbMsgBoxResult
     sinStart = Timer
     On Error GoTo ErrHandle    '设置错误处理
    '创建一个Shell.Application对象
    Set objShell = CreateObject("Shell.Application")
     '取得文件夹浏览器
    Set objFolder = objShell.BrowseForFolder(0, "请选择一个文件夹", 0, 0)
     If objFolder Is Nothing Then Exit Sub
     myFolder = objFolder.Self.Path & "\"
     Set objFolder = Nothing: Set objShell = Nothing
     Set ThisDoc = ActiveDocument    '定义一个Document对象,以利用本程序作为加载宏
    Set mySelection = ThisDoc.ActiveWindow.Selection
     '文件自动命名时必须规避的字符
    ErrChar = Array("\", "/", ":", "*", "?", """", "<", ">", "|")
     '一些特列字符
    For N = 0 To 31
         ReDim Preserve ErrChar(UBound(ErrChar) + 1)
         ErrChar(UBound(ErrChar)) = Chr(N)
     Next
     strNameLenth = Val(VBA.InputBox(prompt:="请输入您需要设置的文件名长度,0或者取消将自动命名!", Title:=myMsgTitle, Default:=10))
     If strNameLenth > 255 Then strNameLenth = 0
     vbYN = MsgBox("是否需要处理页尾的分隔符(分页符/分节符)?它可能会影响文档结构.", vbYesNo + vbInformation + vbDefaultButton2, myMsgTitle)
     Application.ScreenUpdating = False    '关闭屏幕更新
    '在文档的每页中循环
    For N = 1 To mySelection.Information(wdNumberOfPagesInDocument)
         mySelection.GoTo What:=wdGoToPage, Which:=wdGoToNext, Name:=N
         Set myRange = ThisDoc.Bookmarks("\PAGE").Range
         If vbYN = vbYes And VBA.Asc(myRange.Characters.Last.Text) = 12 Then _
            myRange.SetRange myRange.Start, myRange.End - 1
         '取得一个以段落标记为分隔符的一维数组
        myArray = VBA.Split(myRange.Text, Chr(13))
         '将所有文本合并为一个字符串
        PageString = VBA.Join(myArray, "")
         '取得文档中每节的页面设置
        With myRange.Sections(1).PageSetup
             sinLeft = .LeftMargin    '左页边距
            sinRight = .RightMargin    '右页边距
            sinTop = .TopMargin    '上边距
            sinBottom = .BottomMargin    '下边距
            pgOrientation = .Orientation    '纸张方向
        End With
         For Each oChar In ErrChar    '进行一系列替换,即删除无效字符
            PageString = VBA.Replace(PageString, oChar, "")
         Next
         If strNameLenth = 0 Then
             strName = ThisDoc.Name
             strName = VBA.Replace(LCase(strName), ".doc", "")
             strName = strName & "_" & N
         Else
             strName = VBA.Left(PageString, strNameLenth)    '取得文件名
        End If
         strName = strName & ".doc"
         myRange.Copy    '复制
        Set myDoc = Documents.Add(Visible:=False)    '新建一个隐藏的空白文档
        With myDoc
             .Content.Paste    '粘贴
            .Content.Paragraphs.Last.Range.Delete    '删除最后一个段落标记
            With .PageSetup    '进行页面设置
                .Orientation = pgOrientation
                 .LeftMargin = sinLeft
                 .RightMargin = sinRight
                 .TopMargin = sinTop
                 .BottomMargin = sinBottom
             End With
             '如果有相同的文档,则自动命名
            If VBA.Dir(myFolder & strName, vbDirectory) <> "" Then strName = "Page_" & N & ".doc"
             .SaveAs myFolder & strName    '另存为
            .Close    '关闭文档
        End With
     Next
     ThisDoc.Characters(1).Copy    '变相清空剪贴板
    Application.ScreenUpdating = True    '恢复屏幕更新
    sinEnd = Timer    '取得代码运行结束的时间
    If MsgBox("分页保存结束,用时:" & sinEnd - sinStart & _
               "秒,是否打开指定文件夹查看分页保存后的文档情况?", vbYesNo, myMsgTitle) = vbYes Then _
        ThisDoc.FollowHyperlink myFolder
     Exit Sub
ErrHandle:
     MsgBox "错误号:" & Err.Number & vbLf & "出错原因:" & Err.Description, myMsgTitle
     Err.Clear
     Application.ScreenUpdating = True    '恢复屏幕更新
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-5-28 10:54 | 显示全部楼层
  1. Sub SaveAsFileByPage()

  2. '分页保存,适用于WORD97及其以上版本
  3.     Dim objShell As Object, objFolder As Object, strNameLenth As Integer
  4.      Dim mySelection As Selection, myFolder As String, myArray() As String
  5.      Dim ThisDoc As Document, myDoc As Document, strName As String, N As Integer
  6.      Dim myRange As Range, PageString As String, pgOrientation As WdOrientation
  7.      Dim sinLeft As Single, sinRight As Single, sinTop As Single, sinBottom As Single
  8.      Dim ErrChar() As Variant, oChar As Variant, sinStart As Single, sinEnd As Single
  9.      Const myMsgTitle As String = "ExcelHome_ShouRou"
  10.      Dim vbYN As VbMsgBoxResult
  11.      sinStart = Timer
  12.      On Error GoTo ErrHandle    '设置错误处理
  13.     '创建一个Shell.Application对象
  14.     Set objShell = CreateObject("Shell.Application")
  15.      '取得文件夹浏览器
  16.     Set objFolder = objShell.BrowseForFolder(0, "请选择一个文件夹", 0, 0)
  17.      If objFolder Is Nothing Then Exit Sub
  18.      myFolder = objFolder.Self.Path & ""
  19.      Set objFolder = Nothing: Set objShell = Nothing
  20.      Set ThisDoc = ActiveDocument    '定义一个Document对象,以利用本程序作为加载宏
  21.     Set mySelection = ThisDoc.ActiveWindow.Selection
  22.      '文件自动命名时必须规避的字符
  23.     ErrChar = Array("", "/", ":", "*", "?", """", "<", ">", "|")
  24.      '一些特列字符
  25.     For N = 0 To 31
  26.          ReDim Preserve ErrChar(UBound(ErrChar) + 1)
  27.          ErrChar(UBound(ErrChar)) = Chr(N)
  28.      Next
  29.      strNameLenth = Val(VBA.InputBox(prompt:="请输入您需要设置的文件名长度,0或者取消将自动命名!", Title:=myMsgTitle, Default:=10))
  30.      If strNameLenth > 255 Then strNameLenth = 0
  31.      vbYN = MsgBox("是否需要处理页尾的分隔符(分页符/分节符)?它可能会影响文档结构.", vbYesNo + vbInformation + vbDefaultButton2, myMsgTitle)
  32.      Application.ScreenUpdating = False    '关闭屏幕更新
  33.     '在文档的每页中循环
  34.     For N = 1 To mySelection.Information(wdNumberOfPagesInDocument)
  35.          mySelection.GoTo What:=wdGoToPage, Which:=wdGoToNext, Name:=N
  36.          Set myRange = ThisDoc.Bookmarks("\PAGE").Range
  37.          If vbYN = vbYes And VBA.Asc(myRange.Characters.Last.Text) = 12 Then _
  38.             myRange.SetRange myRange.Start, myRange.End - 1
  39.          '取得一个以段落标记为分隔符的一维数组
  40.         myArray = VBA.Split(myRange.Text, Chr(13))
  41.          '将所有文本合并为一个字符串
  42.         PageString = VBA.Join(myArray, "")
  43.          '取得文档中每节的页面设置
  44.         With myRange.Sections(1).PageSetup
  45.              sinLeft = .LeftMargin    '左页边距
  46.             sinRight = .RightMargin    '右页边距
  47.             sinTop = .TopMargin    '上边距
  48.             sinBottom = .BottomMargin    '下边距
  49.             pgOrientation = .Orientation    '纸张方向
  50.         End With
  51.          For Each oChar In ErrChar    '进行一系列替换,即删除无效字符
  52.             PageString = VBA.Replace(PageString, oChar, "")
  53.          Next
  54.          If strNameLenth = 0 Then
  55.              strName = ThisDoc.Name
  56.              strName = VBA.Replace(LCase(strName), ".doc", "")
  57.              strName = strName & "_" & N
  58.          Else
  59.              strName = VBA.Left(PageString, strNameLenth)    '取得文件名
  60.         End If
  61.          strName = strName & ".doc"
  62.          myRange.Copy    '复制
  63.         Set myDoc = Documents.Add(Visible:=False)    '新建一个隐藏的空白文档
  64.         With myDoc
  65.              .Content.Paste    '粘贴
  66.             .Content.Paragraphs.Last.Range.Delete    '删除最后一个段落标记
  67.             With .PageSetup    '进行页面设置
  68.                 .Orientation = pgOrientation
  69.                  .LeftMargin = sinLeft
  70.                  .RightMargin = sinRight
  71.                  .TopMargin = sinTop
  72.                  .BottomMargin = sinBottom
  73.              End With
  74.              '如果有相同的文档,则自动命名
  75.             If VBA.Dir(myFolder & strName, vbDirectory) <> "" Then strName = "Page_" & N & ".doc"
  76.              .SaveAs myFolder & strName    '另存为
  77.             .Close    '关闭文档
  78.         End With
  79.      Next
  80.      ThisDoc.Characters(1).Copy    '变相清空剪贴板
  81.     Application.ScreenUpdating = True    '恢复屏幕更新
  82.     sinEnd = Timer    '取得代码运行结束的时间
  83.     If MsgBox("分页保存结束,用时:" & sinEnd - sinStart & _
  84.                "秒,是否打开指定文件夹查看分页保存后的文档情况?", vbYesNo, myMsgTitle) = vbYes Then _
  85.         ThisDoc.FollowHyperlink myFolder
  86.      Exit Sub
  87. ErrHandle:
  88.      MsgBox "错误号:" & Err.Number & vbLf & "出错原因:" & Err.Description, myMsgTitle
  89.      Err.Clear
  90.      Application.ScreenUpdating = True    '恢复屏幕更新
  91. End Sub
复制代码
找到之前大神写的代码,可以运行但是达不到我的要求,请老师帮忙修改一下。

TA的精华主题

TA的得分主题

发表于 2020-5-28 16:48 | 显示全部楼层
请问下,第三页是空白的,需要保存吗?

TA的精华主题

TA的得分主题

发表于 2020-5-28 17:31 | 显示全部楼层
代码在附件中,直接使用。

按页拆分文档.zip

21.19 KB, 下载次数: 98

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-24 08:46 , Processed in 0.033712 second(s), 15 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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