我在 Excel 中有两列,所有单元格都包含文本字符串。A 列包含 8000 个单元格,B 列包含 3000 个单元格。我需要检查 B 列中的每个单元格,看看它是否包含单元格 A1 中的字符串。如果是这样,我需要删除该文本,保留字符串的其余部分。然后我需要对单元格 A2、A3 等执行相同的操作,一直到单元格 A8000。这将永远需要手动完成,我知道这对于 VBA 程序员来说应该很容易,但我是一个完全的菜鸟,并且在从哪里开始挣扎。谢谢。
5 回答
这是使用 BULK 替换的一种非常简单的方法
Sub Sample()
Dim ws As Worksheet
Dim lRow As Long
Set ws = Sheets("Sheet1")
With ws
lRow = .Range("A" & .Rows.Count).End(xlUp).Row
For i = 1 To lRow
.Columns(2).Replace What:=.Range("A" & i).Value, _
Replacement:="", _
LookAt:=xlPart, _
SearchOrder:=xlByRows, _
MatchCase:=False, _
SearchFormat:=False, _
ReplaceFormat:=False
Next
End With
End Sub
有一种比 Wolf5370 建议的更快的方法。您可以遍历 A 列中的所有单元格,并对它们在 B 列中找到的值进行替换。
这样的事情应该让你开始。
Option Explicit
Sub Replace()
Dim wks as Worksheet
Set wks = Worksheet("Shee1") 'change to suit your needs
With wks
Dim rngLook as Range, cel as Range
Set rngLook = Intersect(.UsedRange,.UsedRange.Offset(1),.COlumns(1))
For each cel in RngLook
.Columns(2).Replace cel.Value, "", xlPart
Next
End With
End Sub
最初我认为排序(每列)和遍历列(主/事务样式)。但是,然后我注意到您在谈论子字符串,因此排序顺序无济于事。做到这一点的唯一方法是将一个循环嵌套在另一个循环中,并检查所有 8000 个单元 3000 次。
dim c1 as integer, c2 as integer
for c2=1 to 3000
for c1=1 to 8000
cells(c1,1).value = Replace(cells(c1,1).value, cells(c2,2).value, "")
next c2
next c1
请注意,这是在我的头顶上手工制作的(因此预计会出现拼写错误等)。基本上它会循环遍历我提到的所有这些时间,每次它替换字符串时-您可以通过将单元格(c1,1)复制到执行替换的变量并在写回之前查看它是否更改来做到这一点-在a上测试它几个周期,看看哪个更快。
编辑:修正了几个错别字(实际上错过了第二个学期的“价值”一词)
PS:如果单元格令人困惑,您可以改用 Range -替换Cells(c1,1)
为Range("A" &c1)
和Cells(c2,2)
Range("B"&c2)
不需要VBA。只需在 C 列中填写此公式:
=VLOOKUP($B1,A:A,1,0)
假设您的数据从 B1 开始,请将此公式填入 B3000。
现在,如果在 A 列中找到 B 列中的值,您将在 C 列中看到匹配值,否则您将看到#N/A
.
最后,按 C 列中的值对 B 列和 C 列进行排序,然后删除您不想要的那些。
这应该需要 30 秒。
我敢肯定会有人来发布与上述等效的VBA。
不确定您是否仅限于 VBA 或者是否可以接受添加列:如下所示:Excel 有一个内置的工作表功能,称为替代品,可以满足您的需要(取决于 Excel 版本)
请注意,在 D3 中,当在 B3 中它的 THIS 和 IS 被丢弃时,TH 是如何显示的。
编辑啊,但现在我看到你需要“循环”这个。我将不得不重新考虑我的回应。