2014-10-08 69 views
1

我想要做的是使用VBA來解決Vlookup的限制,並創建一個用戶窗體來顯示客戶編號的相關項目。我有一列填充重複值(客戶編號)的列,則其旁邊的列具有唯一值(客戶事件)。這裏是我的表的短塊:VBA查找值,返回與查找值關聯的所有唯一值(在用戶表單文本框中)

CustNum  CustEvent 
123   Called In 
123   Placed Order 
345   Filed Complaint 
345   Called In 
345   Refund Approved 

我創建一個窗體,讓我們的員工通過柱搜索,它返回的是在B列。我用VLOOKUP這樣做,但每個人都知道VLOOKUP的侷限性因爲它只會返回它運行到的B中的第一個值。

我需要的是我的用戶窗體的文本框來顯示前五名客戶的事件匹配:

Search: 123 

Called In, Placed Order 

最後將通過我沒有寫訪問SQL表運行,所以改變數據不是一種選擇。

我的代碼:

Dim x As Long 

x = cnum.Value 

textbox1.Value = Application.WorksheetFunction.VLookup(x, Range("A2:B5"), 2, False) 
+0

爲什麼不直接針對表運行一個單獨的「select distinct」查詢? – Chel 2014-10-08 16:17:05

+0

您可以使用高級過濾器來執行此操作。 – 2014-10-08 16:20:04

+0

我對於事物的SQL方面仍然很陌生。你有鏈接或例子嗎? – Jamison 2014-10-08 16:41:02

回答

0

您可以使用VBA函數來爲您答疑解惑。我寫過這個功能,可以做得更健壯;但這應該給你基本的想法。

enter image description here

這背後的代碼是一個簡單的函數,將採取ID作爲參數,然後返回所有相關記錄。基於Allen Browne的ConcatRelated method的想法。

Public Function ConcatRelated(InputID As Long) As String 
    Dim lastRow As Long, iCtr As Long, retStr As String 

    lastRow = Range("A65536").End(xlUp).Row 

    For iCtr = 1 To lastRow 
     If Cells(iCtr, 1).Value = InputID Then 
      retStr = retStr & Cells(iCtr, 2).Value & ", " 
     End If 
    Next 

    If Len(retStr) > 0 Then _ 
     retStr = Left(retStr, Len(retStr) - 2) 

    ConcatRelated = retStr 
End Function 

我希望這會有所幫助!祝你好運。