土曜日, 4月 22, 2023

Excel VBA 13 
絶対不可欠な最終行の取得はエレベーター式

表計算ソフトのExcelは、縦横の表を扱い、一般的に横にデータ項目、縦に項目に対するデータが入っていますが、データ行数は追加・削除などが発生するので決まった行数ではありません。VBAでは、表のすべての行に対して処理することが多くなります。
しかし、表のすべての行に対して処理する為には、最終行の数値を変更する必要がありますが、かなり面倒です。そこで、最終行が自動的に取得すれば便利なわけです。

上の表に対して[Excel VBA 11]では以下のVBAで対処しました。
--------------------
Sub 成績確定_B()
Dim wks As Worksheet
Set wks = Worksheets("成績表")
Dim i, j, k As Long
For i = 2 To wks.Cells(Rows.Count, 1).End(xlUp).Row
For j = 2 To 4
If wks.Cells(i, j) < 60 Then
k = 0
Exit For
End If
k = k + wks.Cells(i, j)
Next
wks.Cells(i, 6) = "不合格"
If k > 200 Then
wks.Cells(i, 6) = "合格"
End If
Next
End Sub
--------------------
※コメント文とカラー設定部分は省略しました。詳しくは[Excel VBA 11]を確認してください。

上が処理結果です。
実は以下の部分は・・・
For i = 2 To wks.Cells(Rows.Count, 1).End(xlUp).Row
次のように記述しても問題ありません。
For i = 2 To wks.Cells(1, 1).End(xlDown).Row

A列の最終行への移動を手操作で行うと、A列を選択して・・・
Ctrl + ↓(Command + ↓)
これで、A12に移動できます。
これをVBAでは、
Cells(1, 1).End(xlDown)
このように書きます。
しかし、以下の様に表の途中に空欄が入っている場合に・・・
For i = 2 To wks.Cells(1, 1).End(xlDown).Row
を実行すると・・・
F8で処理は止まってしまいます。
このような場合は、シートの最終行(1048576)セルに移動してから、
Ctrl + ↑(Command + ↑)とすれば、A12に移動できます。
※最終行は任意のセル上でCtrl + ↓(Command + ↓)とすれば移動できます。
※最終列は任意のセル上でCtrl + →(Command + →)とすれば移動できます。
※最終行(1048576)最終列(XFD)

これをVBAでは、
Cells(Rows.Count, 1).End(xlUp)
このように書きます。
実際には・・・
For i = 2 To wks.Cells(Rows.Count, 1).End(xlUp).Row
これで問題解決です。
なお、Endプロパティの構文は、
End(Direction)

Directionに記述するものは以下の通りです。
xlUp : ↑上へ
xlDown : ↓下へ
xlToLeft : ←左へ
xlToRight : →右へ