【Excel VBA 编程】批量处理表格中文本格式数据为数值型数据,并根据环比数据自动添加批注

目录

引言

问题的分析与设计

文本格式数据转化为数值型数据

环比数据计算及显示

自动添加及删除批注

代码入口设计

代码实现

单元格格式设置、环比计算及增加批注代码实现

批量删除批注

运行结果

回顾总结


引言

在 Excel 中,经常会看到文本类型的数据,该数据看起来像是数字(如下表格B和C列数据),Excel 默认会将这些文本数字显示为常规格式,并在单元格的左上角显示一个绿色的三角形状的图标,用以提示用户这是一个文本格式的数字。这个图标通常出现在“公式错误检查”功能中,来提醒用户可能发生的潜在问题。

很多时候我们并不需要这些绿色的三角形状的图标,而且在使用比较复杂Excel公式时也容易出差错。想要手工去除的话,只需要用鼠标选择B列或C列的某个单元格,就会出现一个感叹号,提醒我们“此单元格中的数字为文本格式,或者其前面有撇号。”,然后点击这个图标,选择“转换为数字”,该单元格的数字即可正常显示

如果按照单元格一个个去除,势必带来很大的工作量,所以本期的第一个需求就是批量去掉这些绿色三角图标,另外两个需求就是自动计算环比增长及根据环比数据情况增加批注

工作中你是不是也遇到过类似的问题呢?一起来看看是如何实现的吧

问题的分析与设计

文本格式数据转化为数值型数据

要解决或去掉这个绿色的三角图标,最直接和最常用的方法通常是改变单元格的格式为数值或常规,这样既解决了数据看起来像是数字的问题,也去除了绿色三角图标

如果我们想要设置单元格的格式为数值,可以使用NumberFormat属性。但需要注意这种方法主要用于设置显示格式,而非改变单元格的实际值类型,所以还需要单独将数据类型做一个转换,表格中B列和C列数据都是整数,因此可以使用int函数进行转化

这类函数还有Val 函数、CDbl 函数、CInt 函数或者 CLng 函数等,都可以帮助我们将字符串转换为数值类型,根据需要选择使用即可

环比数据计算及显示

根据环比计算公式获取:(本期-上期)/上期 

需要注意的是,直接套用公式求出的数据精度很高,一般我们只需要保留2~4位小时即可满足需求了,因此需要用到Round函数通过四舍五入设置小数点位数

计算出来的数据如果想按照成百分比格式显示,还需要再次使用NumberFormat属性,设置Cells对象格式为百分比“0.00%”,如,将D2单元格设置成百分比格式显示,并且保留两位小数,代码如下:

Worksheets(“Sheet1”).Cells(2, 4).NumberFormat = “0.00%” 

自动添加及删除批注

既可以是Range对象也可以是Cells对象,使用它们的.AddComment和.Comment.Delete方法即可实现添加或是删除批注的操作,如下两种方式均是向D2单元格添加一条批注信息:

Worksheets(“Sheet1”).Cells(2, 4).AddComment “批注内容”

Worksheets(“Sheet1”).Range(“D2”).AddComment “批注内容”

代码入口设计

考虑使用方便,还是选取在Sheet页面插入命令按钮(Active x控件)

第一步:Excel文件首先要另存为.xlsm格式文件,第一次打开.xlsm文件会有安全警告,选择启用即可

第二步:顺次选择工具栏 –开发工具–插入–命令按钮(Active X控件),在表单中的适当位置拖动鼠标即可插入。如果该步骤有问题,可以查看我前期写的公众号文章,里面有详细的步骤:如何快速开始编程还不用搭建环境,那一定就是它了……

第三步:双击添加的命令按钮,快速打开VBA代码并且默认会创建类似如下的两行代码,然后我们只要在中间添加代码就可以通过命令按钮调用了

Private Sub CommandButton1_Click()

End Sub

Sheet页面插入命令按钮后显示 

代码实现

