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

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

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

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

Q&A

解決済

1回答

1529閲覧

vbaで、mwsに活用

tidavest

総合スコア595

VBA

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

0グッド

0クリップ

投稿2017/01/30 09:14

編集2017/01/30 09:17

http://mrxblog.net/2015/10/22_mws_excel_vba/

上記URLがあるのですが、
' 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

これは、価格の一番低い、価格を抽出していると思うのですが、
これに加えて、Weight Currency ListPrice Image Image URL

これらを一編にコードで記入する場合は、arrayを使用するのでしょうか。
ひとつづ記入するのが、手間なので一度に記入する方法は、ございませんでしょうか。

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

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

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

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

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

guest

回答1

0

ベストアンサー

本当に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つの多次元配列でまとめて管理する方法もあると思います。
どう管理したら扱いやすいかでご判断ください。


手早く解析するために変数名からおおよその処理を推測することもありますが、思い込みは危険です。
ひとつづつ読み解き、推測に対する裏付けとっていくことが大事です。
面倒ですが、それがコーディングというものですので頑張ってみてください。

参考になれば幸いです。

投稿2017/01/31 02:13

jawa

総合スコア3013

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問