巧用VBA统一数字单位

163 篇文章 16 订阅
59 篇文章 2 订阅
该篇博客介绍了一个VBA宏代码,用于统一Excel表格中数据的单位,将数据从“亿”、“无单位”统一转换为“万”。代码通过检查数据末尾的字符,判断是否需要乘以10000或将数值除以10000,并在适当情况下添加小数点前的零,确保数据格式的一致性。这个解决方案适用于需要快速整理大量带有不规范单位的数据。
摘要由CSDN通过智能技术生成

实例需求: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列。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值