利用InStr比较两列

时间:2017-05-26 13:35:31

标签: excel vba

我花了好几个小时试图找出解决这个问题的最佳方法,但我没有解决方案。我已经尝试使用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

1 个答案:

答案 0 :(得分: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