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行:将姓名跟数据输出到单元格区域
经过几天的学习,能做出这个题,也算初步入门了吧,代码肯定还有很多可以优化的地方,这些就交给后续的实战慢慢提高啦。下面我们来看看效果:
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 = brr
End Sub
好了,本期教程就到这里啦,走过路过的点个关注分享一下吧,谢谢啦,如果你是一个VBA小白,想要了解该如何开始学习VBA,建议看看以下文章
Excel VBA学习路线知识框架梳理(小白VBA入门必看-建议收藏)