質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

4回答

10835閲覧

ループの回数を取得したい

退会済みユーザー

退会済みユーザー

総合スコア0

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2016/10/19 23:13

編集2016/10/19 23:23

ABCDEABCDCDCDEABCDCDE

エクセルにて上記のようにカラム名が列んでおり、
A〜Eが一塊、その中で、CDがランダムで繰り返されます。

其々の2行目のセルに、下記条件のループの回数を出力したいです。
1.ABEは全体の範囲内でのループ回数
2.CDは各A〜Eの範囲内でのループ回数

例では以下のような出力結果となります。

ABCDEABCDCDCDEABCDCDE 000001100112212200112

以上のように、「特定の範囲内」でのループ回数を取得したい場合、どのような方法が考えられますでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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
jawa

総合スコア3013

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

例から見て、『AB(CDが不定数)E』が並んでいる、と仮定すると、
ABE用の変数、
CD用の変数、を初期値0で設定。

後は、表示後に
Dの時、CD用の変数に1を加算、
Eの時、ABE用の変数に1を加算し、CD用の変数を0にする
だけでいいかと。

質問としては、
ループ中に、if文などで条件を指定しカウントを初期化する(0にする)のがいいかと。
ループ中で初期化を行う位置をよく考えないと
思わぬ値になったりするので気を付けてくださいね。

投稿2016/10/20 00:22

torisan

総合スコア678

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

大きな繰り返しの回数を数えるcounterLと、小さな繰り返しを数えるcounterSを用意して
E→A検出でcounterL++。D→C検出でcounterS++。B→C検出でcounterS=0。
こんな感じにして、ABEはcounterLを。CDはcounterSを出す。という感じでいかがでしょう?

投稿2016/10/19 23:48

tnd-.-b

総合スコア247

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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

cesolution

総合スコア217

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/10/27 09:21

大変参考になりました。誠にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問