我仍然不熟悉在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
答案 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