ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > 我的酷贴 > Excel VBA > 如何提取指定的中文大写数值并转换成阿拉伯数值?

如何提取指定的中文大写数值并转换成阿拉伯数值?

作者:绿色风 分类: 时间:2022-08-18 浏览:117
楼主
kevinchengcw
Q: 如何提取指定的中文大写数值并转换成阿拉伯数值?
A: 以下示例涉及如下知识点:
1. 正则提取指定中文大写数值;
2. 字典用于存放对应表;
3. 中文大写数值转换为阿拉伯数值;
4. 正则替换的用法。
代码如下:
  1. Sub test()
  2. Dim RegEx, Dic, Arr
  3. Dim M, N As Integer
  4. Dim mMatch As Match
  5. Dim Matches As matchcollection
  6. Dim Str, Tmp As String
  7. Set RegEx = CreateObject("vbscript.regexp")  '创建正则表达式用于提取对应数值
  8. Set Dic = CreateObject("scripting.dictionary")  '创建字典用于存储转换成宽体的数字与对应的阿拉伯数字
  9. With RegEx  '建立正则规则
  10.     .Global = True
  11.     .Pattern = "([一二三四五六七八十九]*社)|([一二三四五六七八十九]*号)"
  12. End With
  13. For N = 0 To 9   '添加宽体字与阿拉伯数字对应表存入字典中
  14.     Dic.Add StrConv(N, vbWide), N
  15. Next N
  16. For N = 2 To Cells(Rows.Count, 1).End(3).Row  '循环取A列的数据区内容
  17.     Str = Cells(N, 1).Value  '赋值给字符串,便于操作
  18.     Set Matches = RegEx.Execute(Str)   '取得符合规则的数据集
  19.     Cells(N, 3) = Cells(N, 1).Value   '先将A列的值赋给C列(呵呵,节省个变量)
  20.     For Each mMatch In Matches  '提取每个对应数据,转换后替换原字符串中对应内容
  21.         Cells(N, 3) = Replace(Cells(N, 3).Value, Left(mMatch.Value, Len(mMatch.Value) - 1), CtoA(Left(mMatch.Value, Len(mMatch.Value) - 1)))   '替换语句,注意其中调用了自定义的转换函数
  22.     Next mMatch
  23. Next N
  24. Arr = Dic.keys  '将字典的keys赋值给数组,便于取用
  25. For M = LBound(Arr) To UBound(Arr)  '将C列的宽体字阿拉伯数字替换成普通数字
  26.     ActiveSheet.Columns(3).Replace Arr(M), Dic(Arr(M))
  27. Next M
  28. End Sub

  29. Function CtoA(ByVal Rng)   '自定义的中文大写数值转换为阿拉伯数值的函数
  30. Dim Arr, Arr2, Dic
  31. Dim Str As String
  32. Dim M, N, I As Long
  33. Set Dic = CreateObject("scripting.dictionary")  '创建字典用于存储转换值
  34. Dic.Add "千", "*1000+"
  35. Dic.Add "仟", "*1000+"
  36. Dic.Add "百", "*100+"
  37. Dic.Add "佰", "*100+"
  38. Dic.Add "十", "*10+"
  39. Dic.Add "拾", "*10+"
  40. Dic.Add "九", "9"
  41. Dic.Add "玖", "9"
  42. Dic.Add "八", "8"
  43. Dic.Add "捌", "8"
  44. Dic.Add "七", "7"
  45. Dic.Add "柒", "7"
  46. Dic.Add "六", "6"
  47. Dic.Add "陆", "6"
  48. Dic.Add "五", "5"
  49. Dic.Add "伍", "5"
  50. Dic.Add "四", "4"
  51. Dic.Add "肆", "4"
  52. Dic.Add "三", "3"
  53. Dic.Add "叁", "3"
  54. Dic.Add "二", "2"
  55. Dic.Add "贰", "2"
  56. Dic.Add "一", "1"
  57. Dic.Add "壹", "1"
  58. Arr = Dic.keys  '将字典的keys赋值给数组,便于取用
  59. If Rng <> "" Then
  60.     Str = Rng
  61.     Str = Replace(Str, "亿", vbTab)  '将万和亿替换成分隔符便于分开计算
  62.     Str = Replace(Str, "万", vbTab)
  63.     For M = LBound(Arr) To UBound(Arr)  '循环替换对应的大写数字为对应阿拉伯数字
  64.         Str = Replace(Str, Arr(M), Dic(Arr(M)))
  65.     Next M
  66.     Str = Replace(Str, "零", "")   '替换掉多余的字符
  67.     Str = Replace(Str, "+*", "*")
  68.     Arr2 = Split(Str, vbTab)   '拆分字符串为数组,方便各数量级的数字累加
  69.     I = 0
  70.     For M = LBound(Arr2) To UBound(Arr2)
  71.         If Right(Arr2(M), 1) = "+" Then Arr2(M) = Left(Arr2(M), Len(Arr2(M)) - 1)  '替换两种可能存在的情况
  72.         If Left(Arr2(M), 1) = "*" Then Arr2(M) = Right(Arr2(M), Len(Arr2(M)) - 1)
  73.         If Arr2(M) = "" Then
  74.             If M < UBound(Arr2) Then I = I + 10000 ^ (UBound(Arr2) - M)
  75.         Else
  76.             If InStr(Arr2(M), "*") > 0 Or InStr(Arr2(M), "+") > 0 Then
  77.                 I = I + Evaluate(Arr2(M)) * 10000 ^ (UBound(Arr2) - M)
  78.             Else
  79.                 I = I + Arr2(M) * 10000 ^ (UBound(Arr2) - M)
  80.             End If
  81.         End If
  82.     Next M
  83.     CtoA = I   '返回结果
  84. End If
  85. Application.Volatile  '设置为易失性函数,可以即时更新
  86. Set Dic = Nothing  '清空项目
  87. End Function
附示例文件。
请问怎样用公式实现这样的替换?.rar
2楼
wnianzhong
好好向你学习,VBA高手!
3楼
赵文竹
看了示例文件,但还没有看懂,呵呵,向高手学习!再仔细看看……

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap