2017-05-22 13 views
0

我有多達40如果/ elseif的條件,其中的代碼是:比較快的方式的if/else條件

If b = 1 Then 
     d = XXXX 
    ElseIf b = 2 Then 
     d = YYYY 
    ElseIf b = 3 Then 
     d = AAAA 
    ElseIf b = 40 Then 
     d = ZZZZ 
    End If 

是否有這樣做的一個更快的方法,所以我不知道所有If/ElseIf條件?

+1

一看錶什麼元素? – SJR

+1

如果你指的是更快的運行時間,40是不是一個大數字。任何更新都不會更快。或者你的意思是編碼時間? – Vityata

+0

@Vityata通過靜態數組索引會變得更快,特別是對於更大的數組。注意,這是一個*空間 - 時間*折衷;) –

回答

1

使用數組

記得陣列在默認情況下0索引,儘管你可以重寫,當你REDIM陣列使用任何你想要的索引。

Dim MyArray() 
Dim ind As Long 
MyArray = Array("XXXX","YYYY","AAAA","ZZZZ") 
ind = 2 
MsgBox MyArray(ind) 

這將返回3元或AAAA

只是改變IND你想返回

+0

這很快就起作用了。 – Clauric

+0

歡迎您... – user3005775

1

也許使用數組?

所以arr(1) = XXXXarr(2) = YYYY

這樣,你可以

d = arr(b) 
1

最好的辦法是通過索引一些陣列。爲了避免在每次需要時創建數組,可以使用關鍵字Static來聲明它。這樣,索引非常快(特別是對於較大的陣列)。這是一種時空折衷:該陣列保持在內存中,但索引它非常快。

在下面,我創建一個函數,它使用靜態數組將索引轉換爲String。但是,請注意,您可能有興趣通過將字符串放在一些隱藏的工作表中並從中加載它們來使其更具動態性。

Function myString(ByVal index As Long) As String 
    Static ar As Variant ' <-- static: filled once and keeps valid between function calls 
    If IsEmpty(ar) Then ar = Array("XXXX", "YYYY", "AAAA", "ZZZZ") 
    myString = ar(index - 1) 
End Function 

Sub TestIt() 
    Debug.Print myString(1) 
    Debug.Print myString(4) 
End Sub 
+0

共同主題?陣列。它們處於易於訪問的存儲器中,並且可以比機器讀取硬編碼或單元格內容的行更快地被訪問。總是使用具有大量數據和嘎吱嘎吱的數組。但是對於較小的事物,比如少於40條數據 - 時間差別無關緊要。 –

+0

@JohnMuggins,對於40+陣列來說,它更快,並且可讀性/可維護性更好。現在*「時間差別無關緊要」取決於用例。通常,代碼優化(關於速度或任何其他方面)在**之前無關緊要。如果這個索引是在一個密集的循環內部完成的,那麼它就很重要。如果只是獲取一個字符串並將其顯示在交互式應用程序中,那麼即使使用1M以上的不同值也不重要。 –

+0

當有人對此提出SO問題時,我認爲它*確實很重要,否則我會建議他們繼續使用現有的「if-else-if-else-if ...」 –