ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] word域代码插入页码。要求既有当前节第几页,又有文档的第几页

[复制链接]

TA的精华主题

TA的得分主题

发表于 2022-9-19 15:07 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
使用域代码给word文档插入页码时遇到一个问题,既需要当前节的第X页,共Y页,也需要整篇文档的总第M页,共N页。

我用{PAGE}和{SECTIONPAGES},来获取当前节的第X页,共Y页;用{PAGE}和{NUMPAGES}来获取整篇文档的总第M页和共N页。这样操作在第一节是没问题的,但到了第二节及以后,{PAGE}获取的还是当前节的当前页,不是整篇文档的第M页。我尝试过,通过修改页码格式,把“续前节”改为“从n开始”,但也不起作用。

我现在的解决方法是,在域代码中手动输入第一节结束时的页码,加上{PAGE},得到当前文档的“总第M页”。但这样操作的缺点是,如果上一节增减页数,这里的“总第M页”不会跟着发生变化,就会出错。在附件中,第三节我特意没有修改前节的总页数,留了一个错误示例。我希望使用域代码,让文档的“总第M页”可以随文档的编辑动态变化。



盼解答  多谢!


怎样设置页码.rar

8.48 KB, 下载次数: 11

TA的精华主题

TA的得分主题

发表于 2022-9-19 16:41 | 显示全部楼层
本帖最后由 413191246se 于 2022-9-20 19:23 编辑

略。。。。

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-9-20 10:17 | 显示全部楼层

不是双栏页码。是在页脚处插入页码,用“第x页,共y页。总第m页,共n页。”的格式来表示。x和y表示当前节的页数,x是在当前节中的当前页,y是当前节的总页数;m和n表示整个文档的页数,m是当前在整个文档的页码,n是整个文档的总页数。这个需求,用域代码可以实现吗?

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-9-20 10:37 | 显示全部楼层

实测了一下,可以达到效果。我再多试几次看看

TA的精华主题

TA的得分主题

发表于 2022-9-23 23:48 | 显示全部楼层
本帖最后由 413191246se 于 2022-9-24 11:58 编辑

* 楼主,经过最近几天反复思考,问题就出在两个“PAGE”域上!改一个另一个也自动更改,最后,我决定还是从公式入手,将“PAGE”域起始号码 1 加上前一节的页码,这也和你的思想是一致的。现在宏运行结果,看来只能说是成功了一半!毛病就在于宏处理后,页脚显示是正常的,但是要是哪个节(Section)页码有增减,“总第M页”这里是不会自动更新的,必须重新运行一次宏才会正常。如果你想追求完美(自动更新),需要等待高手出马了(不过我觉得已经不错了,改一次运行一次宏也无妨)。——请试用:
  1. Sub PageNumber_SectionPages()
  2. '第 X 页,共 Y 页/总第 M 页,总共 N 页
  3.     Dim i&, j&, k&
  4.     With ActiveDocument
  5.         j = .Sections.Count

  6.         For i = 1 To j
  7.             If i > 1 Then k = ActiveDocument.Sections(i - 1).Range.Information(wdActiveEndPageNumber)
  8.             With .Sections(i)
  9.                 With .Footers(1)
  10.                     .Range.Delete
  11.                     .Range.Font.Size = 42 '页脚字号(请自行调整)
  12.                 End With

  13.                 .Range.Select

  14.                 ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageFooter
  15.                 With Selection
  16.                     .ParagraphFormat.Alignment = wdAlignParagraphCenter

  17.                     .TypeText Text:="第 "
  18.                     .Fields.Add Range:=.Range, Type:=wdFieldEmpty, Text:= _
  19.                         "PAGE  ", PreserveFormatting:=True

  20.                     .TypeText Text:=" 页,共 "
  21.                     .Fields.Add Range:=.Range, Type:=wdFieldEmpty, Text:= _
  22.                         "SECTIONPAGES  ", PreserveFormatting:=True

  23.                     .TypeText Text:=" 页/总第 "

  24.                     If i = 1 Then
  25.                         .Fields.Add Range:=.Range, Type:=wdFieldEmpty, Text:= _
  26.                             "PAGE  ", PreserveFormatting:=True
  27.                     Else
  28.                         .Fields.Add Range:=.Range, Type:=wdFieldEmpty, PreserveFormatting:=False
  29.                         .TypeText Text:="="
  30.                         .Fields.Add Range:=.Range, Type:=wdFieldEmpty, PreserveFormatting:=False
  31.                         .TypeText Text:="PAGE"
  32.                         .MoveRight 1, 2
  33.                         .TypeText Text:="+" & k
  34.                         .Range.Fields.ToggleShowCodes
  35.                         .EndKey
  36.                     End If
  37.                     .TypeText Text:=" 页,总共 "
  38.                     .Fields.Add Range:=.Range, Type:=wdFieldEmpty, Text:= _
  39.                         "NUMPAGES  ", PreserveFormatting:=True
  40.                     .TypeText Text:=" 页"
  41.                 End With
  42.                 ActiveWindow.ActivePane.View.SeekView = wdSeekMainDocument

  43.                 If i > 1 Then
  44.                     With .Footers(1)
  45.                         .LinkToPrevious = False
  46.                         With .PageNumbers
  47.                             .RestartNumberingAtSection = True
  48.                             .StartingNumber = 1
  49.                         End With
  50.                     End With
  51.                 End If
  52.             End With
  53.         Next
  54.     End With
  55.     Selection.HomeKey 6
  56.     MsgBox "Complete!", 0 + 48
  57. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2022-9-24 22:01 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
