2013-01-02 68 views
1

我知道它的東西很簡單,但我只是不知道我要去的地方錯了 - 請幫VBA計算性能

設置場景:在一個工作簿
我現在有3個工作表

表Sheet1 - 包括原始數據,將移動約取決於固定日期爲比賽

Sheet2中 - 由是從片材1

查看複製原始數據 - 該數據的從Sheet 2中

的方法的圖是 - 用戶將手動拖放在Sheet夾具再夾宏啓用按鈕將獲取夾具的副本並在工作表2中添加附加數據的列表中的數據

然後點擊一個最終按鈕以在「視圖」工作表中創建此數據的視圖。 所有的查看錶正在調用一個名爲VnthLookup的已定義模塊來填充每個單元格的相對值。

問題
目前VBA和公式爲每個片創建視圖時,如果我手動提示計算通過點擊細胞並點擊返回按鈕鍵盤上它更新和工作正常工作正常,和。然而,當我嘗試它超時重新計算整個圖片和需要永遠以完成計算值(長達一個小時+只需30行,8個標題)

編碼vnthlookup模塊是

Public Function VlookupNth(MyVal As Variant, MyRange As Range, Optional ColRef As Long, Optional Nth As Long = 1) 
    Dim Count, i As Long 
    Dim MySheet As Worksheet 

    Count = 0 
    Set MySheet = Sheets(MyRange.Parent.Name) 

    If ColRef = 0 Then ColRef = MyRange.Columns.Count 

    For i = MyRange.Row To MyRange.Row + MyRange.Rows.Count - 1 
     If MySheet.Cells(i, MyRange.Column).Value = MyVal Then 
      Count = Count + 1 
      If Count = Nth Then 
       VlookupNth = MySheet.Cells(i, MyRange.Column + ColRef - 1).Value 
       Exit Function 
      End If 
     End If 
    Next i 

    VlookupNth = "" 
End Function 

而且我的查看錶在從列B到列J的每個單元格中都有以下公式 - 取決於我從sheet2請求的值,「X」將不同。

=VlookupNth(1,Sheet2!C:AAA,X,2) 

任何幫助理解爲什麼這需要這麼久,將不勝感激。

如果解釋需要澄清,請儘快發送工作簿,請留下一個轉發地址。

+0

什麼Excel的版本? – RBarryYoung

+1

Sheet2!C:AAA?這是否意味着,它將不得不查看所有行?你能不能讓它更多?即Sheet2!C1:AAA20? – shahkalpesh

回答

4

你有兩個問題:

  1. 較小的問題是,你正在使用工作表名稱來引用您的範圍。請使用您已擁有的MyRange變量。
  2. 一個更大的問題是,您將整列傳遞給該函數,並且該函數將盲目地檢查整列,直到最後一百萬行(以防它找不到足夠早的值)。您需要將功能限制爲表單上的實際數據。

重寫如下:

Public Function VlookupNth(ByVal MyVal As Variant, ByVal MyRange As Range, Optional ByVal ColRef As Long = 0, Optional ByVal Nth As Long = 1) As Variant 
    Dim Count As Long, i As Long 

    Count = 0 
    If ColRef = 0 Then ColRef = MyRange.Columns.Count 

    'Do not consider uninitialized rows 
    Set MyRange = Application.Intersect(MyRange, MyRange.Parent.UsedRange) 

    If Not MyRange Is Nothing Then 
     For i = 1 To MyRange.Rows.Count 
      If MyRange.Cells(i, 1).Value = MyVal Then 
       Count = Count + 1 
       If Count = Nth Then 
        VlookupNth = MyRange.Cells(i, ColRef).Value 
        Exit Function 
       End If 
      End If 
     Next i 
    End If 

    VlookupNth = "" 
End Function 
1

也許不響應,但有一些提示&建議啓動。

Dim Count, i As Long 'is defining Count as a variant 
Dim Count as long, i As Long 'is the proper syntax 

然後
Set MySheet = Sheets(MyRange.Parent.Name)似乎meanlingless。由於MySheet是一個工作表,您使用Set,它應該是Set MySheet = Sheets(MyRange.Parent)
我建議你

  • 嘗試那些小的修正,
  • 確保確保Option Explicit設置爲模塊,
  • 編譯,測試和回來新聞...