2017-05-05 54 views
0

我構建一個宏以獲取一個部門需要的產品列表(他們每天發送一個新列表),並根據報告進行參考倉庫中每個物品的每個位置。到目前爲止,我已經設置了計算產品ID在位置列表(x)中出現的次數,並將其複製到新工作表x中多次。現在我需要它來獲取產品的尺寸並填充另一列,以便我可以索引產品ID &尺寸並查找位置。該表格將被打印並提供給人們拉動產品,而不必在系統中查找並找到列表上的所有東西的位置(目前大約需要一個小時。)代碼自動填充「INDEX」數組公式並在查找列中重新調整爲新的唯一值

現在的問題是我無法在不破壞第二個唯一值的第一個實例的情況下自動填充公式。我找到了一個解決方法,但我不知道如何開始在vba中自動化它。在D2

數組公式=

{=INDEX(Report!D:G,SMALL(IF(Report!D:G=$A2,ROW(Report!D:G)),ROW(A1)),4)} 

當它到達下降到在列A的第二唯一值,它打破和它的內容

{=INDEX(Report!D:G,SMALL(IF(Report!D:G=$A7,ROW(Report!D:G)),ROW(A6)),4)} 

但是通過改變最後一個ROW函數返回A1,它的工作原理如下:

{=INDEX(Report!D:G,SMALL(IF(Report!D:G=$A7,ROW(Report!D:G)),ROW(A1)),4)} 

Formula breaks in first instance of 2nd unique value in Column A

enter image description here

Formula works in first instance of 2nd unique value in Column A by changing final ROW function back to "A1" and dragging down.

enter image description here

我嘗試添加一個IFERROR於下式:

{=IFERROR(INDEX(Report!D:G,SMALL(IF(Report!D:G=$A2,ROW(Report!D:G)),ROW(A1)),4),INDEX(Report!D:G,SMALL(IF(Report!D:G=$A2,ROW(Report!D:G)),ROW($A$1)),4))} 

但很明顯的是沒有工作。這是更絕望。

是否有辦法通過讓VBA中的進程自動檢測列A中的更改並僅將公式中的最後一個ROW函數還原爲A1?

或者,有沒有一個公式可以通過自動填充工作?

任何幫助表示讚賞。謝謝!

回答

0

嘗試這種陣列式:

=INDEX(Report!G:G,SMALL(IF(Report!D:D=$A2,ROW(Report!D:D)),COUNTIF($A$2:A2,A2))) 

作爲它需要與確認的陣列式Ctrl鍵移輸入,而不是退出編輯模式時輸入。如果正確完成,Excel將在公式的周圍放置{}


注:我已經離開你的全列引用中,這是不良的做法使用數組公式時,他們將通過每一個細胞循環,無論它是否有值與否。這將做超過百萬計算PER公式。這會減慢你的計算時間,甚至可能導致excel崩潰。

建議您僅引用其中包含數據的單元格。

處理數據的一種方法是在小變量內創建引用。我們可以做到這一點的INDEX/MATCH:

=INDEX(Report!G:G,SMALL(IF(Report!D$1:INDEX(Report!D:D,MATCH(1E+99,Report!D:D))=$A2,ROW(Report!D$1:INDEX(Report!D:D,MATCH(1E+99,Report!D:D)))),COUNTIF($A$2:A2,A2))) 

現在該公式將自動設置參考到最後一個單元格,在報告表的列d數字的結束,並沒有多餘的非必要的循環會被製造。

+0

它的工作原理!哦,夥計,謝謝!如果您不介意,請提供2個關於您的答案的問題... 如何更改您的公式以使其沒有完整列引用? 和 爲什麼你的工作? COUNTIF在做什麼? 編輯:沒關係第一個問題。我知道了。 – MadeFromMetal

+0

第一個問題,我回答見edit,第二個問題:countif中的第二個引用是相對的,所以公式被拖下來增加了從頂部到公式所在的行的範圍,所以它正在計數重複,所以A中的每次更改都會使計數器回到1. –

+0

感謝您的幫助。一切都很完美。而且從來沒有我的評論編輯,你的編輯比我的解決方案更好。 – MadeFromMetal