Excel VBA 最後の行または列までの値をFor文で取得する方法 End(Direction)編

# 初めに
ExcelでVBAを書く際に、指定したセルからその最後の行または列までの値をFor文で取得する方法について記載します。

# その前にセルを手操作で最終行を指定する方法について
飛ばしたい人は [やり方](#やり方)へを飛んでください。
以下のようなデータがあるときに任意の場所からその最後の行または列を指定する場合は以下の方法で行えます。
```:操作方法
ctrl + 上矢印キー  # 指定したセルの列より下にある連続したデータの最後の行を取得する。
ctrl + 下矢印キー  # 指定したセルの列より上にある連続したデータの最初の行を取得する。
ctrl + 左矢印キー  # 指定したセルの行より左にある連続したデータの最初の列を取得する。
ctrl + 右矢印キー  # 指定したセルの行より右にある連続したデータの最後の列を取得する。
```
例)
「__A1__」セルを選択し「__Ctrl + 下矢印キー__」を押下した場合は以下のようになります。

【__押下前__】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663952/d0deb777-e546-2111-a484-ce747a68846c.png)
【__押下後__】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663952/0f65d8ae-367c-0e11-7bf5-aa00c51d80d0.png)

「__A10__」セルを選択し「__Ctrl + 上矢印キー__」を押下した場合は以下のようになります。
【__押下前__】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663952/c0aaa57d-34d5-47f8-6cf5-03558dc2a923.png)
【__押下後__】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663952/5e22caf2-c017-5ca8-9559-d9f6affca87d.png)

「__A1__」セルを選択し「__Ctrl + 右矢印キー__」を押下した場合は以下のようになります。
【__押下前__】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663952/0a0cea95-4739-d5ac-96ab-e8ede6456082.png)
【__押下後__】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663952/ae2aa0d2-931f-5105-df8e-af976a466dd3.png)

「__E1__」セルを選択し「__Ctrl + 左矢印キー__」を押下した場合は以下のようになります。
【__押下前__】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663952/2dcedaa4-d67b-5540-54c1-37a6a6eb9759.png)
【__押下後__】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663952/1633f8b7-1c0b-ba83-615a-7cca77f9ad88.png)
このようにして手操作の場合は指定できます。

:::note warn
__※注意__
__データ内に空白がある場合は空白の1つ前にあるデータへ飛ぶので注意してください。__
:::
【__押下前__】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663952/a3cd0a05-6f23-39e4-547e-756655748e8d.png)
【__押下後__】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663952/b11fd5c7-4de2-c06a-42ae-8d403b57b7a7.png)

この操作を基本にVBAのコードを考えていきます。

# やり方
VBAで上記と同じ操作をする場合は以下のコードを書きます。
```:書き方
End(Direction)
```
「__Direction__」は方向を表し、それぞれ以下の値を実際には入れてください。(#以降は不要)
```:指定方法
xlUp      # 上
xlDown    # 下
xlToLeft  # 左
xlToRight # 右
```
実際には以下のように書きます。
```:書き方
End(xlUp)      ' ctrl + 上矢印キー
End(xlDown)    ' ctrl + 下矢印キー
End(xlToLeft)  ' ctrl + 左矢印キー
End(xlToRight) ' ctrl + 右矢印キー
```

# 実践
では実際の値を使用して操作してみましょう。

以下のようにシート名「__実行__」にある「__セル取得__」ボタンを実行するとシート名「__ターゲット__」のA列の「__A1~A5__」の値を取得するVBAを書くことを想定します。

【__シート名「実行」__】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663952/70cb5409-e8dc-2810-44f3-76484261a9af.png)
【__シート名「ターゲット」__】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663952/322b33a8-8ada-a2b2-a47b-3d96bfa950d0.png)


```:コード
Sub GetAnoterSheetValue_Btn()
    For i = 1 To Worksheets("ターゲット").Cells(Rows.Count, 1).End(xlUp).Row
        Debug.Print (Worksheets("ターゲット").Cells(i, 1).Value)
    Next
End Sub
```
上記の実行結果です。
```:実行結果
A1
A2
A3
A4
A5
```
上記ののコードの簡単な説明をします。
iの値を1からTOの後の値まで1ずつ増やしていきます。
```:For文
For i = 1 To
`任意の処理
Next
```

対象のシート名を指定しています。
```:シート名を指定
Worksheets("ターゲット")
```
「__Rows.Count__」はエクセルの「__最大行数(1048576)__」を表しますので以下の場合は「__A列の1048576行目__」を表します。
```:1列目の1048576行目のセルを指定
Cells(Rows.Count, 1)
```

「__ctrl + 上矢印キー__」を表します
```:ctrl + 上矢印キー
End(xlUp).Row
```
「__ターゲット__」シートの「__i行目の1列目__」のセルの値をコンソール(イミディエイト)に表示します。
```:セルの値をコンソールに表示
Debug.Print (Worksheets("ターゲット").Cells(i, 1).Value)
```

つまり以下のコードは、「__1から＜ターゲットシートの1列目の最後の行のセルからctrl + 上矢印キーを実施した結果＞の行数までの1列の目のセルの値をコンソールに表示する__」となります。
```:コード
For i = 1 To Worksheets("ターゲット").Cells(Rows.Count, 1).End(xlUp).Row
    Debug.Print (Worksheets("ターゲット").Cells(i, 1).Value)
Next
```
なので列番号を変更すると以下のように行数の違う2列目の値をちゃんと取得してくれます。
```
Sub GetAnoterSheetValue_Btn()
    For i = 1 To Worksheets("ターゲット").Cells(Rows.Count, 2).End(xlUp).Row
        Debug.Print (Worksheets("ターゲット").Cells(i, 2).Value)
    Next
End Sub
```
上記の結果です。
```:上記の結果
B1
B2
B3
B4
B5
B6
```

上記を参考に「__A1~A5__」を「__xlDown__」を使用して表示する場合は以下のようになります。
```:xlDownを使用した場合
Sub GetAnoterSheetValue_Btn()
    For i = 1 To Worksheets("ターゲット").Cells(1, 1).End(xlDown).Row
        Debug.Print (Worksheets("ターゲット").Cells(i, 1).Value)
    Next
End Sub
```
上記の実行結果です。
```:実行結果
A1
A2
A3
A4
A5
```

今度行ではなく「__A1~E1__」列の値を「__xlToLeft__」を使用して表示する場合は以下のようになります。

```:xlToLeftを使用した場合
Sub GetAnoterSheetValue_Btn()
    For i = 1 To Worksheets("ターゲット").Cells(1, Columns.Count).End(xlToLeft).Column
        Debug.Print (Worksheets("ターゲット").Cells(1, i).Value)
    Next
End Sub
```
上記の実行結果です。
```:実行結果
A1
B1
C1
D1
E1
```
:::note warn
__※注意__
__「RowやRows」が「ColumnsやColumn」に変わっています。__
:::

上記を参考に「__A1~E1__」列の値を「__xlToRight__」を使用して表示する場合は以下のようになります。
```:xlToRightを使用した場合
Sub GetAnoterSheetValue_Btn()
    For i = 1 To Worksheets("ターゲット").Cells(1, 1).End(xlToRight).Column
        Debug.Print (Worksheets("ターゲット").Cells(1, i).Value)
    Next
End Sub
```
上記の実行結果です。
```:実行結果
A1
B1
C1
D1
E1
```

以上です。

# 最後に
ここまで見ていただきありがとうございます。