English Deutsch Français Italiano Español Português 繁體中文 Bahasa Indonesia Tiếng Việt ภาษาไทย
所有分類

Private Type TEST
文字 As String
號碼 As String
End Type

Private Sub Command1_Click()
Text1.Text = \"\"
io = InputBox(\"輸入文字或四角號碼,請以空白間隔\")
io = Split(io)
For i = 0 To UBound(io)
Text1.Text = Text1.Text & 轉換(io(i)) & \" \"
Next
End Sub

Public Function 轉換(ByVal Sur As String)
Dim Ar(6587) As TEST
tmp1 = \"ㄅ ㄆ ㄇ ㄈ ㄉ ㄊ ㄋ ㄌ ㄍ ㄎ ㄏ ㄐ ㄑ ㄒ ㄓ ㄔ ㄕ ㄖ ㄗ ㄘ ㄙ ㄚ ㄛ ㄜ ㄝ ㄞ ㄟ ㄠ ㄡ ㄢ \"
tmp1 = tmp1 + \" ㄣ ㄤ ㄥ ㄦ ㄧ ㄨ ㄩ ? 啊 阿 埃 挨 哎 唉 哀 皚 癌 藹 矮 艾 礙 愛 隘 鞍 氨 安 俺 按 暗 岸 \"
tmp1 = tmp1 + \" 胺 案 肮 昂 盎 凹 敖 熬 翱 襖 傲 奧 懊 澳 芭 捌 扒 叭 吧 笆 八 八 八 八 疤 巴 拔 跋 靶 把 \"
tmp1 = tmp1 + \" 耙 壩 壩 霸 霸 罷 爸 白 柏 百 擺 佰 敗 拜 稗 斑 班 搬 扳 般 頒
tmp2 = \"9720 9721 9722 9723 9724 9725 9726 9727 9728 9729 9730 9731 9732 9733 9734 9735 9736 9737 9738 9739 9740 9744 9745 9746 9747 9748 9749 9750 9751 9752 \".............
tmp2 = tmp2 + \" 9753 9754 9755 9756 9741 9742 9743 9990 0759 7093 1002 2179 0740 0780 0755 4114 4074 5676 4253 5337 4293 1947 7137 7254 8637 1344 0219 2174 2542 1489 \"
tmp2 = tmp2 + \" 5143 2714 7542 2491 4138 0425 2407 3581 5063 5984 0277 1159 2020 3421 5359 2193 2091 0665 0721 4576 9908 9808 0360 9708 4002 1572 2149 6405 7249 2116 \"
tmp2 = tmp2 + \" 5090 8218 1056 7218 6011 5007 3640 4101 2672 4102 2369 0184 2408 2157 4458 2432 3803 2289 2104 5301 7317 2647 3652 2101 2142 0133 3904 0584 6586 4810 \"......................
For i = 0 To 6587
Ar(i).文字 = Split(tmp1)(i)
Ar(i).號碼 = Split(tmp2)(i)
Next
For i = 0 To UBound(Ar)
If Ar(i).文字 = Sur Then 轉換 = 轉換 & Ar(i).號碼
If Ar(i).號碼 = Sur Then 轉換 = 轉換 & Ar(i).文字
Next
End Function


Private Sub Form_Load()

End Sub
-------------------------------------------------------------------
因為tmp1 和 tmp2 的資料過大(共6千多字),產生運算結果時間過長,所以想請問什麼方法能改善這個問題,能的話能否請各位高手給我 ”詳解 ”拜託了!

2006-07-09 01:32:43 · 5 個解答 · 發問者 BruceChu 1 in 電腦與網際網路 程式設計

真是太強了!那可以順便請問一下:
鋝 鐦 鐧 鋃 鋟 鋦 錒 錆 鍩錛 鍀 錁 錕 錮 錇 錟 錙 鍥 鍇 鍶 鍔 鍤 鍰 鎄 鏤
輸入後會變成:
鋝 ? ? 鋃 鋟 鋦 錒 錆 ?錛 ? 錁 錕 錮 ? 錟 錙 鍥 鍇 鍶 鍔 鍤 鍰 ? 鏤
------------------------------------------------------------------
若將這幾個字打進Form(程式碼)中如何能避免出現????而不是原來輸入的字?

2006-07-09 21:59:25 · update #1

我很同意W.J.S.您的觀點,但我想要的是當輸入的值不是4個號碼而是3個或者是5個號碼時,如何讓它忠實的出現3個或者是5個的原號碼而不是中文字呢?

2006-07-10 11:15:29 · update #2

請問W.J.S.兄您所附的資料庫程式碼我已下載但執行有困難:出現編譯錯誤的訊息(使用者自訂型態尚未定義),為什麼會這樣呢?感恩!
錯誤反白區---------> mDb As Database

2006-07-10 23:57:37 · update #3

還真的耶!成功了說! 對了但針對上次的問題就是要如何修改程式碼才能 "資料庫設定都是4碼,但倘若輸入非資料庫中的數字碼數,則轉出非資料庫中的數字碼數:舉例來說:
 輸入5337---->轉出 "艾"
但輸入53337--->轉出 "53337"

2006-07-11 09:53:11 · update #4

還有另一個問題就是只能相容下載的ACCESS97檔嗎?我用的是2003,如何修改.mdb的內容,比方說要再加字。感謝你!

2006-07-11 11:38:06 · update #5

非常感謝你們2位高手的指教,也使小弟我解感不少,未來的我會把你們當做是我的目標繼續的學習!

2006-07-12 10:55:04 · update #6

5 個解答

'(1)此題基本上應該用資料庫來做比較適合'(2)tmp1跟tmp2設成全域變數可在Form_Load時就設定,不用每次執行時就設定一次,並請注意其空隔之排列方式'(3)利用Instr迅速找出其位置,並呼叫出相對位置的另外一方,速度會比用迴圈快Dim tmp1$, tmp2$Private Sub Command1_Click()    Text1.Text = ""    io = InputBox("輸入文字或四角號碼,請以空白間隔")    io = Split(io)    For I = 0 To UBound(io)        Text1.Text = Text1.Text & 轉換(io(I)) & " "    NextEnd SubPublic Function 轉換(ByVal Sur As String) As String    Dim I As Long        I = InStr(tmp1, " " & Sur & " ")    If I Then 轉換 = Split(Trim(tmp2))((I - 1) \ 2)        I = InStr(tmp2, " " & Sur & " ")    If I Then 轉換 = Split(Trim(tmp1))((I - 1) \ 5)End FunctionPrivate Sub Form_Load()    tmp1 = " ㄅ ㄆ ㄇ ㄈ ㄉ ㄊ ㄋ ㄌ ㄍ ㄎ ㄏ ㄐ ㄑ ㄒ ㄓ ㄔ ㄕ ㄖ ㄗ ㄘ ㄙ ㄚ ㄛ ㄜ ㄝ ㄞ ㄟ ㄠ ㄡ ㄢ "    tmp1 = tmp1 + "ㄣ ㄤ ㄥ ㄦ ㄧ ㄨ ㄩ ? 啊 阿 埃 挨 哎 唉 哀 皚 癌 藹 矮 艾 礙 愛 隘 鞍 氨 安 俺 按 暗 岸 "    tmp1 = tmp1 + "胺 案 肮 昂 盎 凹 敖 熬 翱 襖 傲 奧 懊 澳 芭 捌 扒 叭 吧 笆 八 八 八 八 疤 巴 拔 跋 靶 把 "    tmp1 = tmp1 + "耙 壩 壩 霸 霸 罷 爸 白 柏 百 擺 佰 敗 拜 稗 斑 班 搬 扳 般 頒 "        tmp2 = " 9720 9721 9722 9723 9724 9725 9726 9727 9728 9729 9730 9731 9732 9733 9734 9735 9736 9737 9738 9739 9740 9744 9745 9746 9747 9748 9749 9750 9751 9752 "    tmp2 = tmp2 + "9753 9754 9755 9756 9741 9742 9743 9990 0759 7093 1002 2179 0740 0780 0755 4114 4074 5676 4253 5337 4293 1947 7137 7254 8637 1344 0219 2174 2542 1489 "    tmp2 = tmp2 + "5143 2714 7542 2491 4138 0425 2407 3581 5063 5984 0277 1159 2020 3421 5359 2193 2091 0665 0721 4576 9908 9808 0360 9708 4002 1572 2149 6405 7249 2116 "    tmp2 = tmp2 + "5090 8218 1056 7218 6011 5007 3640 4101 2672 4102 2369 0184 2408 2157 4458 2432 3803 2289 2104 5301 7317 2647 3652 2101 2142 0133 3904 0584 6586 4810 "End Sub

2006-07-10 12:33:02 補充:
文字輸入會出現?的問題請參考Unicode 補完計畫:
http://infoserv.com.tw/phorum/read.php?f=1&i=48538&t=48537

http://infoserv.com.tw/phorum/read.php?f=1&i=70060&t=70027

2006-07-10 14:02:20 補充:
TO Rody:一時找不到曾經看過的文章記得是璉璉大發表的(一個功力很強的程設,到小雄那邊就可找到他的文章)他曾經針對Instr跟For~Next做比較而得到的結果^^

2006-07-10 14:04:12 補充:
跑跑看
S = "A"
For I = 1 To 100000
S = S & I
If I Mod 500 = 0 Then S = S & "A"
Next
d = Timer
For I = 1 To Len(S)
If Mid$(S, I, 1) = "A" Then Print I; "-";
Next
Print
Print Timer - d

2006-07-10 14:04:25 補充:
d = Timer
I = 0
Do
I = InStr(I + 1, S, "A")
If I Then Print I; "-";
Loop Until I = 0
Print
Print Timer - d

2006-07-10 17:05:52 補充:
此做法是針對你要對照的號碼位數全都一樣為4位數而設計若全都是5位數則將
If I Then 轉換 = Split(Trim(tmp1))((I - 1) \ 5)
改成
If I Then 轉換 = Split(Trim(tmp1))((I - 1) \ 6)
同理其他位數也是一樣.若位數不全然相同時.我想在較少位數前面補0也是可行的方法.如:325>00325
言歸正傳:這種題目還是以資料庫去做才是王道.畢竟管理及查詢上方便多了^^

2006-07-10 18:02:17 補充:
以下是用資料庫的方式去做的(DAO),裡頭的數據是根據你題目上的資料輸入的,有興趣可下載去看(只可放7天)
http://www.yousendit.com/transfer.php?action=check_download&ufid=FD96D34652852553&key=ce460f316974ef5ae9244160e44495e34e1718c9

2006-07-11 01:11:59 補充:
To Rody兄:
很高興這裡又多了你這個高手,讓這個討論區增色不少^_^,不過我還是要提出一些意見XD,請將:
Strs(i) = Forma(i, "00000000000")
改成
Randomize Timer
Strs(i) = String(11 - Len(CStr(i)), Chr(Int(Rnd * 26 + 65))) & i
再跑看看,速度就會差很多,便成InStr快,為何會這樣我也不知道,不過若InStr改成以文字比對的方式(a=A),那速度就非常慢了!

2006-07-11 01:21:41 補充:
另外再補充另一種方式:
Dim K$()
Print "Test 3 Start"

d = Timer
For j = 1 To Repeat
  K = Filter(Strs, Strs(Count), True)
  If UBound(K) = 0 Then S2 = "Find!"
Next
Print "Use " & Timer - d & " Seconds"

2006-07-11 12:28:07 補充:
TO Rody 兄:
呵呵原來如此,我還奇怪說怎麼會這樣Orz
TO 版大:
應該直接執行Project1.vbp就可以,要不然你開啟後在引用項目上引用Microsoft DAO 3.51 Object Library試試看

2006-07-12 12:22:15 補充:
TO 版大:
如果要找不到對照字或是4角號碼就呈現原來的字.只要在 轉換 這個副函式的第一行加入: 轉換=Sur 就可
VB6.0若更新到SP6的話是可以讀到2000的版本,至於2003能不能讀我就不知道了,因為我是用DAO去做,說不定ADO可以,我想這就留待對ADO熟悉的大大们來解答吧XD(現在學的都是ADO,DAO早已過期)

2006-07-09 15:54:30 · answer #1 · answered by W.J.S. 7 · 0 0

想要賺錢嗎???

我覺得比基金.股票.黃金.定存 等等 都還要穩

利息也算OK的網路投資 一次終身 希望你可以來看看

http://migre.me/iFiHM 我的部落落~~

+我臉書~ 詳細可以加我好友

https://www.facebook.com/profile.php?id=100002198710933

我有專屬臉書社團 還有很多不需要錢就可以賺到 的事業 也歡迎你歐

2015-01-23 14:33:22 · answer #2 · answered by ? 1 · 0 0

若要建立很多筆對應資料,改用資料庫查表方式較好

2006-07-10 08:36:47 補充:
文字輸入方面的問題,可嘗試使用RichTextBox

2006-07-10 04:34:20 · answer #3 · answered by ? 6 · 0 0

你的問題在於規劃,本身六千多筆資料搜尋時間可能還好,但是你這 Ar 陣列在每次執行 轉換  這個函式時,都重新設定一次值,這是完全不必要浪費的動作;因此你要讓效能改善,最簡單的作法就是把 Ar 陣列宣告成全域的 (就是拿到函式外面) , 並且在 Form_Load 或其他只會執行一次的地方去設定這些數值就可以了,位置換完應該像這樣Private Type TEST文字 As String號碼 As StringEnd TypePrivate Ar(6587) As TESTPrivate Sub Command1_Click()Text1.Text = ""io = InputBox("輸入文字或四角號碼,請以空白間隔")io = Split(io)For i = 0 To UBound(io)Text1.Text = Text1.Text & 轉換(io(i)) & " "NextEnd SubPublic Function 轉換(ByVal Sur As String)For i = 0 To UBound(Ar)If Ar(i).文字 = Sur Then 轉換 = 轉換 & Ar(i).號碼If Ar(i).號碼 = Sur Then 轉換 = 轉換 & Ar(i).文字NextEnd FunctionPrivate Sub Form_Load()tmp1 = "ㄅ ㄆ ㄇ ㄈ ㄉ ㄊ ㄋ ㄌ ㄍ ㄎ ㄏ ㄐ ㄑ ㄒ ㄓ ㄔ ㄕ ㄖ ㄗ ㄘ ㄙ ㄚ ㄛ ㄜ ㄝ ㄞ ㄟ ㄠ ㄡ ㄢ "tmp1 = tmp1 + " ㄣ ㄤ ㄥ ㄦ ㄧ ㄨ ㄩ ? 啊 阿 埃 挨 哎 唉 哀 皚 癌 藹 矮 艾 礙 愛 隘 鞍 氨 安 俺 按 暗 岸 "tmp1 = tmp1 + " 胺 案 肮 昂 盎 凹 敖 熬 翱 襖 傲 奧 懊 澳 芭 捌 扒 叭 吧 笆 八 八 八 八 疤 巴 拔 跋 靶 把 "tmp1 = tmp1 + " 耙 壩 壩 霸 霸 罷 爸 白 柏 百 擺 佰 敗 拜 稗 斑 班 搬 扳 般 頒 tmp2 = "9720 9721 9722 9723 9724 9725 9726 9727 9728 9729 9730 9731 9732 9733 9734 9735 9736 9737 9738 9739 9740 9744 9745 9746 9747 9748 9749 9750 9751 9752 ".............tmp2 = tmp2 + " 9753 9754 9755 9756 9741 9742 9743 9990 0759 7093 1002 2179 0740 0780 0755 4114 4074 5676 4253 5337 4293 1947 7137 7254 8637 1344 0219 2174 2542 1489 "tmp2 = tmp2 + " 5143 2714 7542 2491 4138 0425 2407 3581 5063 5984 0277 1159 2020 3421 5359 2193 2091 0665 0721 4576 9908 9808 0360 9708 4002 1572 2149 6405 7249 2116 "tmp2 = tmp2 + " 5090 8218 1056 7218 6011 5007 3640 4101 2672 4102 2369 0184 2408 2157 4458 2432 3803 2289 2104 5301 7317 2647 3652 2101 2142 0133 3904 0584 6586 4810 "......................For i = 0 To 6587Ar(i).文字 = Split(tmp1)(i)Ar(i).號碼 = Split(tmp2)(i)NextEnd Sub

2006-07-10 12:44:03 補充:
To W.J.S
1.Instr會比迴圈搜尋快?我沒試過,你有試過嗎?﹙好奇,從低階程式碼的觀點,感覺不出Instr比迴圈快的理由﹚
2.您與『愁痕飄絮』兩位提到這用資料庫查表比較好,何不用資料庫來寫寫看,而且說說為什麼比較好?比較快嗎?程式碼比較短嗎?
3.以上不是吐槽,純粹想要切磋切磋~~

2006-07-10 19:03:11 補充:
嗯... 我測試了一下,我即使我不用Mid這個方式來找,速度也還是比InStr慢很多,我想可能是VB函式實做上有這樣的情形,下次我用C來實做看看,不知道結果會如何

2006-07-10 19:13:30 補充:
以你的問題來說,如果輸入不是可轉換的字串希望就輸出未經轉換的字串其實很簡單,你只要在轉換時,檢查有沒有找到要轉換的字,如果沒有就傳回原字串就可以了。

2006-07-10 20:51:44 補充:
To W.J.S.
因為我不確定資料庫的建立方式, 所以這方面目前我無從測試, 不過剛剛我想了一下, 我發現我被你誤導了, For Loop 並不見得比 Instr慢, 要看怎麼找, 以原發問者的立場, 比對的是一個字串, 而不是單一字元, 字串搜尋如果是短字串, InStr也許比較快, 可是如果搜尋長字串, 結果就不一定了, 不信請執行以下程式:

2006-07-10 20:52:34 補充:
Dim Strs() As String, S As String, S2 As String, i As Long, Count As Long, j As Integer, Repeat As Integer, d As Single
Count = 5000
Repeat = 1000
Print "Setting String"
ReDim Strs(1 To Count) As String
For i = 1 To Count
Strs(i) = Format(i, "00000000000")
S = S & Strs(i) & " "
Next i

2006-07-10 20:53:09 補充:
Print "Test 1 Start"
d = Timer
For j = 1 To Repeat
If InStr(S, Strs(Count)) Then S2 = "Find!"
Next j
Print "Use " & Timer - d & " Seconds"

2006-07-10 20:53:27 補充:
Print "Test 2 Start"
d = Timer
For j = 1 To Repeat
For i = 1 To Count
If Strs(i) = Strs(Count) Then
S2 = "Find!"
Exit For
End If
Next i
Next j
Print "Use " & Timer - d & " Seconds"

2006-07-10 21:05:14 補充:
不過話又說回來, 原發問者的資料也不算太多, 也許 InStr 還是稍微快一點, 而考慮找的資料內容也不多, 我看兩個方法速度應該差不多
另外, 也許這用資料庫是標準做法, 但其實我覺得六千多筆, 也不算太龐大的資料, 即使不用資料庫應該也OK, 用了資料庫, 工具變成兩種(VB和資料庫軟體)到底是否划算, 我想很難講

2006-07-11 11:47:19 補充:
To W.J.S兄
哇... 你的方法還真多,你在號碼前加上亂數文字,對InStr一定會有加速的效果,因為字串越雷同,Instr錯誤比對的次數會越多,你這方法把我設下的陷阱給閃掉了,嗯... 算你厲害~~
另外,資料庫我比較不熟,原發問者的問題就留給你回答啦

2006-07-09 07:23:15 · answer #4 · answered by Rody 5 · 0 0

我沒仔細看您的程式,您也沒說明您的程式要做啥用。

您是要使用者若輸入文字,程式印出 ○○碼:如:內碼或四角號碼?
使用者若輸入四角號碼,和式則印出字來?

能請您說明一下嗎?

2006-07-09 02:25:11 · answer #5 · answered by ? 7 · 0 0

fedest.com, questions and answers