c修改datatable单元格的值_神奇的VBA编程:批量拆分单元格数据

a2e2184894cf9ff5c21673e84da299ad.png

批量对单元格区域内每个单元格中的数据按照一定的规则进行拆分是职场工作中经常碰到的操作。Excel数据选项卡中“分列”提供了基础的功能。能帮助用户通过鼠标快速分列数据。

本篇《神奇的VBA》将介绍几种通过Excel VBA编程来拆解分列单元格中的数据的思路。

案   例 

将下图中B列中的生产编号按照"-"号进行拆分,并将拆分后的非空数据逐一放入右边的列中。

注:表中B列,有约3万1千行数据。

62a38c0df41195ea82d73f0a589305c8.gif

思路1:也是所有初学者的思路, 逐一遍历单元格区域中的所有单元格, 将单元格中的文本进行分裂,并再次遍历分裂后的数组元素放置在右边的单元格中。

Sub 思路1()Dim str As StringDim x As IntegerDim rng As RangeSet rng = Range("B3:B" & Range("B1048576").End(xlUp).Row)For Each cell In rng    str = Replace(Replace(Replace(cell.Text, "---", "-"), "--", "-"), " ", "")    c = 3    r = cell.Row    For Each e In Split(str, "-")        Cells(r, c) = e        c = c + 1    NextNextSet rng = NothingEnd Sub

代码中使用多层嵌套的Replace函数对单元格数据进行了集中清洗,过滤掉了多余的“-”符号和多余的空格。

经过运行验证,思路1代码完全符合要求,代码也简短但是却遇到最大的问题,“速度太慢”。在思路1代码中加入Timer计时器,

Sub 思路1()t1 = Time........................................t2 = TimeMsgBox "用时" & DateDiff("s", t1, t2) & "秒"End Sub

重新运行,3万1千行数据,整体耗时约30秒左右,太慢了。慢的原因是思路1代码在大量地操作单元格区域。数据量少还可以,一旦量大就会遇到该瓶颈。  

思路2:将单元格区域一次性放入动态数组中, 在数组中遍历,增加程序的运行效率,增强体验!

Sub 思路2()Dim str As StringDim x As IntegerDim arrDim brrarr = Range("B3:B" & Range("B1048576").End(xlUp).Row)n = UBound(arr) - LBound(arr) + 1ReDim brr(1 To n, 1 To 20)For r = 1 To UBound(arr, 1)    For c = 1 To UBound(arr, 2)        str = Replace(Replace(Replace(arr(r, c), "---", "-"), "--", "-"), " ", "")        x = 1        For Each e In Split(str, "-")                brr(r, x) = e                x = x + 1        Next    NextNextRange("C3").Resize(UBound(brr, 1), UBound(brr, 2)) = brrEnd Sub

上面的代码对VBA使用者有一定的要求,要求对数组有一定的认知,可以参阅《神奇的VBA》插件学习数组的相关知识。数组是很多编程语言中的必备的结构。数组的操作在内存中进行, 所以运行速度和效率上远比在单元格区域上操作要高的多。经过运行验证, 思路2的代码运行总速度由30秒转为1秒。

拆分文本的思路有很多。本篇神奇的VBA最后再提供另一个取巧的思路。

思路3:巧妙运用Excel自带的分列功能。通过录制宏,获取宏码, 稍作修改就可以重复使用。

Sub 思路3()Dim TargetRange As RangeSet TargetRange = Range("B3:B" & ActiveSheet.Rows.Count)TargetRange.TextToColumns Destination:=TargetRange.Cells(1).Offset(0, 1), DataType:=xlDelimited, _    TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=True, _    Semicolon:=False, Comma:=False, Space:=True, Other:=True, OtherChar:= _    "-", FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), _    Array(6, 1), Array(7, 1), Array(8, 1)), TrailingMinusNumbers:=TrueSet TargetRange = NothingEnd Sub

录制的宏码,看着啰嗦。使用者可以灵活裁剪可选参数,精简代码。经过运行,速度也非常的快!1秒钟也搞定了。

本篇内容《神奇的VBA》就分享就到这里。如果您有更好的方法,欢迎留言告知。文末最后留一个问题。

在思路1和思路2中,嵌套运用了多个Replace函数替换多个字符。有没有更好的思路更高效更精简的替换方法吗?

 ------   结语   ------ 本篇的分享就到这里!上面三种思路的VBA代码实现方法具有一定的通用性,职场人可以直接拿来稍微修改即可为你所用。  如果觉得本篇主题对您的工作有帮助,还请 关注 点赞收藏 转发至朋友圈 点击“在看” 分享给更多的人  ------   更多文章   ------ 《神奇的VBA》编程:另存工作表 《神奇的VBA》编程:禁止修改Excel工作表名称 《神奇的VBA》编程:监控表格单元格值的变化 《神奇的VBA》编程:提取身份证号码中的性别信息 《神奇的VBA》编程:随机生成彩票数据 《神奇的VBA》编程:报表插入空白行 《神奇的VBA》编程:工作表数据的拆分-001 《神奇的VBA》编程:工作表数据的拆分-002 Power Click插件发布-开放下载!神奇的vba
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值