嘗試粘貼此進入VBE立即窗口,按下回車鍵:
Names.Add "i", "=$A$1:$A$12": _
Names.Add "v", "=$B$1:$B$12": _
Names.Add "m", "=$D$1:$D$12": _
Names.Add "h", [IF({1},LOOKUP(ROW(i),ROW(i)/(v=INDEX(v,1))))]: _
Names.Add "l", [IF({1},LOOKUP(ROW(i),ROW(i)/(v=INDEX(v,1)),FREQUENCY(-ROW(i),IF(v=INDEX(v,1),-ROW(i),0))-1))]: _
[m]=[IF(COUNTIF(OFFSET(v,h,,l),"=-"&v),CONCATENATE("=",ADDRESS(ROW(i),COLUMN(i),4),"&"" AND ""&INDEX(",ADDRESS(h+1,COLUMN(i)),":",ADDRESS(h+l,COLUMN(i)),",MATCH(-",ADDRESS(ROW(v),COLUMN(v),4),",",ADDRESS(h+1,COLUMN(v)),":",ADDRESS(h+l,COLUMN(v)),",0))"),"")]: _
Names("h").Delete: _
Names("l").Delete
的輸出在問題的示例數據爲:
D5 =A5&" AND "&INDEX($A$2:$A$6,MATCH(-B5,$B$2:$B$6,0))
D11 =A11&" AND "&INDEX($A$11:$A$12,MATCH(-B11,$B$11:$B$12,0))
注:此方法使用命名數組來存儲標頭位置h
和段長度l
的中間結果,並且當範圍名稱i
(id),v
(值)和m
(匹配)擴展到40,000行時需要大約3-4秒。一個簡單的公式可能是可能的,但是填充大型數據集的效率會很低。
耶!我希望配方大師能夠提出一些不需要全面的VBA解決方案的東西。 ROW(i)'在'FREQUENCY'函數中如何工作以檢查下一個頭部發生(我發現它確實使數組成長,但不知道「-ROW(i)'意味着什麼爲數據數組)? – Zairja 2012-08-10 13:15:12
該死的,這個網站充滿了天才! lori_m,我得寄給你一個蛋糕或者你送給我的所有幫助! Trully讚賞! – tracer 2012-08-10 14:48:34
我很高興這有幫助,它花了一段時間才弄清楚,並且使用函數只是一個有趣的挑戰 - 一個VBA解決方案肯定會更容易遵循,但可能也會更長。 @Zairja:ROW前面的'-'確保頻率計數與輸出數組中的標題位於同一行。 – 2012-08-10 15:43:06