本当にlowestRowは一番価格の安い行でしょうか?
変数の名前からそう思い込まれていませんか?
順を追って変数の使われ方を見ていくと、
'ASIN のスタート行
lowestRow = 2
ASINCol = 1
でASINの開始行としてlowestRowに2が設定されています。
ついでにASINColには1が設定され、これ以降変更されていません。
その後lowestRowは使用されないまま質問いただいた処理に入ります。
' ASINを20個づつ取り出す
cur_j = 20
For j = 1 To 20
' 空になっているか確認する
If (lowestWS.Cells(lowestRow, ASINCol) = "" And lowestWS.Cells((lowestRow + 1), ASINCol) = "") Then
loopBit = 0
cur_j = j - 1
Exit For
End If
' ASINを配列に格納
asin(j) = CStr(lowestWS.Cells(lowestRow, ASINCol).Value)
' 次行へ
lowestRow = lowestRow + 1
Next
まず、jを20回ループする中で、1回ごとにlowestRowを +1しています。
そうやってlowestRowを1行ずつずらしながら、lowestWS.Cells(lowestRow, ASINCol)
のセル値とlowestWS.Cells((lowestRow + 1), ASINCol)
のセル値をチェックしています。
lowestWS.Cells(lowestRow, ASINCol)
についてもう少し掘り下げると、
lowestWSは関数の最初で"getLowest"というシートが設定されている変数です。
このシートのlowestRow行, ASINCol列の座標のセルから値を取り出しています。
ループ1周目ならlowestRowは2、ASINColは1なので、A2セルということになります。
ループ2周目ではlowestRowは3になり、ASINColは1のままなのでA3セルを取得します。
同様にlowestWS.Cells(lowestRow, ASINCol)
は、lowestRow + 1行, ASINCol列の座標のセルを指すことになります。
ループ1周目ならA3セル、ループ2周目ならA4セルということになります。
条件文は
If (lowestWS.Cells(lowestRow, ASINCol) = "" And lowestWS.Cells((lowestRow + 1), ASINCol) = "") Then
です。
ループ1周目ならA2セルが空セルで、かつA3セルも空セルの場合に条件文の中の処理を実行します。
ループ2周目ならA3セルが空セルで、かつA4セルも空セルの場合に条件文の中の処理を実行します。
つまり、lowestRow行とその次の行のASIN列に何も入力がない場合に条件文の中の処理を行うということです。
条件文の中では
loopBit = 0
cur_j = j - 1
Exit For
を行っています。
loopBit
はこの20回のForループよりも上位で行っているWhileループを抜けるためのフラグのようです。
cur_j
はForループに入る前に20という値をセットしていますが、ループの途中で条件を満たした場合にループ回数-1の値に再セットしています。
そしてExit For
でForループを抜けています。
条件を満たしていなければ、そのあとの処理でセルの値をASIN配列に格納し、次の行も処理していきます。
まとめると、
・A列を2行目から順にチェックする。
・20回処理するまでに2行連続で空欄が続いた場合はループ処理を中断する。
・それ以外の場合は取得したセル内容をASIN配列に格納していく。
という処理のようです。
ここまでの処理で抽出しているのは最低価格ではなく、ASINの情報です。
この処理ではASIN配列に値を格納していますが、他の情報も格納していきたいのであれば、ASINに変わる他の配列をそれぞれ用意してもいいですし、1つの多次元配列でまとめて管理する方法もあると思います。
どう管理したら扱いやすいかでご判断ください。
手早く解析するために変数名からおおよその処理を推測することもありますが、思い込みは危険です。
ひとつづつ読み解き、推測に対する裏付けとっていくことが大事です。
面倒ですが、それがコーディングというものですので頑張ってみてください。
参考になれば幸いです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。