ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] 域代码纯文本化及其智能转换

[复制链接]

TA的精华主题

TA的得分主题

发表于 2008-11-10 11:55 | 显示全部楼层 |阅读模式
一直以来,在WORD的学习中时常需要将域代码纯文本化为变形域文本,或将变形域文本转换成域代码。在这方面,老大的GetViewFieldCodes和SetViewFieldCodes两个经典程序使我受益良多。最近受Gemj兄帖子的吸引,突发奇想:能否做到域代码与变形域文本间相互智能转换?这样一个程序就可处理,使用起来将更方便。在参考老大程序的基础上,尝试用另一种思路编写。几经测试,总算写出基本代码。
没有详细测试程序的可靠性及适应性。欢迎测试,并提出修改意见。

Sub TransFieldCodes()
'智能判断将转换后的域代码文本(变形域)复制到剪贴板,或将变形域文本转换为域代码
'无选定区域则作全文档处理。对光标位于非主文档文字部分(页眉页脚等)且无选定内容,则处理该文字部分全部内容
Dim SelRange As Range, myRange As Range, TF As Boolean, TF2 As Byte, oText As String
On Error Resume Next
Application.ScreenUpdating = False
TF = ActiveDocument.ActiveWindow.View.ShowFieldCodes  '获取活动文档域代码显示设置
If TF = False Then ActiveDocument.ActiveWindow.View.ShowFieldCodes = True  '显示域代码
With Selection
    If .Type = wdSelectionIP And .StoryType <> wdMainTextStory Then .Expand wdStory
    Set SelRange = .Range  '取得原选定区域范围
    Set myRange = VBA.IIf(.Type = wdSelectionIP, ActiveDocument.Content, .Range)  '确定处理区域
    If .Type = wdSelectionIP Then .HomeKey wdStory Else .Collapse wdCollapseStart  '光标定位初始化
    If myRange.Fields.Count > 0 And VBA.InStr(myRange.Text, "}") Then _
        TF2 = MsgBox("要将域代码转换为变形域吗?", vbYesNo)  '如处理区域既有域也有普通大括号字符时确定处理方式
    If VBA.InStr(myRange.Text, "}") And TF2 <> 6 Then  '变形域转换为域代码
        Do While .MoveUntil("}")  '依次处理每对大括号
            If .End > myRange.End Then Exit Do
            .Delete
            .MoveStartUntil "{", wdBackward
            ActiveDocument.Fields.Add .Range, wdFieldEmpty, , False
            .MoveStartUntil "{", wdBackward
            .Previous.Delete
            '以下循环语句部分用以删除插入域后产生的多余空格
            If .Characters.First = Chr(32) Then
                .Characters(3).Delete
                .Collapse wdCollapseStart
                .Delete
                .MoveEnd
             Else
                .Characters(2).Delete
            End If
            .SetRange .End - 2, .End - 2
            .Delete
        Loop
        ActiveDocument.Fields.Update
    ElseIf myRange.Fields.Count > 0 Then  '域代码替换为变形域文本(不适用于须保留指定内容其余格式的情形)
        oText = myRange.Text
        oText = VBA.Replace(oText, Chr(19), "{")
        oText = VBA.Replace(oText, Chr(21), "}")
        .Text = oText
        .Cut  '将临时插入的变形域文本剪切到剪贴板
    End If
End With
ActiveDocument.ActiveWindow.View.ShowFieldCodes = TF  '还原域代码显示设置
SelRange.Select  '还原选定状态
Application.ScreenUpdating = True
End Sub

[ 本帖最后由 sylun 于 2008-11-14 00:56 编辑 ]

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2008-11-10 12:31 | 显示全部楼层
第一个支持!

TA的精华主题

TA的得分主题

发表于 2008-11-12 19:30 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2009-4-19 10:03 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
收藏备用!感谢sylun兄的分享!

TA的精华主题

TA的得分主题

发表于 2009-9-27 08:56 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-9-27 09:50 | 显示全部楼层
请dsp5000兄具体指出运行出错的行,最好能提供测试文本内容。

TA的精华主题

TA的得分主题

发表于 2009-9-27 10:04 | 显示全部楼层
呵呵,保存文件后重新打开,没问题了。好使。

TA的精华主题

TA的得分主题

发表于 2009-10-22 13:15 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
感谢分享,太爱excelhome了,如果EXCELHOME是mm的话......一定多多努力,争取早点配上如此“美女”

TA的精华主题

TA的得分主题

发表于 2009-11-15 10:14 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
谢谢分享,收下,

TA的精华主题

TA的得分主题

发表于 2011-4-19 23:22 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
不太懂慢慢学习~~~~~~~~~
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-6-2 15:46 , Processed in 0.043053 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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