【问题标题】:Excel VBA Copy Paste Values with conditionsExcel VBA复制粘贴值与条件
【发布时间】:2016-06-08 13:06:51
【问题描述】:

如果 2 个字段相同(将这两个字段视为标识每条记录的键),我正在尝试将值从一张小表“带 ID 的 MD”复制到更大的表“带 ID 的 D”。

这是我的第一次尝试:

Sub CopyIDCells()

Set i = Sheets("MD with ID")
Set e = Sheets("D with ID")
Dim d
Dim j
d = 1
j = 2

Do Until IsEmpty(e.Range("B" & j))
    d = 2
    Do Until IsEmpty(i.Range("A" & d))
        If e.Range("C" & j).Value = i.Range("D" & d).Value Then
            If e.Range("M" & j).Value = i.Range("J" & d).Value Then
                e.Range("A" & j).Value = i.Range("B" & d).Value
            End If
        End If
        d = d + 1
    Loop
    j = j + 1
Loop

End Sub

这是我的第二次尝试:

Sub CopyIDCells2()

Set i = Sheets("MD with ID")
Set e = Sheets("D with ID")
Dim d
Dim j
d = 1
j = 2

Do Until j = 20886
    d = 2
    Do Until d = 1742
        If e.Cells(j, 3).Value = i.Cells(d, 4).Value Then
            If e.Cells(j, 13).Value = i.Cells(d, 10).Value Then
                e.Cells(j, 1).Value = i.Cells(d, 2).Value
            End If
        End If
        d = d + 1
    Loop
    j = j + 1
Loop

End Sub

此代码运行时,excel 工作表中没有任何变化,尽管运行需要几分钟 -_-"。

.. 样本被移除

【问题讨论】:

  • 你能提供至少一个输入样本吗?比如,“带有 ID 的 MD”表中的 A1A10 是什么,“带有 ID 的 D”表中的 B2B10 是什么?其他输入也可能有用。
  • 在访问单元格中的数据时尝试使用 Value2 属性而不是 Value。根据数据的样子,它可能会修复它。 stackoverflow.com/questions/17359835/…
  • 还可以尝试插入一些调试语句,以查看您的代码进行了哪些比较以及逻辑是如何工作的。我会在你的第一个 If 声明之后放一个:Debug.Print "e.Cells(" & j & ",3) equals i.Cells(" & d & ",4) --> " & e.Cells(j,3).value & " = " & i.Cells(d,4).value。然后在下一个If 语句之后可能还会有另一个调试打印。如果您可以直观地检查您知道应该复制的等效项的位置,然后在测试时调整您的循环参数以专注于该区域。
  • 你为什么有这个?如果 e.Cells(j, 3).Value = i.Cells(d, 4).Value Then If e.Cells(j, 13).Value = i.Cells(d, 10).Value Then 。为什么不将其更改为 If (e.Cells(j, 3).Value = i.Cells(d, 4).Value) And (e.Cells(j, 13).Value = i.Cells(d, 10 ).Value) 然后为您节省一个 if 和可能的时间执行。另外,为什么有2个直到?不应该更快地确定哪一个是两者中最长的,然后根据它进行循环吗?
  • 我确实在最后添加了一个样本,

标签: vba excel


【解决方案1】:

因此,查看您的第一个 CopyIdCells 方法,我只会对此进行一个修复 - 使变量 d=2。这在您的示例数据顶部有标题,您需要像其他工作表一样从第 2 行开始。

Sub CopyIDCells()

Set i = Sheets("MD with ID")
Set e = Sheets("D with ID")
Dim d
Dim j
d = 2
j = 2

Do Until IsEmpty(e.Range("B" & j))
    d = 2
    Do Until IsEmpty(i.Range("A" & d))
        If e.Range("C" & j).Value = i.Range("D" & d).Value Then
            If e.Range("M" & j).Value = i.Range("J" & d).Value Then
                e.Range("A" & j).Value = i.Range("B" & d).Value
            End If
        End If
        d = d + 1
    Loop
    j = j + 1
    Loop

End Sub

除了您的公式看起来不错之外,您只是没有任何数据可以满足您的要求。将此列添加到“MD with ID”的底部,您将看到您的代码匹配。

mouse   10  08  11267   A/J M   823 1/11/2008   1   SC-807  LONG    10/10/2005

由于您在“案例编号”和“其他 ID”上进行匹配,因此两张表中都没有符合此条件的项目。当您将上面的行添加到“带有 ID 的 MD”时,您会在第二张表的几行中看到相应的 ID。

【讨论】:

  • 行间有空格怎么办?它会在需要之前退出
  • 当然会。这取决于她的数据集。她有两个版本的代码。一个经过数千行,另一个设计为在第一个空白处退出。两者的底层代码基本相同。因此,两者的处理方式应该相同。只看她的意图。相同的编辑只需要应用于第二个脚本,尽管我没有验证那个。只是看起来她希望至少有一个人来解决这个问题。
  • 我已经尝试修复它,但它显然不起作用,即使该值应该为真,if 条件始终为假!谢天谢地,我能够通过 python 进行更改,谢谢大家的帮助:)
  • 是的,这很奇怪。它适用于您的测试数据。我想知道您的工作表名称是否在某处有多余的空间......
猜你喜欢
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-22
相关资源
最近更新 更多