返回列表 上一主題 發帖

請教mid、midb、len、lenb問題

回復 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

回復 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

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

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

感覺樓主自己本身的想法有問題。為什麼一定要按ASIN編碼截取呢?是有什麼特殊的要求還是為了適應數據環境沒有辦法而為之呢?如果處理的數據就是在Excel表格中,Excel表格的所有字符串都是Unicode編碼的,完全不需要舍近求遠啊……
世界那麼大,可我想去哪?

TOP

按ASIN編碼截取很容易出現一個字符被截成兩個字符的現象,如果一定要按這種方式截取那只能是一個一個字符去比較,如果字符的編碼在0至127之間,則表示為一個ASCII字符(佔一個字節位),否則就按兩個字節單元計算。當出現剛好一個雙字節字符有截取一半的情況時,再按自己的需求是保留整個字符還是去掉此字符(這個情況樓主沒有說明)。
世界那麼大,可我想去哪?

TOP

回復 1# lionliu
樓主知道這東西嗎...
A1儲存格右鍵>儲存格格式>對齊方式>勾選自動換列
表達不清、題意不明確、沒附檔案格式、沒有討論問題的態度~~~~~~以上愛莫能助。

TOP

如果是 ANSI 轉碼就好了

TOP

本帖最後由 lionliu 於 2016-1-21 16:50 編輯

回復 15# 准提部林
謝謝准大提供的測試檔案。我先下載下來測試
也很抱歉到現在才有空上來看資料,知道有這麼多大哥關心在此說謝謝。
我的環境:是windows7
我的資料是系統廠商開發出來的報表系統轉出來的excel檔,所以是win7的ANSI格式,
出貨後要提供買方上傳出貨相關資料是UTF-8格式文字檔,備註欄的長度
每行30字元,因此買方要求若是全中文最長10個中文字。所以我在ANSI的情形下,
只能取20個字元。
在此附上我調整過的備註欄資料。 活頁簿2.rar (13.82 KB)
lionliu

TOP

        靜思自在 : 信心、毅力、勇氣三者具備,則天下沒有做不成的事。
返回列表 上一主題