ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] word文档自动设置千分位问题

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-1-8 13:57 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
目的:将文档标为黄色的数值,自动以千分位形式展现。
下面是收集的两套代码,都有些问题,寻求帮助!
Sub 正则4千分位()
    On Error Resume Next
   Application.ScreenUpdating = False   '关闭屏幕更新,加快程序运行
    Dim myRange As Range,mt As Match, oRang As Range, n%, m%
   
    If Selection.Start<> Selection.End Then
        Set myRange =Selection.Range
    Else '无选择区
        Set myRange =ActiveDocument.Content '定义为主文档文字部分
    End If
   
    WithCreateObject("vbscript.regexp")
        .Pattern ="[0-9.]{4,}"  '正则表达式有些问题
        .Global = True:.IgnoreCase = False: .MultiLine = True
        For Each mt In.Execute(myRange.Text)
            m =mt.FirstIndex: n = mt.length
            Set oRang =ActiveDocument.Range(myRange.Start + m, myRange.Start + m + n)
            oRang.Text =VBA.Format(oRang.Text, "Standard") '修改格式
        Next
    End With
End Sub
Function GetRepeatedTimes(ByVal strParent As String, _
        ByVal strChild AsString) As Long
    Dim lngLenOfChild AsLong
   
    lngLenOfChild =Len(strChild)
   
    If lngLenOfChild Then
        GetRepeatedTimes= (Len(strParent) - Len(Replace(strParent, strChild, vbNullString))) /lngLenOfChild
    End If
End Function
Sub 千分位()
    '78085842(凯文)&1838095599(春天)@QQ群257182022(Word& VBA)
    '有些问题,会把年份都更改了
    On Error Resume Next
   Application.ScreenUpdating = False   '关闭屏幕更新,加快程序运行
    Dim Rng As Range,length%, End_selection&
   
    If Selection.Type =wdSelectionIP Then  'Selection.Start =Selection.End
        End_selection =ActiveDocument.Content.End
        Set Rng =ActiveDocument.Content '定义为主文档文字部分
    Else '有选择区
        End_selection =Selection.Range.End
        Set Rng =Selection.Range '定义为选中文字部分
    End If
   
    With Rng.Find
        .ClearFormatting
        .Text ="[.0-9]{4,}"    '查找数字
        .MatchWildcards =True
        
        Do While .Execute
            With .Parent
                If .Start> End_selection Then Exit Do
                If GetRepeatedTimes(.Text,".") > 1 Then Exit Do '数值有一个以上的小数点,则跳过
                length =Len(.Text)
                .Text =VBA.Format(VBA.Val(.Text), "Standard") '转为千分位格式
               End_selection = End_selection + Len(.Text) - length
                .Start =.End
            End With
        Loop
        
    End With
   
   Application.ScreenUpdating = True '恢复屏幕更新
End Sub
现将2019年度财务状况汇报如下:
2018年7月1日后入司员工发放奖金的50%。一位数1个,俩位数12件,三位数234元,招待费788.12元,房租4935元,办公费674539.00 元,本年实现100087.50 元,甲产品1234600.05元,剩余9776500.0116 元,利润-8324.032元。资产总额95.84元。最后结余0元。4133.897
  
18376
  
  
14133.897552
  
  
1484
  
  
-913
  
  
0.981
  
  
1.
  
  
.04842
  
  
0.1.2.3
  

方案.zip

14.57 KB, 下载次数: 6

TA的精华主题

TA的得分主题

