我必须在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
答案 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中,您可以将其用于任意查找和搜索范围。