見出し画像

【お手軽カンタン自動化!エクセルVBA × IEで身代わりロボットを作る最短8ステップ】~その5~ループ処理

みなさんこんにちは。taka.(@teihen_escape)です。

前回は、VBAでIEを操作する上で必須の知識、表示待ちについて紹介しました。難しいことを抜きにすれば、いったんは丸暗記してしまえばいい内容なので、まずはそれでOKです。

さて今回は、VBAに限らずプログラミングをする上でと言っても過言ではない、ループ処理について解説していきます。

まず前回までのコードを改めてここで紹介すると、こんな感じ↓でしたね。

Sub yahoo検索()

Dim objIE As InternetExplorer

Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = True
objIE.navigate "https://search.yahoo.co.jp/"
  
Do While objIE.Busy = True Or objIE.readyState < READYSTATE_COMPLETE
    DoEvents
Loop

'検索窓に入力後、検索ボタンをクリック
objIE.Document.getElementById("yschsp").Value = Range("A1")
objIE.Document.getElementsByClassName("b")(0).Click

'objIE.Quit
'Set objIE = Nothing

MsgBox "完了しました"

End Sub

検索ワードはセルに書けば大丈夫なようにしましたが、まだこれでは完全に実用的とは言いがたいですね。
なぜならばそう、現状ではひとつのワードしか検索することができないからです。

こういったツールを作るとき、ほぼ間違いなく発生する処理が「繰り返し」であり、そしてこれこそが正に「ループ処理」なんです。

今回は、A列に複数の検索ワードを入力しておき、それらが順番に検索されていくように作りかえてみましょう。

例によって結論のコードをまず書いてしまいます。

Sub yahoo検索()

Dim objIE As InternetExplorer
Dim i As Long

Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = True
   
i = 1
Do Until Cells(i, 1) = ""
   
   objIE.navigate "https://search.yahoo.co.jp/"
   
   Do While objIE.Busy = True Or objIE.readyState < READYSTATE_COMPLETE
       DoEvents
   Loop

   '検索窓に入力後、検索ボタンをクリック
   objIE.Document.getElementById("yschsp").Value = Cells(i, 1)
   objIE.Document.getElementsByClassName("b")(0).Click

   Application.Wait Now + TimeValue("00:00:01")
   
i = i + 1
Loop

objIE.Quit
Set objIE = Nothing

MsgBox "完了しました"

End Sub

ぱっと見、なにが変わっているかというと、
objIE.navigate以降の処理が

i = 1
Do Until Cells(i, 1) = ""

i = i + 1
Loop

で挟まれているのが分かりますね。
では、これらをふたつのパートに分けて説明していきます。

Do Until Cells(i, 1) = ""とLoop

まず、
Do Until Cells(i, 1) = ""

Loop
ですが、これがループ処理をさせるためのコードの実態です。
IEの表示待ちの際にも似たようなものが出てきましたね。

挟まれた部分を繰り返してねという意味で、今回の場合は
「Cells(i, 1) が、""(=空欄)になるまで繰り返してね」ということを表しています。

Cells(i, 1)て何ぞや?
という話なんですが、Cellsは前に出てきたRangeと似たもので、これを使うとセルを「行列方式」で表現できます。
つまりCells(i, 1)だと「行がi、列が1」ということなんですね。

「列が1」というのはA列のことを指し、つまり
「列が2」ならB列
「列が3」ならC列
ということを意味します。

ここで今回やりたいことを改めて確認しますが、目的は、A列に入力された値を順番に検索していきたい、ということでしたよね。
これは別の言い方をすると、「A列は固定で行だけが順番に変わっていってほしい」ということを指します。

なので、i という変数を新たに設けて、i が1、2、3、...と順番に自動で移り変わっていってくれれば、やりたいことができるわけです。

カウントアップ

ということで二つ目のパートの説明に入りますが、
Do Until Cells(i, 1) = ""
の前に「i=1」を設けることで、まず「iという変数の初期値が1ですよ」ということを表しています。
そして処理の最後、Loopの前に「i = i + 1」とすることで、「一連の処理が終わったあとにiに1を足しますよ」ということをやっています。

この「i = i + 1」というのはカウントアップと言って、ループ処理の時にとても重要な考え方になるので是非覚えてしまってくださいね。

というわけで、これらをまとめて改めて説明すると、
まず i という変数をもうけ、そこに1をセットし、そのあと

Cellls(1,1) ←A1のこと
Cellls(2,1) ←A2のこと
Cellls(3,1) ←A3のこと
...

という具合に i をカウントアップさせていくことで処理を繰り返していき、
最終的にCells(i, 1) = ""(つまりA列のセルが空欄)にったら処理を止めるよ、といったことをやらせていたわけです。

文字で説明すると少し長くはなりましたが、加えるコード自体はシンプルで簡単なものなので、概念を理解してしまえば意外と簡単な話かと思います。

あと最後に補足ですが、i という変数を新たに設けるにあたり、冒頭で

Dim i As Long

とiを宣言しています。これについては一旦詳細の説明は省きますが、
コードの中でなにか変数を使いたい時は、予め宣言しておかなければならないんだな、くらいで最初は思っていてください。

ちなみにAsのあとは変数の型を指定するのですが、
今回の i のように数字のとき ⇒ 「Long」
文字列のとき ⇒ 「String」
と表記すると覚えておけばいったん大丈夫です。

***

如何でしたでしょうか。
これで複数の処理をさせることができるようになり、かなりやれることの幅が増えたのではないかと思います。
次回はさらにやれることを増やべく、「IF処理」について解説します。

それでは、本日も最後まで読んで頂き有難うございました^^/

【お手軽カンタン自動化!エクセルVBA × IEで身代わりロボットを作る最短8ステップ】

0、 なぜVBA×IEなのか
1、 参照設定
2、最小限の型を覚えよう
3、型を使いやすく改良しよう
4、 IEの表示待ち
5、 ループ処理 ←←←←←←←←←← イマココ
6、 IF分岐
7、 DOM操作その一
8、 DOM操作その二

この記事が気に入ったらサポートをしてみませんか?