ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 向前辈们求一个“查找文档中不成对的符号标为红色”的宏

[复制链接]

TA的精华主题

TA的得分主题

发表于 2015-11-3 07:21 | 显示全部楼层 |阅读模式
本帖最后由 13907933959 于 2015-11-3 08:52 编辑

如:以下符号有不成对(有右边、缺左边,有左边、缺右边)的,标为红色。

‘’“”()[]{}〔〕〈〉《》「」『』〖〗【】

其中在文档中,如段落开头或单行开头,碰到单边右括号里有数字的,如: 123)……、一)二)三)……除外。

晚辈先谢谢前辈们!






TA的精华主题

TA的得分主题

 楼主| 发表于 2015-11-5 09:48 | 显示全部楼层
求路过的前辈出手相助,晚辈将万分感谢!

TA的精华主题

TA的得分主题

发表于 2015-11-6 16:20 | 显示全部楼层
本帖最后由 413191246se 于 2015-11-7 00:37 编辑

139:在 VBE(编程环境)中,右键工具栏勾选“编辑”工具栏,点击“设置注释块”按钮,可注释一行或几行代码行,下面的宏如果不喜欢《重波浪线》这两行语句可自行注释掉(该宏未加 一)二)三)规避):(略)

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-11-6 19:08 | 显示全部楼层
413191246se 发表于 2015-11-6 16:20
139:在 VBE(编程环境)中,右键工具栏勾选“编辑”工具栏,点击“设置注释块”按钮,可注释一行或几行代 ...

师傅好!
终于等到您的这个代码了,我知道只有您才有办法解决它,真是给力,师傅为徒弟的事总是双保险,还设有重波浪线,一目了然、准确无误,我再也不用一个一个找,一个一个对了。感谢师傅!
师傅、在保证这个效果的前题下,还有不有办法,把在文档中,如段落开头或单行开头,碰到单边右括号里有数字的,如: 1)2)3)……、1)、2)、3)、……、或 一)二)三)……一)、二)、三)、……规避掉?如能、这个将又是一个十全十美的宏。

TA的精华主题

TA的得分主题

发表于 2015-11-7 00:32 | 显示全部楼层
139:试试这次的代码,一般地说是行了,但不保证绝对正确:
  1. Sub 查找不成对符号()
  2.     Dim a, b, i As Long
  3.     a = Array("‘", "“", "(", "[", "{", "〔", "〈", "《", "「", "『", "〖", "【")
  4.     b = Array("’", "”", ")", "]", "}", "〕", "〉", "》", "」", "』", "〗", "】")
  5.     ActiveDocument.Content.InsertBefore Text:=vbCr
  6.     Do
  7.         '前符号
  8.         Selection.HomeKey Unit:=wdStory
  9.         Selection.Find.ClearFormatting
  10.         Do While Selection.Find.Execute(findtext:=a(i), Forward:=True)
  11.             Do
  12.                 Selection.MoveEnd Unit:=wdCharacter, Count:=1
  13.                 If Selection.Characters.Last.Text = vbCr Then GoTo aaa
  14.                 If Selection.Characters.Last.Text = b(i) Then
  15.                     Exit Do
  16.                 ElseIf Selection.Characters.Last.Text = a(i) Then
  17. aaa:
  18.                     Selection.Characters.First.Font.Color = wdColorRed '红色
  19.                     Selection.Characters.First.Font.Underline = wdUnderlineWavyHeavy '重波浪线
  20.                     Selection.MoveEnd Unit:=wdCharacter, Count:=-1
  21.                     Exit Do
  22.                 End If
  23.             Loop
  24.             Selection.MoveRight Unit:=wdCharacter, Count:=1
  25.         Loop
  26.         '后符号
  27.         Selection.EndKey Unit:=wdStory
  28.         Selection.Find.ClearFormatting
  29.         Do While Selection.Find.Execute(findtext:=b(i), Forward:=False)
  30.             Do
  31.                 Selection.MoveStart Unit:=wdCharacter, Count:=-1
  32.                 If Selection.Characters.First.Text = vbCr Then GoTo bbb
  33.                 If Selection.Characters.First.Text = b(i) Then
  34. bbb:
  35.                     If Len(Selection) <= 7 And Selection Like vbCr & "*[0-9a-zA-Z0-9a-zA-Z一二三四五六七八九十百零甲乙丙丁戊己庚辛壬癸])" Then GoTo ccc
  36.                     Selection.Characters.Last.Font.Color = wdColorRed '红色
  37.                     Selection.Characters.Last.Font.Underline = wdUnderlineWavyHeavy '重波浪线
  38.                     Selection.MoveStart Unit:=wdCharacter, Count:=1
  39.                     Exit Do
  40.                 ElseIf Selection.Characters.First.Text = a(i) Then
  41.                     Exit Do
  42.                 End If
  43.             Loop
  44. ccc:
  45.             Selection.MoveLeft Unit:=wdCharacter, Count:=1
  46.         Loop
  47.         i = i + 1
  48.     Loop Until i = 12
  49.     If ActiveDocument.Paragraphs(1).Range.Text = vbCr Then ActiveDocument.Paragraphs(1).Range.Delete
  50. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2015-11-7 00:36 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
