返回列表 上一主題 發帖

請教mid、midb、len、lenb問題

本帖最後由 准提部林 於 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

回復 13# lionliu


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

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

TOP

回復 12# ML089
回復 12# 准提部林
謝謝2為版大指導
我現在終於知道問題所在了,我再努力試試看可否判斷每次取出字串長度。
我的原始資料無法正確提供,因為不確定性有英數、空白、中文很亂長短不一,最多可以到200bye以上。
在這還是謝謝2位熱心的教導。
lionliu

TOP

回復 10# lionliu

把准大的公式改為自訂函數
Function xMidB(ByVal str As String, start, length)
    xMidB = Evaluate("MidB(""" & str & """," & start & ", " & length & ")")
End Function

Function xLenB(ByVal str As String)
    xLenB = Evaluate("LenB(""" & str & """)")
End Function
   

再來就是取用的資料規則
每20個字取一段,若中文字在第20個字位置,用Evaluate來使用表函數時會自動取為21個字元,保持中文字的完整性。但下一段是要取20個字或19個字要先定義清楚。
{...} 表示需要用 CTRL+SHIFT+ENTER 三鍵輸入公式

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

本帖最後由 lionliu 於 2016-1-19 15:30 編輯

回復 6# ML089
回復 8# 准提部林
2位大哥好:
經過測試後發現2個問題,mj大大的方法若中文字串剛好在切割點會變成?,下一行第一格字也是?,中文字剖半。

准大的方法我第一次用midb不會改,我過我用了類式的笨方法,"=midb(a1,1,20)"打公式的方式,結果會好一點,但是發現會掉字(中文字剛好在分割點時),目前尚在研究測試中。
lionliu

TOP

回復 6# ML089
謝謝MJ大大:
我測試後都正常了。
lionliu

TOP

回復 7# 准提部林
謝謝 Mj與准大2位大哥的回覆,原來medb還要這樣改,我想說一直出現亂碼不知哪里出錯正想再請教。我再試看看。
lionliu

TOP

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

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

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

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

TOP

加入
Function xMidB(ByVal str As String, start, length)
    xMidB = StrConv(MidB(StrConv(str, vbFromUnicode), start, length), vbUnicode)
End Function

Function xLenB(ByVal str As String)
    xLenB = LenB(StrConv(str, vbFromUnicode))
End Function

將原程式中的 LenB 改為 xLenB
將原程式中的 MidB 改為 xMidB
{...} 表示需要用 CTRL+SHIFT+ENTER 三鍵輸入公式

TOP

        靜思自在 : 不要隨心所欲,要隨心教育自己。
返回列表 上一主題