[[20160822213402]] 『基準日の前後の近い日にちを取得する方法について』(N-work) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『基準日の前後の近い日にちを取得する方法について』(N-work)

以下の様なA列とB列が1,000程度ある「Sheet01」のデータから
「Sheet02」のB/C/E/F/Gの列に
以下の条件の数値を拾うための良い方法はないでしょうか?

現状は手作業で取得しておりまして時間的にも侭ならぬ状況です。
お力添えのほど宜しく御願い致します。

B列 : A列の数値が同じであってD列の数値から過去に遡って2番目に近い数値
C列 : A列の数値が同じであってD列の数値から過去に遡って1番目に近い数値
E列 : A列の数値が同じであってD列と同じ数値
F列 : A列の数値が同じであってD列の数値から未来に進んで1番目に近い数値
G列 : A列の数値が同じであってD列の数値から未来に進んで2番目に近い数値

 --------------------------------------
※ 「Sheet01」のA列B列、「Sheet02」のA列D列は最初から入力されてます。
 --------------------------------------

Sheet01

 A列	B列					
1131	20160301					
1131	20160401
1131	20110401					
1131	20170401					
1131	20160201					
1131	20160101					
1131	20150101					
2136	20160731					
2136	20160802					
2136	20160630					
2136	20160630					
2136	20160530					
3333	20160101					
3333	20150102					
3333	20160102					
7536	20150901					
7536	20150801					
7536	20150731					
9999	20170901					

Sheet02

 A列      B列      	C列      	 D列      	E列      	 F列      	 G列      
   (2番目に近い)	(1番近い)	■基準■	       同日	      1番近い	      2番目に近い
1131	20160101	20160201	20160301	20160301	20160401	20170401
2136	20160530	20160630	20160631	        	20160731	20160802
3333	        	20150102	20151231	        	20160101	20160102
7536	20150731	20150801	20150901	20150901	        	        
9999	        	        	20160901	        	20170901	      

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 こんばんわ。

 多分以下の式で行けると思います。
 Sheet01のデータが100行までにしています。
 もっと多ければ調整して下さい。
 でも配列を扱ってるので、参照範囲が大きすぎると重くなります。

 B2 =IF(C2="","",IFERROR(AGGREGATE(14,6,1/((Sheet01!A$1:A$100=A2)*(Sheet01!B$1:B$100<C2))*Sheet01!B$1:B$100,1),""))
 C2 =IFERROR(AGGREGATE(14,6,1/((Sheet01!A$1:A$100=A2)*(Sheet01!B$1:B$100<D2))*Sheet01!B$1:B$100,1),"")
 E2 =IF(COUNTIFS(Sheet01!A:A,A2,Sheet01!B:B,D2),D2,"")
 F2 =IFERROR(AGGREGATE(15,6,1/((Sheet01!A$1:A$100=A2)*(Sheet01!B$1:B$100>D2))*Sheet01!B$1:B$100,1),"")
 G2 =IFERROR(AGGREGATE(15,6,1/((Sheet01!A$1:A$100=A2)*(Sheet01!B$1:B$100>F2))*Sheet01!B$1:B$100,1),"")
 それぞれ下にオートフィル

数式にゴミが混ざってたので修正しました。(8:17)

(sy) 2016/08/23(火) 01:03


 syさんの数式、凄いですね。 集計関数を使えば、こんな複雑な条件でも書けてしまうとは…。
 私はマクロ例を書いてみます。マクロでも結構複雑です。

 Sub test()
    Dim AR As Object
    Dim wk1 As Worksheet
    Dim wk2 As Worksheet
    Dim i As Long
    Dim j As Long
    Dim iMax As Long
    Dim vw As Variant

    Set AR = CreateObject("System.Collections.ArrayList")
    Set wk1 = Sheets("Sheet01")
    Set wk2 = Sheets("Sheet02")

    iMax = wk1.Cells(wk1.Rows.Count, "A").End(xlUp).Row

    For i = 2 To wk2.Cells(wk2.Rows.Count, "A").End(xlUp).Row
        AR.Clear
        vw = wk2.Cells(i, "A").Value
        For j = 1 To iMax
            If vw = wk1.Cells(j, "A").Value Then
                AR.Add wk1.Cells(j, "B").Value
            End If
        Next j
        AR.Sort

        vw = wk2.Cells(i, "D").Value
        For j = 0 To AR.Count - 1
            If vw <= AR(j) Then
                If 1 < j Then
                    wk2.Cells(i, "B").Value = AR(j - 2)
                End If
                If 0 < j Then
                    wk2.Cells(i, "C").Value = AR(j - 1)
                End If
                If vw = AR(j) Then
                    wk2.Cells(i, "E").Value = AR(j)
                    If j < AR.Count - 1 Then
                        wk2.Cells(i, "F").Value = AR(j + 1)
                    End If
                    If j < AR.Count - 2 Then
                        wk2.Cells(i, "G").Value = AR(j + 2)
                    End If
                Else
                    wk2.Cells(i, "F").Value = AR(j)
                    If j < AR.Count - 1 Then
                        wk2.Cells(i, "G").Value = AR(j + 1)
                    End If
                End If
                Exit For
            End If
        Next j
    Next i

    Set AR = Nothing
 End Sub
(???) 2016/08/23(火) 10:42

syさん、???さん、ありがとうごいます。

syさんの関数を使ったところ即終わりました。
有難いと思うと同時に手作業でやっていたことが泣けてきました。

本音をいうと返信がないんじゃないかと思ってましたが、
凄い関数をご紹介頂けて本当に嬉しいです。

重ねて御礼申し上げます。
(NーWork) 2016/08/23(火) 14:46


 To ???さん

 2010からAGGREGATE関数が使えるようになって非常に便利ですよね。
 エラーも無視できるし、欲を言えば第4引数が必要ない集計方法の時も範囲だけでなく配列が使用出来たら良いなと思う時はありますけど。

(sy) 2016/08/23(火) 21:05


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.