2016-08-05 141 views
0

我被困在如何從邏輯上解決問題,因爲它可能需要二維數組,或者我可能會過度考慮問題。Excel VBA - 將列數據與唯一標識符進行比較

我有兩張數據。每張數據都有一個唯一標識符列表和與每個標識符關聯的少數日期。不幸的是(這是我卡住的地方),與每個標識符相關的日期數量並不總是相等的,所以我很難比較日期。

例如,這裏是從工作表Sheet樣品:

1 | 06/08 
1 | 06/15 
1 | 06/16 
1 | 06/17 
1 | 06/22 
1 | 06/23 
1 | 06/30 
1 | 07/01 
1 | 07/05 
1 | 07/06 
1 | 07/07 
1 | 07/12 
1 | 07/15 
1 | 07/18 
2 | 06/24 
2 | 06/30 
2 | 07/05 
2 | 07/06 
2 | 07/07 
2 | 07/08 
2 | 07/14 

這裏是從表2中的樣品:

1 | 06/07 
1 | 06/16 
1 | 06/17 
1 | 06/23 
1 | 07/06 
1 | 07/07 
1 | 07/18 
1 | 06/21 
1 | 06/28 
1 | 07/08 
1 | 07/14 
2 | 06/09 
2 | 07/13 

基本上,這應該通過日期爲每個標識符來檢查進展。 Sheet1上的日期在項目應該更新時有承諾日期。 Sheet2上的日期包含該項目實際更新時的日期。

基本的邏輯循環是採取所有的唯一標識符,並可能將它們存儲在一個數組中。

然後,對於該數組中的每個唯一值,查看Sheet1中該標識符的每個唯一日期。在Sheet1中的那個日期,Sheet2中的日期是否等於或早於?如果是這樣,該項目在該日成功更新。

但是這裏有一個棘手的部分,那就是Sheet2上的這個日期現在需要被丟棄,因爲它被「使用」了。現在,我們轉到Sheet1上的下一個日期以獲取該標識符。 Sheet2中的標識符是否等於或早於該日期?等等。

任何幫助你可以提供翻譯這個邏輯到VBA將不勝感激!簡單的比較可能很簡單,但這種複雜性需要比我目前熟悉的更多的VBA。

回答

0

不需要VBA。使用這個公式中的C1工作表Sheet1上向下拖動,您的所有數據:如果它發現如果承諾日期沒有得到遵守適當的更新日期和FALSE

=B1>=OFFSET(INDIRECT(ADDRESS(MATCH(Sheet1!A1, Sheet2!$A:$A, 0),2,1,1,"Sheet2")), IFERROR(COUNTIF(OFFSET(INDIRECT(ADDRESS(MATCH(Sheet1!A1, Sheet1!A:A, 0),3,1,1,"Sheet1")),0,0,ROW()-ROW(INDIRECT(ADDRESS(MATCH(Sheet1!A1, Sheet1!A:A, 0),3,1,1,"Sheet1")))),TRUE),0),0) 

這個公式將返回TRUE。

EDIT

另外有兩點:

  1. 有一個小錯誤,其中式可以從下面的標識符讀 '更新日期'。修正後的版本是:

    =AND(B1>=OFFSET(INDIRECT(ADDRESS(MATCH(Sheet1!A1, Sheet2!$A:$A, 0),2,1,1,"Sheet2")), IFERROR(COUNTIF(OFFSET(INDIRECT(ADDRESS(MATCH(Sheet1!A1, Sheet1!A:A, 0),3,1,1,"Sheet1")),0,0,ROW()-ROW(INDIRECT(ADDRESS(MATCH(Sheet1!A1, Sheet1!A:A, 0),3,1,1,"Sheet1")))),TRUE),0),0), OFFSET(INDIRECT(ADDRESS(MATCH(Sheet1!A1, Sheet2!$A:$A, 0),1,1,1,"Sheet2")), IFERROR(COUNTIF(OFFSET(INDIRECT(ADDRESS(MATCH(Sheet1!A1, Sheet1!A:A, 0),3,1,1,"Sheet1")),0,0,ROW()-ROW(INDIRECT(ADDRESS(MATCH(Sheet1!A1, Sheet1!A:A, 0),3,1,1,"Sheet1")))),TRUE),0),0)=Sheet1!A1) 
    
  2. 兩個片需要由兩個標識符(「A」柱)和日期(「B」柱)

+0

這工作完全,謝謝你,進行排序是比我想用4個數組和VBA完成的更優雅的解決方案。 – yutingxiang

+0

@yutingxiang我很樂意提供幫助。如果此答案已解決您的問題,請考慮通過點擊複選標記來接受此問題。這表明你已經找到了社區的解決方案。沒有義務這樣做。 – hstay