[[20260103231506]] 『他の列のデータの最終行を使って範囲選択するマク』(ひろ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) |

| 全文検索 | 過去ログ ]

 

『他の列のデータの最終行を使って範囲選択するマクロ』(ひろ)

皆様あけましておめでとうございます本年もよろしくお願いします
D列にデータが入力されてますその列のデータの最終行を取得して
A1からD列のデータの最終行を範囲選択するマクロをつくりたいのですがどうすればよろしいでしょうか

< 使用 Excel:Excel2019、使用 OS:Windows10 >


 Sub 範囲選択()
     Range("A1").Resize(Cells(Rows.Count, "D").End(xlUp).Row, 4).Select
 End Sub

(野次馬) 2026/01/04(日) 00:16:23


■1
難しく考えることはないと思います。単純に以下のプロセスを考えてみましょう。
 1.D列最終行(のセル)を取得する
 2.A1セルからD列最終行セルを選択する

■2
「1.」のほうは、いくつかありますが、やはり既に提示があるようにEndプロパティを使ったアプローチが有名どころかなと思います。

 【参照】
https://excel-ubara.com/excelvba1/EXCELVBA318.html
https://www.moug.net/tech/exvba/0050088.html

すなわち、以下で取得が可能です。

 Cells(Rows.Count, "D").End(xlUp)

■3
「2.」のほうは、いったんセル範囲の表現方法を調べてみるとよいと思いますが、Rangeオブジェクトを使い↓のように表現することが可能です。

    Range("A1:D5").Select・・・・・・・・・・・・・セル番地を示す【文字列】で指定する
    Range(Range("A1"), Range("D5")).Select ・・・・右上と左下の【セル】で指定する
    Range("A1", Range("D5")).Select・・・・・・・・2番めの応用
    Range("A1", "D5").Select・・・・・・・・・・・・2番めの応用

■4
ここまで理解出来たら、上記を組み合わせて以下のようにすればOKです。

    Sub 研究用1()
        Dim MyRNG As Range
        Set MyRNG = Cells(Rows.Count, "D").End(xlUp)

        Range("A1", MyRNG).Select
    End Sub

むろん、1行にまとめても問題ありません。

    Sub 研究用2()
        Range("A1", Cells(Rows.Count, "D").End(xlUp)).Select
    End Sub

■5
このほか、「■2」で取得しているのが【セル】ということが理解できれば、↓のような表現も可能ということに気づくと思います。

    Sub 研究用3()
        Range("A1:D" & Cells(Rows.Count, "D").End(xlUp).Row).Select
    End Sub

■6
なお、余談になりますが、なぜ"選択"したいのでしょうか?
VBAの世界では基本的にシートやセル(オブジェクトといいます)は、きちんと指定すればいちいちActiveにしたり選択したりする必要はありません。

例えば、D列最終行を調べて、そのうちA〜B列の文字だけ赤くしたいということなら↓のようにすればよいです。

    Sub 研究用4()
        Range("A1:B" & Cells(Rows.Count, "D").End(xlUp).Row).Font.Color = vbRed
    End Sub

ともすれば、無駄な処理につながりますので、本当に必要な"選択"なのか再考されるとよいかと思います。

(もこな2) 2026/01/04(日) 09:15:39


 既に提示のある通り、VBAを使うのにSelectだのActivateだのを使うのは
 安定性に欠けるため、推奨されません

 「選択する」「アクティブにする」はあくまで手動での動きであり
 VBAを使うなら「指定する」ように頭を切り替えるべきです

 Sub sample()
     Dim rng As Range
     With ThisWorkbook
         Set rng = .Range(.Cells(1,1),.Cells(Rows.Count,4).End(xlUp))
         ‘rngを使った処理
    End With

(Asa) 2026/01/04(日) 22:51:53


 エラーになりませんか? 趣旨は賛同しますが。
(たぶん) 2026/01/04(日) 23:31:20

シートがなきゃやエラーになるわな
(ぬけてるよ) 2026/01/05(月) 00:26:08

>VBAを使うのにSelectだのActivateだのを使うのは
> 安定性に欠けるため、推奨されません
では伺います。
何のためにそれらは用意されているのですか。
(?) 2026/01/05(月) 08:57:33

 例えば、シートを挿入するとアクティブシートが変わるので、
処理終了時特定のシートをアクティブにしたい時
(はてな) 2026/01/05(月) 10:00:22

(はてな)さん
解説有難うございました。

(?) 2026/01/05(月) 10:39:19


 シートが抜けてますね。失礼しました.
 With ActiveSheet
 With ThisWorkbook.Sheets(1)
 With ThisWorkbook.Sheets("シート名")
 などが正です。

 >何のためにそれらは用意されているのですか
 Selectする、Activateすることが求められる場合が存在するからです
 はてなさんの解説の様に、「処理後にシート1をActiveにした状態したい」場合や
 「処理後に手入力が必要なセルが存在するために、そのセルをActiveにしたい」場合などです

 あくまで「VBA内で処理が完結」し、「特にユーザーへの見え方を変更する必要がない」なら
 Selectなどの多用は控えるべき、という話であって
 適切な前提があれば、それに沿った処理がごく普通に推奨されます

(Asa) 2026/01/05(月) 19:21:29


 「それらの前提条件やデメリットを考慮しないまま、
 環境依存の処理を組むことが推奨されない」
 ということです。

 (シートが抜けているコードを提示しておいて恐縮ですが)
 ブックやシートの指定を省略して、RangeやCellsを記述することが推奨されないのも
 「省略=Activeを参照」という前提を考慮する必要が出てしまうからです
 常に「どこがActiveなのか?」「どこがSelectされているのか?」
 を考慮するのが面倒かつ不安定なので、「できるだけ指定しましょう」というお話でした。
 「オブジェクトを指定する≒オブジェクト変数として保持する」という主旨です。
(Asa) 2026/01/05(月) 19:28:58

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.