Excel VBA:通过单元格循环并将值复制到另一个工作簿

我已经花了几个小时在这个问题上,但我没有find一个工作解决scheme的成功。

这是我的问题描述

我想在一个工作簿中循环一定范围的单元格,并将值复制到另一个工作簿。 根据第一个工作簿中的当前列,我将这些值复制到第二个工作簿中的其他工作表中。 当我执行我的代码时,我总是得到runtime error 439: object does not support this method or property

我的代码看起来或多或less是这样的:

 Sub trial() Dim Group As Range Dim Mat As Range Dim CurCell_1 As Range Dim CurCell_2 As Range Application.ScreenUpdating = False Set CurCell_1 = Range("B3") 'starting point in wb 1 For Each Group in Workbooks("My_WB_1").Worksheets("My_Sheet").Range("B4:P4") Set CurCell_2 = Range("B4") 'starting point in wb 2 For Each Mat in Workbooks("My_WB_1").Worksheets("My_Sheet").Range("A5:A29") Set CurCell_1 = Cells(Mat.Row, Group.Column) 'Set current cell in the loop If Not IsEmpty(CurCell_1) Workbooks("My_WB_2").Worksheets(CStr(Group.Value)).CurCell_2.Value = Workbooks("My_WB_1").Worksheets("My_Sheet").CurCell_1.Value 'Here it break with runtime error '438 object does not support this method or property CurCell_2 = CurCell_2.Offset(1,0) 'Move one cell down End If Next Next Application.ScreenUpdating = True End Sub 

我已经做了大量的研究,并且知道如何将值从一个工作簿复制到另一个工作簿,如果您使用显式名称作为对象(工作表和范围),但我不知道为什么它不起作用variables。 我也search了stackoverlow,显然是Google,但是我没有find类似的问题来回答我的问题。

所以我的问题是:你能告诉我在我的代码中的错误,或者是否有另一种更简单的方法来完成相同的使用不同的方式?

这是我的第一个问题,所以我希望我的代码的格式,所提出的问题和提供的信息一切正常。 否则让我知道。

5件事…

1)你不需要这条线

Set CurCell_1 = Range("B3") 'starting point in wb 1

这条线是毫无意义的,因为你把它设置在循环内

2)你每次都把它设置成一个循环

Set CurCell_2 = Range("B4")

你为什么要这样做? 每次只会覆盖这些值。 另外哪个表是这个范围? (见第5点)

3) CurCell_2是一个Range,JohnB指出它不是一个方法。

更改

Workbooks("My_WB_2").Worksheets(CStr(Group.Value)).CurCell_2.Value = Workbooks("My_WB_1").Worksheets("My_Sheet").CurCell_1.Value

CurCell_2.Value = CurCell_1.Value

4)只能设置“=”符号,不能指定范围

CurCell_2 = CurCell_2.Offset(1,0)

将其更改为

Set CurCell_2 = CurCell_2.Offset(1,0)

5)处理两个或多个对象时总是指定完整声明,以免混淆。 你的代码也可以写成( UNTESTED

 Option Explicit Sub trial() Dim wb1 As Workbook, wb2 As Workbook Dim ws1 As Worksheet, ws2 As Worksheet Dim Group As Range, Mat As Range Dim CurCell_1 As Range, CurCell_2 As Range Application.ScreenUpdating = False '~~> Change as applicable Set wb1 = Workbooks("My_WB_1") Set wb2 = Workbooks("My_WB_2") Set ws1 = wb1.Sheets("My_Sheet") Set ws2 = wb2.Sheets("Sheet2") '<~~ Change as required For Each Group In ws1.Range("B4:P4") '~~> Why this? Set CurCell_2 = ws2.Range("B4") For Each Mat In ws1.Range("A5:A29") Set CurCell_1 = ws1.Cells(Mat.Row, Group.Column) If Not IsEmpty(CurCell_1) Then CurCell_2.Value = CurCell_1.Value Set CurCell_2 = CurCell_2.Offset(1) End If Next Next Application.ScreenUpdating = True End Sub 
 Workbooks("My_WB_2").Worksheets(CStr(Group.Value)).CurCell_2.Value 

这是行不通的,因为CurCell_2不是Worksheet的一个方法,而是一个variables。 replace为

 Workbooks("My_WB_2").Worksheets(CStr(Group.Value)).Range("B4").Value