【问题标题】:Delete all text strings in all cells for a column B if it matches the text string in any of the cells in column A如果与 A 列中任何单元格中的文本字符串匹配,则删除 B 列所有单元格中的所有文本字符串
【发布时间】:2012-06-26 19:50:15
【问题描述】:

我在 Excel 中有两列,所有单元格都包含文本字符串。 A 列包含 8000 个单元格,B 列包含 3000 个单元格。我需要检查 B 列中的每个单元格,看看它是否包含单元格 A1 中的字符串。如果是这样,我需要删除该文本,保留字符串的其余部分。然后我需要对单元格 A2、A3 等执行相同的操作,一直到单元格 A8000。这将永远需要手动完成,我知道这对于 VBA 程序员来说应该很容易,但我是一个完全的菜鸟,并且在从哪里开始挣扎。谢谢。

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    这是使用 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
    

    【讨论】:

    • +1。我认为我们是同步的!你和我在各地同时发布相同的答案!
    • 谢谢,悉达多和其他所有人,这太棒了!但是,一个问题是,此例程将 B 列中的匹配文本字符串替换为空格。我需要字符串完全消失,没有空间。我们如何避免有多余的空间?
    • 哎呀...我发现我做错了什么,它工作得很好。谢谢!
    【解决方案2】:

    有一种比 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
    

    【讨论】:

    • 叹息... +1 同时发帖... 再次! :) 顺便说一句,您在Columns(2) 之前缺少一个点;)
    【解决方案3】:

    不确定您是否仅限于 VBA,或者是否可以接受添加列:例如: Excel 有一个内置的工作表功能,称为替代,可以满足您的需要(取决于 Excel 版本)

    注意在 D3 中,TH 是如何显示的,而在 B3 中,它的 THIS 和 IS 被删除了。

    编辑 啊,但现在我看到你需要“循环”这个。我将不得不重新考虑我的回答。

    【讨论】:

    • 是的,但他想将 A 列中的每个单元格与 B 列中的每个单元格进行比较,而不仅仅是同一行中的单元格。
    • 抱歉,我猜我们越过了帖子(如果你愿意,我会删除它,但你的回复看起来很奇怪)。顺便说一句,我没有对任何人投赞成票或反对票(我用得很少,几乎从不反对)
    【解决方案4】:

    不需要 VBA。只需在 C 列中填写此公式即可:

    =VLOOKUP($B1,A:A,1,0)

    假设您的数据从 B1 开始,请将此公式填入 B3000。

    现在,如果在 A 列中找到 B 列中的值,您将在 C 列中看到匹配值,否则您将看到 #N/A

    最后,按照 C 列中的值对 B 列和 C 列进行排序,然后删除不需要的。

    这应该需要 30 秒。

    我相信会有人来发布与上述等效的 VBA。

    【讨论】:

    • 但他想查找一个子字符串,而不是整个列值 - 然后删除找到的子字符串。
    • 我认为这行不通,因为用户必须检查所有唯一的 A 列值是否都在 B 列值内的任何位置。 VLookup 无法做到这一点。
    • @Wolf5370 子字符串?呃,我想我会删除我的答案。
    【解决方案5】:

    最初我认为排序(每列)和遍历列(主/事务样式)。但是,然后我注意到您在谈论子字符串,因此排序顺序无济于事。 这样做的唯一方法是将一个循环嵌套在另一个循环中,然后检查所有 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)

    【讨论】:

    • 我了解您的方法,但不知道如何编写代码。当我从一列和单元格移动到另一列和单元格时,我尝试使用宏记录器生成基本代码,搜索子字符串并将其替换为空等,但效果不佳。
    • 虽然这可能有效,但嵌套循环是一种非常缓慢的方法。请参阅下面的我和@SiddharthRout 的答案。另外,我认为它落后了,我想你想要cells(c2,2).Value = Replace(cells(c2,2).Value,cells(c1,1).Value,"")
    • 是的,斯科特(和 Siddharth Rout)有更好的方法 - 自从我对 Excel VBA 做了任何认真的事情以来已经有一段时间了 - 感谢那里的新知识:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多