[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『連続する数値の抽出について』(ぱーく)
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.