ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] 人民币中文大写(宏)- 最新修正!

[复制链接]

TA的精华主题

TA的得分主题

发表于 2016-9-18 14:47 | 显示全部楼层
413191246se 发表于 2016-9-12 22:31
谢谢 loquat 朋友!
139:你 5 楼的要求,当然是能办到的,但是,到底是你对呢?还是我对呢?这个不好说了 ...

师傅好!
能不能先满足我5楼的要求?把代码小数字的部分先给优化一下,我想先把帐本小数字的这部分整理完。谢谢师傅!

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-9-22 02:26 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
* 本宏对三位小数或以上,自动四舍五入为二位小数。
* 本宏对原文数字(小写金额)只设置格式,并不改变一个字符(不删除/不增加)。
* 顺便对徒弟 139 说一声:带不带“零”字,在转换时要看原数字是否有“0”,不可人为添加。
* 请各位朋友,有时间可以认真学习一下《正确填写票据和结算凭证的基本规定》一文。

TA的精华主题

TA的得分主题

发表于 2016-9-22 11:21 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 13907933959 于 2016-9-22 16:24 编辑

师傅好!
测试小于10亿的数字,准确无误,代码来得真不容易!!!师傅辛苦!!!

TA的精华主题

TA的得分主题

发表于 2016-9-22 11:22 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 13907933959 于 2016-9-22 16:24 编辑
413191246se 发表于 2016-9-22 02:26
* 本宏对三位小数或以上,自动四舍五入为二位小数。
* 本宏对原文数字(小写金额)只设置格式,并不改变一 ...

师傅好!
测试小于10亿的数字,准确无误,代码来得真不容易!!!师傅辛苦!!!

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-10-16 22:09 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
顶以更新!
....最近,因为全新重写了代码,重新修正了算法,并重新键入了大约 3700 行测试数字,每天用于此宏的测试时间并不多,致使最近从 9月22日一直到迁延到现在才完成本宏,主要是10亿以上百亿、千亿数字,实际用处并不大,但没有似乎还不行,工夫全耽误在百亿、千亿这些数字上面了,总算完成此宏!(此宏终结!)
....139 徒弟请注意:明天我再把《人民币中文小写》代码再更新一遍发到楼下!

TA的精华主题

TA的得分主题

发表于 2016-10-16 23:55 来自手机 | 显示全部楼层
413191246se 发表于 2016-10-16 22:09
顶以更新!
....最近,因为全新重写了代码,重新修正了算法,并重新键入了大约 3700 行测试数字,每天用于 ...

感觉用正则表达式来做,应该可行,且速度也很快!

TA的精华主题

TA的得分主题

发表于 2016-10-17 16:58 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
413191246se 发表于 2016-10-16 22:09
顶以更新!
....最近,因为全新重写了代码,重新修正了算法,并重新键入了大约 3700 行测试数字,每天用于 ...

