ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] 给word中的数字添加千分位符号

[复制链接]

TA的精华主题

TA的得分主题

发表于 2011-11-16 22:08 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 1024kb 于 2011-11-16 23:23 编辑

下午用word 2003干活,碰到给大量数字添加千分符的问题,搜了守柔的老帖子http://club.excelhome.net/forum.php?mod=viewthread&tid=65559,除了几张图片和word文档之外什么也没看到,只好自己动手丰衣足食,写了一个宏。没学过VB,完全现学现卖,欢迎批评指正。也不知道这个陈芝麻烂谷子的问题是不是早有人轻松解决了,权当玩玩吧。
除了4位数(及以上,有可能用到公元10000年吗?呵呵)的年份和三位以上的小数也会被分隔之外,其它都没有什么问题,表格中的数字也没问题。
使用了键盘左上角Esc下面的“`”作为终止标志符号,如果原文中包含该符号,可暂时替换为其他的。

Sub InsertThousandSplitSymbol()
'年份、小数也将被分隔,运行完毕之后应注意纠正。小数一般最多保留至小数点后两位,不会有太大影响;年份则通常有较为明显的特征,可以统一替换。
    Selection.HomeKey Unit:=wdStory
    Selection.TypeText Text:="`000 "
    Selection.EndKey Unit:=wdStory
    Selection.Find.ClearFormatting
    With Selection.Find
        .Text = "^#^#^#"
        .Replacement.Text = ""
        .Forward = False
        .Wrap = wdFindAsk
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchByte = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute
    Selection.MoveLeft Unit:=wdCharacter, Count:=2
    Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend
Do Until Selection = "`"
    If Asc(Selection) > 47 And Asc(Selection) < 58 Then
        If Len(Selection) = 1 Then
        Selection.MoveRight Unit:=wdCharacter, Count:=1
        Selection.TypeText Text:=","
        Else
        Selection.EndKey Unit:=wdLine
        End If
    Else
    End If
    Application.Browser.Previous
    Selection.MoveLeft Unit:=wdCharacter, Count:=2
    Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend
Loop
    Selection.HomeKey Unit:=wdStory
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "`000 "
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchByte = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-11-17 10:01 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
早上起来想了想,现在的方法是搜索3位连续的数字,搜索4位才更合理,也更简单,修改了一下。不过没系统地看过VB命令,没找到搜索至文首即退出循环的好方法,仍然采用了临时添加终止符号的方式,看起来麻烦了不少,请多指教。

Sub InsertThousandSplitSymbol()
'年份、小数也将被分隔,运行完毕之后应注意纠正。小数一般最多保留至小数点后两位,不会有影响;年份则通常有较为明显的特征,可以统一替换。
   Selection.HomeKey Unit:=wdStory
    Selection.TypeText Text:="`0000 "'在文档开始临时添加终止标识符。
    Selection.Find.ClearFormatting
    With Selection.Find
        .Text = "^#^#^#^#"
        .Replacement.Text = ""
        .Forward = False
        .Wrap = wdFindStop
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchByte = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute
    Selection.EndKey Unit:=wdStory'执行一次连续四位数字的搜索,并跳到文末,准备进入正题。
Do Until Selection = "`"
    Selection.MoveRight Unit:=wdCharacter, Count:=2
    Application.Browser.Previous'没有遇到终止符则跳至刚添加的分隔符左侧,继续查找左侧的连续四位数字。
    Selection.MoveLeft Unit:=wdCharacter, Count:=1
    Selection.MoveRight Unit:=wdCharacter, Count:=1
    Selection.TypeText Text:=","'添加分隔符。
    Selection.MoveLeft Unit:=wdCharacter, Count:=3
    Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend'选择已处理过的四位数左侧的字符,以检查是否遇到终止符。
Loop
    Selection.HomeKey Unit:=wdStory
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "`0,000 "
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchByte = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll'删除临时符号。
End Sub

TA的精华主题

TA的得分主题

发表于 2012-10-8 14:23 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2019-7-4 12:53 | 显示全部楼层
好用,像我的这种99999(1111-99999)这样的就只能通过这个vba了,必须顶起来!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-1-11 07:46 , Processed in 0.021638 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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