ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创]使用域自动填充功能完成人民币金额大写

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2018-12-30 23:36 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
  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, MatchWildcards:=False)
  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 = "(人民币" & i & ")"
  122.             If n = 1 Then Selection.InsertBefore Text:=i Else Selection.MoveEnd unit:=wdCharacter, Count:=1: Selection.InsertAfter Text:=i
  123.             If s = 1 Then End
  124.         End If
  125. Skip:
  126.         Selection.MoveRight unit:=wdCharacter, Count:=1
  127.     Loop
  128. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2019-5-17 09:37 | 显示全部楼层
Limpo 发表于 2017-6-20 22:34
十一年过去了,找到的答案依然是这个最强的
不知道现在新版的Word中是不是有了更简单的原生解决方案
我是 ...

又过了两年想起这件事来了,试着这么该了下代码貌似可以了:
  1. { SET Data { ={ MERGEFIELD "金额" } } }{ SET JinE { =ABS(Data) \#"0.00" } }{ SET Yuan { =INT(JinE) } }{ SET Jiao { =INT(JinE*10-Yuan*10) } }{ SET Fen { =INT(JinE*100-Yuan*100-Jiao*10) } }{ IF Data < 0 "负" "" }{ IF Yuan = JinE "{ =Yuan \*CHINESENUM2 }圆整" { IF Fen = 0 "{ =Yuan \*CHINESENUM2 }圆{ =Jiao \*CHINESENUM2 }角整" { IF Jiao = 0 "{ =Yuan \*CHINESENUM2 }圆{ =Fen \*CHINESENUM2 }分" "{ =Yuan \*CHINESENUM2 }圆{ =Jiao \*CHINESENUM2 }角{ =Fen \*CHINESENUM2 }分" }} }
复制代码
发现另外一个问题,38000.02,这个金额的贰分显示为壹分。

TA的精华主题

TA的得分主题

发表于 2019-5-21 11:29 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
请问各位,在邮件合并中。具体该如何用。
楼主的域代码放在什么地方?

TA的精华主题

TA的得分主题

发表于 2019-5-21 17:08 | 显示全部楼层
请楼主指点一下,该如何实际运用。即,如果我是邮件合并,这段代码放在什么地方呢?谢谢

TA的精华主题

TA的得分主题

发表于 2019-5-21 23:51 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
楼上朋友:楼主是 守柔版主,他不是经常在线的。如果想用代码,可以试用我 91 楼的代码,放在通用模板 Normal.dot 中即可(先录制一个宏 Macro1,找到它,发现它是在 Normal.dot 中)。

TA的精华主题

TA的得分主题

发表于 2019-5-22 09:21 | 显示全部楼层
413191246se 发表于 2019-5-21 23:51
楼上朋友:楼主是 守柔版主,他不是经常在线的。如果想用代码,可以试用我 91 楼的代码,放在通用模板 Norm ...

由于我是在邮件合并中使用。请问下,如果用您的宏,会不会把整个文档的数字都搞成了大写。另外,支不支持上千万的数字。即12345678元。

TA的精华主题

TA的得分主题

发表于 2019-5-22 09:34 | 显示全部楼层
版主,我下载你的附件打开后,试了一下,当金额大于百万以后,就提示:错误!不能以指定格式显示编号。圆捌角捌分

TA的精华主题

TA的得分主题

发表于 2019-5-22 15:28 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
楼上朋友:我的《人民币中文大写》宏,会将文档中所有“数字元”(比如 345.67元)转为人民币中文大写,数字后面没有“元”字的不会有变化;但原数字元并不会改变。如果不放心,你可以打几个数字试试看!

TA的精华主题

TA的得分主题

发表于 2019-5-22 21:45 | 显示全部楼层
413191246se 发表于 2019-5-22 15:28
楼上朋友:我的《人民币中文大写》宏,会将文档中所有“数字元”(比如 345.67元)转为人民币中文大写,数 ...

直好意思 ,不会用宏。没整明白。让你费心了。

TA的精华主题

TA的得分主题

发表于 2019-9-3 17:38 | 显示全部楼层
萌新完全不会用。。。只能佩服佩服
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-26 03:19 , Processed in 0.035243 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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