2016-08-05 12 views
0

2次元配列が必要な場合があるため、または問題を過剰に考えている可能性があるため、論理的に問題にアプローチする方法に取り組んでいます。Excel VBA - 列データを一意の識別子と比較する

私は2枚のデータを持っています。各データシートには、一意の識別子のリストと、各識別子に関連付けられた一握りの日付があります。残念ながら(これは私が立ち往生しているところです)、各識別子に関連付けられた日付の数は常に同じではないため、日付を比較するのが難しいです。例えば

は、ここではシート1からのサンプルです:

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は不要です。シート1にC1にこの数式を使用すると、すべてのデータのために下にドラッグします:

=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) 

コミットメント日付が尊重されなかった場合には、適切な更新日付とFALSEを見つけた場合、この式は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

関連する問題