2014-02-25 47 views
0

我想創建一個公式來返回excel中的行號。基本上我有兩個不同的表格,我想鏈接。在參考列下的員工部分,我想要提出一個公式,如果符合某些標準,它將引用一個數字。Excel公式引用多個列中的多個條件

例如,我希望能夠取2256(麻木爲tom)並搜索建築物表中的「分配」列以查找匹配,然後查看緊靠其的單元是否表示超時或不是(x是超時),然後我希望它返回數組B3中對應行的參考編號:B7,用於符合員工編號但不超時的班次。如果它找不到符合這兩個標準的東西,我需要它返回數字0.在這種情況下,我希望湯姆的參考數字報告爲1,即它有一個參考4,而凱西顯示3。琥珀應該保持空白。

Building 

Ref  Post  Start  End  assign  overtime 
1  sh  1600  2400  2256    
2  sn  600  1400  2057   x  
3  sh  1000  1800  2107    
4  sd  1400  2200  2057    
5  dc  700  1500  2256   x 


Employee 

Name  Numb  Start End  Post  Reference 

tom  2256  day  eve  sh   ?? 

Liz  2057  day  eve  sd   ?? 

Amber 2952  day  eve  none   ?? 

kathy 2107  day  eve  sh   ?? 

有人可以幫助這個公式嗎?我嘗試過sumproduct,index,match,if和and版本,並且總是收到錯誤。謝謝。

回答

2

使用您的樣本數據,公式爲:

=IFERROR(INDEX($A$2:$A$6,MATCH(1,INDEX(($E$2:$E$6=B10)*($F$2:$F$6=""),),0)),"") 

但是,只返回第一個匹配的參考數。有沒有可能發生多次事件?如果是這樣,結果應該是什麼?

如果永遠只能有一個發生,也許一個簡單的SUMIFS將是你最好:

=SUMIFS($A$2:$A$6,$E$2:$E$6,B10,$F$2:$F$6,"") 

,然後格式化表不顯示爲0,或使用自定義格式隱藏起來: 0;0;;@

當然,一如既往的調整範圍,以適應

0

不尊重公式答案,我相信它工作得很好。 你的問題有很多解決方案,我的不一定是最好的。 但是... 您可能想嘗試編寫一個VB宏來完成任務。 如果你不知道,宏是一種簡單的編程類型,學習如何使用宏可以在excel中打開一個有用可能性的整個世界。 (如果您有時間和傾向) 使用宏可以爲變量添加標籤,檢查結果並輕鬆進行調試,以及使用任何未來的增強功能對其進行修改。 您可以使用Developer-> Visual Basic子菜單運行宏。 運行和調試宏很容易和有趣...試試吧,看看

Public Sub Employee_Not_Overtime_Check() 
' 
    Dim iMaxEmployee As Long 
    Dim iMaxBuilding As Long 
    Dim irow As Long 
    Dim iEmpNum As Long 
    Dim iReference As Integer 

' Initialisation, stop screen refresh during macro execution 

    Application.ScreenUpdating = False 
    Application.DisplayAlerts = False 

    iMaxBuilding = Sheets("Building").UsedRange.Rows.Count 
    iMaxEmployee = Sheets("Employee").UsedRange.Rows.Count 

' For debug, setting limits smaller 



    iMaxBuilding = 10 
     iMaxEmployee = 10 


' Loop through the Employee Records, for each one check their overtime status 

     irow = 2 
     Do While irow <= iMaxEmployee 
      Sheets("Employee").Select 
      iEmpNum = Cells(irow, 2).Value 

      Call CheckOvertime(iEmpNum, iMaxBuilding, iReference) 

      Sheets("Employee").Select 
      Cells(irow, 6).Value = iReference 

      irow = irow + 1 
     Loop 


     Application.ScreenUpdating = True 
     Application.DisplayAlerts = True 


    End Sub 

Function CheckOvertime(ByVal iEmpNum As Long, ByVal iMaxBuilding As Long, ByRef iReference As Integer) 

    Dim irow As Long 

    Sheets("Building").Select 

    iReference = 0 

    For irow = 2 To iMaxBuilding 
     If Cells(irow, 5).Value = iEmpNum Then 
      If Cells(irow, 6).Value <> "x" Then 
       iReference = Cells(irow, 1).Value 
       Exit For 
      End If 
     End If 

    Next irow 

End Function