CoCoのYDブログ

心に思い浮かんだことを少し掘り下げ発信します

【VBA】知っておくと便利なEndプロパティ

こんにちは

今回はEndプロパティの説明です。

基本的なところなので知ってる人は多そうですが、一応説明します。

Endプロパティは簡単に説明すると選択したセルの終端を選択するものです。

簡単に説明するとセルを選択して[Ctrl]と[←]や[Ctrl]と[↓]を押したときに選択されるセルのことですね。

 

余談ですが、Excelを初めて触ったときに、Excelの終わりってどこなんだろうかとずっと右や下を押していた記憶がありますwそのときに教えてあげたかった知識ですね(遠い目)

 

下準備

あらかじめシートをこんな感じにしてみましょうか

f:id:takataka2743:20180916081219p:plain

下準備めっちゃ雑w

こんなんだから中級者だと(ry

例で作ってるだけなので真似される方は適当に作っちゃってください

実際に仕事で使う場合、何百何千と品名があり、数も変動するためいちいち何番まであるとか

サンプルプログラム

購入品のリストと在庫品のリストの比較を行ってみましょうか

もし在庫品名と購入品名が被った場合、購入品名のフォントを赤色にするといった感じにしましょう。

ではサンプルです。

Sub 比較()
    Dim i As Long
    Dim j As Long

    For i = 2 To Range("A2").End(xlDown).Row
        For j = 2 To Range("D2").End(xlDown).Row
            If Cells(i, 2) = Cells(j, 5) Then
                Cells(i, 2).Font.Color = RGB(255, 0, 0)
                Exit For
            Else
                Cells(i, 2).Font.Color = RGB(0, 0, 0)
            End If
        Next j
    Next i
End Sub

 1行目:プロシージャの開始

2~3行目:変数宣言

4行目:なし

5行目:変数iのFor文開始(2~range("A2")の下方向終端の行数まで)

6行目:5行目同様変数jのFor文開始

7行目:Cells(i, 2) とCells(j, 5)の比較

8行目:条件が合致していれば購入リストの品名を赤にする

9行目:For文から抜ける

10行目:Else処理の開始

11行目:条件に不一致の場合、購入リストの品名を黒くする

12行目:If文の終了

13~14行目:変数を返す

15行目:プロシージャの終了

 

蛇足

Endプロパティによけいなものが付いてるけどあれって何?

Range("A2").End(xlDown).Row

この赤文字の所ですね。

これはRowプロパティといって指定されたセルの行番号を返しなさいという命令です。

読み方はロゥかな?

この場合、Range("A2")から[Ctrl]+[↓]へ行ったセルの行番号を返しなさいという事になります。

 

Rowが行番号なら列番号は何?

列番号を返す場合はColumn(コラム)ですね。

これも同じようにCellsやRangeの後ろに付けます。

 

RowsやColumnsがあるんだけど?

たまに打ち間違えるやつですねw

RowsやColumnsはRangeオブジェクトとして値を返します。

つまりRows(1)はRange("1:1")と同じ意味ですね。

Columns("3:5")はRange("C:E")と同じですね。

うーん、自分には使いこなせる気がしないw

 

右や左も.End(xlRight)や.End(xlLeft)になるの?

昔僕もやらかしましたが、左右の場合は変わってきます。

左右の場合はToが付くので注意しましょう。

 プロパティ 方向
 .End(xlUp)  上:Ctrl+↑方向
 .End(xlDown)  下:Ctrl+↓方向
 .End(xlToLeft)  左:Ctrl+←方向
 .End(xlToRight)  右:Ctrl+→方向

 

 

ちなみにですが、下の図のようなケースが発生する場合があるかもしれませんね。

文字の入力されたセルの間に空白セルがまぎれている場合、終端行は空白セルの上の行になってしまいます。

これでは処理が中途半端で終わってしまいます。

f:id:takataka2743:20180916094941p:plain

 

この場合Range("A10000").End(xlUp).rowのように上から下の終端行を探すのではなく、下から上へ終端行を探すのもひとつの手ですね。

とはいえ、その終端行が空白だった場合も中途半端になってしまうため実行する前に確認したり、ミスを防ぐための処理を加える必要はありますね。