单元格格式设置、环比计算及增加批注代码实现

Private Sub CommandButton1_Click()
    Dim ws As Worksheet
    Dim iRow As Integer
    Dim iCol As Integer
    Dim i As Integer
    
    iRow = 2
    iCol = 2
    i = 1
    Set ws = Worksheets("Sheet1")
    
    Do While ws.Cells(iRow, 1) <> ""
        Do While ws.Cells(iRow, iCol).Value <> ""
            ws.Cells(iRow, iCol).Value = Int(ws.Cells(iRow, iCol).Value) '去掉绿色三角,其实还是文本类型
            ws.Cells(iRow, iCol).NumberFormat = "0" '单元格格式设置,设置为不带小数的整数
            iCol = iCol + 1
        Loop
        '计算环比
        ws.Cells(iRow, 4).Value = Round((ws.Cells(iRow, 3).Value - ws.Cells(iRow, 2).Value) / ws.Cells(iRow, 2).Value, 4)
        ws.Cells(iRow, 4).NumberFormat = "0.00%"  ' 设置为带两位小数的数值
        '环比负增长,增加批注
        If ws.Cells(iRow, 4).Value < 0 Then
            ws.Cells(iRow, 4).AddComment "这是第" & i & "批注"
            i = i + 1
            With ws.Cells(iRow, 4).Comment
                 .Visible = msoTrue ' 使批注可见
                 .Shape.Fill.Visible = msoTrue ' 显示批注的填充色(如果设置了的话)
                 .Shape.Fill.ForeColor.RGB = RGB(255, 124, 128) ' 粉色' 设置批注颜色
                 .Shape.Fill.Transparency = 0 ' 设置填充色的透明度为0(不透明),全透明1
             End With
        End If
        iRow = iRow + 1
        iCol = 2
    Loop
    
    MsgBox "完成"
    
End Sub

批量删除批注

Private Sub CommandButton2_Click()
    Dim ws As Worksheet
    Dim lastRow As Integer
    Dim cell As Range

    Set ws = Worksheets("Sheet1")
    
    lastRow = ws.Cells(ws.Rows.Count, "D").End(xlUp).Row ' 修改为你的列号,例如"D"表示第四列
    For Each cell In ws.Range("D2:D" & lastRow) ' 修改为你的列号和最后一行号,例如"D2:D" & lastRow 表示第四列除去第一行后的所有行
        If Not cell.Comment Is Nothing Then cell.Comment.Delete
    Next cell
    MsgBox "D列中的所有批注已删除"
End Sub

运行结果

在Sheet1页面点击命令按钮“执行”后程序开始运行,运行结束后会有提示框,关闭提示框查看Sheet1表单

B列和C列数据左上角的绿色三角全部去掉,格式从文本转成数值
环比数据自动计算完毕,并按照百分比形式显示,保留小数点后两位
环比数据负增长单元格,自动增加批注

如果需要清除掉批注,可以点击命令按钮“批量删除批注”,即可将D列的批注全部删除 

回顾总结

本期分享了通过批量设置单元格格式,将文本格式数据快速转换成数值数据,尤其是在数据量巨大的情况下能发挥更大的优势,也方便利用Excel公式处理数据,不至于因数据格式问题导致公式失效。

另外,VBA可以自动化实现批量添加批注和删除批注的操作,如果你经常需要使用批注,那么使用上述代码应该能帮助你节约更多的时间,提升工作效率

如果想学习更多的编程知识,无论是用来提升自动化办公效率还是想着提升自我,都可以已关注我的公众号,解锁更多的VBA技能

我的分享对你有帮助的话,麻烦点赞、加已关注支持一下吧,你的支持就是我最大的创作动力!

最后,再提醒一下大家,如果你有需求但因为各种问题搁置,可以把你的问题反馈给我,一起帮你出谋划策哦!搜索公众号“努力鸭是黑色的”,已关注我的公众号能够更加及时沟通反馈哦!

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容