【问题标题】:Finding rows with specific words in an excel sheet [closed]在 Excel 工作表中查找具有特定单词的行 [关闭]
【发布时间】:2020-10-17 15:42:12
【问题描述】:

我有一个类似这种格式的表格:

Table

我的表格有 50000 行和 800 列,某些单元格(制表符分隔)包含多个逗号分隔的单词(例如 L、N)。我想只保留给定列(比如 col2)中包含一组单词(比如 A 到 N)中的一个的行,并删除剩余的行。

是否可以使用 Vlookup 或有其他方法?任何建议表示赞赏。

【问题讨论】:

  • 我很好奇:你为什么用 [r] 和 [python] 标记这个?您对使用这些的解决方案感兴趣吗?您在帖子中没有这样说。
  • “A 到 N”表示不是“一组单词中的一个”的多个单词的范围。请修改您的问题以澄清。
  • @Aron 如果 [r] 和 [python] 可以解决我的问题,我想尝试一下。
  • 你的“桌子”到底在哪里/什么?你说制表符分隔,所以它是一个文本文件吗?
  • @Tim 是的,它是一个 .txt 文件。但某些字段/单元格包含多个逗号分隔的单词。

标签: python r excel vba excel-formula


【解决方案1】:

创建一个帮助列,可能位于工作表副本的最右侧。在该列的第 2 行输入此公式。修改公式以将 C 列替换为辅助列(您在其中编写公式的列)的 ID,并将 B 列替换为要在其中查找单词的列。从头到尾处理公式。

=ISERROR(FIND(C$1,$B2))

现在在辅助列的单元格 (1) 中输入您要保留的单词(在我的示例中为 C$1)。该列将填充 TRUE 和 FALSE。

  • TRUE 表示未找到该词,应删除该行
  • FALSE 表示该词存在并应保留

现在对该列的工作表进行排序并删除其中包含 TRUE 的块。 15秒平坦,在你做了几次之后。这比运行任何 VBA、r 或 Python 解决方案都快。

【讨论】:

  • 感谢您回复 Variatus!这对于一个查询来说工作得非常快。但是,我有大约 5000 个这样的词要搜索。请让我知道我是否必须通过创建 5000 个帮助列或有任何更简单的方法来做到这一点。对不起,如果我的问题不清楚。
  • 即使您的代码可以在一个小时内为您准备 5000 个工作簿 - 而不是我建议的 24 个 - 查看新创建的 5000 个文件需要多长时间?没有方向的速度是毫无用处的。但是,让我们面对现实吧,我们现在正在考虑我是否应该为您编写代码。我不是免费工作,也不是为了钱而工作(也不是你提供的),我不相信你的项目。因此答案是否定的。祝你好运。
  • 我是一个初学者,正在寻找学习一些我不知道的东西的方向,但我没有要求任何人为我编写一段代码。相反,我想自己学习和编写。谢谢。
  • 在这里发布您尝试过的内容。事实上,这是论坛的要求。当你遇到困难时,这里的人会帮助你。
  • 您还需要解决方案吗?
【解决方案2】:

我遇到的最大问题是在传达我做了什么、如何做以及为什么做的沟通方面。没必要,所以删了。

所以,选择表格的任何部分、部分或范围并运行代码。

如果您不需要删除找到的数据并希望保留在您的工作表中,您可以删除下面的代码部分“清除任何现有的过滤器”,但仍为其他目的标记(例如您可以将这些位复制到另一个文件如果你愿意,等等)。

下面的代码应该满足您在问题中提出的要求,并只留下表格中您选择的任何条款中不包含的部分。即它将根据您的标准删除并向上移动表格中的行。