可结合书签进行设置,在每节起始位置插入一个书签,书签命名规则为“sec"+节编号,如sec1,则页脚含域代码的文本为:
{={ page }-{ pageref "sec{ section }" }+1 }
页,共
{sectionpages }
页。总第
{ page }
页,共
{numpages }
页。宏代码:


  1. Sub test()
  2.     '同时显示节内页码和文档总页码
  3.     Dim i%, n%, achar, codetext
  4.     Dim aSec As Section
  5.    
  6.     achar = Array(15, 11, 6, 2)
  7.     codetext = Array("numpages", "page", "sectionpages", "=page-pageref ""secsection""+1")
  8.     For Each aSec In ActiveDocument.Sections
  9.         i = i + 1
  10.         With aSec.Range  '每节开头插入一个指定名称的书签
  11.             .Collapse wdCollapseStart
  12.             ActiveDocument.Bookmarks.Add "sec" & i, .Duplicate
  13.         End With
  14.         
  15.         If aSec.Footers(wdHeaderFooterPrimary).LinkToPrevious = False Then '如果指定页脚与前一节不同
  16.             With aSec.Footers(wdHeaderFooterPrimary).Range
  17.                 .Text = "第x页,共y页。总第m页,共n页"
  18.                 For n = 0 To 3
  19.                     .Fields.Add .Characters(achar(n)), , codetext(n), False
  20.                 Next
  21.                 With .Fields(1).Code
  22.                     .SetRange .Start + 7, .Start + Len(.Text) - 3
  23.                     .Fields.Add .Duplicate, , .Text, False
  24.                     .SetRange .Start - 5, .Start + Len(.Text) - 1
  25.                     .Fields.Add .Duplicate, , .Text, False
  26.                 End With
  27.                 With .Fields(3).Code
  28.                     .SetRange .Start + 13, .Start + Len(.Text) - 2
  29.                     .Fields.Add .Duplicate, , .Text, False
  30.                 End With
  31.                 .ParagraphFormat.Alignment = wdAlignParagraphCenter
  32.             End With
  33.         End If
  34.     Next
  35. End Sub
复制代码


TA的精华主题

TA的得分主题

发表于 2022-9-25 13:14 | 显示全部楼层
sylun 兄:你的代码测试了,后三项都正确,唯独第一个域(包括3个)“第X页”不正确!“总第M页”在第一节增加一页后,测试仍然正确。我准备下午用笔记本电脑修改一下第一个域,但刚才在我联想大电脑上修改半天,未达到目的,原因在于:你不是像我一样用录制宏一样的代码来表达域,你直接用 .Range,我是录制宏方法进入页脚,填写后再退出页脚返回主文档(.wdSeekMainDocument)。还有,你代码中多处有“.duplicate”,我虽然知道它是复制的意思,但不知道这样用是为什么。现在问题不大,只是第一个域有问题,就是加这个域的双大花括号的位置问题。

TA的精华主题

TA的得分主题

发表于 2022-9-25 19:24 | 显示全部楼层
本帖最后由 413191246se 于 2022-10-2 20:26 编辑

* sylun 兄:今天下午折腾了 3 个小时,没有搞定!晚上刚才又折腾好一会儿,也没搞定。
* 下面的代码,是在 兄台 的代码基础上修改的,因为这个“.duplicate”实在搞不定!我只好用录制宏的方法插入域了,但是发现,执行宏后保存退出,再打开,页脚不正确!——兄台 有空的话,请给看看,我实在搞不定了。

TA的精华主题

TA的得分主题

发表于 2022-10-1 11:31 | 显示全部楼层
413191246se 发表于 2022-9-25 13:14
sylun 兄:你的代码测试了,后三项都正确,唯独第一个域(包括3个)“第X页”不正确!“总第M页”在第一节 ...

前面的域代码只用于需要设置的节的页码是连续设置的情形,这是通常的做法(其实就是需要计算节内页码),如果中间有重新设置起始页码的,就不适用,这其实从代码文本中{page}出现的位置就可看出来。如果一定要每节重新设置起始页码,可试试如下域代码(计算并显示所谓的总页编号),此时不需要插入书签并用pageref域,但需要用到set域,且每节用于插入页码的页眉或页脚需要与前一节断开链接,不建议用此法:
起始节:{quote {set "sec{section}" {sectionpages}}{page}}
之后的其他节:{quote {set "sec{section}" {={"sec{={section}-1}"}+{sectionpages}}}{={"sec{section}"}-{sectionpages}+{page}}}

TA的精华主题

TA的得分主题

发表于 2022-10-2 20:35 | 显示全部楼层
* sylun 兄:国庆节快乐!辛苦了!——昨天,录制了第一节的域代码,折腾一会儿成功了。今天,又录制了第二节的域代码,报错。另外,说实在的,这些域代码放在一起,我也看不出来是什么意思,感觉好麻烦。
* 如果 楼主 需要,我建议暂时使用我 5 楼的代码,每次修改文档完毕后,再运行一次宏即可保存。
* 我想放弃本帖的解答了,我的主要兴趣还是公文自动排版。
* 下面是我录制的宏的域代码(第二节),你看看是否有错:(建议你也不要多用精力了,好好休息!)
fielderr.png
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-22 21:34 , Processed in 0.040848 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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