Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 如果B列的所有单元格中的文本字符串与a列中任何单元格中的文本字符串匹配,则删除B列所有单元格中的所有文本字符串_Excel_Vba - Fatal编程技术网

Excel 如果B列的所有单元格中的文本字符串与a列中任何单元格中的文本字符串匹配,则删除B列所有单元格中的所有文本字符串

Excel 如果B列的所有单元格中的文本字符串与a列中任何单元格中的文本字符串匹配,则删除B列所有单元格中的所有文本字符串,excel,vba,Excel,Vba,我在Excel中有两列,所有单元格都包含文本字符串。A列包含8000个单元格,B列包含3000个单元格。我需要检查B列中的每个单元格,看看它是否包含单元格A1中的字符串。如果有,我需要删除该文本,保留字符串的其余部分。然后我需要对A2、A3等单元做同样的事情,一直到A8000单元。这将永远需要手动完成,我知道这对VBA程序员来说应该很容易,但我是一个完全的新手,在哪里开始还很困难。谢谢。起初,我认为应该进行排序(每列)并对列进行遍历(主/事务样式)。然而,我注意到您正在谈论子字符串,所以排序顺序

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

起初,我认为应该进行排序(每列)并对列进行遍历(主/事务样式)。然而,我注意到您正在谈论子字符串,所以排序顺序将不会有帮助。 唯一的方法是将一个循环嵌套在另一个循环中,并检查所有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)复制到一个变量来进行替换,并在写回之前查看它是否发生了变化-在几个周期内测试它,看看哪个更快

编辑:修正了几个拼写错误(实际上第二个术语中遗漏了“Value”一词)


PS:如果单元格混淆,您可以使用范围-将
单元格(c1,1)
替换为
范围(“A”&c1)
,将
单元格(c2,2)
替换为
范围(“B”&c2)

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

注意,当B3中的THIS和is被删除时,D3中的TH是如何显示的

编辑
啊,但现在我明白了,你需要“循环”这个。我必须重新考虑我的回答。

这里有一个使用批量替换的简单方法

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

不需要VBA。只需在C列中填写以下公式:

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

假设您的数据从B1开始,将此公式填充到B3000

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

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

这需要全部30秒


我相信会有人来发布与上述内容相当的VBA。有一种比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

我理解您的方法,但不知道如何编写代码。我尝试使用宏记录器生成基本代码,同时从一列和单元格移动到另一列和单元格,搜索子字符串并将其替换为零,等等,但效果不好。虽然这可能有效,但嵌套循环是一种非常缓慢的方法。请参阅下面我和@SiddharthRout的答案。此外,我认为这是一种倒退,我认为您需要
单元格(c2,2)。Value=Replace(单元格(c2,2)。Value,单元格(c1,1)。Value,“””
是的,Scott(和Siddharth Rout)有更好的方法-自从我认真使用Excel VBA以来已经有一段时间了-感谢那里的新知识:D+1。我认为我们是同步的!你和我在同一时间发布了相同的答案!谢谢,悉达思和其他人,这太棒了!不过,有一个问题是,此例程将B列中的匹配文本字符串替换为空格。我需要绳子完全消失,没有空间。我们如何避免有多余的空间?哎呀。。。我知道我做错了什么,它工作得很好。非常感谢。是的,但他想将A列中的每个单元格与B列中的每个单元格进行比较,而不仅仅是同一行中的单元格。对不起,我猜我们的帖子交叉了(如果你愿意,我会删除它,但是你的回复看起来会很奇怪)。顺便说一句,我没有投票给任何人(我很少使用up和down),但他想寻找一个子字符串,而不是整个列的值-然后删除找到的子字符串。我认为这不起作用,因为用户必须检查所有唯一的列a值是否都在列B值内。VLookup不能这样做。@Wolf5370子字符串?呃,我想我会删除我的答案。唉+1用于同时发布。。。再说一遍!:)顺便说一句,您在
列(2)
;)前缺少一个点