2014-01-30 23 views
1

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

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

要点是我有一个电子表格,第一列是分类栏(奶酪,肉,素食),而列H(偏移部分)是类型 - (莫扎里拉,Parmesean,意大利辣香肠等)。我期望做的是在某个列中编译不同类型的一个类别的列表而不重复。例如,我想在栏I中找到“奶酪”一词的所有实例。我希望代码先找到奶酪一词,然后给我一个类型(切达干酪等)。第二个发现是检查我的最后一列中是否已经存在该类型。如果它已经出现在列中(第二个查找功能=没有),那么它会转到下一个“奶酪”。如果它是新的(第二个查找函数=无),那么我希望它将该类型放在列中并继续。

由于它是错误的,考虑到语法几乎与我以前的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 

回答

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 
+0

我应该扔在,我不能搜索苛求,因为他们是相当长的部件号/描述(告诫即整列可能会像“000cheese AB”和“0cheese 00045”的条目。请问一个instr检查c.value部分是可以接受的吗? – Lzkatz

+0

是的,只要使用'如果InStr(c.Value,“奶酪”)然后'而不是'如果c.Value =“奶酪”然后' – 2tsai

+0

工作得很好,谢谢。 – Lzkatz

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 
+0

我没有最终使用这个主要的,但对于我的其他疑问,这非常有帮助,谢谢。 – Lzkatz