Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.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
Python 在excel工作表中查找具有特定单词的行_Python_R_Excel_Vba_Excel Formula - Fatal编程技术网

Python 在excel工作表中查找具有特定单词的行

Python 在excel工作表中查找具有特定单词的行,python,r,excel,vba,excel-formula,Python,R,Excel,Vba,Excel Formula,我有一个类似于此格式的表格: 我的表格有50000行和800列,某些单元格(制表符分隔)包含多个逗号分隔的单词(例如L,N)。我只想在给定的列(比如col2)中保留包含一组单词(比如a到N)中的一个的行,并删除其余的行 是否可以使用Vlookup或有其他方法来实现?任何建议都将不胜感激。创建一个助手列,也许在工作表副本的最右边。在该列的第2行中输入此公式。修改公式以将列C替换为辅助列(在其中编写公式的列)的ID,并将B替换为查找单词的列。从头到尾处理这个公式 =ISERROR(FIND(C$1

我有一个类似于此格式的表格:

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


是否可以使用Vlookup或有其他方法来实现?任何建议都将不胜感激。

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

=ISERROR(FIND(C$1,$B2))
现在,在helper列的单元格(1)中输入要保留的单词(在我的示例中为C$1)。该列将填充TRUE和FALSE

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

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

我遇到的最大问题是沟通我做了什么,如何做以及为什么要做。没有必要,所以删除了

因此,选择表的任何部分、部分或范围并运行代码

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

下面的代码应该符合您在问题中提出的要求,只留下表格中不包含任何术语的部分。i、 它将根据您的条件删除表中的行并向上移动

&是的,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
应用程序.WorksheetFunction.Hlookup
,以给出最终结果列,标记要删除的行,但这最终是不必要的。那些早期的版本/宏也可以工作,但速度较慢,所以我使用数组不需要辅助列

我求助于我的朋友,[excel campus-根据条件删除行][1]嵌入并调整最后的autoflter代码,该代码删除了您不需要的行,因此您无需自己执行)

现在,它是一个“虚拟”hlookup,通过删除与您的规范/要求匹配的所有行,在您的选择(或数据)中匹配数组,从而为您留下所需的数据

我知道并有一个巨大的预感,它可以进一步改进、扩展和优化(从我生产阵列的方式开始),但我现在对它的功能和潜在范围感到满意


[1] :)

我很好奇:你为什么用[r]和[python]来标记它?您对使用这些解决方案感兴趣吗?你在帖子中没有这样说。“A到N”表示一系列的单词,而不是“一组单词中的一个”。请修改您的问题以澄清。@Aron如果[r]和[python]可以为我的问题提供解决方案,我想尝试一下。您的“表”具体在哪里/什么地方?你说制表符分开了,那么你有一个文本文件吗?@Tim是的,它是一个.txt文件。但某些字段/单元格包含多个逗号分隔的单词。感谢您的回复!这对于一个查询来说非常快。然而,我有大约5000个这样的词要搜索。请让我知道,如果我必须通过创建5000个帮助器列或有任何更简单的方法来做到这一点。如果我的问题不清楚,很抱歉。即使您的代码可以在一小时内为您准备5000本工作簿,而不是我建议的24本,您需要多长时间才能查看新创建的5000个文件?没有方向的速度是毫无用处的。但是,让我们面对现实吧,我们现在正在考虑我是否应该为您编写代码。我不是免费工作,也不是为钱工作(你也没有提供),我也不相信你的项目。因此答案是否定的。祝你好运。我是一个初学者,正在寻找学习一些我不知道的东西的方向,但我没有要求任何人为我写一段代码。相反,我想自己学习和写。谢谢。在这里公布你的尝试。事实上,这是论坛的要求。当你陷入困境时,这里的人会帮助你。你还需要解决这个问题吗?事实上,因为这些单词被标记为已找到的唯一实例(除了在你的ask中的第2列之外)在第15列(在我的代码中,或者如果你将15改为任何其他数字,那么该列数字),自动筛选只需按该列而不按任何其他列进行筛选,即可选择相关行并删除它们。因此,您不必将autofilter范围更改为其他任何内容,除非为输出标记选择的范围/列超出了列AZ。N.B.=列(列中的任何单元格)提供列号。不,它不慢。它可以处理800多列,5000行。刚刚测试过。在您的情况下,您必须将我的代码更改为a1:adu和15到800。我会在答复中这样做。