【发布时间】:2018-06-05 08:12:10
【问题描述】:
我正在尝试从 Sheet1 复制特定行,当在该行上特定单元格的状态为“DONE”时选择说,“DONE”之后的第二个标准是检查同一行上是否有另一个单元格一个特定的值。之后,复制在特定工作表上找到的每行,如果发现重复则检查目标。
到目前为止,我已经设法根据 2 个标准从 Sheet1 复制到另一个(使用 IF 的老派,我尝试使用自动过滤器,但我没有设法做到),但我很难防止重复复制到其他工作表。
我尝试了所有方法,基于 Range 的第一张表进行值检查,为每张表编写一个宏以防止重复,但没有任何效果,我被困在这个问题上。
下面代码的另一个问题是,在多次点击更新按钮后,它不会复制所有找到的行,而是只复制第一个找到的行,并且在其间插入一些空行,我不明白原因那个。
代码如下:
Private Sub CommandButton1_Click()
Dim LastRow As Long
Dim i As Long, j As Long, k As Long, j1 As Long, k1 As Long, j_last As Long,
k_last As Long
Dim a As Long, b As Long
Dim ActiveCell As String
With Worksheets("PDI details")
LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
End With
With Worksheets("Demo ATMC")
j = .Cells(.Rows.Count, "A").End(xlUp).Row + 2
End With
With Worksheets("Demo ATMC Courtesy")
k = .Cells(.Rows.Count, "A").End(xlUp).Row + 2
End With
With Worksheets("Demo SHJ")
j1 = .Cells(.Rows.Count, "A").End(xlUp).Row
k1 = .Cells(.Rows.Count, "A").End(xlUp).Row
End With
With Worksheets("Demo AD")
a = .Cells(.Rows.Count, "A").End(xlUp).Row
b = .Cells(.Rows.Count, "A").End(xlUp).Row
End With
MsgBox (j)
For i = 5 To LastRow
With Worksheets("PDI details")
If .Cells(i, 20).Value <> "" Then
If .Cells(i, 20).Value = "DONE" Then
If .Cells(i, 11).Value = "ATMC DEMO" Then
If Not .Cells(i, 7) = Worksheets("Demo ATMC").Range("D4") Then
Worksheets("Demo ATMC").Range("A" & j) = Worksheets("PDI details").Range("A" & i).Value
Worksheets("Demo ATMC").Range("B" & j) = Worksheets("PDI details").Range("E" & i).Value
Worksheets("Demo ATMC").Range("C" & j) = Worksheets("PDI details").Range("F" & i).Value
Worksheets("Demo ATMC").Range("D" & j) = Worksheets("PDI details").Range("G" & i).Value
Worksheets("Demo ATMC").Range("F" & j) = Worksheets("PDI details").Range("H" & i).Value
Worksheets("Demo ATMC").Range("G" & j) = Worksheets("PDI details").Range("I" & i).Value
End If
End If
If .Cells(i, 11).Value = "ATMC COURTESY" Then
If Not .Cells(i, 7) = Worksheets("Demo ATMC Courtesy").Range("D4")
Then
Worksheets("Demo ATMC Courtesy").Range("A" & k) = Worksheets("PDI details").Range("A" & i).Value
Worksheets("Demo ATMC Courtesy").Range("B" & k) = Worksheets("PDI details").Range("E" & i).Value
Worksheets("Demo ATMC Courtesy").Range("C" & k) = Worksheets("PDI details").Range("F" & i).Value
Worksheets("Demo ATMC Courtesy").Range("D" & k) = Worksheets("PDI details").Range("G" & i).Value
Worksheets("Demo ATMC Courtesy").Range("F" & k) = Worksheets("PDI details").Range("H" & i).Value
Worksheets("Demo ATMC Courtesy").Range("G" & k) = Worksheets("PDI details").Range("I" & i).Value
k = k + 1
End If
End If
End If
End If
End With
Next i
End Sub
【问题讨论】:
-
如何确定重复?从粘贴到工作表中删除重复项可能比尝试不复制它们更简单。无论哪种方式,当您有一个行的唯一标识符(可能是任何给定行中的几列的串联)时,查找重复项是最容易的,但这将允许您发现它是否是重复项(这可能是整行是重复的或子集。VBA 和通过电子表格直接提供的删除重复功能。
-
您当然可以通过使用 AND 组合条件来删除其中一些 Ifs
-
(您在自己的行上有一个
Then需要调整,并且在Dim i as Long, j as Long, ...行上的声明后有一个错误的逗号) -
@BruceWayne 与其说是一个错误的逗号,不如说是
k_last As Long被错误地推到了下一行 -
您在最后一行的一些项目上获得了 +2。这些可能是空白的,因为最后一行是有数据的。这些可能是您插入空白行的罪魁祸首。您还可以在同一工作表和同一列上找到最后一行两次。只需找到它一次并将第二个变量 = 设置为找到它的那个,你真的需要 2 吗?
标签: vba excel duplicates copy