从一个工作簿复制到另一个工作簿时excel vba对象所需的错误

有谁知道为什么:

Set wb = Workbooks.Open(url) Worksheets("MF All In Rates").Range("C8:P8").Copy Destination:=Workbooks("Dashboard_Final.xlsm").Worksheets("HIST COF").Range(Cells(Current.Row, 4), Cells(Current.Row, 17)) 

会给我一个对象所需的错误? 该url是有效的,MF All In Rates是打开的电子表格中的有效表单。 即使macros在该工作簿中,是否也必须提供比Dashboard_Final.xlsm更具体的文件path?

对于像这样长时间的引用的疑难解答,将其分解成单独的行并逐步完成。 如果你这样写你的代码,你将能够相当容易地确定错误的位置:

 Dim oBook As WorkBook Dim oSheet As WorkSheet Dim oRange As Range Dim vCell1 As Variant Dim vCell2 As Variant vCell1 = Cells(Current.Row, 4) vCell2 = Cells(Current.Row, 17) Set oBook = Workbooks(Dashboard_Final.xlsm) Set oSheet = oBook.Worksheets("HIST COF") Set oRange = oSheet.Range(vCell1, vCell2) 

没有试图重现这一点(我目前在我的Linux机器上),我想你错过了“Dashboard_Final.xlsm”引号。

 Set wb = Workbooks.Open(url) wb.Worksheets("MF All In Rates") _ 'did you mean to use the wb var here? .Range("C8:P8") _ .Copy(Destination:= Workbooks("Dashboard_Final.xlsm") _ 'changed this line .Worksheets("HIST COF") _ .Range(Cells(Current.Row, 4), Cells(Current.Row, 17))) 

编辑:

基于你对这两个答案的评论,我猜你正在尝试与刚刚打开的工作簿进行交互(使用Set wb = Workbooks.Open(url) )。 如果是这种情况,请确保您正在使用该工作簿(在我的示例中使用wb.Worksheets...行)。 以下是一个更粗略的testing方法:

 Set wb = Workbooks.Open(url) Dim wbDest as Excel.Workbook, rngDest as Excel.Range, wsDest as Excel.Worksheet Set wbDest = Workbooks("Dashboard_Final.xlsm") Set wsDest = wbDest.Worksheets("HIST COF") set rngDest = wsDest.Range(cells(Current.Row, 4), Cells(Current.Row, 17)) wb.Worksheets("MF All In Rates").Range("C8:P8").Copy Destination:= rngDest 

标准化你的单元格引用也是最好的 – 既可以使用Range(单元格…单元格),也可以使用Range(“C#:C#”) – 这样可以更清楚地看到范围是相同的大小。

如果你仍然有问题,请尝试单独编写每个单元格,例如:

wsDest.cells(8, 3).value = wsSource.Cells(Current.Row, 4).value

要么

 Dim Arr() as Variant, rng as Excel.Range Arr = wsSource.Range("C8:P8") 'put the data in the source sheet into an array Set rng = wsDest.Range(cells(Current.Row, 4), Cells(Current.Row, 17)) 'get the destination range rng.Resize(UBound(Arr, 1), UBound(Arr, 2)).Value = Arr 'resize the range (just in case) and transpose the array to the worksheet 

其中wsDest是目标工作表(复制到的目标),而wsSource是源工作表(从中复制)。 你可以在这里find更多有关将数组和数组转换为范围的更多信息 。