本文共 1725 字,大约阅读时间需要 5 分钟。
实例需求:A列中有不规范数据,数据单位不一致,现需要将数据统一为“万”为单位,如B列所示。
先看一下数据规律,有如下三类: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 = arrEnd 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 = arrEnd 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列。
转载地址:http://zyjl.baihongyu.com/