[英]Excel VBA: Loop through cells and copy values to another workbook
我已经花了好几个小时来解决这个问题,但是我找不到合适的解决方案。
这是我的问题描述 :
我想循环遍历一个工作簿中的特定范围的单元格并将值复制到另一个工作簿。 根据第一个工作簿中的当前列,我将值复制到第二个工作簿中的不同工作表。 当我执行我的代码时,我总是得到runtime error 439: object does not support this method or property
。
我的代码看起来或多或少像这样:
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
我已经做了大量的研究,我知道如果你为对象(工作表和范围)使用显式名称,如何将值从一个工作簿复制到另一个工作簿,但我不知道为什么它不能像我使用它实现它一样变量。 我也搜索了stackoverlow和-onlyly-Google,但我没有找到类似的问题来回答我的问题。
所以我的问题是:你能告诉我我的代码中的错误在哪里,或者是否有另一种更简单的方法来使用不同的方式完成相同的操作?
这是我的第一个问题,所以我希望我的代码格式,提出的问题和提供的信息一切正常。 否则请告诉我。
5件事......
1)你不需要这条线
Set CurCell_1 = Range("B3") 'starting point in wb 1
当你在循环中设置它时,这条线是没有意义的
2)你每次都在循环中设置它
Set CurCell_2 = Range("B4")
你为什么这样做? 它只会每次都覆盖这些值。 哪个表是这个范围在??? (见第5点)
3) CurCell_2
是一个范围,正如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的方法,而是变量。 替换为
Workbooks("My_WB_2").Worksheets(CStr(Group.Value)).Range("B4").Value
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.