您現在的位置是:首頁 > 垂釣
以多個給定符號作為間隔拆分字串
- 由 VBA語言專家 發表于 垂釣
- 2022-05-31
instr函式什麼意思
大家好,我們今日講解“VBA資訊獲取與處理”教程中第十四個專題“Split函式提取資料資訊的深入講解”的第三節“以多個給定符號作為間隔拆分字串”,這個專題是非常實用的知識點,希望大家能掌握利用。教程會提供配套的程式檔案。
第三節 以多個給定符號作為間隔拆分字串
大家好,我們繼續講解用Split的引申函式拆分字串。在上一講中我們講解了按照任意多個字元來拆分字串的方案,但細心的朋友會提出自己的疑問,如果要根據多個字元如何拆分字串呢?確實,如果拆分的標準改為多個字串,按照上將的內容是無法得到正確的結果的,我們這講就來解決這個問題。
實現的場景,如下圖:
我們在給出的源字串中,要求按照B列的符號來拆分,B列的特點是含有多個字串,這個時候我們考慮到各種情況。
1 實現按多個符號作為間隔進行拆分字串的思路分析
為了實現按照多個符號來拆分,我們可以同樣設計一個函式,這個函式中要給出拆分間隔的標準,這個時候的拆分標準我們用陣列來裝載。
為了按照拆分的標準來拆分字串,我們需要在含有拆分標準的陣列元素中建立一個迴圈,如果發現源字串中包含其中之一的元素,那麼就把源字串中發現的這個符號替換成其他的特定符號,所有的源字串中的符號替換完成後,我們只需要用Split這個函式進行分隔就可以了。
同樣,我們還可以指定如果給出的分隔字串有重複的處理方案。
2 實現按多個符號作為間隔進行拆分字串的程式碼實現
我還是先給出我的程式碼,然後進行講解:
Function SplitB(ByValInString As String, IgnoreDoubleDelmiters As Boolean, _
Delims() As String) As String()
‘IgnoreDoubleDelmiters表示指示當兩個delims之間沒有文字時要做什麼。
’ 如果該值為True,則將連續分隔符壓縮為單個分隔符。
‘ 如果此值為False,則連續分隔符將導致結果陣列中的元素為空。
Dim Arr() As String
If Len(InString) = 0 Then
SplitB = Arr
Exit Function
End If
If IgnoreDoubleDelmiters = True Then
For Ndx = LBound(Delims) To UBound(Delims)
N = InStr(1, InString, Delims(Ndx) &Delims(Ndx), vbTextCompare)
Do Until N = 0
InString = Replace(InString, Delims(Ndx) &Delims(Ndx), Delims(Ndx))
N = InStr(1, InString, Delims(Ndx) &Delims(Ndx), vbTextCompare)
Loop
Next
End If
ReDimArr(1 To Len(InString))
For Ndx = LBound(Delims) To UBound(Delims)
InString = Replace(InString, Delims(Ndx), Chr(1))
Next
Arr = Split(InString, Chr(1))
SplitB = Arr
End Function
Sub mynzB()
Dim TT() As String
Sheets(“SHEET3”)。Select
[c:aa]。ClearContents
Range(“c1”) = “拆分結果”
I = 2
Do While Cells(I, 1) <> “”
TT() = Split(Cells(I, 2)。Value)
UU = SplitB(Cells(I, 1)。Value, True, TT)
For N = LBound(UU) To UBound(UU)
Cells(I, N + 3) = UU(N)
Next
I = I + 1
Loop
End Sub
程式碼截圖:
程式碼講解:
1)If IgnoreDoubleDelmiters = True Then
For Ndx = LBound(Delims) To UBound(Delims)
N = InStr(1, InString, Delims(Ndx) &Delims(Ndx), vbTextCompare)
Do Until N = 0
InString = Replace(InString, Delims(Ndx) &Delims(Ndx), Delims(Ndx))
N = InStr(1, InString, Delims(Ndx) &Delims(Ndx), vbTextCompare)
Loop
Next
End If
這段程式碼是IgnoreDoubleDelmiters引數的處理,表示指示當兩個delims之間沒有文字時要做什麼。如果該值為True,則將連續分隔符壓縮為單個分隔符。如果此值為False,則連續分隔符將導致結果陣列中的元素為空。這個引數的測試讀者可以自己進行,程式碼我已經給出。
程式碼中的InStr函式是一個字串查詢函式:其功能是查詢一個字串在另一個字串中首次出現的位置。
語法:InStr([start,]string1,string2[,compare])
返回值:從 Start 位置開始,在 String1 中尋找 String2 ,如果沒有找到,則返回0。如果 String1 或 String2 為Null,則返回Null,其他情況返回 String2 在 String1 中的起始位置。上述程式碼中用的是Do Until N = 0 指的就是直到沒有發現為止。
2)ReDimArr(1 To Len(InString))
For Ndx = LBound(Delims) To UBound(Delims)
InString = Replace(InString, Delims(Ndx), Chr(1))
Next
Arr = Split(InString, Chr(1))
SplitB = Arr
以上程式碼是用Chr(1)符號代替了InString中的拆分標準符號,最後Arr = Split(InString, Chr(1))
用Chr(1)來分隔源字串。
3)
Do While Cells(I, 1) <> “”
TT() = Split(Cells(I, 2)。Value)
UU = SplitB(Cells(I, 1)。Value, True, TT)
For N = LBound(UU) To UBound(UU)
Cells(I, N + 3) = UU(N)
Next
I = I + 1
Loop
在標準模組中就是利用了SplitB來實現我們的目的。大家要注意,在實現之前我利用了 TT() = Split(Cells(I, 2)。Value) 來獲取拆分間隔符號的引數。
3 實現按多個符號作為間隔進行拆分字串的實現結果
我們點選執行按鈕,看返回的結果:
上面截圖完全實現了我們的目的,對於重複字元的測試讀者可以自己進行。
本節知識點回向
:
①
Sp
litB函式的意義是什麼
?
②
Sp
litB函式的
和Sp
litA有什麼不同
?
本講程式碼參考檔案
:01
4
工作表
.xlsm
積木程式設計的思路內涵:
在我的系列書籍中一直在強調“搭積木”的程式設計思路,這也是學習利用VBA的主要方法,特別是職場人員,更是要採用這種方案。其主要的內涵:
1
程式碼不要自己全部的錄入
。你要做的是把積木放在合適的位置然後去
修正程式碼
,一定要複製,從你的積木庫中去複製,然後修正程式碼,把時間利用到高效的思考上。
2
建立自己的“積木庫”
。平時在學習過程中,把自己認為有用的程式碼放在一起,多積累,在用到的時候,可以隨時拿來。你的積木庫資料越多,你做程式的思路就會越廣。
VBA的應用界定及學習教程:
VBA
是利用
Office
實現個人小型辦公自動化的有效手段(工具)。
這是我對VBA的應用界定。在取代OFFICE新的辦公軟體沒有到來之前,誰能在資料處理方面做到極致,誰就是王者。其中登峰至極的技能非VBA莫屬!
我記得20年前自己初學VBA時,那時的資料甚少,只能看原始碼自己琢磨,真的很難。20年過去了,為了不讓學習VBA的朋友重複我之前的經歷,我根據自己多年VBA實際利用經驗,推出了六部VBA專門教程:
第一套:
VBA
程式碼解決方案
是VBA中各個知識點的講解,教程共147講,覆蓋絕大多數的VBA知識點,提供的程式檔案更是一座不可多得的程式碼寶庫,是初學及中級人員必備教程;目前這套教程提供的版本是修訂第二版,
程式檔案透過
3
2
位和
6
4
位兩種
O
FFICE
系統測試。
第二套:
VBA
資料庫解決方案
資料庫是資料處理的專業利器,教程中詳細介紹了利用ADO連線ACCDB和EXCEL的方法和例項操作,適合中級人員的學習。目前這套教程提供的是修訂第一版教程,
程式檔案透過
3
2
位和
6
4
位兩種
O
FFICE
系統測試。
第三套:
VBA
陣列與字典解決方案
陣列和字典是VBA的精華,字典是VBA程式碼水平提高的有效手段,值得深入的學習,是初級及中級人員程式碼精進的手段。目前這套教程提供的版本是修訂第一版,
程式檔案透過
3
2
位和
6
4
位兩種
O
FFICE
系統測試。
第四套:
VBA
程式碼解決方案之影片
是專門面向初學者的影片講解,可以快速入門,更快的掌握這門技能。這套教程是第一套教程(修訂一版)的影片講解,聽母音更易接受。
這套教程
還
會額外提供透過
3
2
位和
6
4
位兩種
O
FFICE
系統測試的程式檔案。
第五套:
VBA
中類的解讀和利用
這
是一部高階教程,講解類的虛無與肉身的度化,類的利用雖然較少,但仔細的學習可以促進自己VBA理論的提高。這套教程的領會主要是讀者的領悟了,領悟一種佛學的哲理。目前這套教程提供的版本是修訂第一版,
程式檔案透過
3
2
位和
6
4
位兩種
O
FFICE
系統測試。
第六套教程:《
VBA
資訊獲取與處理》
,
這
是一部高階教程,涉及範圍更廣,實用性更強,面向中高階人員。教程共二十個專題,包括:跨應用程式資訊獲得、隨機資訊的利用、電子郵件的傳送、VBA網際網路資料抓取、VBA延時操作,剪下板應用、Split函式擴充套件、工作表資訊與其他應用互動,FSO物件的利用、工作表及資料夾資訊的獲取、圖形資訊的獲取以及定製工作表資訊函式等等內容。
上述教程的學習順序:
1
→
3
→
2
→
6
→
5
或者
4
→
3
→
2
→
6
→
5
。提供的程式檔案更是一座巨大的程式碼庫,供讀者使用,如需要可以WeChat: NZ9668
學習VBA是個過程,也需要經歷一種枯燥的感覺
“眾鳥高飛盡,孤雲獨去閒。相看兩不厭,只有敬亭山”。學習的過程也是修心的過程,修一個平靜的心。在程式碼的世界中,心平靜了,心情好了,身體自然而然就好。心靜則正,內心裡沒有那麼多邪知邪見,也就沒有那麼多妄想。利人就是利己。我的教程助力給正在努力的朋友。
“水善利萬物而不爭”,綿綿密密,微則無聲,巨則洶湧。學習亦如此,知道什麼是自己所需要的,不要蜷縮在一小塊自認為天堂的世界裡,待到暮年時再去做自欺欺人的言論。要努力提高自己,用一顆充滿生機的心靈,把握現在,這才是進取。越是有意義的事情,困難會越多。願力決定始終,智慧決定成敗。不管遇到什麼,都是風景。看淡紛爭,看輕得失。學習時微而無聲,利用時則巨則洶湧。“路漫漫其修遠兮,吾將上下而求索”
每一分收穫都是成長的記錄,怎無憑,正是這種執著,成就了朝霞的燦爛。最後將一闕詞送給致力於VBA學習的朋友,讓大家感受一下學習過程的枯燥與執著:
浮雲掠過,暗語無聲,
唯有清風,驚了夢中啼鶯。
望星,疏移北斗,
奈將往事雁同行。
阡陌人,昏燈明暗,
忍顧長亭。
多少
VBA
人,
暗夜中,悄聲尋夢,盼卻天明。
怎無憑!
分享我多年工作實際經驗的成果,隨喜這些有用的東西,給確實需要利用VBA的同路人。迴向學習利用VBA的歷歷往事,不勝感慨,謹以這些文字以紀念,
分享成果,隨喜正能量