ABCDEABCDCDCDEABCDCDE
エクセルにて上記のようにカラム名が列んでおり、
A〜Eが一塊、その中で、CDがランダムで繰り返されます。
其々の2行目のセルに、下記条件のループの回数を出力したいです。
1.ABEは全体の範囲内でのループ回数
2.CDは各A〜Eの範囲内でのループ回数
例では以下のような出力結果となります。
ABCDEABCDCDCDEABCDCDE 000001100112212200112
以上のように、「特定の範囲内」でのループ回数を取得したい場合、どのような方法が考えられますでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
VBAで
ご自身で作成されたコードの提示がないようですので、考え方のアドバイスのみさせていただきます。
まず、今回やりたいことはそれぞれの項目の出現回数のカウントで、ルールが2つあるということですね。
ルール①:A・B・Eは全体の中での出現数をカウント
ルール②:C・DはA~Eの間で出現した回数をカウント
①に関しては単純に全体をループして、それぞれの出現回数を数えてあげればいいです。
②に関しては「A~Eの範囲内での回数」という条件が追加されますので、Aが出現したタイミングでカウンタをリセットしてあげる必要があります。
提示いただいた例では、AB(CD)Eの形で()内は1回以上の繰り返し、という規則的な状態なっているようです。
この規則性が崩れないのであればABEをまとめてカウント、CDもまとめてカウントすればいいと思います。
⇒torisanさん提示の方法
上記の規則性が崩れた場合もカウンタとしては正しく動作させていのであれば、少し面倒ではありますがA~Eをそれぞれ別にカウントしてあげたほうがいいです。
⇒cesolutionさん提示の方法
Excel関数でも
今回はVBAの質問ですので蛇足ではありますが、計算用に3列使えばVBAを利用しなくてもExcel関数で実現できます。
【元データ】 A B C D E F G H I J K L M N O P Q R S T U V ---------------------------------------------- 1: A B C D E A B C D C D C D E A B C D C D E 2: 3: 4:
この状態から、以下の固定値・数式を記述します。
【固定値】 A3セル:0 A4セル:0 【数式】 ルール①計算用 A2セル:=IF(OR(A$1="A",A$1="B",A$1="E"),COUNTIF($A$1:A$1,A$1),0) ルール②計算用 B3セル:=IF(OR(B$1="A",B$1="B",B$1="E"),0,IF(B$1="C",A3+1,A3)) B4セル:=IF(OR(B$1="A",B$1="B",B$1="E"),0,IF(B$1="D",A4+1,A4)) 結果表示用 A5セル:=IF(A$1="C",A$3-1,IF(A$1="D",A$4-1,A$2-1)) 【入力後の状態】 A B C D E F G H I J K L M N O P Q R S T U V ---------------------------------------------- 1: A B C D E A B C D C D C D E A B C D C D E 2: 1 3: 0 0 4: 0 0 5:0 ※A3・A4は固定値0 ※A2・B3・B4・A5は数式の結果値
上記の状態から、A2セルをB2~U2までコピーします。
同様にB3セルをC3~U3まで、B4セルをC4~U4まで、A5セルをB5~U5までコピーします。
以上の入力で、
【結果データ】 A B C D E F G H I J K L M N O P Q R S T U V ---------------------------------------------- 1: A B C D E A B C D C D C D E A B C D C D E ←対象データ 2: 1 1 0 0 1 2 2 0 0 0 0 0 0 2 3 3 0 0 0 0 3 ←ルール①計算 3: 0 0 1 1 0 0 0 1 1 2 2 3 3 0 0 0 1 1 2 2 0 ←ルール②計算("C") 4: 0 0 0 1 0 0 0 0 1 1 2 2 3 0 0 0 0 1 1 2 0 ←ルール②計算("D") 5: 0 0 0 0 0 1 1 0 0 1 1 2 2 1 2 2 0 0 1 1 2 ←計算結果
となり、5行目に目的の値を作成できます。
計算用の3行(2~4行)は高さ0にするなり、邪魔にならない行に移動するなりすれば見た目もOKです。
蛇足の方が長くなってしまいましたが、参考までに。
投稿2016/10/20 01:41
編集2016/10/20 01:46総合スコア3013
0
ベストアンサー
スマートさが欠片もないコードで恐縮ですが、例えば以下のようにすればできるかと思います。
Eを見つけたら、C、Dのカウントは0に戻すようにしています。
VBA
1Sub loopnumcheck() 2 3With Worksheets("Sheet5") 4 Dim a, b, c, d, e, i As Integer 5 Dim Cmax As Integer 6 7 a = -1 8 b = -1 9 c = -1 10 d = -1 11 e = -1 12 Cmax = Cells(1, 1).End(xlToRight).Column 13 14 For i = 1 To Cmax 15 16 Select Case Cells(1, i) 17 Case "A" 18 a = a + 1 19 Cells(2, i) = a 20 Case "B" 21 b = b + 1 22 Cells(2, i) = b 23 Case "C" 24 c = c + 1 25 Cells(2, i) = c 26 Case "D" 27 d = d + 1 28 Cells(2, i) = d 29 Case "E" 30 e = e + 1 31 c = -1 32 d = -1 33 Cells(2, i) = e 34 End Select 35 Next 36 37End With 38 39End Sub
投稿2016/10/19 23:47
総合スコア217
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。