经过上篇数组的实战案例的道友,多少会被其中的逻辑关系搞得有点绕,小道也是,我们需要知晓的是很多东西我们只是拿来用的而已,比如电视机,我们不需要了解电视机的电路图,只需要会用遥控和开关就行了。
编程中的高级语言同样如此,VBA和python都是高级语言,想深入学习可能要花费不菲的时间和精力,深度学习一些底层逻辑和算法,而对于大多数“用户”而言,我们只需要知道它能干什么,有什么功能,而VBA的函数和Python中的包都是一些大牛封装好的“遥控器”,嘿嘿,我们用就行了,尤其是像我这种半路出家的用户,想办法先成为熟手后,再想办法成为高手。
Split函数(作用于1维数组)
返回一个下标从零开始的一维数组,它包含指定数目的子字符串。
Split(字符串,"分隔符")
Sub test()
Dim i$
i = "a-b-c-d-e-f"
arr = Split(i, "-")
[a1].Resize(1, UBound(arr)) = arr
End Sub
结果:
image.png
数据互换:
Sub 数据互换()
arr = [a1].CurrentRegion
For Each a In arr
arr1 = Split(a, "-")
n = n + 1
Cells(n, "c") = arr1(1) & "-" & arr1(0)
Next
End Sub
结果:
image.png
Join函数(作用于1维数组)与spilit相反的操作。
返回一个字符串,该字符串是通过连接某个数组中的多个子字符串而创建的。
Join(数组,"连接符")
image.png
Sub 数据合并()
i = Sheet3.Cells(Rows.Count, 1).End(xlUp).Row
With Sheet3
For j = 1 To i
Set k = Range(.Cells(j, 1), .Cells(j, Columns.Count).End(xlToLeft))
arr = Application.Transpose(Application.Transpose(k))
Cells(j, 1) = "'" & Join(arr, "")
Next j
End With
End Sub
image.png
由于join与spilit函数只能处理一维数组,所以他们之间的转换需要经过Transpose转置。
Filter函数(作用于1维数组)
返回一个下标从零开始的数组,该数组"包含"基于指定筛选条件的一个字符串数组的子集。
语法
'Filter(要搜索的1维数组。, 搜索的字符串,[TRUE/FALSE])为真则是包含,为假则是不包含。
Sub test()
arr = [{"abc","bb","c","ba","dd","nba"}]
a = Filter(arr, "b", True)
b = Filter(arr, "b", 0)
End Sub
filter实战:模糊筛选。
image.pngSub 筛选()
[d2:f999].Clear
i = Cells(Rows.Count, 1).End(xlUp).Row
Range("c2:c" & i).FormulaArray = "=a2:a" & i & " & ""-"" & b2:b" & i
arr = Range("c2:c" & i)
Range("c2:c1" & i).Clear
a = Filter(Application.Transpose(arr), [g1], True)
For Each b In a
n = n + 1
c = Split(b, "-")
Cells(n + 1, "d") = c(0)
Cells(n + 1, "e") = c(1)
Next
End Sub
结果:我们没有采用join将两个单元格的数据合并,而是采用工作表函数的数组函数,将区域A2:B11一次性合并到C列,然后将数据装入数组,清空C列数据,由于arr为一个二维数组,将其转置成一位,然后filter函数进行匹配,结果赋值给a,a为一个一维数组,用spilit函数将其拆分,最后循环写入对应单元格。
image.png
网友评论