返回列表 上一主題 發帖

[發問] 如何判斷是否 全形字?

[發問] 如何判斷是否 全形字?

本帖最後由 sunnyso 於 2013-4-8 20:17 編輯

如何判斷是否 全形字? 有沒有用 VBA 和不用VBA的方法.  謝謝

用=CODE() 對"氹" 字 沒有用

  1. 字        is全形
  2. 氹        TRUE
  3. 仔        TRUE
  4. 澳        TRUE
  5. A        FALSE
  6. 1        FALSE
  7. 1        TRUE
  8. ?        FALSE
  9. ?        TRUE
  10. .        FALSE
  11. 。        TRUE
複製代碼
q.rar (6.22 KB)
ss

現在Unicode碼應用很廣,Excel對Unicode碼支援不全(至少不便),尤其是VBA。還有也不支援Unicode碼的CSV檔。

TOP

回復 27# cbl0924

BIG5對 特殊字無效(例如氹)
ss

TOP

可不可以乾脆全部都用 =BIG5(數值/文字)
全部統一變成全形
或 =ASC(數值/文字)  全部變成半形

這樣會不會比較簡單??
若無閑事掛心頭
便是人間好時節

TOP

回復 2# Hsieh 回復 21# Bodhidharma 回復 22# ML089 回復 24# 准提部林

終於想到一個簡潔的方法,用 “正規表示式”

不知 各位大大們是否再提供更的精闢解法!
  1. Function CountDblChr(ByVal sCh As String) As Integer
  2.     Set re = CreateObject("vbscript.regexp")
  3.     're.Pattern = "[\u4e00-\u9fa5]" '判斷中文字(包括特殊字,但不包括符號。和數字如1)
  4.     re.Pattern = "[^\x00-\xff]" '判斷所有的全形字
  5.     re.Global = True
  6.     re.IgnoreCase = True
  7.     Set matches = re.Execute(sCh)
  8.     CountDblChr = matches.Count
  9.     Set re = Nothing
  10. End Function
複製代碼
ss

TOP

回復 24# 准提部林

若不考慮〔特殊字〕

DblChrCount = LenB(StrConv([D3], vbFromUnicode)) - Len([D3])
ss

TOP

回復 23# sunnyso


~~LeftB(   , 1) 在VBA好像不能用___〔LeftB〕在工作表函數與VBA函數作用不同,只能使用〔Evaluate〕來帶!

A1文字:氹仔 堃 澳A1??2135H?V

1.以MID跑迴圈取字,再逐一比對:
  Sub 全型字元數1()
  Dim j%, Jm%, T$
  For j = 1 To Len([A1])
    T = Mid([A1], j, 1)
    If T <> Evaluate("LeftB(""" & T & """,1)") Then Jm = Jm + 1
  Next j
  MsgBox "全型字共有:" & Jm & " 個"
  End Sub
 
2.不用迴圈:
  Sub 全型字元數2()
  Dim X1%, X2%
  X1 = Len([A1])
  X2 = Evaluate("Len(LeftB(""" & [A1] & String(X1, "1") & """," & X1 * 2 & "))")
  MsgBox "全型字共有:" & X1 * 2 - X2 & " 個"
  End Sub
 
  公式演示:
  B1:=LEN(A1)*2-LEN(LEFTB(A1&REPT(1,LEN(A1)),LEN(A1)*2))
 
  其他參考:文字若超過99字,請自行調整
  =LEN(A1)*2-LEN(LEFTB(A1&REPT(1,99),LEN(A1)*2)) 
  =FREQUENCY(LEN(LEFTB(MID(A1,ROW(1:99),1)&"TT",2)),{1,0})
  =SUMPRODUCT(N(LEN(LEFTB(MID(A1,ROW(1:99),1)&"TT",2))=1))
  
  若不考慮〔特殊字〕應會單純些,以上粗略程式碼及公式供參考,看版主們是否再提供較正規的精闢解法!

TOP

回復 2# Hsieh
回復 13# ML089
回復 19# 准提部林
回復 21# Bodhidharma

Left(   ,1) <> LeftB(   , 1) 在VBA好像不能用

附註 LeftB 函數是使用在位元組資料字串上。所以 LeftB 傳回的是位元組數,而非字元數。

請問各位大大, 如何用VBA來判斷(不使用Application.WorksheetFunction)?
ss

TOP

回復 21# Bodhidharma

沒錯,你的說明比較對,重點就是 X
{...} 表示需要用 CTRL+SHIFT+ENTER 三鍵輸入公式

TOP

回復 20# ML089

補充一下註解,應該加一個
X:應視為是全型,但LENB()為1的特例,如「堃」
B:全型字數
S:半型字數
LEN(A1)+LENB(A1)-LENB(BIG5(A1))
=(B+S +X)+ (B*2+S+X) - (B*2 + S*2+X)
=B+X

TOP

        靜思自在 : 要比誰更受誰.不要比誰更怕誰。
返回列表 上一主題