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

时间:2015-07-14 15:54:06

标签: excel vba 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))

会给我一个对象所需的错误吗?网址有效且MF A​​ll In Rates是打开的电子表格中的有效工作表。我是否必须提供比Dashboard_Final.xlsm更具体的文件路径,即使宏在该工作簿中?

2 个答案:

答案 0 :(得分:1)

没有尝试重现这一点(我目前在我的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...行)。这是一种更粗略地测试它的方法:

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是源工作表(您从中复制的位置)。您可以找到有关将数组和数组的范围转换为范围here的更多信息。

答案 1 :(得分:1)

对于像这样的长引用的疑难解答,将它们分解为单独的行并逐步执行。如果您编写这样的代码,您将能够相当容易地确定错误的位置:

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)