2014-01-30 18 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