返回列表 上一主題 發帖

請教mid、midb、len、lenb問題

請教mid、midb、len、lenb問題

大家好:
想請教 len()搭mid()英數字員與中文字元,lenb()搭midb()英數中文字元算法

我有製作一個範例問題 活頁簿1.rar (12.48 KB)

我的疑問是midb、lenb對英數為何也是雙字元
有辦法讓英數算單字元,中文算雙字元的方法嗎?
lionliu

回復 23# ML089
謝謝ml版他大的提醒, 讓我的資料內榮更通順。我再仔細的研究一下。
lionliu

TOP

本帖最後由 ML089 於 2016-1-24 23:16 編輯

回復 20# lionliu
原始備註是以CHAR(13)&CHAR(10)結尾,若要重新分隔為20字元時,CHAR(13)&CHAR(10)結尾用 "," 來替代會比好。


一、採用函數公式方法
名稱公式
find_text =MIDB(STR,LOOKUP(999,IF({1,0},1,FINDB(INDIRECT("R[-1]C",),STR)+LENB(INDIRECT("R[-1]C",)))),{19;20})
STR =SUBSTITUTE(!$A$2,CHAR(13)&CHAR(10),",")

C6公式
C6 =IF(AND(ROW(A1)>1,INDIRECT("R[-1]C",)=""),"",LOOKUP(,0/FINDB(find_text,STR),find_text))

公式其他應用時需要修改 名稱中的 $A$2,其他不需要處理。


二、採用VBA方法
借用准大的VBA修改如下

Sub 截取字串()
    Dim Arr
    Arr = SPL(Replace([A2], Chr(13) & Chr(10), ","), 20)
    Arr = Split(Arr, Chr(10))
    [H6].Resize(UBound(Arr)) = Application.Transpose(Arr)
End Sub

Function SPL(ByVal xS$, xL%)
    If xS = "" Then Exit Function
    nL = IIf(InStr(xS, xMidB(xS, 1, 20)), 20, 19)
    SPL = xMidB(xS, 1, nL) & Chr(10) & SPL(xMidB(xS, nL + 1, 9999), xL) '遞回處理
End Function

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

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

三、採用自訂函數及自動換列方式
=SPL(SUBSTITUTE($A$2,CHAR(13)&CHAR(10),","),20)
{...} 表示需要用 CTRL+SHIFT+ENTER 三鍵輸入公式

TOP

回復 21# 准提部林
謝謝准大
幫我把這困擾我很久的問題解決了
,我再仔細的研究一定要搞懂他。
lionliu

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

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

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

TOP

如果是 ANSI 轉碼就好了

TOP

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

TOP

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

TOP

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

TOP

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