返回列表 上一主題 發帖

請教mid、midb、len、lenb問題

請教mid、midb、len、lenb問題

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

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

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

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

回復 2# ML089
謝謝版大回覆
我的問題是midb(range,1,20)為什麼英數都算雙字元。
我的需求是20字元,英數中文混合。
lionliu

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

本帖最後由 lionliu 於 2016-1-18 09:42 編輯

回復 3# lionliu

謝謝ml大哥,我在測試一下。
lionliu

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

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

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

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

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

TOP

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

TOP

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

TOP

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

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

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

TOP

        靜思自在 : 地上種了菜,就不易長草;心中有善,就不易生惡。
返回列表 上一主題