Sub rensyu1219_001()
'しそ巻きカウント
Dim gokei 'カウント数
Dim migi ' カウント数を記入する場所の行位置の値
Dim hidari ' 項目が書かれているリストの行位置の値
For migi = 4 To 6 'カウント数を記入する行位置範囲の指定
gokei = 0 '一つループが終わったらgokeiを初期化する
For hidari = 4 To 18 '一つの項目について該当したらgokeiに加算する
If Range("c" & hidari).Value = Range("E" & migi).Value Then
gokei = gokei + 1
End If
Range("F" & migi).Value = gokei 'この時点での加算結果を書き込む
Next
Next
End Sub
受講生さんの投稿
(投稿ID: 3593)
正解と異なる点は、1項目のカウントが終了した時点で
合計値を書き込むタイミングです。
endIfで個別の行の判別を終えた後、nextで次の行へ移る前に
カウント値を書き込んでいます。
こうすると、1行ごとのカウント値が「見える化」し、
上書きを繰り返すことによって、最終的には正しいカウントが
書き込まれますね。
これは確信犯的にそうしたわけではなく、
「どこでカウント値を書き出すか」のタイミングにまだ迷いがあったため
nextで戻る前に置いてみただけなのです。
どこでgokeiを初期化するかで迷うのと似ていますね。
入れ子のnextから抜けるときにgokeiを記入し、初期化し、
それから次の行の項目に移動する、が正しい流れですね。
でも、1行ごとの結果をそのたびに書き出し、上書きする仕組みは
それ自体面白いし、使える局面があるかもと思ったので、
ご紹介しました。
gooska
小川慶一さんのコメント
(コメントID: 5077)
おはようございます。
>フォローアップで一番悩み、記憶に刻まれていたのがこの問題です。
複数の変数を扱うの、ここが最初ですからね。
戸惑いもあるかもしれません。
そこを乗り越えると簡単なのですが。
というか、実は、エクセルマクロって、要は、以下の3つがすべてです。
[1] 調査対象を変数を使って指定する
[2] 出力先を変数を使って指定する
[3] 条件に一致するか?を調べる
あとは、[1], [2], [3]それぞれについて引き出しを増やしていくだけです。
> でも、1行ごとの結果をそのたびに書き出し、上書きする仕組みは
> それ自体面白いし、使える局面があるかもと思ったので、
> ご紹介しました。
いただいたプログラムだと、結果の出力回数が見本より多いですね。
「条件に該当するデータが10万行あるデータだったとしたらどうだろか?」とか考えてみてください。
見本で示した書き方だと出力は1回だけです。
都度出力すると、出力は10万回です。
受講生さんのコメント
(コメントID: 5078)
おはようございます。
早朝からご返信ありがとうございます。
確かに、処理行数が10万業務だった場合の事を考えると、無駄な出力が10万回行われることになり、不適切であったことがはっきり分かりました。(実際、次の職場では、10万件以上のデータを扱うことになり、マクロを組まないと手作業では無理な量です。)
同じ結果が得られれば良いのではなく、工程に無駄がなく、負荷のかからないプログラムを書かなくてはいけないことがよく分かりました。
gooska