2016-01-22 81 views
0

非常新的編碼和第一篇文章在這裏。我查遍了所有地方,但無法弄清楚我的代碼有什麼問題。基本上我試圖從另一個工作簿上的數據計算一些平均值。我運行以下代碼時出現的錯誤「運行時錯誤1004,應用程序定義的錯誤或方法定義的錯誤」似乎是從我參考其他工作簿以執行Match方法的行中生成的。它看起來像它應該工作,但對我來說否則報錯說...感謝您的幫助爲什麼我得到這個運行時錯誤?

Private Sub CommandButton1_Click() 
Dim wbk As Workbook 
Set wbk = Workbooks.Open("X:\Data Analysis\Process & Wall Loss Data Analysis\***** CT 12 HR AVG rev2.xlsm") 
Dim nrow As Integer, conv_start As Double, conv_end As Double, avg1 As Double, avg2 As Double 
nrow = Cells(9, 12) 
For i = 1 To nrow 
    conv_start = Application.VLookup(Cells(14 + i, 12), Range(Cells(3, 2), Cells(300, 3)), 2, True) 
    conv_end = Application.VLookup(Cells(14 + i, 13), Range(Cells(3, 2), Cells(300, 3)), 2, True) 
    avg1 = Application.Match(conv_start, wbk.Worksheets("PC & Wear").Range(Cells(1, 1), Cells(626, 1)), 1) 
    avg2 = Application.Match(conv_end, wbk.Worksheets("PC & Wear").Range(Cells(1, 1), Cells(626, 1)), 1) 
    For j = 1 To 40 
     Cells(42 + j, 11 + i) = Application.Average(Range(Cells(avg1, 1 + j), Cells(avg2, 1 + j))) 
    Next j 
Next i 

末次

+1

你需要限定所有的對象範圍; 'range'和'cells'到工作表。例如'nrow = Cells(9,12)'應該是這樣的:'nrow = wbk.sheets(「Sheet1」)。Cells(9,12)' –

回答

2
wbk.Worksheets("PC & Wear").Range(Cells(1, 1), Cells(626, 1)) 

這裏Cells()將參照activesheet,而不是該板在其他工作簿,因此只要「PC & Wear」不是活動工作表,代碼就會失敗。

你應該完全限定的Range()Cells()所有使用與工作表對象:

Dim sht As Worksheet 
Set sht = wbk.Worksheets("PC & Wear") 
'... 
avg1 = Application.Match(conv_start, sht.Range(sht.Cells(1, 1), sht.Cells(626, 1)), 1) 
'... 

注意,最好連預期將要使用ActiveSheet情況下做到這一點 - 以後你可以開發你的進一步的代碼,並結束一些其他工作表處於活動狀態,並且您的代碼將會中斷(或更糟糕的是,它仍然可以工作,但會產生錯誤的輸出)。

進一步的改進將是定義一個變量範圍內,以避免重複自己:

Dim rngLU As Range 
Set rngLU = wbk.Worksheets("PC & Wear").Range("A1:A626") 
'... 
avg1 = Application.Match(conv_start, rngLU, 1) 
'... 
+0

'You should fully qualify all Range()和Cells()與工作表對象的用法是在開發可用於任何工作表的通用工具時。 – dnep

+0

@dnep假設這個'工具'總是要在活動工作表上運行 - 如果你想讓_truly_與任何工作表一起工作,那麼你應該絕對使用工作表對象限定範圍。就「最佳做法」而言,並沒有真正的例外,因爲活動工作表上的限定範圍仍然有效。 –

+1

即使在期望使用ActiveSheet時,我也喜歡聲明一個工作表對象,並將其明確地設置爲ActiveSheet:它避免了關於代碼打算在哪個表上工作的任何問題(對需要維護您的用戶代碼!) –