循环浏览一个工作表中的每一行,然后复制到另一个工作表的命名范围

时间:2018-12-11 16:52:44

标签: excel vba loops range

我一直在努力解决这一问题,但到目前为止还没有成功。该代码有效,但是不幸的是,它以意外的方式工作。

MACRO工作簿是主工作簿,“数据”表上包含所有数据字段。 LEAN工作簿包含某些数据点,我想将这些数据点复制并粘贴到MACRO工作簿中“数据”表上的命名范围中,直到最后一行。

例如:

宏工作簿具有以下列:

sublimeREPL

精益工作簿具有以下列:

Eng #  Eng Name   Date Started     Date Completed    KPI1   KPI2  

100    ABC        12/01/2018       12/10/2018        50    100 

目标有两个:

  1. 从精益工作簿的特定列中获取数据,并将其粘贴到宏工作簿的“数据”表中,直到最后一行可用
  2. 从“精益工作簿”(按行)中获取KPI#,并通过得分到达与“数据”表中的KPI#相匹配的命名范围/列。

我尝试下面的代码:

Eng #   Date Started   Date Completed   KPI#   Score
101     12/02/2018      12/03/2018      1       50
101     12/02/2018      12/03/2018      2       10
102     11/01/2018      11/20/2018      1       100
102     11/01/2018      11/20/2018      4       100

我想跳过1002的测试Eng#,所以我输入了该条件。

1 个答案:

答案 0 :(得分:0)

我要收集的是从leanrange中的每个单元格及其相邻列中获取值,并将其插入到宏工作簿中相应标题下的表中。

我认为这里有两个问题:

  1. for循环中的语法相反
  2. 您的补偿效率低下

这是我的建议:由于每个循环都使用a,因此使用cell对象循环遍历范围内的所有单元格,而不要使用offset。然后,您需要偏移宏工作簿中的行,否则,您将一次又一次地粘贴到同一行。这就是为什么标题被覆盖的原因。您可以使用第二个循环来偏移cell,以便可以循环浏览leanrange中的每一列。最后,由于看起来您的范围“ Enum”,“ ds”,“ dc”等都是相邻的列,因此我通过使用j来抵消宏工作簿中的列来简化了事情。

Dim i As Integer
Dim j As Integer
Dim cell As Range

i = 1
For Each cell In leanrange
    If leanrange.Range("A2") <> "E1002" Then
        For j = 0 To 3
            wsmacro.Range("Enum").Offset(i, j) = cell.Offset(0, j).Value
        Next j
        i = i + 1
    End If
Next cell