& 是的,Python 和 R 也可以简单地为您执行此操作,使用 python 中的数据帧,代码更少。但是这个 VBA 代码适用于我的许多示例。不知道 50000 行和 X 列的情况如何,但应该没问题{编辑后: 效果很好}。

    Sub SearchTableorSelectionDeletetermsFound5()
    

    Dim corresspondingpartner() As Variant
 
    Dim rng As Range: Set rng = Selection
    Dim col As Range
    For Each col In rng.Columns

    Dim r As Range
    Dim rn As Variant
    Dim Rownum As Long
    
    Rownum = Selection.Rows.Count
    
    ReDim rm(0 To Rownum) As Variant 'size of this array needs to equal or bigger than your selection
                  
    'With Sheet2
    terms = Sheets("Sheet2").Cells(1, 1).CurrentRegion

    k = 1
    For rw = 0 To UBound(terms)
    ReDim Preserve corresspondingpartner(rw)
    corresspondingpartner(rw) = (k / k) 'gives each correspondong partner element an id of 1.
    k = k + 1

   Next
   'End With
    
   For Each r In Selection
   n = 0
   m = n
 
   For Each c In terms
   ' Checks for each term in turn in the terms column.
   ' If it finds one, it inserts the corresponding corresspondingpartner name in the column cell/corresponding row column O (*post edit: now, column ADU)*
   If r.Offset(0, 0).Value Like "*" & c & "*" Then

    
   rm(n) = corresspondingpartner(n) 'corresspondingpartner(n)  and in the end, you dont even need this, you can replace with any value which the auto fiter section looks for to delete
    'so you can  remove any instances and classees of corresspondingpartner, including the making of this corresponding second array
    'turns out it could have been just if =1

    Cells(r.Row, 801).Value = rm(n) / rm(n) 'Sheets("HXY2").
    '##### YOU DONT EVEN NEED A HLOOKUP! :)
    '#### BUT I STILL WANT TO GET RID OF THE OFFSET COLUMS, DO IT WITHOUT THEM. DONE!! :)
    '''###''' same here , turns out could have just been =1
    
    End If
    n = n + 1
    Next
    Next
    
    Next col


  
  'Clear any existing filters
    On Error Resume Next
    ActiveSheet.ShowAllData
    On Error GoTo 0

  '1. Apply Filter
   ActiveSheet.Range("A1:ADU5000").AutoFilter Field:=801, Criteria1:=corresspondingpartner(n) / corresspondingpartner(n)
  
  '2. Delete Rows
    Application.DisplayAlerts = False
    ActiveSheet.Range("A1:ADU5000").SpecialCells(xlCellTypeVisible).Delete
    Application.DisplayAlerts = True
  
  '3. Clear Filter
    On Error Resume Next
    ActiveSheet.ShowAllData
    On Error GoTo 0

End Sub

您可能会看到,一开始我正在使用从表/选择中打印偏移列结果 - 这占用了不必要的空间,并且还在代码中使用了 VBA Application.WorksheetFunction.Hlookup 来给出最终结果结果列,标记要删除的行,但这最终是不必要的。那些较早的版本/宏也可以工作,但速度较慢,所以我在不需要辅助列的情况下使用数组。

我求助于我的朋友,[excel 校园 - 根据条件删除行][1] 在末尾嵌入和调整自动过滤器代码,删除您不想要的行,因此您不必这样做自己动手)

它现在是对您选择(或数据)中数组匹配项的“虚拟”hlookup,通过删除符合您的规范/要求的所有行,为您留下所需的数据。

我知道并且有一种强烈的预感,它可以进一步改进,进一步扩展精简(从我制作数组的方式开始),但我对它的功能和潜在范围目前感到满意。

[1]:https://www.youtube.com/watch?v=UwNcSZrzd_w&t=6s)

【讨论】:

  • 实际上,这些单词被标记为已找到的唯一实例(除了您询问的第 2 列)位于第 15 列(在我的代码中,或者如果您将 15 更改为任何其他数字,然后是该列号),自动过滤器只需要按该列而不是其他任何列进行过滤,就能够选择相关行并删除它们。因此,您不必将自动筛选范围更改为其他任何内容,除非您为输出标签选择的范围/列超出 AZ 列。注: =column(列中的任何单元格) 为您提供列号。
  • 不,它并不慢。它适用于 800 多列、5000 行长。刚刚测试过了。在您的情况下,您将不得不将我的代码更改为 a1:adu 并将 15 更改为 800。我会在回复中这样做。
猜你喜欢
  • 2019-12-23
  • 1970-01-01
  • 2020-12-07
  • 1970-01-01
  • 2017-04-26
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
相关资源
最近更新 更多