[[20220531224747]] 『範囲選択で最終行をしていするには』(ふ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『範囲選択で最終行をしていするには』(ふ)

こんばんわ
普通範囲選択は Range("A14:E20").Select
という風に書くのですが
それをデータの最終行にするにはどうすればよろしいでしょうか
最終行の取得はできます

Sub 最終行

Dim 最終行 As Long

最終行 = cells(Rows.Count.1)End(xlup).Rows

ここから先がわかりません
教えてくださいよろしくおねがいします

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


 Range("A14:E" &  cells(Rows.Count,1).End(xlUp).Row).Select

 じゃないですか?

(半平太) 2022/05/31(火) 23:19


以下では ?

Option Explicit

Sub test()

    Dim lg As Long, lg2 As Range

    lg = Cells(Rows.Count, 1).End(xlUp).Rows
    lg2 = Range(Cells(1, 1), Cells(lg, 5))
    lg2.Select
End Sub

(見習い会社員) 2022/06/01(水) 08:09


 見習い会社員さんへ。
  lg = Cells(Rows.Count, 1).End(xlUp).Rows
 は RowsではなくRowの間違いではないですか?

     lg2 = Range(Cells(1, 1), Cells(lg, 5))
 は
    Set lg2 = Range(Cells(1, 1), Cells(lg, 5))
 としないといけないでしょう。
 Range等のオブジェクトを変数に代入するにはSetを付けないといけません。

 ところで、変数名の lgとかlg2とは何の省略なんでしょうか。
 名は体を表すものにしておいたほうが、将来の自分(他人みたいなものです)にとって有益です。

(γ) 2022/06/01(水) 09:18


γさん、初心者有る有るのミスの指摘ありがとうございます。

>Range等のオブジェクトを変数に代入するにはSetを付けないといけません。

  御意!

>RowsではなくRowの間違いではないですか?

	Rowでは、コンパイルエラー(変数が定義されていません)がでます。
	ROWSで問題なく完走します。

	最終行を取得でRowsで問題ないと思いますが ?

>変数名の lgとかlg2とは何の省略なんでしょうか。

	ラスト行(LastGyo)でlgとしました。
	lg2については、変数はRangeなので安易にそのまま2を付けてlg2ですが
	名が体をなしていない安易な命名でした。
	反省 my_BAD !!

(見習い会社員) 2022/06/01(水) 09:54


http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_cell.html#xlup

セル範囲(あるいはセル単体)については、
いろいろな表現方法があります。

 >Dim 最終行 As Long
 >最終行 = cells(Rows.Count.1)End(xlup).Rows

↑これだと、最後の行番号「だけ」が取得されます。
まぁ、それを使ってセル範囲を表す、「"A14:E20"」というような、
「文字列」を作るというのもありなんですが、
シート上の状態は、いつも同じようになっているとは限りませんので、
セルの場所を示す語彙を増やすことが肝要かと思います。
(まっつわん) 2022/06/01(水) 10:02


     Dim lg As Long
     lg = Cells(Rows.Count, 1).End(xlUp).Rows
 は、私の手元では、「型が一致しません」というエラーになりました。
 どういう理屈で行番号が返るのか、私には理解ができません。

 イミディエイトウインドウで、
 ?typename(Cells(Rows.Count, 1).End(xlUp).Rows)
 と入力してみてください。
 Rangeを返しませんか?

 Set lg2 = Range(Cells(1, 1), Cells(lg, 5))とlgを使うのだから、
 求めたいのは、行番号という整数のはずでしょう?

 素直に
     lg = Cells(Rows.Count, 1).End(xlUp).Row
 でよいと思いますよ。

 ?typename(Cells(Rows.Count, 1).End(xlUp).Row)
 はLongを返します。
 RowはRangeオブジェクトの(最初のセルの)行番号を返すプロパティですよ。
 https://docs.microsoft.com/ja-jp/office/vba/api/excel.range.row
 を読んでみてください。

 # 本来の質問者さんの参考にもなるかと思い、議論しています。
(γ) 2022/06/01(水) 10:23

lg = Cells(Rows.Count, 1).End(xlUp).Rows では無く
 lg = Cells(Rows.Count, 1).End(xlUp).Row でした。

ここに回答を書き込むのは10年早そうなので
質問するだけして見習いは、ROMが相応なので回答するのは控えます。

お世話をおかけしました。
すいません。 _(._.)_

(見習い会社員) 2022/06/01(水) 11:01


いやいや、投稿されるとご自身の勉強になりますよ。遠慮は不要かと思いますね。

(γ) 2022/06/01(水) 11:09


> Rowでは、コンパイルエラー(変数が定義されていません)がでます。
Dim Row as Long とかの変数宣言を一度して、その後に消したりしていませんか?
既定のプロパティと同一の変数は避けたほうがよいと思います。
(私は経験が無いので、そういうエラーが出た原因を単に推測しただけですが)

(γ) 2022/06/01(水) 11:16


 >ここに回答を書き込むのは10年早そうなので
 >質問するだけして見習いは、ROMが相応なので回答するのは控えます。

私は掲示板に質問しまくって勉強しました。
最初は、コミュニケーションとるのもなかなか大変ですが、
遠慮は不要かと。
勉強してると疑問やわからないところが次々出てきますし、
理解したつもりが理解できてないということもあるとは思います。

手動の操作だと、「選択する」ことで、操作対象のセル範囲をエクセル君に教えますが、
VBAの場合、言葉で指示できるので、基本的には「選択する」という行為を、
命令又は指示することは不要です。

まずは、
「アクティブなシート上のE列のデータ最終行のセル」
だけに注力してみてはいかがでしょうか?

'文字列を作る例
sub test

    dim r as long
    dim a as string

    r = cells(rows.count,"E").end(xlup).row
    a = r

   msgbox a

   a= "A14:E" & a
   msgbox a

   range(a).select    '選択してみてセル範囲を目視で確認

end sub


Rowsプロパティは、行(セル範囲の一種)の集まり(コレクション)を返します。
Rowプロパティは、行番号を返します。

返すというのは、聞いた質問に対しての返答的な意味です。
その他わからない用語はネットで調べてみてください。

(まっつわん) 2022/06/01(水) 15:49


まっつわんさま、お尋ねします。
あなたの書かれた
| >Dim 最終行 As Long
| >最終行 = cells(Rows.Count.1)End(xlup).Rows
| ↑これだと、最後の行番号「だけ」が取得されます。
は、弘法も筆の誤り ということでよろしかったですか?
(γ) 2022/06/01(水) 16:03

 >それをデータの最終行にするにはどうすればよろしいでしょうか 
 A20:E20 を選択したいということ。
 >最終行の取得はできます 
 どうやって取得したの。
 >最終行 = cells(Rows.Count.1)End(xlup).Rows
 コンパイルエラーになったぞ。
 >ここから先がわかりません
 何が分からないんですか。やりたいことは何ですか。
(分からん) 2022/06/01(水) 18:53

遅くなりました
つまりRange("A14:E20")の20の部分を最終行が変わっても範囲選択できるようにしたいです
(ふ) 2022/06/06(月) 17:20

 ん? (半平太)さんの

 ↓これではいかんのかしら?

 (半平太) 2022/05/31(火) 23:19

(あみな) 2022/06/06(月) 17:45


End(xlup) だったら範囲1番下の1つ下の行から行わないと意味無しでは。

(不憫) 2022/06/06(月) 18:22


つまりこの位置から上

Range("B2:E8").Resize(1, 1).Offset(Range("B2:E8").Rows.Count, Range("B2:E8").Columns.Count - 1).Select
(不憫) 2022/06/06(月) 18:36


前提として、最下行取得するのがA列で間違いないですか?
質問時のコード(誤りとはいえ)はA列を指定していますけども。
(ちゃらんぽ) 2022/06/06(月) 22:09

はい 取得はa列で大丈夫です
(ふ) 2022/06/06(月) 23:16

(半平太)さんの 2022/05/31(火) 23:19に提示されたコードは確認されていますか?

私が脇道にそらしたかもしれません。
私としては既に解決済みではあるものの、
# 本来の質問者さんの参考にもなるかと思い、議論しています。
と一応のお断りをしたつもりでしたが、通じていなかったですか。

(γ) 2022/06/06(月) 23:31


あなたの
最終行 = cells(Rows.Count.1)End(xlup).Rows
が間違いであることも、
一連の議論のなかでしていますので、参考にしてください。
(γ) 2022/06/06(月) 23:34

>はい 取得はa列で大丈夫です
でしたら、既に指摘がある通り、
半平太さんの回答で、望む範囲が選択されませんか?
思った通りの結果にならないなら、もう少し詳しい説明が必要でしょう。
(ちゃらんぽ) 2022/06/07(火) 07:10

 >つまりRange("A14:E20")の20の部分を最終行が変わっても範囲選択できるようにしたいです 
 「20の部分を」が分からないのだがデータが増減するということですね。
 >はい 取得はa列で大丈夫です
 下記のコードは A列を指定しています。

 参考です。

 Sub 範囲選択()
 Dim lastRow As Integer
     lastRow = Range("A" & Rows.Count).End(xlUp).Row '最終行番号取得
     Range(Cells(14, 1), Cells(lastRow, 5)).Select'範囲選択取得
 End Sub

 Sub 最終行選択()
 Dim lastRow As Integer
     lastRow = Range("A" & Rows.Count).End(xlUp).Row '最終行番号取得
     Range(Cells(lastRow, 1), Cells(lastRow, 5)).Select'最終行範囲取得
 End Sub

(nm) 2022/06/07(火) 11:29


ありがとうございます参考にします
(ふ) 2022/06/07(火) 20:59

コメント返信:

[ 一覧(最新更新順) ]


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