139---楼上代码第3/4行是一维数组,其中的元素是由英文双引号括起来的,现在是12个元素,a 是前半个符号的集合,b 是后半个符号的集合,如果你想再增加一对成对的符号的话,需要注意每个元素之间有双引号,并且是由逗号分隔的,而且,第48行代码,要改为 Loop Until i=13。

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-11-7 08:42 | 显示全部楼层
本帖最后由 13907933959 于 2015-11-7 08:45 编辑
413191246se 发表于 2015-11-7 00:36
139---楼上代码第3/4行是一维数组,其中的元素是由英文双引号括起来的,现在是12个元素,a 是前半个符号的 ...

师傅好!
现在这个宏以十全十美了,真是太好用了!谢谢师傅!
师傅、您的意思是不是说:数组里面的元素有多少组的符号,第48行代码Loop Until i= ??,后面的数字,也要相应改为多少?
师傅、再问一下,数组里面的元素最多可放多少个?

TA的精华主题

TA的得分主题

发表于 2015-11-7 11:51 | 显示全部楼层
本帖最后由 413191246se 于 2015-11-7 11:52 编辑

是的,139,数组里面的元素数值要与第48行代码的数值一样(因为用的是循环控制结构 Do...Loop语句,要准确循环才可以,否则就会产生错误了);数组元素可能是255个吧,数组我不太熟,现在是一维数组,多维数组威力更大。

TA的精华主题

TA的得分主题

发表于 2015-11-7 12:04 | 显示全部楼层
413191246se 辛苦了!惭愧有一段时间都没来学习了,有时看到需要考虑的因素较多的问题就有力不从心的感觉。
这个问题对于长篇文档的整理比较实用,测试5楼的代码发现部分标点如 <>、[]、{} 未能标注?不知道是不是我哪里操作不对的原因。
另外有些疑问:(1)跨段落匹配的标点算不算成对?
              (2)多层嵌套匹配的标点算不算成对?

TA的精华主题

TA的得分主题

发表于 2015-11-7 12:56 | 显示全部楼层
本帖最后由 413191246se 于 2015-11-7 13:04 编辑

版主谦虚!——测试有限,如 <>、[]、{} 等未加测试。——的确是将配对限制在一个段落内,跨段落情况未考虑。多层嵌套更是不敢企及(本人虽然被139称作师傅,但实际仍为VBA小菜鸟,跟论坛版主/高人们无法比)。谢谢!

*****另外,版主:我是将楼主 139 的这些符号(都是全角)直接使用,如果是半角的符号,未加考虑,须用《半角符号转全角》宏先转换。
*****现在感觉,有很多宏当时认为是正确无误完美的,但有时遇到特殊情况就出错了,不完美了,所以,感觉完美的宏很少,总不到位。

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

本版积分规则

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

GMT+8, 2024-11-24 16:17 , Processed in 0.039813 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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