ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[已解决] 汉字转换为阿拉伯数字

[复制链接]

TA的精华主题

TA的得分主题

发表于 2022-3-22 17:00 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
yibao2 发表于 2022-3-22 16:53
将“零”替换为”○“就可以了。
=LOOKUP(,0/(SUBSTITUTE(TEXT(ROW($1:$10000),"[dbnum1]"),"一十","十" ...

九千零五,转换成阿拉拍数字应该是9005,一个零换两个00,九万零五(90005)是一个零换000,我没整对

TA的精华主题

TA的得分主题

发表于 2022-3-22 17:03 | 显示全部楼层
于箱长 发表于 2022-3-22 17:00
九千零五,转换成阿拉拍数字应该是9005,一个零换两个00,九万零五(90005)是一个零换000,我没整 ...

9005,[dbnum1]写作:九千○五
90005,[dbnum1]写作:九万○五
这个格式只有零不同

TA的精华主题

TA的得分主题

发表于 2022-3-22 17:07 | 显示全部楼层
于箱长 发表于 2022-3-22 17:00
九千零五,转换成阿拉拍数字应该是9005,一个零换两个00,九万零五(90005)是一个零换000,我没整 ...

如果数字大点,函数运算量大,电脑吃力。还是你的VB好。可惜我不懂

TA的精华主题

TA的得分主题

发表于 2022-3-22 20:01 | 显示全部楼层
我写的还有不少地方需要完善,不想动脑了,找了一个比较完美的,只对A列和B列稍做了调整,注明了原作者
  1. Option Explicit

  2. Sub test() '汉字转阿拉伯数字模块
  3. Dim tm, ii
  4. Dim arrPre, arrRes
  5. arrPre = Range("A1:A" & [a65536].End(3).Row) '待转换汉字存放位置A列,可修改
  6. ReDim arrRes(1 To UBound(arrPre), 1 To 1)
  7. For ii = 1 To UBound(arrPre)
  8. arrRes(ii, 1) = toNum(arrPre(ii, 1))
  9. Next ii
  10. [b1].Resize(UBound(arrPre), 1) = arrRes '写入转换后的阿拉伯数字位置B列,可修改
  11. End Sub

  12. Private Function toNum(myStr)
  13. '==========================================================
  14. '中文小写转阿拉伯数字函数
  15. 'Writen by 时光鸟
  16. '2012-12-24 于 武汉

  17. 'ver 2.0 beta (update 2013-6-17)
  18. '*改进数量级左侧为非转化文本时的转化Bug(感谢excelhome论坛"星语心愿"朋友的bug反馈)
  19. 'ver 1.9 beta (update 2013-1-12)
  20. '*改进极个别情况最右侧数量级的右侧为非转化文本时的转化Bug
  21. 'ver 1.8 beta (update 2012-12-30)
  22. '*改进少数情况下把"二"习惯用成"两"的时候的转化问题
  23. '*改进极个别情况下"〇"或"零"后直接跟数量级时的转化问题
  24. '*对小部分中文小写数字的不规范表达增加纠错转化功能
  25. '*增加对中文小写乘法口诀转化的功能支持
  26. 'ver 1.7 beta (update 2012-12-29)
  27. '*改进个别情况下需要在中文小写中同时使用〇和零时的转化问题
  28. '*优化代码结构,提升效率
  29. 'ver 1.6 beta (updat'e 2012-12-28)
  30. '*解决了首位只有数量级时这种简化表达方式转化不正确的Bug
  31. 'ver 1.5 beta (update 2012-12-27)
  32. '*解决了〇右侧有多个数量级时某种情况替换数量不正确的Bug
  33. 'ver 1.4 beta (update 2012-12-27)
  34. '*解决了〇右侧有多个数量级时替换数量不正确的Bug
  35. 'ver 1.3 beta (update 2012-12-26)
  36. '*解决了连续有多个数量级时转化不正确的Bug
  37. 'ver 1.2 beta (update 2012-12-26)
  38. '*解决了中文小写中某种情况下使用汉字“零”时转化不正确的Bug
  39. 'ver 1.1 beta (update 2012-12-25)
  40. '*解决了中文小写中含有〇的情况下时转化不正确的Bug
  41. 'ver 1.0 beta (update 2012-12-24)
  42. '*中文小写转阿拉伯数字正常表达方式转化函数发布
  43. '==========================================================

  44. Dim strG$, strL$, strN$, strZ$, findZ$, addZ$
  45. Dim i%, m%, n%, k%, Lv%, Rv%, Lx%, Rx%, R1%, R2%, Ly%, Ry%, Tx%, flagP%
  46. strG = "十百千万亿"
  47. strL = "一二三四五六七八九"
  48. strN = "123456789"
  49. strZ = "〇零"
  50. If myStr = "" Then Exit Function
  51. While (InStr(myStr, Left(strZ, 1)) + InStr(myStr, Right(strZ, 1)) > 0)
  52. Lv = InStr(myStr, Left(strZ, 1))
  53. Rv = InStr(myStr, Right(strZ, 1))
  54. If Lv > 0 Then If Rv = 0 Or Rv > Lv Then findZ = Left(strZ, 1)
  55. If Rv > 0 Then If Lv = 0 Or Lv > Rv Then findZ = Right(strZ, 1)
  56. m = InStr(myStr, findZ)
  57. If m < Len(myStr) And InStr(strG, Mid(myStr, m + 1, 1)) Then
  58. myStr = Left(myStr, m) & "一" & Mid(myStr, m + 1)
  59. End If
  60. If Mid(myStr, m - 1, 1) <> "" Then Lx = InStr(strG, Mid(myStr, m - 1, 1)) Else Lx = 0
  61. If Mid(myStr, m + 2, 1) <> "" Then R1 = InStr(strG, Mid(myStr, m + 2, 1)) Else R1 = 0
  62. If Mid(myStr, m + 3, 1) <> "" Then R2 = InStr(strG, Mid(myStr, m + 3, 1)) Else R2 = 0
  63. If R2 = 5 Then Rx = R1 + R2 + 3 Else Rx = R1 + R2
  64. If Lx > 0 And Lx < R1 Then Rx = 0
  65. If Lx > R1 And Lx < R2 Then Rx = R1
  66. If Lx = 5 Then Lx = Lx + 3
  67. If Lx = 0 And Rx = 0 Then Lx = 2
  68. myStr = Replace(myStr, findZ, Mid(10 ^ (Lx - Rx - 1), 2), 1, 1)
  69. Wend
  70. Do
  71. If Len(myStr) < 2 Then Exit Do
  72. If Mid(myStr, n + 1, 1) <> "" Then Ly = InStr(strG, Mid(myStr, n + 1, 1)) Else Ly = 0
  73. If Mid(myStr, n + 2, 1) <> "" Then Ry = InStr(strG, Mid(myStr, n + 2, 1)) Else Ry = 0
  74. If Ly > 0 And Ry > 0 Then
  75. If Ly = 5 Then addZ = Mid(10 ^ (Ly + 3), 2) Else addZ = Mid(10 ^ Ly, 2)
  76. myStr = Left(myStr, n + 1) & addZ & Mid(myStr, n + 2)
  77. n = n + Len(addZ)
  78. Else
  79. n = n + 1
  80. End If
  81. Loop Until (n = Len(myStr) - 1)
  82. If Len(myStr) > 3 And InStr(strL, Left(myStr, 1)) * InStr(strL, Mid(myStr, 2, 1)) Then
  83. If Len(myStr) = 4 And Mid(myStr, 3, 1) = "得" Then myStr = Left(myStr, 1) & "×" & Replace(Mid(myStr, 2), "得", "=")
  84. If Len(myStr) < 6 And InStr(strL, Mid(myStr, 3, 1)) > 0 And InStr(strG, Mid(myStr, 4, 1)) > 0 Then
  85. myStr = Left(myStr, 1) & "×" & Mid(myStr, 2, 1) & "=" & Mid(myStr, 3)
  86. End If
  87. End If
  88. If InStr(myStr, "两") > 0 Then myStr = Replace(myStr, "两", "二")

  89. If InStr(strG, Left(myStr, 1)) > 0 Then myStr = "一" & myStr
  90. While (flagP <= Len(myStr) - 2)
  91. flagP = flagP + 1
  92. If InStr(strG, Mid(myStr, flagP + 1, 1)) > 0 And InStr(strG & strL & strZ & strN & "1234567890", Mid(myStr, flagP, 1)) = 0 Then
  93. myStr = Left(myStr, flagP) & "一" & Mid(myStr, flagP + 1)
  94. End If
  95. Wend

  96. If Len(myStr) > 1 Then
  97. For i = Len(myStr) - 1 To 1 Step -1
  98. k = InStr(strG, Right(myStr, 1))
  99. If k = 5 Then myStr = myStr & Mid(10 ^ (k + 3), 2) Else If k > 0 Then myStr = myStr & Mid(10 ^ k, 2)
  100. If k = 0 Then
  101. Tx = InStr(strG, Mid(myStr, i, 1))
  102. If Tx > 0 And InStr(strL, Mid(myStr, i + 1, 1)) = 0 And Mid(myStr, i + 1, 1) <> "0" Then
  103. If Tx = 5 Then addZ = Mid(10 ^ (Tx + 3), 2) Else addZ = Mid(10 ^ Tx, 2)
  104. myStr = Left(myStr, i) & addZ & Mid(myStr, i + 1)
  105. End If
  106. End If
  107. Next i
  108. End If
  109. For i = 1 To Len(strL)
  110. If i <= Len(strG) And InStr(myStr, Mid(strG, i, 1)) Then myStr = Replace(myStr, Mid(strG, i, 1), "")
  111. If InStr(myStr, Mid(strL, i, 1)) > 0 Then myStr = Replace(myStr, Mid(strL, i, 1), Mid(strN, i, 1))
  112. Next i
  113. toNum = myStr
  114. End Function
复制代码




评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2022-3-23 09:01 | 显示全部楼层

亲测出错
亲测出错.png

点评

常识都掉了还不捡起来  发表于 2022-3-23 10:25

TA的精华主题

TA的得分主题

发表于 2022-3-23 09:20 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
于箱长 发表于 2022-3-22 20:01
我写的还有不少地方需要完善,不想动脑了,找了一个比较完美的,只对A列和B列稍做了调整,注明了原作者

...

亲,突发奇想——想反过来操作,能不能把阿拉伯数字转换成汉字?

TA的精华主题

TA的得分主题

发表于 2022-3-23 09:35 | 显示全部楼层
向往的歌 发表于 2022-3-23 09:20
亲,突发奇想——想反过来操作,能不能把阿拉伯数字转换成汉字?

那个可比这个简单多了

TA的精华主题

TA的得分主题

发表于 2022-3-23 09:40 | 显示全部楼层
  1. Function DX(m)
  2.     DX = Replace(Application.Text(Round(m + 0.00000001, 2), "[dbnum2]"), ".", "元")
  3.     DX = IIf(Left(Right(DX, 3), 1) = "元", Left(DX, Len(DX) - 1) & "角" & Right(DX, 1) & "分", IIf(Left(Right(DX, 2), 1) = "元", DX & "角整", IIf(DX = "零", "", DX & "元整")))
  4.     DX = Replace(Replace(Replace(Replace(DX, "零元零角", ""), "零元", ""), "零角", "零"), "-", "负")
  5. End Function
复制代码

推荐大家一个我自己常用的阿拉伯数字转中文金额的自定义代码,很遗憾,我不知道这个代码是哪位大神的作品

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2022-3-23 10:11 | 显示全部楼层
于箱长 发表于 2022-3-23 09:40
推荐大家一个我自己常用的阿拉伯数字转中文金额的自定义代码,很遗憾,我不知道这个代码是哪位大神的作品 ...

亲,似乎运行不了请教:如何才能运行?

TA的精华主题

TA的得分主题

发表于 2022-3-23 10:25 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-12-14 06:29 , Processed in 0.026674 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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