投稿/コメントを表示します。

しそ巻きカウントの問題に、1年半ぶりに取り組みました。フォローアップで一番悩み、記憶に刻まれていたのがこの問題です。本当に、先生にも大変お世話になりました。今回私が書いたプログラムは以下のとおりです。
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

正解と異なる点は、1項目のカウントが終了した時点で
合計値を書き込むタイミングです。
endIfで個別の行の判別を終えた後、nextで次の行へ移る前に
カウント値を書き込んでいます。
こうすると、1行ごとのカウント値が「見える化」し、
上書きを繰り返すことによって、最終的には正しいカウントが
書き込まれますね。

これは確信犯的にそうしたわけではなく、
「どこでカウント値を書き出すか」のタイミングにまだ迷いがあったため
nextで戻る前に置いてみただけなのです。
どこでgokeiを初期化するかで迷うのと似ていますね。

入れ子のnextから抜けるときにgokeiを記入し、初期化し、
それから次の行の項目に移動する、が正しい流れですね。

でも、1行ごとの結果をそのたびに書き出し、上書きする仕組みは
それ自体面白いし、使える局面があるかもと思ったので、
ご紹介しました。

gooska


2017/12/20 08:04