2013-06-20 77 views
0

我正在構建一個非常複雜的VBA工作簿,並且運行大部分代碼的一個問題是性能。我有一個內置的函數,它或多或少,以下VBA函數避免如果語句

Public Function zzz (xxx as String) as String 
if xxx = "apple" then zzz = "orange" 
if xxx = "appple2" then zzz = "orange2" 
if xxx = "apple3" then zzz = "apple3" 

等(但有大約30字符串代替)。我多次調用這個函數。有一個更好的方法嗎?

+0

你最好用'vlookup()'來做這個。 –

+2

你至少可以使用'if else'。 – Brad

+0

這是查詢值和結果值會是什麼的真實例子嗎? – shahkalpesh

回答

1

幾乎沒有。而對於30弦,這應該不會非常慢。

性能問題很可能在另一個地方,特別是在直接與工作簿交互的地方。嘗試在隨機嘗試更新代碼段之前測量各種過程的時間。

很多線條並不意味着性能下降。並非每條線都需要相同的時間來執行。

1

你可以使用數組和WorksheetFunction.Match組合你的函數。這會走這條路:在VBA函數的

Public Function zzz(xxx As String) As String 
    Dim funInput As Variant 
    Dim funOutput As Variant 
     funInput = Array("apple", "apple2", "apple3") 
     'above array- add additional input elements and... 
     '...match them with resulting items in below array 
     funOutput = Array("orange", "orange2", "apple3") ' 

    zzz = funOutput(Application.Match(xxx, funInput, 0) - 1) 
End Function 

樣品電話:

Debug.Print zzz("apple2") 

將導致用:

orange2 
+0

+1在使用'Application.Match'來索引數組之前,沒有看到過這種方法。創新。喜歡它。 –

1

你可以嘗試使用選擇案例,如果你只檢查一個變量的值。這將更快,因爲一旦找到正確的變量,它將跳過剩餘的行。

Select case xxx 
case "apple" 
zzz = "orange" 
case "apple2" 
zzz = "orange2" 
case "apple3" 
zzz = "orange3" 
End Select