从VBA到JSA实战案例:数据结构转换+排序

文摘   教育   2024-10-23 19:50   广东  
经过一周的JSA学习,决定开始进行实战,开始做题,不经实战检验的学习终究不会有太多效果
如图:有A列所示数据,现在我们需要将他转换为C1单元格所示区域结构,同时要将每个人的数据进行升序排序。

下面我们来看看JSA的做法吧:

function test(){  let arr=Range("A1").CurrentRegion.Value2.flat()  let brr=new Array()  let crr=new Array(new Array())  var j=0  arr.forEach((val,i,ar)=>{    if(/[一-龢]+/.test(val)){      brr.push(val)      if(i>=1){        crr.push(new Array())        j++      }    }else{      crr[j].push(val)    }  })  for(irow of crr){    irow.sort((a,b)=>(a-b))  }  Range("C1").Resize(3,1).Value2=Application.WorksheetFunction.Transpose(brr)  Range("D1").Resize(3,4).Value2=crr}

第2行:将数据赋值给数组,并使用flat方法将二维数据转一维

第3行:定义一个一维数组,用于存名字

第4行:定义一个二维数组,用于存数据

第5行:定义变量j,用于累加姓名数量

第6行:使用数组forEach方法遍历数组

第7-12行:使用正则测试数据,如果数据中有中文,则将将数据插入brr数组,同时crr数组新增一个空行。j变量自加1,用于定位crr数组的行

第14行:如果不是中文,将数据追加到crr数组

第17-19行:使用for...of循环遍历crr行,然后将每一行使用sort方法进行升序排序

第20-21行:将姓名跟数据输出到单元格区域

经过几天的学习,能做出这个题,也算初步入门了吧,代码肯定还有很多可以优化的地方,这些就交给后续的实战慢慢提高啦。下面我们来看看效果:

下面我们来看看VBA的做法:

Sub test1()    Dim sht As Worksheet, wb As Workbook, rng As Range    Set reg = CreateObject("VBScript.RegExp")    Dim arr, str, i, j, brr(1 To 10, 1 To 10)    arr = Range("A1").CurrentRegion.Value    With reg        .Pattern = "[一-龥]+"        For i = 1 To UBound(arr)            If .test(arr(i, 1)) Then                m = m + 1                n = 1                brr(m, n) = arr(i, 1)            Else                n = n + 1                brr(m, n) = arr(i, 1)            End If    Next i        For j = 1 To UBound(brr)        For x = 2 To UBound(brr, 2)            If brr(j, x) = "" Then Exit For            For y = 2 To UBound(brr, 2) - x                If brr(j, y + 1) = "" Then Exit For                If brr(j, y) > brr(j, y + 1) Then                    t = brr(j, y)                    brr(j, y) = brr(j, y + 1)                    brr(j, y + 1) = t                End If            Next y        Next x    Next j    End With    Range("c1").Resize(UBound(brr), UBound(brr, 2)).Value = brrEnd Sub
第2-17行跟JSA的思路差不多,都是使用正则加循环转换结构,这里就不多解释了,他们的差异在第19-31行:由于VBA没有数组排序的方法,我们只能靠自己写排序,19-31行写了一个冒泡排序法。在简写代码上,JSA确实比VBA更胜一筹。

好了,本期教程就到这里啦,走过路过的点个关注分享一下吧,谢谢啦,如果你是一个VBA小白,想要了解该如何开始学习VBA,建议看看以下文章

Excel VBA学习路线知识框架梳理(小白VBA入门必看-建议收藏)

求关注-求星标-求点赞-求看-求分享
最近创建了一个VBA学习交流群,如有需要进群可以添加微信 jaresfzz,或者扫描以下二维码,备注进群

Excel应用教程
主要提供Excel vba,函数,图表,数据透视表,pq,Js等教程
 最新文章