2012-12-23 70 views
3

G'Day,Excel VBA - 任何性能優勢之間的const字符串範圍或定義名稱的範圍?

我有一個問題更多的是幫助我更多地瞭解Excel VBA如何有效地管理爲了執行數據而在一個地方聲明的定義範圍。只是想在計算這個項目之前找出哪兩個選項(我目前知道的)更好或者不是最佳實踐。

我解決的問題是使在一組虛構的供應商包含了一些失敗的一張小桌子,這樣的表格看起來像這樣(抱歉它是原始形式)

「公司名稱」,「故障」
「號酷機」 7
「冷卻液宿舍」 5
「少量的水冷卻液3
‘空氣推進系統’7
「將軍冷卻液」 5
「佩服冷卻劑」 4

我的第一個選項(常量字符串)是該模塊/公式如下。

Option Explicit 
Public Const CountofFailures As String = "J7:J12" 
Sub btnRandom() 
    ' Declaration of variables 
    Dim c As Range 

    ' Provide a random number for failures across Suppliers 
    For Each c In ActiveSheet.Range(CountofFailures) 
     c.Value = Random1to10 
    Next c 
End Sub 

Function Random1to10() As Integer 
    'Ensure we have a different value each time we run this macro 
    Randomize 
    ' Provide a random number from 1 to 10 (Maximum number of Failures) 
    Random1to10 = Int(Rnd() * 10 + 1) 
End Function 

第二個選項(Defined Name)是這個模塊/公式如下。

Option Explicit 
Sub btnRandom() 
    ' Declaration of variables 
    Dim c As Range 
    Dim iLoop As Long 

    ' Provide a random number for Suppliers with Defined Range 
    For Each c In ActiveWorkbook.Names("CountofFailures").RefersToRange 
     c.Value = Random1to10 
    Next c 
End Sub 

Function Random1to10() As Integer 
    'Ensure we have a different value each time we run this macro 
    Randomize 
    ' Provide a random number from 1 to 10 (Maximum number of Failures) 
    Random1to10 = Int(Rnd() * 10 + 1) 
End Function 

任何建議 - 如果有幫助,我會做一個宏計時器測試?

如果我將單元格中列出的範圍讀取爲值,會有第三個選項嗎?我沒有看到過這樣的代碼在實踐中?

回答

3

你的兩個代碼循環遍歷範圍,這將是瓶頸。我建議你

  1. 使用範圍名稱來自動「定位」你的數據 - 即如果你插入/刪除行和列你的引用保持不變。我的經驗是,雖然在文件中許多區域的名稱可以結束了模糊處理什麼工作簿是做
  2. 做單寫這個範圍

代碼

Sub QuickFill() 
Randomize 
Range("CountofFailures").Formula = "=Randbetween(1,10)" 
Range("CountofFailures").Value = Range("CountofFailures").Value 
End Sub 
+0

Brett,我是否正確地說最後的.value = .value行與副本相同,粘貼特殊的相等值? –

+0

是的 - 它將公式轉換爲 – brettdj

+1

的值,感謝Brett的建議。我會安排子程序遵循這個一般模式。 –

5

我不知道性能差異 - 我懷疑const更快。我的一般建議是「在性能問題出現之前不要擔心性能問題」。否則,你最終會猜測你需要花費什麼優化時間,這可能是不對的。

至於命名範圍,好處是它們在插入行和列時移動。如果你在第一列插入一個新的列,你的第一個例子需要被編輯,第二個例子將會繼續工作。

+0

好的。我會停止演出,直到我知道我有一個性能問題。 –

1

我發現,命名範圍較慢(大概是因爲Excel必須在名稱上進行內部查找才能找到它所指的內容),但除非極端情況下,您不太可能找到重要的dofference(數以萬計的名稱引用數萬甚至數十萬次) 。正如迪克所說:收益遠遠超過微不足道的速度損失。