ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助]怎样用VBA将“{”和“}”分别替换成域标记的左右括号?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2006-4-23 20:12 | 显示全部楼层 |阅读模式
将一文本格式的文件进行适当的替换后以便能转换成WORD中的域代码,经初步替换后文中有大量类似下列文本的内容: {eq \f(1,{eq \r({eq \f(b,a)})})} 注意:上面的“{}”有相互嵌套的情况(有的又没有嵌套),且文中不止一个此类文本,如又有: {eq \r(3,{eq \f(1,2)})} 还可能有更多。 但这不是真正的域代码,因为“{}”是ASCII字符而不是域标记,如果能将文中的所有“{”都替换成域标记左括号,将所有“}”都替换成域标记右括号,上述2例就成了真正的域代码,这样再按Alt+F9或在VBA中执行相应的命令即可得公式。 请高手相助!谢谢!! [em09]

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-4-23 20:57 | 显示全部楼层

我根据守柔大侠的一处代码改写了一下,应该能初步达到目的,但我刚才试了一下,对一10页文件,费时太长,各位高手能否帮我优化一下,最好能提高效率和速度。

Sub TXT2EQ()


Dim SelStart As Long, SelRange As Range, NewSelStart As Long
Dim i As Range, MyPost As Long
On Error Resume Next
Application.ScreenUpdating = False
With ActiveDocument
SelStart = .Start '定义一个起始位置
Set SelRange = .Range '定义一个区域为选定区域
End With
While InStr(SelRange, "{") > 0 '设置如果指定区域中含有"{"则进入循环
NewSelStart = SelStart '定义一个开始位置
Set i = ActiveDocument.Range(NewSelStart, NewSelStart + 1)
While i <> "}" '设置如果i的文本值不是为"}"则进入循环
Set i = ActiveDocument.Range(NewSelStart, NewSelStart + 1) '重新定义i的区域
NewSelStart = NewSelStart + 1 '将i的起点位置下移一个字符位置
If i = "{" Then MyPost = NewSelStart - 1 '取得当i="{"的位置
Wend
'定义一个新区域
Set MyRange = ActiveDocument.Range(MyPost, NewSelStart)
With MyRange
.Characters(1) = "" '将{删除
.Characters(.Characters.Count) = "" '将}删除
.Select '选定
End With
Application.Run "InsertFieldChars" '插入域标志
Wend
Application.ScreenUpdating = True '恢复屏幕更新
End Sub

TA的精华主题

TA的得分主题

发表于 2006-4-24 12:25 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

草作,仅供参考,请测试一下:

Option Explicit
Sub Example()
Dim myRange As Range, TempRange As Range, lngStart As Long, lngEnd As Long
Dim FieldRange As Range, oField As Field
Application.ScreenUpdating = False
With ActiveDocument
GN: Set myRange = ActiveDocument.Content
With myRange.Find
.Text = "}"
Do While .Execute(replacewith:="", Replace:=wdReplaceOne)
lngEnd = myRange.End - 1
Set TempRange = ActiveDocument.Range(0, lngEnd)
With TempRange.Find
.Text = "{"
.Forward = False
If .Execute(replacewith:="", Replace:=wdReplaceOne) Then
lngStart = TempRange.Start
Set FieldRange = ActiveDocument.Range(lngStart, lngEnd)
FieldRange.Select
Application.Run "InsertFieldChars"
End If
End With
GoTo GN
Loop
End With
.Fields.Update
.ActiveWindow.View.ShowFieldCodes = False
End With
Application.ScreenUpdating = True
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-4-24 18:57 | 显示全部楼层

高手出手,就是不凡!非常谢谢守柔大侠!

3楼的代码快很多,文件短优势不算大,但我用一20页的文件测试,3楼的用时4分20秒,2楼的用时31分17秒,中途像是假死,但能看到滚动条的滑块缓缓下滑。

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-4-26 10:02 | 显示全部楼层
运用3楼的代码中的原理,还可以再加上转换表格的功能,但有几个问题我总是解决不了,反复看VBA的帮助文件也无获。请高手相助。 问题见附件。 Sub TXT2WORD() '处理EQ域 Dim myRange As Range, TempRange As Range, lngStart As Long, lngEnd As Long Dim FieldRange As Range, oField As Field Dim TableRange As Range, oTable As Table Application.ScreenUpdating = False With ActiveDocument GN: Set myRange = ActiveDocument.Content With myRange.Find .Text = "}" Do While .Execute(replacewith:="", Replace:=wdReplaceOne) lngEnd = myRange.End - 1 Set TempRange = ActiveDocument.Range(0, lngEnd) With TempRange.Find .Text = "{" .Forward = False If .Execute(replacewith:="", Replace:=wdReplaceOne) Then lngStart = TempRange.Start Set FieldRange = ActiveDocument.Range(lngStart, lngEnd) FieldRange.Select Application.Run "InsertFieldChars" End If End With GoTo GN Loop End With .Fields.Update .ActiveWindow.View.ShowFieldCodes = False End With '处理表格 With ActiveDocument GN1: Set myRange = ActiveDocument.Content With myRange.Find .Text = "~" Do While .Execute(replacewith:="", Replace:=wdReplaceOne) lngEnd = myRange.End - 1 Set TempRange = ActiveDocument.Range(0, lngEnd) With TempRange.Find .Text = "`" .Forward = False If .Execute(replacewith:="", Replace:=wdReplaceOne) Then lngStart = TempRange.Start Set TableRange = ActiveDocument.Range(lngStart, lngEnd) TableRange.Select With Selection .ConvertToTable Separator:=wdSeparateByCommas '转换成表格 .Columns.AutoFit '调整所有列宽使之适于文本宽度 End With End If End With GoTo GN1 Loop End With End With Application.ScreenUpdating = True End Sub K4JZIjG1.rar (27.63 KB, 下载次数: 12) [em09]

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-4-26 21:03 | 显示全部楼层

分析了一下代码,表格嵌套错位问题应是先转换子表后转换总表(即先里后外)造成的。但怎么解决这个问题呢?

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

本版积分规则

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

GMT+8, 2024-11-16 11:25 , Processed in 0.050153 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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