ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] 人民币中文大写(宏)2019-6-1

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-7-26 23:25 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
借用413191246se老师地盘,再分享一段重新写的RMB大写代码,文本搜索过程全部用正则处理,并吸收了他人好的经验技巧。
还是那句话,小写转大写用处不是很大,主要是换一下脑筋,算是与413191246se老师和喜爱的坛友互相交流吧。
  1. Private Sub 人民币大写()
  2. s$ = ActiveDocument.Range.Text                                   '整篇文本赋予s$
  3. With CreateObject("VBScript.RegExp")                             '建立正则对象
  4.     .Global = True                                               '全局查找或替换
  5.     .Pattern = "[\d.,,\u0020\u3000\u00A0]+(?=元)"               '小写模式串
  6.      Set g = .Execute(s)                                         '返回小写集合对象
  7.      For j = g.Count - 1 To 0 Step -1                            '倒序循环处理
  8.          n = g.Item(j).Value                                     '获取小写金额
  9.          If n Like "*.*.*" Then MsgBox n & "元<--小数点过多!": GoTo sk
  10.         '下列正则表达式对小写作规范处理
  11.         .Pattern = "[\u0020\u3000\u0009\u00A0,,]"               '去掉空格及数字分节号
  12.          n = .Replace(n, "")                                     '替换成空字符
  13.          n = Format(n * 100, "0")                                '将小写化成整数
  14.          If Len(n) > 15 Then MsgBox "数字超出15位啦! ": GoTo sk  '金额超万亿位就退出
  15.          Caps = ""
  16.         '下列For语句循环替换成大写
  17.          For i = 0 To Len(n) - 1                                   '按数字位数循环替换
  18.             s1 = Mid(n, Len(n) - i, 1)                            '从末位起逐位取数字
  19.             s2 = Mid("零壹贰叁肆伍陆柒捌玖", s1 + 1, 1)           '取相应数字的大写
  20.             s3 = Mid("分角元拾佰仟万拾佰仟亿拾佰仟万", i + 1, 1)  '从左边起逐位取单位
  21.             Caps = s2 & s3 & Caps                                 '连接数字大写与单位大写
  22.          Next i
  23.         '下列正则表达式去掉多余的"零"
  24.         .Pattern = "(零[仟佰拾角分])+零?"
  25.          Caps = .Replace(Caps, "零")
  26.         .Pattern = "零?([亿万元])(零万)?"
  27.          Caps = .Replace(Caps, "$1")
  28.         .Pattern = "零$"
  29.          Caps = .Replace(Caps, "整")
  30.          If n = 0 Then Caps = "零元整"
  31.         '下列三行插入RMB大写(于小写之前)
  32.          st = g.Item(j).FirstIndex                      '取得小写前的位置号
  33.          Selection.SetRange Start:=st, End:=st          '光标定位于插入点
  34.          Selection.InsertBefore Text:="人民币" & Caps   '插入大写金额
  35. sk:
  36.      Next j
  37. End With
  38. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-7-27 12:18 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
谢谢 楼上朋友! 正则我还是不会,但很羡慕!尤其是,现在各位高手老师,都会正则。有时间测试一下结果是否正确。

TA的精华主题

TA的得分主题

发表于 2019-7-27 17:00 | 显示全部楼层
本帖最后由 qdnzlh 于 2019-7-29 18:54 编辑

楼主老师其实是高手,我看你论坛发了很多不错的代码,正则不会其实很正常,我原来也不会。过去对正则表达式也只了解一点皮毛,就是最基本的语法符号,比如:[] () ? + * . \ | ^ $ 这十种符号。后来听很多高手大师都说正则对文本字符串的搜索、提取、替换等功能十分强大,今年以来就下决心学习。现在对基本的东西能够应付,由于正则表达式千变万化,复杂的还是不行。现在自己的感觉,正则这东西对文本字串的处理,是要比各种语音自带的搜索替换功能强大和灵活的多,不了解的话确实可惜。

楼主老师编了很多有技巧性的实用代码,正则这东西对你应该不是什么难题,可能花个几晚上你就会了。

这里顺变再对上面我给出的代码,第5行的小写模式串再完善一下:
考虑到数字金额第一个字符必须是数字(半角或全角),不能是逗号或小数点,否则会连 “……中国,元旦……”中的 “,元”,或者 “……new year. 元旦……” 中的 “. 元” 也能匹配。同时,金额中可能会夹杂半角空格或不间断空格,在数字与“元”之间可能会有全角空格,但夹杂制表符的可能性不大,故不含制表符。修改完善的正则表达式如下:
.Pattern = "[0-9\d][0-9\d.,,\u0020\u3000\u00A0]*(?=元)"

其中:0-9为全角数字,\d 代表半角数字。* 代表左边[]中的内容可有可无,也可出现多次。(?=元) 表示匹配时要查询一下“元”这个字符,若有,就去匹配左边的内容 (匹配内容不含字符“元”)

TA的精华主题

TA的得分主题

发表于 2020-9-11 19:22 | 显示全部楼层
大神,能不能直接做成报表,我复制好像不行。

TA的精华主题

TA的得分主题

发表于 2020-10-15 19:11 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2024-3-18 09:27 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
很实用,收藏中

TA的精华主题

TA的得分主题

发表于 2024-3-29 18:55 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-25 15:18 , Processed in 0.044996 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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