AHK word vba excel 脚本实现大小写金额互转
导读
先说使用方法
小写转大写
复制小写金额后运行代码会自动转成大写金额 并放到剪贴板里面
大写转小写
复制大写金额后运行代码会自动转成小写金额 并放到剪贴板里面
金额中阿互转(InputStr,To:="z") ;To: 中|阿
{
InputStr:=trim(InputStr)
if (RegExMatch(InputStr,"^[.d]+$") and instr(To,"z"))
{
arrNum:=StrSplit(InputStr,".")
IP:=arrNum[1]
DP:=arrNum[2]
if(strlen(IP)>17) ;设定20位,
return InputStr
OutputStr:=""
数字转换:={0 : "零",1 : "壹",2 : "贰",3 : "叁",4 : "肆",5 : "伍",6 : "陆",7 : "柒",8 : "捌",9 : "玖"}
小数单位:={1 : "角",2 : "分",3 : "毫",4 :"厘"}
整数单位:={1 : "元",2 : "拾",3 : "佰",4 : "仟",5 : "万",6 : "拾",7 : "佰",8 : "仟",9 : "亿",10:"拾",11:"佰",12:"仟",13:"兆",14:"拾",15:"佰",16:"仟",17:"万",18 : "拾",19 : "佰",20 : "仟"}
DllCall("msvcrt.dll\_wcsrev", "Ptr", &IP, "CDECL")
Loop,parse,% IP
OutputStr := 数字转换[A_LoopField] 整数单位[A_index] OutputStr
loop,3
{
OutputStr:=RegExReplace(OutputStr,"零(拾|佰|仟)","零")
OutputStr:=RegExReplace(OutputStr,"零{1,3}","零")
OutputStr:=RegExReplace(OutputStr,"零(?=(兆|亿|万|元))","")
OutputStr:=RegExReplace(OutputStr,"亿零万","亿")
OutputStr:=RegExReplace(OutputStr,"兆零亿","兆")
}
if(DP)
{
OutputStr .="零"
loop,parse,% DP
{
if(A_index>5)
break
if(A_loopfield=0)
continue
OutputStr .= 数字转换[A_LoopField] 小数单位[A_Index]
}
}
else
{
OutputStr .= "整"
}
return OutputStr
}
else if (regexmatch(InputStr,"^[角分毫厘零一二两三四五六七八九十百千万亿兆壹贰叁肆伍陆柒捌玖拾佰仟元整]+$") and instr(To,"a"))
{
InputStr:=StrReplace(InputStr,"整")
arrStr:=StrSplit(InputStr,"元")
IP:=arrStr[1]
DP:=arrStr[2]
DllCall("msvcrt.dll\_wcsrev", "Ptr", &IP, "CDECL") ;先反转
中文转换:={角:1000,分:100,毫:10,厘:1,零:0, 一:1, 二:2, 两:2, 三:3, 四:4, 五:5, 六:6, 七:7, 八:8, 九:9, 十:10, 百:100, 千:1000, 万:10000, 亿:100000000, 兆:1000000000000,壹:1, 贰:2, 两:2, 叁:3, 肆:4, 伍:5, 陆:6, 柒:7, 捌:8, 玖:9, 拾:10, 佰:100, 仟:1000}
num:=0
x:=1
old:=1
loop,parse,IP ;经过前面的反转,相当于从后面逐字parse
{
v:=中文转换[A_LoopField] ;获取对应的数字,或者倍数
if (v>=10 and v>old) ;如果是倍数,且该倍数是上升的,就用这个倍数,基准值同时改变。
old:=x:=v
else if (v>=10 and v x:=v*old
else ;当前字符不是倍数的话,累加
num:=num+x*v
}
if(DP)
{
小数部分:=""
前置数值:=0
loop,parse,DP
{
v:=中文转换[A_LoopField] ;获取对应的数字,或者倍数
if (A_loopfield~="角|分|毫|厘")
{
小数部分+=前置数值 * v
前置数值:=0
}
else
前置数值:=v
}
num:=num "`." 小数部分
}
return num
}
else
return InputStr
}
; 获取剪贴板内容
Clipboard := ClipboardAll
; 判断剪贴板内容类型并进行金额转换
if (Clipboard ~= "^[.d]+$") {
; 如果是小写金额,则转成大写金额
result := 金额中阿互转(Clipboard, "z")
} else if (Clipboard ~= "^[角分毫厘零一二两三四五六七八九十百千万亿兆壹贰叁肆伍陆柒捌玖拾佰仟元整]+$") {
; 如果是大写金额,则转成小写金额
result := 金额中阿互转(Clipboard, "A")
} else {
MsgBox, 剪贴板内容不是有效的金额格式
return
}
; 将最终结果放回剪贴板
Clipboard := result
复制代码
再给大家发一个word vba 代码的 使用说明:选中小写金额运行代码后 自动在下一行输入转换的大写金额
Sub 小写金额转大写金额()
Dim s As Double
s = Selection.Range
Debug.Print NumToChar(s)
Selection.EndKey Unit:=wdLine
Selection.TypeParagraph
Selection.TypeText Text:=NumToChar(s)
End Sub
Function NumToChar(Number As Double) As String
Dim strNum As String
Dim arrNum(), arrChar(), arrUnits(), arr()
Dim k As Integer
Temp = Abs(Round(Number, 2)) * 100
strNum = CStr(Temp)
arrChar = Array("零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖")
arrUnits = Array("分", "角", "元", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟", "兆", "拾", "佰", "仟", "京")
For i = Len(strNum) To 1 Step 1
ReDim Preserve arr(k)
arr(k) = Mid(strNum, i, 1)
If arr(k) = 0 Then
If InStr("元万亿兆", arrUnits(k)) Then
arr(k) = arrUnits(k)
Else
arr(k) = "零"
End If
Else
arr(k) = arrChar(arr(k)) & arrUnits(k)
End If
k = k + 1
Next
strNum = ""
For i = UBound(arr) To LBound(arr) Step 1
strNum = strNum & arr(i)
Next
If Round(Number, 0) = Number Then
strNum = Left(strNum, InStr(strNum, "元")) & "整"
ElseIf Round(Number, 1) = Number Then
strNum = Left(strNum, InStr(strNum, "角")) & "整"
End If
Do While InStr(strNum, "零零") > 0
strNum = Replace(strNum, "零零", "零")
Loop
strNum = Replace(strNum, "零兆", "兆")
strNum = Replace(strNum, "零亿", "亿")
strNum = Replace(strNum, "零万", "万")
strNum = Replace(strNum, "零元", "元")
strNum = Replace(strNum, "兆亿", "兆")
strNum = Replace(strNum, "兆万", "兆")
strNum = Replace(strNum, "亿万", "亿")
If Number < 0 Then
strNum = "负" & strNum
ElseIf Number = 0 Then
strNum = "零元整"
End If
NumToChar = strNum
End Function
复制代码
如果想用excel CONCATENATE 函数
SUBSTITUTE(SUBSTITUTE(IF(ROUND(G14,2),TEXT(G14,";负")&TEXT(INT(ABS(G14)+0.5%),"[dbnum2]G/通用格式元;;")&TEXT(RIGHT(TEXT(G14,".00"),2),"[dbnum2]0角0分;;整"),),"零角",IF(G14^2<1,,"零")),"零分","整")复制代码
