实例需求:A列中有不规范数据,数据单位不一致,现需要将数据统一为“万”为单位,如B列所示。
先看一下数据规律,有如下三类:
- 无单位数据,如A1
- 单位为“万”,如A2
- 单位为“亿”,如A3
Sub demo()
Dim r As Range
Dim arr, lstchar
Dim i As Integer
Set r = [A1].CurrentRegion
arr = r.Value
For i = LBound(arr) To UBound(arr)
lstchar = Right(arr(i, 1), 1)
If lstchar = "亿" Then
arr(i, 1) = CStr(Val(arr(i, 1)) * 10000) & "万"
ElseIf VBA.IsNumeric(lstchar) Then
arr(i, 1) = CStr(Val(arr(i, 1)) / 10000) & "万"
End If
Next
r.Offset(0, 1).Value = arr
End Sub
运行代码看结果,貌似不错,单元B1单元格的数据与要求略有不同,缺少了小数点之前的零。
升级一下代码解决这个问题。
Sub demo()
Dim r As Range
Dim arr, lstchar
Dim i As Integer
Set r = [A1].CurrentRegion
arr = r.Value
For i = LBound(arr) To UBound(arr)
lstchar = Right(arr(i, 1), 1)
If lstchar = "亿" Then
arr(i, 1) = CStr(Val(arr(i, 1)) * 10000) & "万"
ElseIf VBA.IsNumeric(lstchar) Then
arr(i, 1) = CStr(Val(arr(i, 1)) / 10000)
n = InStr(arr(i, 1), ".")
If n Then
arr(i, 1) = FormatNumber(arr(i, 1), Len(arr(i, 1)) - n, vbTrue, , vbFalse) & "万"
Else
arr(i, 1) = arr(i, 1) & "万"
End If
End If
Next
r.Offset(0, 1).Value = arr
End Sub
【代码解析】
第5行代码获取第一列的数据区域。
第6行代码将数据读入数组。
第7~20行代码循环处理每个数据。
第8行代码取得数据的最后一个字符。
如果最后一个字符是“亿”,那么第10行代码将数字乘以10000,并在最后添加“万”,代码中使用Val
函数可以获取数据中的数字部分。
第11行代码判断最后一个字符是否为数字。
如果是数字,说明数据没有单位,第12代码将数组除以10000。
第13代码读取转换后数字中小数点的位置。
如果不包含小数点,那么第17行代码直接添加“万”;否则第15行代码使用FormatNumber
格式化数据,解决缺少小数点之前零的问题。FormatNumber
不能替换为Format
函数。
FormatNumber
的语法格式如下,详细讲解参见 在线帮助。
FormatNumber(Expression、[ NumDigitsAfterDecimal, [ IncludeLeadingDigit, [ UseParensForNegativeNumbers, [ GroupDigits ]]]])
第21行代码将数据回写到B列。