ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

求一个获得标题编号的代码

[复制链接]

TA的精华主题

TA的得分主题

发表于 2013-4-27 16:36 | 显示全部楼层 |阅读模式
本帖最后由 limshanb 于 2013-4-27 16:36 编辑

求一个获得标题编号的代码
1、问题的提出
        在技术或商务文件中总是有大量的图表,一个上千页的大型技术文件可能有上百个表格和插图,正规的文件应该是表有表名表号,图有图名图号,由于编纂文件时文件要来回复制粘贴,所以表名表号、图名图号要“嵌入”表或图中,而不是在表的上方或图的下方用正文打字,如所附样例,这样做的好处是复制粘贴时表头图名都不会丢失,也方便。
        表的编号与图的编号可以用自然序号从1往后排,更好的方法是取该编号与所在章节的标题相同(若有多个图表则用-1,-2来区分)。这样符合标准编写要求,也是一般技术文件普遍采用的方式。由于工作需要,相当多的包含图标的文字块要来回复制粘贴,重复利用,所以图表编号设置成与所在章节的标题号交叉引用是个好主意,这样文字块剪贴到新的文章中图表编号会跟着章节标题编号一起变化,当然,章节标题也必须是采用自动的多级标题编号。这个思路对于经常编纂大型技术文档的单位来说是个高效率、高质量的有力措施。
2、我的问题
        我在冲入图标编号时采用的是word的交叉引用方法,这个对于短文档来说问题不大,对于汇总的大型文档、上千页的文档来说,在设置交叉引用时候要在小小的窗口寻找该章节的位置十分费时间,因为通常文档有数百个、上千个标题行。
        我想要设计一个VBA编码,只要执行这个代码,就自动在光标所在位置给出所在章节的编号,网上找了一个代码“Selection.Bookmarks("\headinglevel").Range.ListFormat.ListString ”,这个代码最后一个词组不能用,在此请求大侠们赐个代码,先谢谢了!
       下面附样例,在样例中我是用交叉引用的方式插入图表编号的,样例文件较小手工才做问题也不大,但是汇总编纂时,同事们提供来的章节,很多人的图表既没有名称也没有编号,若采用人工方法是件非常辛苦的事。在一个单位里,若想让所有人都规规矩矩做word文件也是不现实的,很多人打字都很勉强,更别说一些设置了。若有VBA代码来做这件事,只要定义一个快捷键,或者把宏拖到工具栏,只要一下这个设置就完成了,能够大大提供工作效率,同时也减少出错率。
       当然,最理想的方式是批量操作,一篇文档中哪怕有100个图表,只要执行一个代码就能批量设置好所有图标的编号。
       我的所有操作都是从实践中的需要提出来的,过去sylun 大侠为我设计过很多有用的代码,其中一次性删除无用的垃圾样式、一次性整理非段落换行的文字,是非常实用、非常难得、我也极为珍视的,在此致以崇高的敬意!

样例.rar

79.08 KB, 下载次数: 44

TA的精华主题

TA的得分主题

发表于 2013-4-27 21:51 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Sub 插入标题编号()
Selection.InsertAfter Selection.Bookmarks("\headinglevel").Range.ListFormat.ListString
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-4-28 09:24 | 显示全部楼层
感谢2楼网友提供的代码,谢谢
     这个代码对于页面上的任何位置、表格内的单元格,都非常有效,但是对于文本框内,有运行错误“5941”,提示“集合所要求的成员不存在”,看来该代码不能识别光标放在文本框内的位置。在我1楼给出的样例中,图名是放在文本框内的,该代码对于样例中图名的编号不能用。
     如果文本框内的位置也有效就更完美了,能否在代码中增加个判断,如果光标在文本框内,就执行穿透文本框的代码。

     非常感谢zhanglei1371 网友的关照!

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-4-28 10:25 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
进一步的试验
       进一步的试验证发现2个问题:
       1、只要光标放在本word的最后的位置,执行代码就报错“5041”,提示“集合所要求的成员不存在”。这个问题不大,一般不会用到最后位置获取编号。
       2、运行代码插入文中的是纯数字文本,不是交叉连接。我的本意是要插入交叉链接,是域。为什么要交叉连接的域?因为只有这样,包含图标的文字块(或说章节)在编辑的移动粘接过程中,图号表号才会实现自动适应文章章节编号,不用再次重新编号,因为编号是链接到标题号的,例如,原来属于第二节的内容,其中包含图表及其编号,也包括在正文中引用这些图标编号的文字,如表2.1、图2.1,表2.2.1、图2.3.1等等(正文叙述中用到的图表编号也是用交叉链接的),现在粘贴到新文章中变为第5节了,那么原来文中的表2.1、图2.1,表2.2.1、图2.3.1等,现在会自动变成表5.1、图5.1,表5.2.1、图5.3.1。
       有网友可能不理解我为什么要搞这么复杂、麻烦,那是你不干这个工作不知道这儿的情况,我们搞工程投标时,完成任务的截止时间是不能突破的,往往在几天内就要拿出一个上千页的排版漂亮的大型文档,我是技术人员,主要精力还是要用在内容的编写上,同样排版的漂亮也有很高的要求,我不得不寻找提高效率的方法,像重新为图表编号是个简单劳动但是要全神贯注、细心核对才能不出错,手工操作2小时的工作,若用VBA代码帮助可能几分钟就搞定。