发表于 2019-1-8 23:18 | 显示全部楼层
楼主,如果你下载试用我的《Word2003VBA通用模板宏(2019元旦版)》的话(即使是2007及以上版本也可以参考其中的代码),里面的《千分位》宏似乎能满足你的要求,下面是链接:
http://club.excelhome.net/thread-1452376-1-1.html

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-1-9 18:26 | 显示全部楼层
413191246se 发表于 2019-1-8 23:18
楼主,如果你下载试用我的《Word2003VBA通用模板宏(2019元旦版)》的话(即使是2007及以上版本也可以参考 ...

感谢,我学习下!!

TA的精华主题

TA的得分主题

发表于 2019-1-10 22:22 来自手机 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2019-1-11 00:26 | 显示全部楼层
谢谢 楼上 朋友!——我的《千分位》宏算了好久,才得到正确公式;而楼上朋友提供的代码仅一行代码,即解决问题,太好了!——经我实践,可以这样做:(假设选定了一串数字,不包括段落标记)
如果是整数:Selection.Text=VBA.Format(Selection.Text,"#,###")
如果是小数:Selection.Text=VBA.Format(Selection.Text,"#,###.##")
* 不知 楼上 朋友 对于 人民币中文大写金额 有什么一行代码没有?(如:34.57元,转换为大写)。

TA的精华主题

TA的得分主题

发表于 2019-1-11 08:10 来自手机 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
413191246se 发表于 2019-1-11 00:26
谢谢 楼上 朋友!——我的《千分位》宏算了好久,才得到正确公式;而楼上朋友提供的代码仅一行代码,即解决 ...

那个没有研究,这个千分位格式是微软设计的。

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-1-11 13:26 | 显示全部楼层
修改完善了一下,find后format,正则基本放弃了,实在不会
  1. Sub 千分位()
  2.     '78085842(凯文)&1838095599(春天)@QQ群257182022(Word & VBA)
  3.     On Error Resume Next
  4.     Application.ScreenUpdating = False    '关闭屏幕更新,加快程序运行
  5.     Dim Rng As Range, length%, End_selection&
  6.    
  7.     If Selection.Type = wdSelectionIP Then  'Selection.Start = Selection.End
  8.         End_selection = ActiveDocument.Content.End
  9.         Set Rng = ActiveDocument.Content '定义为主文档文字部分
  10.     Else '有选择区
  11.         End_selection = Selection.Range.End
  12.         Set Rng = Selection.Range '定义为选中文字部分
  13.     End If
  14.    
  15.     With Rng.Find
  16.         .ClearFormatting
  17.         .Text = "[.0-9]{4,}"    '查找数字
  18.         .MatchWildcards = True
  19.         
  20.         Do While .Execute
  21.             With .Parent
  22.                 If .Start > End_selection Then Exit Do
  23.                 If CountStr(.Text, "[\.]") > 1 Then Exit Do '数值有一个以上的小数点,则跳过
  24.                 length = Len(.Text)
  25.                 .Text = VBA.Format(VBA.Val(.Text), "Standard") '转为千分位格式
  26.                 End_selection = End_selection + Len(.Text) - length
  27.                 .Start = .End
  28.             End With
  29.         Loop
  30.         
  31.     End With
  32.     '有些问题,会把年份都更改了。将修改的年份恢复(全文)
  33.     ActiveDocument.Content.Find.Execute FindText:="(2),([0-9]{3}).00年", ReplaceWith:="\1\2年", Replace:=wdReplaceAll, MatchWildcards:=True
  34.     Application.ScreenUpdating = True '恢复屏幕更新
  35. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2019-1-13 14:38 | 显示全部楼层

Sub 设置千分位格式()
Dim myRange As Range, myValue As Double
Application.ScreenUpdating = False '关闭屏幕更新,加快程序运行
Do '进入一个循环
'定义myRange为活动文档的主文字部分
Set myRange = ActiveDocument.Content
With myRange.Find '查找设置
.ClearFormatting '清除格式
.Text = "[0-9]{4,}[!年]" '查找四个以上的数字且其后为不为年的内容
.MatchWildcards = True '使用通配符
If .Execute = False Then Exit Do '如果未找到则退出循环
myValue = Val(myRange.Text) '取得数字
myRange.SetRange myRange.Start, myRange.End - 1 '重新定义myRange对象
myRange.Text = VBA.Format$(myValue, "#,##0") '写入千分位格式
End With
Loop
Application.ScreenUpdating = True '恢复屏幕更新
End Sub

TA的精华主题

TA的得分主题

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

TA的精华主题

TA的得分主题

发表于 2020-10-22 18:08 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
sandorn 发表于 2019-1-11 13:26
修改完善了一下,find后format,正则基本放弃了,实在不会

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

本版积分规则

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

GMT+8, 2024-11-24 02:54 , Processed in 0.042196 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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