师傅好!
师傅您真让徒弟感动!!!

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-10-17 20:43 | 显示全部楼层
....谢谢 段先生!你是 VBA & 正则 高手,相信能办到!
....其实,我是 VBA 菜鸟,勉强会编一些小宏,主要是不想求高手,自己能解决的就自己编了,算法不行,功力不行,但还算自给自足。
....谢谢 徒弟 139 !
下面是《人民币中文小写》的代码,由《人民币中文大写》加了一段转换代码而成,不知对不对:
  1. Sub 人民币中文小写()
  2. '功能:全文查找数字元(也可单选数字)转换为人民币中文小写

  3.     Dim i As String, j As String, k As String, x As String, y As String, u As Long, v As Long, n As Long, s As Long
  4.     x = MsgBox("小写是否放在数字前面?(否则后面)", vbYesNoCancel + vbExclamation, "人民币中文小写")
  5.     If x = vbYes Then
  6.         n = 1
  7.     ElseIf x = vbNo Then
  8.         n = 0
  9.     Else
  10.         End
  11.     End If

  12. '全文/单个
  13.     If Selection.Type <> wdSelectionIP Then
  14.         Do While Selection.Characters.First Like "[!0-90-9]"
  15.             Selection.MoveStart Unit:=wdCharacter, Count:=1
  16.         Loop
  17.         Do While Not (Selection.Characters.Last Like "[0-90-9.,,  ]" Or Selection.Characters.Last Like ChrW(160))
  18.             Selection.MoveEnd Unit:=wdCharacter, Count:=-1
  19.         Loop
  20.         Selection.MoveEnd Unit:=wdCharacter, Count:=1
  21.         If Selection Like "*[!元]" Then
  22.             Selection.MoveEnd Unit:=wdCharacter, Count:=-1
  23.             Selection.InsertAfter Text:="元"
  24.         End If
  25.         s = 1
  26.         GoTo SingleNum
  27.     End If

  28. '全文查找数字元
  29.     Selection.HomeKey Unit:=wdStory
  30.     Selection.Find.ClearFormatting
  31.     Do While Selection.Find.Execute(findtext:="^#", Forward:=True)
  32.         Do While Selection.Characters.Last Like "[0-90-9.,,  ]" Or Selection.Characters.Last Like ChrW(160)
  33.             Selection.MoveEnd Unit:=wdCharacter, Count:=1
  34.         Loop
  35. SingleNum:
  36.         If Selection Like "*元" Then
  37.             '格式处理
  38.             Selection.Font.Bold = True '加粗
  39.             Selection.Font.Color = wdColorBlue '蓝色
  40.             Selection.Font.Underline = wdUnderlineWavyHeavy '重波浪线

  41.             '选定数字
  42.             Selection.MoveEnd Unit:=wdCharacter, Count:=-1
  43.             k = "万仟佰拾亿仟佰拾万仟佰拾元空角分"
  44.             i = Selection

  45.             '规范数字
  46.             i = Replace(i, ChrW(160), "") '替换不间断空格
  47.             i = Replace(i, " ", "") '替换半角空格
  48.             i = Replace(i, " ", "") '替换全角空格
  49.             i = Replace(i, ",", "") '替换英文逗号
  50.             i = Replace(i, ",", "") '替换中文逗号
  51.             i = Format(i) '删除数字前后无效零/小数点

  52.             '单个数字
  53.             If s = 1 Then
  54.                 i = StrConv(i, vbNarrow) '全角转半角
  55.                 Dim a
  56.                 a = Val(i) '数值型
  57.                 If Len(i) <> Len(a) Then MsgBox "非纯数字,无法转换!!!", vbOKOnly + vbCritical, "人民币中文大写": End
  58.             End If

  59.             If i Like ".*" Then i = "0" & i

  60.             '错误报警
  61.             If Selection Like "*.*.*" Or Val(i) > 999999999999.99 Then
  62.                 Selection.Font.Color = wdColorRed '红色
  63.                 Selection.Font.Underline = wdUnderlineWavyHeavy '重波浪线
  64.                 GoTo Skip
  65.             End If

  66.             '强制格式
  67.             If i Like "*?.??" Then
  68.             ElseIf i Like "*?.?" Then
  69.                 i = i & "0"
  70.             ElseIf i Like "*?.???*" Then
  71.                 i = Format(i, "0.00")
  72.             Else
  73.                 i = i & ".00"
  74.             End If

  75.             '核心代码
  76.             v = Len(i)
  77.             k = Right(k, v)
  78.             u = 0
  79.             y = ""
  80.             Do
  81.                 u = u + 1
  82.                 j = Mid(i, u, 1) & Mid(k, u, 1)
  83.                 y = y & j
  84.             Loop Until u = v
  85.             i = y

  86.             '基本替换
  87.             i = Replace(i, "1", "壹")
  88.             i = Replace(i, "2", "贰")
  89.             i = Replace(i, "3", "叁")
  90.             i = Replace(i, "4", "肆")
  91.             i = Replace(i, "5", "伍")
  92.             i = Replace(i, "6", "陆")
  93.             i = Replace(i, "7", "柒")
  94.             i = Replace(i, "8", "捌")
  95.             i = Replace(i, "9", "玖")
  96.             i = Replace(i, "0", "零")
  97.             i = Replace(i, ".", "点")
  98.             i = Replace(i, "点空", "")

  99.             '零字替换
  100.             i = Replace(i, "零仟", "零")
  101.             i = Replace(i, "零佰", "零")
  102.             i = Replace(i, "零拾", "零")

  103.             Do While i Like "*零零*"
  104.                 i = Replace(i, "零零", "零")
  105.             Loop

  106.             i = Replace(i, "零亿", "亿零")
  107.             i = Replace(i, "零万", "万零")
  108.             i = Replace(i, "零元", "元零")

  109.             Do While i Like "*零零*"
  110.                 i = Replace(i, "零零", "零")
  111.             Loop

  112.             i = Replace(i, "零角零分", "整")
  113.             i = Replace(i, "零角", "零")
  114.             i = Replace(i, "零分", "")

  115.             If i Like "元零*" Then i = Replace(i, "元零", "")
  116.             If i = "元整" Then i = "零" & i

  117.             If i Like "*万零元*" And Val(i) < 100000000 Then i = Replace(i, "万零元", "万元") '10万<=X<1亿
  118.             i = Replace(i, "亿万", "亿")

  119.             If i Like "*亿零万*" Then i = Replace(i, "零万", "") '>=10亿

  120.             '基本替换(小写)
  121.             i = Replace(i, "壹", "一")
  122.             i = Replace(i, "贰", "二")
  123.             i = Replace(i, "叁", "三")
  124.             i = Replace(i, "肆", "四")
  125.             i = Replace(i, "伍", "五")
  126.             i = Replace(i, "陆", "六")
  127.             i = Replace(i, "柒", "七")
  128.             i = Replace(i, "捌", "八")
  129.             i = Replace(i, "玖", "九")

  130.             '转换结果
  131.             i = "(人民币" & i & ")"
  132.             If n = 1 Then Selection.InsertBefore Text:=i Else Selection.MoveEnd Unit:=wdCharacter, Count:=1: Selection.InsertAfter Text:=i
  133.             If s = 1 Then End
  134.         End If
  135. Skip:
  136.         Selection.MoveRight Unit:=wdCharacter, Count:=1
  137.     Loop
  138. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2016-10-18 07:33 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
413191246se 发表于 2016-10-17 20:43
....谢谢 段先生!你是 VBA & 正则 高手,相信能办到!
....其实,我是 VBA 菜鸟,勉强会编一些小宏,主要 ...

师傅好!
师傅辛苦!师傅辛辛辛辛苦!师傅辛苦!!!
刚测试了,转换正确。
师傅、中文数字小写“零”,好象是这个“○”。

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-10-23 21:34 | 显示全部楼层
顶以更新!
.
139 请注意:第18楼第34行代码,要在最后的括号前面加上下面一句
,MatchWildCards:=False
关于是“零”还是“○”的问题,你自己查一下网络吧,不过我觉得好像是“零”——如果认为是“○”,可在第150行中添加代码 i = Replace(i, "零", "○")
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-6-10 12:17 , Processed in 0.033199 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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