一千萬個為什麽

搜索

EXCEL - 在列表中查找值並返回多個相應的值

我正在嘗試在Excel中創建一個Tree Traversal以用於我的計劃。我正處於每個1006個單元長的2個列表的位置。第一個是前輩,第二個是後繼者。我試圖使用一組函數來顯示多個結果。例如,如果我輸入3,我希望列出任務3的所有後繼者。到目前為止,我提出的代碼是:

=IF(ISERROR(INDEX($A$1:$B$1006,SMALL(IF($A$1:$A$1006=$E$3,ROW($A$1:$A$1006)),ROW(1:1)),2)),"NO",INDEX($A$1:$B$1006,SMALL(IF($A$1:$A$1006=$E$3,ROW($A$1:$A$1006)),ROW(1:1)),2))

但是,當我輸入前一個時,它不會顯示正確的後繼者。

提前感謝能幫助我的人

最佳答案

您不能使用公式加入值(或者至少,我看不到一種簡單的方法)。

你可以調用一個程序(更快但更具侵入性):

Option Explicit

Sub Proc_ListPre()
Dim rData As Range, lLastrow As Long, i As Integer
Dim aValues() As Variant
Dim sFilter As String, sRes As String

'Ask for the value to filter to the user
sFilter = InputBox("Which predecessor do you want to analyse?", "Please type the predecessor you want")
If Len(sFilter) = 0 Then Exit Sub

'Define the range
'either use UsedRange (if only columns A and B are used)
'Set rData = ActiveSheet.UsedRange
'or use End(xlUp) if not
lLastrow = ActiveSheet.Range("a65536").End(xlUp).Row
Set rData = ActiveSheet.Range("A1:B" & lLastrow)
'Filter the predecessor with the criteria given in arg
rData.AutoFilter Field:=1, Criteria1:=sFilter

'Find the last row of the filtered data
lLastrow = ActiveSheet.Range("a65536").End(xlUp).Row
aValues = ActiveSheet.Range("A2:B" & lLastrow).Value
'Join the 2nd column of the array
'Join(WorksheetFunction.Index(aValues, 0, 2), ";") 'note that this doesn't work because index returns a 2D array
'Workaround to join the 2nd column
For i = 1 To UBound(aValues, 1)
    If Len(CStr(aValues(i, 2))) > 0 Then
        sRes = sRes & aValues(i, 2) & ";"
    End If
Next
sRes = Left(sRes, Len(sRes) - 1)
MsgBox sRes

ActiveSheet.AutoFilterMode = False
End Sub

or use a formula that you will call in your worksheet as =ListPre(mypredecessor)

Function ListPre(ByVal sFilter As String)
Dim rData As Range, lLastrow As Long, i As Integer
Dim aValues() As Variant
Dim sRes As String

'Define the range
'either use UsedRange (if only columns A and B are used)
'Set rData = ActiveSheet.UsedRange
'or use End(xlUp) if not
lLastrow = ActiveSheet.Range("a65536").End(xlUp).Row
Set rData = ActiveSheet.Range("A1:B" & lLastrow)
aValues = ActiveSheet.Range("A2:B" & lLastrow).Value

'Join the 2nd column of the array
'Join(WorksheetFunction.Index(aValues, 0, 2), ";") 'note that this doesn't work because it returns a 2D array
'Workaround to join the 2nd column
For i = 1 To UBound(aValues, 1)
    If Len(CStr(aValues(i, 2))) > 0 And CStr(aValues(i, 1)) = sFilter Then
        sRes = sRes & aValues(i, 2) & ";"
    End If
Next
sRes = Left(sRes, Len(sRes) - 1)
ListPre = sRes
End Function

轉載註明原文: EXCEL - 在列表中查找值並返回多個相應的值