Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
学ぶ ワークシートのナビゲーション | Excelデータの操作
ビジネス自動化のためのExcel VBA

ワークシートのナビゲーション

メニューを表示するにはスワイプしてください

実際のデータには、どこで終わるかを示すラベルはありません。Range("A1:I5") のように範囲をハードコーディングすると、注文が6件目になった瞬間に動作しなくなります。そのため、シートにデータの終わりを尋ねる必要があります。

最終行の取得

このコース全体で最もよく使われるコード行:

Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

このコードは右から左に読みます:列Aの一番下(ws.Rows.Count)から始め、上方向(End(xlUp))にジャンプして最初にデータが入っているセルに到達し、その行番号を返します。注文数がいくつあっても機能します。

図3.2

最終列の取得

同じ方法ですが、横方向です:

Dim lastCol As Long
lastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column

UsedRange

シート上でこれまでにデータが入力された矩形範囲全体を報告する機能。簡単な確認には便利ですが、注意が必要です。内容を削除したセルも記憶しているため、実際のデータ範囲より広く報告される場合があります。

Debug.Print ws.UsedRange.Address        ' e.g. $A$1:$I$6
Debug.Print ws.UsedRange.Rows.Count     ' 6

CurrentRegion

通常はこちらの方が適切なツールです。単一セルから周囲の連続したデータブロックまで外側に拡張し、最初の空白行または空白列で停止します。Ordersのような整然としたテーブルに正確に一致します。

Dim tableRange As Range
Set tableRange = ws.Range("A1").CurrentRegion
Debug.Print tableRange.Address           ' $A$1:$I$6
Debug.Print tableRange.Rows.Count - 1    ' 5 — subtract 1 to exclude the header

課題

  1. Subメソッドを使って最後の行を見つけ、イミディエイトウィンドウに出力するEnd(xlUp)を作成してください。
  2. 同じSub内で、CurrentRegion.Rows.Countを使った別の方法でも最後の行を取得し、同様に出力してください。両者が一致することを確認します。
  3. シートの7行目に6件目の注文を手動で追加し、マクロを再実行して、どちらの方法でも7が報告されることを確認してください(コードの変更は不要)。
ヒント
expand arrow

1. End(xlUp) を使った最終行の検索

  • 列Aの一番下から上方向へジャンプ — 第3章「最終行の検索」セクションと同じパターン。
  • Debug.Print で結果をイミディエイトウィンドウ(Ctrl+G)に表示。

2. CurrentRegion を使った別の方法

  • CurrentRegion は、単一セル(例:Range("A1"))から連続したデータブロック全体に拡張。
  • その領域の .Rows.Count はヘッダー行も含む — データ行のみが必要な場合は1を引くことに注意(本章の注意参照)。今回は2つの方法を比較するだけなので、まずは生のカウントを出力し、その後ヘッダーについて考察。

3. 6行目を追加して再実行

  • コードの変更は不要 — ワークシートの7行目に新しい注文を直接入力し、同じ Sub を再実行。
解答
expand arrow
Sub CompareLastRowMethods()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Orders")

    Dim lastRowMethod1 As Long
    lastRowMethod1 = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
    Debug.Print "End(xlUp): " & lastRowMethod1

    Dim lastRowMethod2 As Long
    lastRowMethod2 = ws.Range("A1").CurrentRegion.Rows.Count
    Debug.Print "CurrentRegion: " & lastRowMethod2
End Sub
すべて明確でしたか?

どのように改善できますか?

フィードバックありがとうございます!

セクション 3.  2

AIに質問する

expand

AIに質問する

ChatGPT

何でも質問するか、提案された質問の1つを試してチャットを始めてください

セクション 3.  2
some-alt