2017-05-26 91 views
0

我花了数小时试图找出解决此问题的最佳方法,但我没有解决方案。我试过循环,使用InStr,条件格式w /通配符,但结果从来没有我想要的。利用InStr比较两列

我有两列值,一个是我想要搜索的值,另一个是长字符串,我的值可能坐在任何地方,因此我需要通配符。我想要做的是采取长字符串列的第一行,并将其与较短值的列中的每个值进行比较。如果没有短值的长字符串被发现,与长串删除该行并移动到下一个...

我想我已经将其设置是这样的:

For i = 1 to lastrow, 
    If InStr(longvalue, shortvalue) Then 
    ' Break loop to next i? 
    Else 
     If i = lastrow 
      longvalue.EntireRow.Delete 
     End If 
    End If 
Next i 

任何帮助,将不胜感激......一直拉着我的头发在这一个。再看看,我想我需要2个循环,第一个循环遍历所有的短数值和单个较长的值,然后在它们全部循环后,转到下一个更长的值。

编辑:本端:

i = 6 
j = 2 
Set sht = ThisWorkbook.Worksheets("SM Summaries") 
lastrow = sht.Cells(sht.Rows.Count, "C").End(xlUp).Row 
reallastrow = lastrow + 1 
For i = 6 To reallastrow 
    For j = 2 To 82 
     If InStr(ActiveWorkbook.Sheets("SM Summaries").Range("C" & i).Value, ActiveWorkbook.Sheets("SM Reference Sheet").Range("H" & j).Value) Then 
      Exit For 
     Else 
      If j = 82 Then 
       ActiveWorkbook.Sheets("SM Summaries").Range("C" & i).EntireRow.ClearContents 
      End If 
     End If 
    Next j 
Next i 

回答

0

当在一个循环中删除行,你需要循环向后所以循环可以跟踪正确的行。所以,

For i=lastrow to 1 step -1 
    If InStr(longvalue, shortvalue) Then 
     GoTo Nexti 
    end if 
    if i=1 then 
     longvalue.entirerow.delete 'this assumes longvalue is a cell reference 
    end if 
Nexti: 
Next i 

但我想我会用Find

With Worksheets(1).Range("b1:b500") 
for i=lastrow to 1 step -1 
    Set c = .Find(cells(i,1), lookin:=xlValues, lookat:=xlPart) 'xlPart returns true if just part of the string matches 
    If c Is Nothing Then 'didn't find your string 
     cells(i,2).entirerow.delete 
    end if 
next i 
End With 
+0

感谢马特!我只是想出了它。与第一部分代码几乎相同的答案。我正在通过循环向前迈进,并使用clearcontents而不是deleterow,因为在我的代码结束时,我删除了所有的空白和重复,并且它们全部向上移动。无论什么作品! – dwirony

+0

好的。好。由于代码更加简洁,也可以使用'Find'进行试验。尽管如此,恭喜你搞清楚了。 –

+0

因此'Find'会自动使用通配符,所以即使我的值是一个更大字符串中的子字符串,它会通过? – dwirony