如何在sheet2中的给定单元格值的sheet1中遍历行,并将sheet1中的行替换为表2中的行?

时间:2015-11-06 18:34:47

标签: vba replace

我必须在sheet2中的同一列中给定匹配的单元格值,找到并替换工作表1中的行。列号为4.

HELPPP !!!

这就是我现在所拥有的,我在下一个x上收到错误。

Sub DeleteRows()
    Dim wb As Workbook
    Dim ws As Worksheet
    Dim ws2 As Worksheet

    Set wb = ActiveWorkbook
    Set ws = Sheets(Sheet1)
    Set ws2 = Sheets(sheet2)

    With wb
    For i = 1 To ws2.Cells(Rows.Count, 4).End(xlUp).Row
        Dim lookupvalue As String
        lookupvalue = ws2.Cells(i, 4).Value

        For x = 1 To ws1.Cells(Rows.Count, 4).End(xlUp).Row
            Dim rng As range
            For Each rng In range("D:D")

            If InStr(1, rng.Value, "lookupvalue") > 0 Then
                rng.Delete
            End If
        Next x
exitloop:
Next i

End With

End Sub

2 个答案:

答案 0 :(得分:0)

作为A.S.H.说,代码需要一点改进:

1)需要组合两个内部循环。

2)由于您正在删除单元格,因此新的内部循环应该从下往上,这可能就是为什么你有第二个内部循环,但这只是为sub增加了时间。

3)您目前只删除一个单元格,其周围的任何数据都将保留。这可能是你想要的,所以我把它留下了,但如果你打算删除整行,那么取消注释那行。

4)当使用instr函数进行测试时,变量不应该在引号中,变量用引号括起来,它将查找特定的单词" lookupvalues"而不是分配给该变量的值。

5)正在使用的with块没有做任何事情。当使用with块时,使用它的行需要以'开头。'例如:在你的代码中,with与工作簿一起使用,因此每次使用工作表时,都应该以"。"开头。比如[ { "__type": "Test1Class:#Question33569121", "baseproperty": null, "test1property": null }, { "__type": "Test2Class:#Question33569121", "baseproperty": null, "test2property": null } ] 等等。但是,通过使用工作簿声明工作表,不再需要它。

.ws1...

答案 1 :(得分:0)

我想提出一种替代方法来使用For Each循环和Range对象的Find方法来处理它。

Sub DeleteRows()
   Dim wb As Workbook
   Dim ws As Worksheet
   Dim ws2 As Worksheet
   Dim lookup_rng As Range
   Dim lookupvalue As String
   Dim search_rng As Range
   Dim rng As Range
   Dim match_rng As Range

   Set wb = ActiveWorkbook
   Set ws = wb.Sheets("Sheet1")
   Set ws2 = wb.Sheets("Sheet2")

   Set lookup_rng = Application.Intersect(ws2.Range("D:D"), ws.UsedRange)
   Set search_rng = Application.Intersect(ws.Range("D:D"), ws2.UsedRange)

   For Each rng In lookup_rng.Cells
      lookupvalue = rng.Value
      With search_rng
         Set match_rng = .Find(lookupvalue, LookIn:=xlValues, LookAt:=xlPart, SearchDirection:=xlPrevious)
         Do Until NoMoreMatches(match_rng)
            match_rng.Delete 'Or match_rng.EntireRow.Delete if you want to delete the entire row.
            Set match_rng = .FindPrevious
         Loop
      End With
   Next
End Sub

   Private Function NoMoreMatches(MatchRng As Range) As Boolean
      NoMoreMatches = MatchRng Is Nothing
   End Function

这种方法比Scott Craner更浪费,因为Find方法始终从范围的末尾开始。但是,我认为它具有更容易阅读的优点,即代码更直接地显示它应该做什么。

此外,使用此版本,您可以将循环提取到单独的Sub中,您可以将其用于任意查找和搜索范围。