欢迎转发和点一下“在看”,文末留言互动!
置顶公众号或设为星标及时接收更新不迷路
小伙伴们好,今天来和大家分享一道VBA的题目。原题目是下面这样子的:
按照题目要求,需要将左侧的数据结构转换为右侧的结构。整体看下来,这道题目如果使用公式,难度则会非常大。而通过一小段代码,则可以轻轻松松地解决问题。
完整代码如下:
Sub 转换结构() Dim i As Integer, j As Integer, k As Integer, myarr As Variant myarr = Range("A1").CurrentRegion For i = 1 To UBound(myarr) If Len(myarr(i, 1)) = 3 Then k = k + 1: j = 0 If Len(myarr(i, 1)) = 3 Then Cells(k + 5, 3) = myarr(i, 1) Else j = j + 1 Cells(k + 5, j + 3) = myarr(i, 1) End If Next iEnd Sub
这段代码使用了循环+单元格赋值的方法来解决问题。这里If Len(myarr(i, 1)) = 3 Then k = k + 1: j = 0一句是重点。
If Len(myarr(i, 1)) = 3 Then k = k + 1: j = 0
由于所有的姓名都是三个字的,因此用来判断新结构中新行的起始位置。当字节数等于3时,令变量k累加,同时对变量j初始赋值0。
If Len(myarr(i, 1)) = 3 Then Cells(k + 5, 3) = myarr(i, 1)Else j = j + 1 Cells(k + 5, j + 3) = myarr(i, 1)End If
再次利用IF语句来对单元格赋值。当变量等于3时,将姓名填入当前行的第一个单元格。否则,就对当前行的下一个单元格赋值。
下面是群友空杯大佬写的一段代码,同样很简短,运行速度也比上面一段更快。
完整代码如下:
Subtest()Dimarr, x, j, rarr = Range("a1:a18")ReDimdrr(1 To 99, 1 To 20)Forx = 1 To UBound(arr)IfInStr(arr(x, 1), "-") = 0 Thenr = r + 1: drr(r, 1) = arr(x, 1): j = 0Elsej = j + 1drr(r,j + 1) = arr(x, 1)EndIfNextx[c10].Resize(r,20) = drrEndSub
基本思路两段代码是一样的。这段代码使用了数组的方式来处理数据,效率上更高!
本期内容练习文件提取方式:
链接:https://pan.baidu.com/s/1JXrJu17lvNtR6mYK5te-VQ?pwd=o949
提取码:o949
好了朋友们,今天和大家分享的内容就是这些了!喜欢我的文章请分享、转发、点赞和收藏吧!如有任何问题可以随时私信我哦!