返回列表 上一主題 發帖

請教mid、midb、len、lenb問題

本帖最後由 准提部林 於 2016-1-18 15:45 編輯

較簡單的方法:
xLenB = Evaluate("LenB(""" & Range("A1") & """)")
MsgBox xLenB

若中文含有〔簡體字〕或其它外字碼全型字,xLenB 會傳回1,所以還是不可靠,
例如:堃.々.国.龥....等等

可考慮〔正則〕方法,但我不熟用,請上網找現成看看∼∼

TOP

回復 10# lionliu


不要用 MIDB,先以工作表公式參考以下:
A1:asxing中一刀
B1:=LEFT(A1,LEN(A1)*2-LENB(A1)) 取前段半型字
C1:=RIGHT(A1,LENB(A1)-LEN(A1)) 取後段全型字
   或 =MID(A1,LEN(A1)*2-LENB(A1)+1,99)

如果文字串不是單純的兩段式,方法就複雜多了,要看實際資料及需求如何?

TOP

回復 13# lionliu


以 =MIDB("Ya Xing 123456789中一刀",1,20) 為例,
取出字串為 "Ya Xing 123456789中 " , "一" 剛好在 20,21 位置, 被截斷只取一半, 所以字串後面多了一個[空白字元],
雖然可用 TRIM 去除空白字元, 但若遇到取出字串的前後空白是原字串所有, 此時 TRIM 會讓結果失真,
因此以上的 LENB, MIDB 都無法正確取出結果!

或許舉出一個較長字串實例, 並手動將需求結果列出, 再來想辦法!!!

TOP

本帖最後由 准提部林 於 2016-1-20 22:50 編輯

給個參考方法∼∼∼

A1放502個字元文字串當測試,
 
Sub 截取字串()
Dim Arr
Arr = SPT_Str([A1], 20)
Arr = Split(Arr, Chr(10))
[H4].Resize(UBound(Arr) + 1) = Application.Transpose(Arr)
End Sub
 
'=============================
Function SPT_Str(xString$, xLength%)
Dim T$, TT$, TTT$, LN&
TT = xString
Do
  T = Evaluate("MIDB(""" & Left(TT, 240) & """,1," & xLength & ")")
  LN = Len(T)
  If Right(T, 1) = " " And Mid(TT, LN) <> " " Then LN = LN - 1
  TTT = TTT & Chr(10) & Left(TT, LN)
  TT = Mid(TT, LN + 1)
Loop Until TT = ""
SPT_Str = Mid(TTT, 2)
End Function
 
Left(TT, 240) 
_字串太長,MIDB 會發生錯誤,所以先截取前面240個字元!

If Right(T, 1) = " " And Mid(TT, LN) <> " " Then LN = LN - 1 
_截取文字最後一字若為〔空白字元〕,判斷是否為全型字未完全取出的餘白,若是,則減取一字!
 
測試檔:
20160120-01(截取字串).rar (9.2 KB)
 

TOP

回復 20# lionliu


範例檔的〔函數〕或〔VBA〕兩法,都有中文字〔掉字〕問題,
#15程式稍修如下:
Sub 截取字串()
Dim Arr
Arr = SPT_Str(Replace([A2], Chr(10), ""), 20) 
Arr = Split(Arr, Chr(10))
[B6].Resize(UBound(Arr) + 1) = Application.Transpose(Arr)
End Sub

〔自訂函數〕Function SPT_Str(xString$, xLength%) 不變!

完全不會有〔掉字/差字〕問題∼∼∼

TOP

        靜思自在 : 是非當教育,讚美作警惕。
返回列表 上一主題