【问题标题】:Excel VBA: Loop through cells and copy values to another workbookExcel VBA:循环遍历单元格并将值复制到另一个工作簿
【发布时间】:2012-05-28 09:21:05
【问题描述】:

我已经在这个问题上花费了几个小时,但我没有成功找到可行的解决方案。

这是我的问题描述

我想遍历一个工作簿中的特定范围的单元格并将值复制到另一个工作簿。根据第一个工作簿中的当前列,我将值复制到第二个工作簿中的不同工作表中。 当我执行我的代码时,我总是得到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 和 - 显然 - 谷歌上进行了搜索,但我没有找到可以回答我的问题的类似问题。

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

这是我在这里的第一个问题,所以我希望我的代码格式、提出的问题和提供的信息一切正常。否则请告诉我。

【问题讨论】:

    标签: vba loops excel


    【解决方案1】:

    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) 在处理两个或多个对象时,请始终指定完整的声明,以减少混淆。你的代码也可以写成

    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
    

    【讨论】:

    • 非常感谢!你的回答对我帮助很大!我根据您的建议更改了我的代码,它应该立即运行!关于你的观点2):实际上你是对的,这张纸不见了。如果我理解正确,那么 Range 指的是特定的单元格、工作表和工作簿,而不仅仅是单元格。但是由于我在每个内部循环中使用 Offset 移动这个范围,所以我必须在外部循环中重置它。
    • If I understood you right, then a Range refers to a specific cell, a sheet and a workbook, not only a cell. 否 :) Range 表示一个单元格、一行、一列或一组单元格,其中包含工作表中的一个或多个连续单元格块。
    【解决方案2】:
    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
    

    【讨论】:

    • 感谢您的回答!对我来说听起来很合乎逻辑。所以现在我清楚地明白为什么会出现错误消息。但是,如果末尾的范围并不总是 Range("B4"),而是由变量 CurCell_2 定义的变化范围,您将如何编写代码?
    • CurCell_2.Value = ... ?或者类似 ...Range (aVariableContainingAStringDefiningTheRange).Value = ...
    猜你喜欢
    • 1970-01-01
    • 2013-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多