[[20070612175340]] 『連続する数値の抽出について』(ぱーく) ページの最後に飛ぶ

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

 

『連続する数値の抽出について』(ぱーく)

A列の数列の中で、最も連続している数値に対応している
B列の最大の数値のみを抽出したいです。
なにか関数の組み合わせでできますでしょうか?

下記の例ですと、
A列でもっとも連続しているのが「1」。
連続している「1」に対応する最も大きなB列の値は「4」を抽出したいです。

単に最頻度の数値の中のMAXで選んでしまうと、
連続からは外れた「1」に対応する「7」が選ばれてしまいます。

A列B列

 1 1
 1 2
 1 3 
 1 4  ←ココを抽出したい
 2 5
 2 6
 1 7  ←ここだとA列の「1」は連続した数値ではないのでNG
 2 8
 3 9

わかりにくくて申し訳ありませんが、よろしくお願いします。


 検証不足かもしれませんが、、、
 
 ユーザー定義関数を考えてみましたb
 
 標準モジュールへコピペ
'-------------------------
Function park(Rng As Range, Optional x As Integer = 1)
Dim MyA As Variant, MyKey As Variant
Dim i As Long, n As Long, c As Long
    MyA = Rng.Value
    For i = 1 To UBound(MyA, 1) - 1
        If MyA(i, 1) = MyA(i + 1, 1) Then
            n = n + 1
            If n > c Then: c = n: MyKey = MyA(i + 1, x)
        Else
            n = 0
        End If
    Next i
    park = MyKey
End Function
 
※標準モジュールへのコピペ方法
 Alt + 【F11】を押して、Microsoft Visual Basic を立ち上げる
 挿入 → 標準モジュール
 出てきた白い画面に、上記をコピペ
 「×」でエクセルに戻。
 使用方法は、
 =park(A1:B10,2) 等としてください。
       ~~~~~1 ~2
 1.範囲
 2.その範囲の左から何番目のものを返すかを指定。
  ※省略すると一番多く連続したものを返します。
 
 (キリキ)(〃⌒o⌒)b


キリキさま

ありがとうございます。
無事抽出ができました。
やっぱり関数ではムリだったのですね。
抽出しないといけないデータが100件ほどあるので
VBAを書いていただいて本当に助かりました。


 作業列を使っても良いのであれば、関数でも出来る気がしますよb
 
 挑戦はしてませんがw
 (キリキ)(〃⌒o⌒)b

 試しに、考えてみましたb
 
	[A]	[B]	[C]
[1]	項目	項目	
[2]	1	1	1
[3]	2	2	1
[4]	a	3	1
[5]	a	4	2
[6]	a	5	3
[7]	3	6	1
[8]	3	7	2
[9]	x	8	1
[10]	x	9	2
[11]	x	10	3
[12]	x	11	4
 
 1行目に、タイトルがあるとして、、、
 C2 =IF(A1=A2,C1+1,1)
  以下コピー
 
 =INDEX(B2:B12,MATCH(MAX(C2:C12),C2:C12,))
 と、するのは如何でしょう?
 
 (キリキ)(〃⌒o⌒)b

 確かにできました!
 何を何にネストすればいいのかわからず困ってましたが、
 目からウロコです。
 勉強になりました。

 ただ、実は結構複雑なデータなので、
 できれば新たなC列を作らずに処理をしたいと思っていたので
 ユーザー定義関数を使わせていただきます。
 ありがとうございました。
 (ぱーく)

 昨日はありがとうございました。

  実は一点ほど不具合が生じてしましました。

 B列なのですが、データは昇順になっているのではなく、
 数字はランダムになっているのです。

 下記の場合、A列で最も連続しているのが、「2」
 その連続する「2」に対応するB列の中で、最大値は5行目の「4」となります。

 このような抽出は可能でしょうか?

	[A]	[B]	
 [1]	項目	項目	
 [2]	1	5	
 [3]	2	3	
 [4]	2	1	
 [5]	2	4	←ココが連続するAに対する最大値
 [6]	2	3	
 [7]	9	1
 [8]	3	2	
 [9]	6	2	
 [10]	1	9	
 [11]	1	8	
 [12]	2	7	


 B列は、数字しかないということですね?
 
Function park(Rng As Range, Optional x As Integer = 1)
Dim MyA As Variant
Dim MyKey As Integer
Dim i As Long, n As Long, c As Long
    MyA = Rng.Value
    For i = 1 To UBound(MyA, 1) - 1
        If MyA(i, 1) = MyA(i + 1, 1) Then
            n = n + 1
            If n > c Then: c = n: MyKey = i
        Else
            n = 0
        End If
    Next i
   park = Application.Max(Range(Rng.Cells(1, 1).Address).Offset(MyKey - c).Resize(MyKey, x))
End Function
 
 に、変更してみてください。
 
 ※B列の数値が「32,767」を超える可能性がある場合は、
  Interer を Long に、変更してください。
  A列で最も連続が、複数(同数)ある場合は、先に発生したものが優先になっております。
 
 #ちょっと時間が無かったので、検証がいい加減かも・・・ 
 (キリキ)(〃⌒o⌒)b

 早速にありがとうございました。
 試してみます!

コメント返信:

[ 一覧(最新更新順) ]


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