TA的精华主题

TA的得分主题

发表于 2013-4-28 14:15 | 显示全部楼层
本帖最后由 zhanglei1371 于 2013-4-28 15:47 编辑

可参考下守柔老大的代码:
http://club.excelhome.net/thread-294101-1-1.html
替换成交叉引用可以做到,在文本框内的解决不了

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-4-28 15:30 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
谢谢zhanglei1371 网友
     守柔的代码不是解决我的问题的。不过测试中发现其功能正好与守柔说的相反,不是把手动题注编号改成自动而是相反,把原来自动的域改成了纯文本数字。
     我想要的功能是:在光标处获得所在章节的交叉引用的标题编号,光标位置可以在表格里,或文本框里。
     谢谢您给予的帮助。

TA的精华主题

TA的得分主题

发表于 2013-4-28 15:53 | 显示全部楼层
就附件格式而言,可试试如下代码:
  1. Sub test()
  2.     '插入对插入点所属标题编号的交叉引用
  3.     Dim strRefitems() As String
  4.     Dim ref
  5.     Dim i As Integer
  6.     Dim strList As String
  7.     strRefitems = ActiveDocument.GetCrossReferenceItems(wdRefTypeNumberedItem)
  8.     If UBound(strRefitems) = 0 Then Exit Sub
  9.     With Selection
  10.         If .StoryType = wdMainTextStory Then
  11.             strList = .Bookmarks("\headinglevel").Range.ListFormat.ListString
  12.         ElseIf .StoryType = wdTextFrameStory Then
  13.             strList = .ShapeRange(1).Anchor.GoTo(wdGoToHeading, wdGoToPrevious).ListFormat.ListString
  14.         End If
  15.         For Each ref In strRefitems
  16.             i = i + 1
  17.             If Split(Trim(ref), Chr(32))(0) = Trim(strList) Then
  18.                 .InsertCrossReference wdRefTypeNumberedItem, wdNumberNoContext, i, True
  19.                 Exit For
  20.             End If
  21.         Next
  22.     End With
  23. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-4-28 17:17 | 显示全部楼层
太好了!
      sylun 大侠的代码是最棒的!
      这个代码完全符合我的需求,您的这个代码至少可以节约90%的手工操作劳动。我甚至可以把它做到为表头、图名专门定义的一个样式中,再定义快捷键,以后在编写或编辑文档时,只要一个快捷键,图表的编号就完成了。
      这样做的好处主要是适应大量的、重复率高的图表的插入。同时可以实现文章模块组装,重组后的新文章也不用重新编号了,只要整篇更新域就好了。
      word自身提供的题注功能虽好,但是并不能识别所有类型的图和表,也不能按章节编号。

     再次感谢您的帮组支援!

TA的精华主题

TA的得分主题

发表于 2013-4-28 23:33 | 显示全部楼层
看了你的需求,推荐你使用我编写的软件:http://club.excelhome.net/forum.php?mod=viewthread&tid=664005,其中有个写作功能,主要解决自动编号和交叉引用,要引用对象可以通过引用源的搜索,能比较好地解决你的问题。近来我将代码优化了,在上千页的文档中测试了,速度都还不错。
另外一般把题注放在文本框中是不规范的,同时也是不好用代码或者word自带功能来处理的。

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-5-1 16:38 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
谢谢你提供这个信息,找到你的介绍网页再仔细看。我的工作经常整理大型文档,写作倒是不算主要,因为自己写作可以按规矩来排版,主要是整理别人提供过来的不规范的排版、和文章格式。我在探索自己的方式,把图名图号放在文本框内再与图组合到一起,这样该图就成为一个可以复用的标准模块,再编写新文档或编纂汇总修订文档时方便“组装”,表格也一样,把表头放在表的第一行,该行设置成不显示表格筐线,同样也方便来回移动。如果不这样有什么坏处?最大的坏处就是移动不方便,还要重新键入图号名称,现实中因为图的版式不同来回拷贝几次位置就变化了,往往是图表移动走了,图表的名称往往落在原文件上不被发现,等打印出来时才发现。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-22 21:36 , Processed in 0.048700 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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