Peter H.
2002-04-24, 12:00 PM
感謝夏先生
頁 : 1
[2]
Peter H. 2002-04-24, 12:00 PM 感謝夏先生 leonchou 2002-09-18, 03:08 AM 呵~ Animal兄你又出現了阿, 久見久見~ Instr 是 VBA 本身的函數, 不是 Excel VBA 的, 所以你可能找錯地方囉~~ Instr 是用來找出指定字元(字串)在另一字串中出現的位罝. Instr(起始位置,尋找目標字串,要尋找的字串) <--語法 而 vbLf 是 VB 的內建常數, 指 "斷行符號". Instr(1, [A1], vbLf) 的意思就是 -- 斷行符號在A1儲存格字串出現的位置, 從第一個字起算. Komi 2002-09-23, 10:44 AM 以下有另一方法,請參考!:) (LEON大師有提示: 此方法因為用到Split 函數,所以不適用於Excel 97,請注意!):eek: 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 Komi 2002-09-24, 04:31 PM 關於您的問題,是這樣的: 「實體上」,我離"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 Komi 2002-09-25, 10:28 AM 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),可一目瞭然: Komi 2002-09-25, 01:35 PM 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上來。 等你的回答! Komi 2002-09-26, 11:12 AM 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....) 看似多此一舉,卻是絕對必要的; 至於原因,請原諒我壞心,你自個兒試試就知道了。 Komi 2002-09-26, 11:27 AM To:常上此網站的動物 先生 您自己研究,不懂再PO上來吧! |