我試圖找出我在 Excel 宏中遇到的 1004 錯誤。如果我使用格式,則for 行set numRange失敗Range(Cells()),但如果我使用顯式 Range 呼叫(即Range("b2")),則成功。
在函式的下方,我使用相同的格式(和相同的變數名),它就像一個魅力。
任何幫助,將不勝感激!
Function GetCopyRange(wbName, wsIndex, vnIndex)
Dim rowsCounter As Integer
Dim numRows As Integer
Dim numCols As Integer
Dim numRange As Range
rowsCounter = 6 'GetStartCell()
Set numRange = Workbooks(wbName).Worksheets(wsIndex).Range(Cells(rowsCounter, 2)) 'This line fails
[ ... ]
Set GetCopyRange = Workbooks(wbName).Worksheets(wsIndex).Range(Cells(rowsCounter, 3), Cells(numRows, numCols)) 'This line succeeds
End Function
編輯:我得到的錯誤是“1004”,應用程式定義或物件定義的錯誤
uj5u.com熱心網友回復:
范圍函式可以在 2 種變體中呼叫:
(1)有一個引數:在這種情況下,引數是一個地址,例如
Range("A1")
Range("B10:D20")
Range("A1:F" & lastrow)
它也可以是一個命名范圍,例如Range("MyDataRange")。
(2)有兩個引數:指定 Range 的第一個(左上角)和最后一個(右下角)單元格
Range(Range("B10"), Range("D20"))
Range(Cells(10, 2), Cells(20, 4))
Cells始終獲取 2 個引數(行和列)并回傳包含一個單元格的 Range。在 VBA 中,您經常使用Cells,因為您將數字作為行和列索引。
無關但也很重要:當你寫作時
Set GetCopyRange = Workbooks(wbName).Worksheets(wsIndex).Range(Cells(rowsCounter, 3), Cells(numRows, numCols))
當作業簿不是活動作業簿時,它將失敗。這在評論中提供的鏈接 BigBen 中進行了解釋,因為Cells使用不合格(您不會告訴 VBA 您要使用哪個作業表)。
通常,使用 Workbook 和 Worksheet 變數和/或With-statement 是一個好主意。使代碼更易于閱讀和維護。注意 Range 和 Cells 之前的前導點 - 它們告訴 VBA 您指的是With-statement 的物件。
Dim wsIndex As Worksheet
Set wsIndex = Workbooks(wbName).Worksheets(wsIndex)
With wsIndex
Set GetCopyRange = .Range(.Cells(rowsCounter, 3), .Cells(numRows, numCols))
End With
uj5u.com熱心網友回復:
Set numRange = Workbooks(wbName).Worksheets(wsIndex).Range(Cells(rowsCounter, 2)) '此行失敗
作業簿(wbName).Worksheets(wsIndex).Range(
一切都很好。它指定指定作業表的范圍物件。
單元格(行計數器,2)
但是,指的是活動作業表的單元格屬性,而不是 wsIndex 的。
就像 BigBen 所說,最好使用作業表的單元格屬性來指定范圍物件。
Set numRange = Workbooks(wbName).Worksheets(wsIndex).Cells(rowsCounter,2)
我還發現在定義函式時指定引數型別以及預期的回傳型別很有用。
Function GetCopyRange(wbName as String, wsIndex as Integer, vnIndex as Integer) As Range
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/439843.html
