感謝夏先生
感謝夏先生
呵~ Animal兄你又出現了阿, 久見久見~
Instr 是 VBA 本身的函數, 不是 Excel VBA 的,
所以你可能找錯地方囉~~
Instr 是用來找出指定字元(字串)在另一字串中出現的位罝.
Instr(起始位置,尋找目標字串,要尋找的字串) <--語法
而 vbLf 是 VB 的內建常數, 指 "斷行符號".
Instr(1, [A1], vbLf) 的意思就是 --
斷行符號在A1儲存格字串出現的位置, 從第一個字起算.
以下有另一方法,請參考!
(LEON大師有提示:
此方法因為用到Split 函數,所以不適用於Excel 97,請注意!)
Sub split_and_wrap2()
S = Split([A1], vbLf): Range("A1:B1").Clear
For i = 1 To UBound(S) + 1
[A1] = [A1] & IIf(i = 1, "", vbLf) & Left(S(i - 1), 7)
[B1] = [B1] & IIf(i = 1, "", vbLf) & Mid(S(i - 1), 8, Len(S(i - 1)) - 7)
Next
End Sub
關於您的問題,是這樣的:
「實體上」,我離"LEON" 大師比較近
(很羨慕吧!!??...開玩笑的,見不到面啦!!)
他「以真人發音」告訴我:
『以前曾用Split()回答別人的問題,人家說不能用;
後來才發現是在Excel97下不能用...』。
所以,您可能要去問他是在哪篇文章;我也不知道。
另外,vbLf是=chr(10)沒錯...
還有,順道一提的是:
Split()實在很好用。
以前要去算某一個文字列中出現了『某個字串或字元』幾次,
例如以這次的例子來說:
[A1]儲存格內有:
(1)2010楊傳廣
(2)2012紀政
(3)2018戴室然
(4)2110歐陽一濱
想算有幾列(植樹問題→即為:間隔or換行字元vbLf的個數+1)的話;
可以用↓來算有幾行:
N = Len([A1]) - Len(Replace([A1], vbLf, "")) + 1
然後,藉由split可以寫得稍短一點:
N = UBound(Split([A1], vbLf)) + 1
其實我本來的寫法是這樣的↓,後來才把它改成↑↑split_and_wrap2()
那樣的。
Sub Komi_split1()
N = Len([A1]) - Len(Replace([A1], vbLf, "")) + 1
'推算原本在[A1]儲存格內究竟有幾行。
S = Split([A1], vbLf, N): Range("A1:B1").Clear
'利用Split函數傳回那N行的各別字串。
For i = 1 To N '進行那N行字串的截切、分解。
[A1] = [A1] & IIf(i = 1, "", vbLf) & Left(S(i - 1), 7)
[B1] = [B1] & IIf(i = 1, "", vbLf) & Mid(S(i - 1), 8, Len(S(i - 1)) - 7)
Next
End Sub
TO: 常上此站的動物
↑您的問題,簡單說:
在Excel工作表內是用ASCII Code(或說是系統預設字集BIG-5碼)來決定;
而在VB(VBA)那邊是用Unicode Code來作比較,答案本來就不一樣。
我比較確知的是:
(1)Excel的﹝資料﹞→﹝排序﹞功能是依照ASCII Code來排的。
在Excel 工作表內作「<」or「>」的運算,也是依照ASCII Code來決定的。您可以用code()及char()來確認。
參考】:您用code()所得到的10進位數值,若轉成16進位值,其實就是BIG-5碼,可以用“內碼”輸入法試試看即知。
另外,BIG-5內碼的排列是以”部首”順序搭配”總筆劃”來排的;
您可以去造字程式媕Y,選擇一個字碼再藉由﹝參照﹞功能來瞧一瞧就明白了。
(2)而在Excel VBA內作「<」or「>」的運算,則是依照下列↓來決定:
a.OS是95以前的, 以BIG-5碼的代碼來決定。
(98的時候就己經支援Unicode Code了);
當時不論工作表內的排序orVBA比大小,結果應該都是一致的。
不過這是殘留印象,我現在無法驗証。
b.OS是98(含)以後的, 以Unicode Code來決定。
而Unicode Code的排列,是以所謂「CJK漢字」的共通部首搭配筆劃數來排的。
排出來的結果跟BIG-5碼或日文JIS、大陸GB code各別對照下,順位都有些許出入。
請務必參考下表(上傳檔案code.jpg),可一目瞭然:
To:常上此站的動物
對不起, "民"字的Unicode是「6c11」不是「6cee」,我打錯了。
你可以試試↓這個...
Sub UnicodeTest()
'顯示↓以下漢字所對應的Unicode,再倒著顯示以下Unicode碼所對應的漢字。
Dim Ucd(8) As String
ChWrd = Array("我", "是", "中", "華", "民", "國", "之", "國", "民")
For i = 0 To UBound(ChWrd)
Ucd(i) = Hex(AscW(ChWrd(i))) '抓各別漢字的Unicode,再轉成16進位值。
Next '不轉16進位值,用10進位的也沒關係,但下面的"&H" &要拿掉。
'【註】Ucd = Array("6211", "662f", "4e2d", "83ef", "6c11", "570b", "4e4b", "570b", "6c11")
For i = 0 To UBound(Ucd)
UniStr = UniStr + ChrW("&H" & Ucd(i))
Next
MsgBox UniStr
End Sub
P.S. 我剛有看了一下你那個Word.xls媕Y的"Function 字排序"&Function 字排序2"
覺得你寫的有點長ㄟ,而且我比較不喜歡"逐一比對"的方式。
如果你不嫌我太雞婆的話,我再把我的方法POST上來。
等你的回答!
To:常上此站的動物
↓這兩個請參考;內容就不多解釋了...
Function K字排序(SrcCell As Range) '照Unicode排序=你的字排序()
Dim SrcWord()
N = Len(SrcCell.Value): ReDim SrcWord(N)
For i = 1 To N
SrcWord(i) = CLng("&H" & Hex(AscW(Mid(SrcCell, i, 1))))
Next
For i = 1 To N
K字排序 = K字排序 & ChrW(WorksheetFunction.Small(SrcWord, i))
Next
End Function
Function K字排序2(SrcCell As Range) '照BIG-5碼排序=你的字排序之二
Dim SrcWord()
N = Len(SrcCell.Value): ReDim SrcWord(N)
For i = 1 To N
SrcWord(i) = Asc(Mid(SrcCell, i, 1))
Next
For i = 1 To N
K字排序2 = K字排序2 & Chr(WorksheetFunction.Small(SrcWord, i))
Next
End Function
有一點,請留意:
第一個函數中的 CLng("&H" & Hex....) 看似多此一舉,卻是絕對必要的;
至於原因,請原諒我壞心,你自個兒試試就知道了。
To:常上此網站的動物 先生
您自己研究,不懂再PO上來吧!
書籤