2014-06-23 116 views
-1

錯誤被扔在這之前合作行錯誤1004自動填充

ThisWorkbook.Sheets("data").Range("AJ2:AM2").AutoFill Destination:=Range("AJ2:AM" & localLastRow) 

,但之後我糾正另一個錯誤似乎並不想打漂亮了。源包含在目標中。我只是不確定問題來自哪裏。

任何幫助將不勝感激。 我已經發布了下面的整個宏。它最終將成爲一個被稱爲主宏的類。

Sub FormulaUpdate() 
' 
' FormulaUpdate Macro 
' Updates Columns AJ through AS 
' 
Dim localLastRow As Long 
Dim sourceLastRow As Long 
Dim wbName As String 
Dim wbPath As String 
Dim sourceSheet As Worksheet 
Dim sourceRange As Range 
Dim thisSheet As Worksheet 

Application.ScreenUpdating = False 

'sets strings from user's selection of Item Branch Report 
wbPath = GetFile("Select Item Branch Report to be Used") 
wbName = GetFilenameFromPath(wbPath) 

Workbooks.Open(wbPath, ReadOnly:=True).Activate 

'sets workseets to be referenced 
Set sourceSheet = ActiveWorkbook.Sheets(1) 
Set thisSheet = ThisWorkbook.Sheets("data") 

'counts rows in selected item branch report for use elsewhere in macro 
sourceLastRow = sourceSheet.Range("A" & Rows.Count).End(xlUp).Row 

'range for use in vlookup formula, for both system leadtime and order min columns 
Set sourceRange = sourceSheet.Range("B1:BG" & sourceLastRow) 

'Counts rows in this workbook for use elswhere in macro 
localLastRow = thisSheet.Range("A" & Rows.Count).End(xlUp).Row 

'uses formulas in cells to autofill the data 
thisSheet.Range("AJ2:AM2").AutoFill Destination:=thisSheet.Range("AJ2:AM" & localLastRow) 


'loops through each row of both the system lead time, and the order min column, and sets the value from item branch report 
For i = 2 To localLastRow 

thisSheet.Range("AN" & i).Value = Application.WorksheetFunction.VLookup(thisSheet.Range("C" & i), sourceRange, 53, False) 
thisSheet.Range("AP" & i).Value = Application.WorksheetFunction.VLookup(thisSheet.Range("C" & i), sourceRange, 58, False) 
Application.StatusBar = "Referencing IBR: " & i & " of " & localLastRow & ": " & Format(i/localLastRow, "0%") 

Next i 

'uses formulas in cells to autofill the data 
thisSheet.Range("AO2").AutoFill Destination:=thisSheet.Range("AO2:AO" & localLastRow) 
thisSheet.Range("AQ2:AS2").AutoFill Destination:=thisSheet.Range("AQ2:AS" & localLastRow) 

Workbooks(wbName).Close (False) 
+0

只是確保'localLastRow'是一個有效的數字'> 2' –

+0

它返回5091,所以不應該是錯誤來源 –

+0

,但你確定它是> 2嗎?那很可能會導致問題標題中的1004 ... –

回答

1

我提到上面是錯誤解決方案。閱讀this瞭解爲什麼依賴SelectActivate方法的背景通常存在問題,應始終避免。您已經遇到了一個令人沮喪的問題 - 那就是您需要跟蹤哪張表處於「活動」狀態,並不斷更新代碼以使相應的表格「處於活動狀態」。這使得代碼難以瀏覽,而且執行起來更加昂貴。

適當的解決辦法是完全限定的範圍,例如:

ThisWorkbook.Sheets("data").Range("AJ2:AM2").AutoFill Destination:=ThisWorkbook.Sheets("data").Range("AJ2:AM" & localLastRow) 

爲什麼?

因爲,如您所見,不合格範圍總是指的是ActiveSheet。一種解決方案(錯誤的)是連續製作正確的紙張Active。正確的解決方案是完全限定您的範圍,尤其是在多個工作簿或工作表中工作時。

+0

我發現你發佈的帖子相當有幫助。我和問問題的人差不多。謝謝!在我的情況下,這是值得明確提到打開的第二個工作簿,而不是激活它並參考這種方式?或者,既然這裏只有兩個工作簿,那麼使用ActiveWorkbook引用打開的工作簿就等於使用變量來引用? –

+0

IMO最好的做法是始終使用變量來表示工作簿,而不是「ActiveWorkbook」關鍵字。 –

+1

++ @DavidZemens還值得一提的是,'sourceLastRow = Range(「A」&Rows.Count).End(xlUp)。Row'也應該是完全合格的 –