なずブログ

インフラSE、Java開発、リモートワークエンジニアな人のメモ帳

スクレイピングまでがんばるVBA講座~4.プログラム基礎(ループ)

f:id:nazuna_0124:20170510210426p:plain

ぼえ~~~ 秋風が爽やかで気持ちいいですね~~

定時帰りおいしいです。



おつかれさまです。なずなです。


講座の4回目。プログラム基礎ってやつですね。



ここを飛ばすとまずい箇所です。


先々でわからなくなったら、ここに戻りましょう



プログラム基礎(ループ)

ここからはプログラムの基礎知識です。
基礎とはいえ、実は大半これでなんとかなります!

人はなぜプログラムを使うのか。1つの回答は繰り返しを行うのに
ほとんどコストがかからないからaです。

純粋に覚えて慣れるための部分です。
つまんないですけど、がんばりましょー。ほかで慣れてる人は
書き方だけ覚えて飛ばしてオッケーです。



VBAではインクリメントがありません。
i = i + 1 表記です。 (ほかはi++とかける)

ループの表記方法は以下

for i = 0 to 10

    debug.print i
next i

do while cells(1,1).value <> ""

    debug.print cells(i,1)
    i = i + 1
loop


for each s in Worksheets

    debug.print s.name
next


ここでぴんとこないかたは適当にぐぐったページで調べてみてください。


[補足]
ループを強制するにはCtrl + Breakキーです。
特にDo loopでカウントを忘れて無限ループしてしまうことがよくあります。

キーボードの位置や状況によっては止まらなかったりします。
そういうときは強制終了するしかありません。

データは戻ってしまうのでループ実行前には保存する癖をつけたほうが無難です。

九九を作成する。

いろいろ方法が出てきます。 目的としているのは2重ループをすんなにかけるかどうかです。

ここはこぴっちゃだめです。最初は写経でもいいので、 手なりでかけるようにタイピング練習しましょう!

Sub QuQu()
    Dim y, k As Long

    For y = 1 To 9
        For k = 1 To 9
            Cells(y, k).Value = y * k
        Next k
    Next y

End Sub


・15の段まで表示するように変更してみてください。
・サンプルはA1から開始されています。C6からの表になるように変更してください。


[補足]
ついでに変数宣言の書き方の一例です。
こういうループのための変数をカウンタ変数なんて言ったりします。

この変数に大仰な名前をつけるかは諸説わかれるところですが、
For分は i,k,y,x などわかりやすいもので問題ないです。

表を読み取る

データを扱う上で表は基本中の基本になります。
むしろ、どうやって「表に変えるか」を考えるくらいです。

というわけで、続いて読み取りです。
今回作った表をdebug.print します。


Sub ReadQuQu()
    Dim y, k As Long

    For y = 1 To 9
        For k = 1 To 9
            Cells(y, k).Value = y * k
        Next k
    Next y
End Sub


これで読み取りは可能です。


### もし何行目まで記載があるか不明な場合

方法は2つあります。○○の間繰り返すDo while

 Sub ReadQuQu2()
    Dim y, k As Long

    y = 1
    k = 1

    Do While Cells(y, 1) <> ""
        Do While Cells(y, k) <> ""
            Debug.Print Cells(y, k).Value

            k = k + 1
        Loop

        y = y + 1
    Loop
End Sub 



変数に初期値が必要です。
カウンタ変数を足していく処理も必要です。


この方法では1列目に空白行があればそこでループが終わることに注意してください。
実際に使うときには必ず入力される列を対象にします。


Until(○○まで繰り返す)という書き方もあります。
暇な人は書き換えに挑戦してみてください。



もう1つは最初に何行目まであるかを取得する方法です。


 Sub QuQu3()
    Dim y, k As Long
    Dim LastRow, LastClm As Long

    LastRow = Cells(10000, 1).End(xlUp).Row
    LastClm = Cells(1, 250).End(xlToLeft).Column

    For y = 1 To LastRow
        For x = 1 To LastClm
            Debug.Print Cells(y, x)
        Next x
    Next y


End Sub


Excelでの最終行、最終列の取得方法はぐぐってオッケーです。
表の形式によって微妙に違うので使い分けましょう。

ここでは事前に行数を数えてループの繰り返し回数に設定するという
基本方法として覚えてください。

オブジェクトのループ

For Each ループの説明回です。
最初はちょっととっつきにくいですね。

イメージでいえば子供に皿を洗ってもらう場合。
先に皿が何枚あるか数えて、「○○枚あらって」などと指定せずに
流し台にある皿を全部洗ってと伝えます。

おおよそ。こういうイメージです。複数固まったオブジェクトから
1つ1つ取り出して処理することができます。

ここでついでに覚えておきましょう。Rangeオブジェクトは複数範囲を
指定することができます。

```VB
Sub QuQu4()

Dim rng As Range
Dim r As Range

Set rng = Range("A1:I9")

For Each r In rng
    Debug.Print r.Value
Next

```
こういう書き方になります。
結構すっきりしててよいです。

1つ注意点としてはこのループでは読み出す順番が保証されていない
ことです。
順番が必要な場合はほかのループ方法を使いましょう。


End Sub


このループを使ってオブジェクトをまず変数に取得。
その中から特定の名前や条件に一致するオブジェクトを選ぶことをよくやります。

例としては、同じブック内のシート名をすべて表示します。

```VB
    Sub ReadSheetNam()
    Dim s As Worksheet


    For Each s In ThisWorkbook.Worksheets
        Debug.Print s.Name

    Next

    End Sub
```

変数に格納しない事例もしめしつつこんな感じに。


・Excel内のすべてのブック名を表示するプロシージャを作成してください。
(ぐぐってオッケーです)



ここのループ、次の条件分岐を覚えるあたりから

ぐぐってなんとかする癖付けをしておきましょう。



ただし、それは独学時のみです。


15分悩んで答えが出なかったら、

さっさと私に質問してみよ~。