使用带有两个查找的findnext

时间:2014-01-30 18:14:41

标签: excel vba

我仍然不熟悉在VBA中使用range / find / findnext并且正在寻求一些帮助。我已经成功实现了单一查找 - > findnext循环,但是我想知道是否可以使用findnext并使用两个查找。

我正在使用它的代码如下。为简单起见,我正在使用披萨库存。

要点是我有一个电子表格,第I列是catagories列(奶酪,肉类,蔬菜),而H列(偏移部分)是类型 - (Mozzarella,Parmesean,Pepperoni等)。我要做的是编译某个列中不同类型的一个类别的列表,没有重复。

例如,我想在第一列中找到“奶酪”一词的所有实例。我希望代码首先找到奶酪这个词,然后给我类型(Cheddar Mozzarella等)。第二个发现是检查我的最后一列中是否已存在该类型。如果它已经存在于列中(第二个查找函数=不是什么),那么它将转到下一个“奶酪”。如果它是新的(第二个查找函数=没有),那么我希望它将类型放在列中并继续。

因为它是错误的,并且考虑到语法几乎与我以前的Find / Findnext相同,只添加了一个额外的FindNext,我意识到它可能引用了错误的一个。有什么方法可以避免这种情况吗?

注意:我意识到我可以很容易地填写最后一列中的所有类型,删除重复项,然后对它们进行排序,但这看起来有点不优雅和耗时。我想知道是否有一种更方便的方式,我正在尝试。

    a = 2
    Set c = Range("I:I").Find("Cheese")
    firstadd = c.Address

    If Not c Is Nothing Then

        Do
            temp = c.Offset(0, -1)
            Set d = Range("BA:BA").Find(temp)

                If d Is Nothing Then
                    Cells(a, 53) = temp
                    a = a + 1
                End If

            Set c = Range("I:I").FindNext(c)
        Loop While Not c Is Nothing And c.Address <> firstadd
    End If

End Function

2 个答案:

答案 0 :(得分:1)

尝试For Each循环以避免使用find / findnext循环。

a = 2
For Each c in Range("I:I") 
    If InStr(c.Value, "Cheese") Then
        temp = c.Offset(0, -1).Value
        If Not Range("BA:BA").Find(temp) Is Nothing Then
            Cells(a, 53).Value = temp
            a = a + 1
        End If
    End If
Next c

答案 1 :(得分:1)

试试这个。

Dim exists As Integer
a = 2
Set c = Range("I:I").Find("Cheese")
firstadd = c.Address

    Do While Not c Is Nothing And c.Address <> firstadd
        temp = c.Offset(0, -1)
        exists = WorksheetFunction.CountIf(Range("BA:BA"), temp)

            If exists > 0 Then
                Cells(a, 53) = temp
                a = a + 1
            End If

        Set c = Range("I:I").FindNext(c)
    Loop 

End Function