返回列表 上一主題 發帖

請教mid、midb、len、lenb問題

回復 1# lionliu

你的範例中 A1 = "abc123, abc 123 abc123我搞不定 MID( ),MIDB( ),LEN( ) LENB( ) stuwxyz"

LEN(A1) = 64
LENB(A1) = 69
表示 69-64=5 有5個雙字元

不了解你要求甚麼?
{...} 表示需要用 CTRL+SHIFT+ENTER 三鍵輸入公式

TOP

回復 3# lionliu

請看這篇說明
    http://forum.twbts.com/thread-31-1-1.html



Len 函數範例
第一個範例使用 Len 傳回某字串的長度(字元數)或某變數的大小(位元數)。Type...End Type 程式區塊定義一個自訂資料型態 CustomerRecord。如果該資料型態定義在物件類別模組中,則必需以關鍵字 Private 開頭(表示為私有)。若定義在一般模組中,Type 定義就可以為 Public。

Type CustomerRecord    ' 定義使用者自訂的資料型態。
    ID As Integer    ' 將此定義放在一般模組中。
    Name As String * 10
    Address As String * 30
End Type

Dim Customer As CustomerRecord    ' 宣告變數。
Dim MyInt As Integer, MyCur As Currency
Dim MyString, MyLen
MyString = "Hello World"    ' 設定變數初值。
MyLen = Len(MyInt)    ' 傳回 2。
MyLen = Len(Customer)    ' 傳回 42。
MyLen = Len(MyString)    ' 傳回 11。
MyLen = Len(MyCur)    ' 傳回 8。

如果用ANSI表示字串的話,第二個範例使用 LenB和使用者定義的函數 (LenMbcs) 傳回某字串的長度(字元數)。

Function LenMbcs (ByVal str as String)
    LenMbcs = LenB(StrConv(str, vbFromUnicode))
End Function

Dim MyString, MyLen
MyString = "ABc"
' "A" 和 "B" 是 DBCS且 "c" 是SBCS。
MyLen = Len(MyString)
' 傳回字串中有3 –3 個字元。
MyLen = LenB(MyString)
' 傳回 6 – 6 位元用於Unicode。
MyLen = LenMbcs(MyString)
' 傳回 5 - 5個位元用於ANSI。
{...} 表示需要用 CTRL+SHIFT+ENTER 三鍵輸入公式

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

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

本帖最後由 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

        靜思自在 : 我們最大的敵人不是別人.可能是自己。
返回列表 上一主題