求教版里达人老师:如何用VBA将文档中的文本框中的部分文字“格式化”
时间:2011-02-26
来源:互联网
请教:
对当前Word文档中的所有文本框中的每行文字进行如下格式化:每行中第一个空格字符前、起行大写字母串后的字符部分进行红色、加粗显示(可能有的行没有这样的字符)该如何用VBA批量操作?
说明:
“起行大写字母串后的”是指行首是大写字母或连续的大写字母的,则从它后面的第一个字符开始,到这个行内第一次出现空格的位置,这两者之间的字符(附件中的文档在这个位置不小心多打了“副本”两字)进行红色显示。
注意:
有的文本框跟其它对象进行了组合操作,还有的是竖排文本框
本问题的关键:
1.VBA格式化文本框中部分字符;
2.若用正则表达式,好像VB不支持零宽后行断言。那这里的字符匹配问题能否有其它的变通方法;
3.文本框与其他对象组合后使问题变得更加不好处理了。有人提议先用VBA解除组合,可惜我不会弄。另外解除组合后还能用VBA来还原组合吗。
详情见附件及图片。
另外说明一下,这个问题我已经发了个Excel版的,因为没有得到解答,所有特转成Word版发到本版块,看能否请守柔、konggs、c81等高人解决解决。在这里先谢谢大家啦!
[ 本帖最后由 cg372101 于 2011-2-26 19:44 编辑 ]
Help.gif(45.06 KB)
Help.rar(15.3 KB)
对当前Word文档中的所有文本框中的每行文字进行如下格式化:每行中第一个空格字符前、起行大写字母串后的字符部分进行红色、加粗显示(可能有的行没有这样的字符)该如何用VBA批量操作?
说明:
“起行大写字母串后的”是指行首是大写字母或连续的大写字母的,则从它后面的第一个字符开始,到这个行内第一次出现空格的位置,这两者之间的字符(附件中的文档在这个位置不小心多打了“副本”两字)进行红色显示。
注意:
有的文本框跟其它对象进行了组合操作,还有的是竖排文本框
本问题的关键:
1.VBA格式化文本框中部分字符;
2.若用正则表达式,好像VB不支持零宽后行断言。那这里的字符匹配问题能否有其它的变通方法;
3.文本框与其他对象组合后使问题变得更加不好处理了。有人提议先用VBA解除组合,可惜我不会弄。另外解除组合后还能用VBA来还原组合吗。
详情见附件及图片。
另外说明一下,这个问题我已经发了个Excel版的,因为没有得到解答,所有特转成Word版发到本版块,看能否请守柔、konggs、c81等高人解决解决。在这里先谢谢大家啦!
[ 本帖最后由 cg372101 于 2011-2-26 19:44 编辑 ]
附件

2011-2-26 19:28

2011-2-26 19:28, 下载次数: 2
作者: cg372101 发布时间: 2011-02-26
可试试如下代码:
复制内容到剪贴板
Dim S As Shape, SS As Shape
Application.ScreenUpdating = False
For Each S In ActiveDocument.Shapes
If S.Type = msoTextBox Then
aa S.TextFrame.TextRange
ElseIf S.Type = msoGroup Then
For Each SS In S.GroupItems
If SS.Type = msoTextBox Then aa SS.TextFrame.TextRange
Next
End If
Next
Application.ScreenUpdating = True
End Sub
Sub aa(myRange As Range)
Dim aPar As Paragraph, a As String, i As Integer
For Each aPar In myRange.Paragraphs
With aPar.Range.Find
.Text = "[A-Z][!^32]@^32"
.MatchWildcards = True
If .Execute Then
With .Parent
a = .Text
.Expand wdParagraph
If .Text Like a & "*" Then
For i = 1 To Len(a)
If Mid(a, i, 1) Like "[!A-Z]" Then
.SetRange .Start + i - 1, .Start + Len(a) - 1
.Font.Color = wdColorRed
.Font.Bold = True
Exit For
End If
Next
End If
End With
End If
End With
Next
End Sub
代码:
Sub test()Dim S As Shape, SS As Shape
Application.ScreenUpdating = False
For Each S In ActiveDocument.Shapes
If S.Type = msoTextBox Then
aa S.TextFrame.TextRange
ElseIf S.Type = msoGroup Then
For Each SS In S.GroupItems
If SS.Type = msoTextBox Then aa SS.TextFrame.TextRange
Next
End If
Next
Application.ScreenUpdating = True
End Sub
Sub aa(myRange As Range)
Dim aPar As Paragraph, a As String, i As Integer
For Each aPar In myRange.Paragraphs
With aPar.Range.Find
.Text = "[A-Z][!^32]@^32"
.MatchWildcards = True
If .Execute Then
With .Parent
a = .Text
.Expand wdParagraph
If .Text Like a & "*" Then
For i = 1 To Len(a)
If Mid(a, i, 1) Like "[!A-Z]" Then
.SetRange .Start + i - 1, .Start + Len(a) - 1
.Font.Color = wdColorRed
.Font.Bold = True
Exit For
End If
Next
End If
End With
End If
End With
Next
End Sub
作者: sylun 发布时间: 2011-02-26
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28