【问题标题】:Loop through each row in one worksheet and copy to another worksheet's named ranges循环遍历一个工作表中的每一行并复制到另一个工作表的命名范围
【发布时间】:2018-12-11 16:52:43
【问题描述】:

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

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

例如:

宏工作簿有列:

Eng #  Eng Name   Date Started     Date Completed    KPI1   KPI2  

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

精益工作簿有列:

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

目标有两个:

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

我对下面代码的尝试:

Public Sub GrabLeanFileData()

Dim wbmacro As Workbook
Dim wblean As Workbook

Set wbmacro = Workbooks.Item("MacroFile.xlsm")
Set wblean = Workbooks.Item("Subcontractor CA - KPI's Lean.csv")

Dim wsmacro As Worksheet
Dim wslean As Worksheet

Set wsmacro = wbmacro.Worksheets.Item("Data")
Set wslean = wblean.Worksheets.Item("Subcontractor CA - KPI's Lean")

Dim leanrange As Range
Set leanrange = wslean.Range("A2:A15000")

wblean.Activate

Dim cell As Range

i = 1

For Each cell In leanrange

    If leanrange.Range("A2") <> "E1002" Then
        Range("A2").Offset(i, 0).Value = wsmacro.Range("Enum").Value
        Range("B2").Offset(i, 0).Value = wsmacro.Range("ds").Value
        Range("C2").Offset(i, 0).Value = wsmacro.Range("dc").Value
        Range("D2").Offset(i, 0).Value = wsmacro.Range("kpi1").Value


        i = i + 1
    End If

Next cell

End Sub

我想跳过 1002 的测试 Eng # 所以我把这个条件放进去。

【问题讨论】:

  • “代码有效,但不幸的是以意想不到的方式。” - 你这是什么意思?你有错误吗?您的预期结果是什么,目前的结果是什么?
  • 另外,您在 For Each 循环中迭代了 cell,但您从未在循环中使用它。
  • 如果您将 for 循环中的范围明确命名为 wslean.Range("A2").Offset(i,0),它会改变什么吗?只是一个猜测。在不知道您的代码输出什么的情况下,很难确定问题所在。
  • 不做任何更改,似乎从 MACRO 表中获取列标题并将其粘贴到从单元格 A2 开始的 LEAN 工作簿中。它似乎在反向运行:(
  • wsmacro.Range("enum") 是您的列标题吗?如果是这样,我认为您只是颠倒了语法。 wsmacro.Range("enum") = wslean.Range("A2").Offset(i,0) 解决问题了吗?

标签: excel vba loops range


【解决方案1】:

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

我认为这里有两个问题:

  1. for 循环中的语法颠倒了
  2. 你没有有效地抵消

以下是我的建议:由于您使用 for each 循环,因此请使用 cell 对象循环遍历范围内的所有单元格,而不是使用偏移量。然后,您需要在宏工作簿中偏移该行,否则您只是一遍又一遍地粘贴到同一行。这就是为什么您的标题被覆盖的原因。您可以使用第二个循环来偏移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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-13
    • 2013-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    相关资源
    最近更新 更多