字符串函數(shù)Split的妙用
最近做了一個批處理小程序,Split函數(shù)立了大功勞。分享給大家其中的思路和知識點。
→案例需求:
將下圖1中B列句子,按空格、標(biāo)點符號分割開,單獨列為1行。

圖1

圖2
→思路分析:
首先就想到用Split函數(shù),以空格作為分隔符號把英文句子分割開。我們先熟悉下Split函數(shù)。
●使用方法:Split(需要分割的字符串,分隔符)
通俗的說:Split 函數(shù)給他一個分隔符,能把字符串分割開,并返回一個下標(biāo)從零開始的一維數(shù)組。(重點:①下標(biāo)從0開始②一維數(shù)組)

仿佛可以解決問題了,但是還有一個條件:句子中除了空格,標(biāo)點符號也要做為分隔符。
Split只能設(shè)置一種分隔符,如何實現(xiàn)多種分隔符實現(xiàn)成功分割字符串呢?
●解決辦法:
我們在使用Split函數(shù)之前,把其他的標(biāo)點符號,全部替換為空格即可。這樣子,可以一次性實現(xiàn)分以空格作為分隔符分割字符串。
→最終代碼:
里面除了數(shù)組轉(zhuǎn)置自定義函數(shù)可以借鑒,其他的都是上面編程邏輯的體現(xiàn),理解了上面說的,下面的東西很簡單。
Sub test()Dim crr()k = 0Set sht2 = Worksheets("原始數(shù)據(jù)")arr = Intersect(sht2.UsedRange, sht2.Cells)For i = 2 To UBound(arr)brr = Split(replacestr(arr(i, 2)), " ") '以空格作為分隔符,分割字符串For j = 0 To UBound(brr) '分割完成,循環(huán)寫入數(shù)組crrk = k + 1ReDim Preserve crr(1 To UBound(arr, 2), 1 To k)For m = 1 To UBound(arr, 2) 'For循環(huán),將英文句子同一行的內(nèi)容寫入數(shù)組Crrcrr(m, k) = arr(i, m)Nextcrr(2, k) = brr(j)NextNext'//開始寫入結(jié)果Set sht = Worksheets("結(jié)果")sht.UsedRange.Clear '清空原有數(shù)據(jù)Worksheets("原始數(shù)據(jù)").Rows(1).Copy sht.Range("a1")sht.Range("a2").Resize(UBound(crr, 2), UBound(crr)) = Transpose2(crr)sht.Columns.AutoFitMsgBox ("完成!")End SubFunction replacestr(strr)'自定義函數(shù),替換標(biāo)點符號為空格,為下一步'用空格分割句子做準(zhǔn)備replacestr = Replace(strr, ",", " ,")replacestr = Replace(replacestr, ".", " .")replacestr = Replace(replacestr, """", " "" ")replacestr = Replace(replacestr, "?", " ? ")replacestr = Trim(replacestr)End Function
數(shù)組轉(zhuǎn)置自定義函數(shù):
Function Transpose2(arr As Variant)'自定義數(shù)組轉(zhuǎn)置函數(shù),突破工作表函數(shù)Transpose的限制Dim brr(), i, j, nn = NumberOfArrayDimensions(arr)If n = 1 ThenReDim brr(LBound(arr) To UBound(arr), 1 To 1)For i = LBound(arr) To UBound(arr)brr(i, 1) = arr(i)NextElseReDim brr(LBound(arr, 2) To UBound(arr, 2), LBound(arr) To UBound(arr))For i = LBound(arr) To UBound(arr)For j = LBound(arr, 2) To UBound(arr, 2)brr(j, i) = arr(i, j)NextNextEnd IfTranspose2 = brrEnd FunctionPublic Function NumberOfArrayDimensions(arr As Variant) As IntegerDim Ndx As IntegerDim Res As IntegerOn Error Resume NextDoNdx = Ndx + 1Res = UBound(arr, Ndx)Loop Until Err.Number <> 0NumberOfArrayDimensions = Ndx - 1End Function
【建議收藏】VBA說歷史文章匯總 ?速碼工具箱2.0發(fā)布,更強大的功能等你來體驗! ?VBA會被Python代替嗎? ?代碼存儲美化工具測評-【VBE2019】 ?Excel和Word數(shù)據(jù)交互讀取(生成合同)
評論
圖片
表情
