- ベストアンサー
EXCELマクロ 最終データまでの範囲選択
こんにちは。 EXCELマクロでデータの範囲選択の方法を教えてください。 A1~A10には10個のデータ(固定) B2~不定のデータ この範囲を選択する方法を教えてください。 (『 みたいにA列に固定データがあるのでうまく 範囲をひろえません。)
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
tabtab9さん、こんにちは。 Wendy02です。 このようにしたらいかがかしら? Sub getMyRange3() Dim r As Range With ActiveSheet.Range("A1").CurrentRegion 'または、Activesheet.UsedRange Set r = Cells(65536, .Cells(.Cells.Count).Column).End(xlUp) Range("A1", r).Select End With Set r = Nothing End Sub .UsedRange は、離れた場所のものまでを範囲にしてしまう欠点があります。逆に、.CurrentRegion は、A1 からデータが離れすぎると、取れないことがあります。これは、C列なら、C列の右下端からA1に向かって、範囲を取るようにします。 一応、分りやすいように、r で変数を取りましたが、1つにまとめてしまって結構です。こういうのは、簡単なコードなのですが、慣れていないと、ちょっと思いつきませんね。慣れていなかったら、やはり、一度、Union の使い方を覚えたら良いかと思います。1つずつ、足していく方法です。ローテクに見えますが、かなり便利です。 もしも、点々と間が空いているようにデータの場合は、右端列の.SpecialCells(xlCellTypeConstants) から、そのAreas Count の最後尾、最後のセルを取るのが一番確実です。
その他の回答 (8)
- Wendy02
- ベストアンサー率57% (3570/6232)
tabtab9さん、こんにちは。 今、私自身、少しずつプログラミングを勉強をしています。もし、私が、仕事で使わなくてはならないとしたら、達成しなければならないという、アセリに近いものを感じながら、土日を掛けて、質問掲示板に聞いていることになるかと思います。 さて、マクロですが、以下は、ActiveCell が、ブランクでなかったら、その場所から、左端上に伸ばすことにはなるのですが、やっぱりコードとしては、基点となるのはA1と書くわけです。そして、10行以上は取らないとすれば、以下のようになります。 Sub getMyRange1() Dim myRow As Long '値の入っている右端を選択 If Not IsEmpty(ActiveCell) Then '10行以上は、範囲を取らない If ActiveCell.Row > 10 Then myRow = 10 Else myRow = ActiveCell.Row Range(Range("A1"), ActiveCell).Resize(myRow).Select End If End Sub 以下は、通常では、考えられない設定ですが、左端上のデータの入っているものを探し、範囲を取るコード Sub getMyRange2() Dim r As Range '値の入っている右端を選択 If Not IsEmpty(ActiveCell) Then '左端上を探す On Error Resume Next Set r = ActiveSheet.UsedRange.Columns(1).SpecialCells(xlCellTypeConstants) If Err.Number > 0 Then Exit Sub On Error GoTo 0 Range(r.Cells(1), ActiveCell).Select End If End Sub
補足
すっ、すみません。 masa_peeの例を使わせていただきますと、 (本当に僕が悪いというのは実感していますの で、この場をお借りしてお詫び申しあげます。) <masa_peeさんの作られたデータサンプル> A B 1 あ 13 2 い 9 3 う 60 4 え 52 5 お 21 6 か 87 7 き 8 く 9 け 10 こ この例だとB列が6行目までなのでA1:B6を選択したい。 P.S. >今、私自身、少しずつプログラミングを勉強をしています。 Wendy02さんほどの技術をもつとしても、少しずつプログラミングを勉強・・・とのことですが、僕はなぜ
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 良くあることなのですが、マクロコードに慣れている方なら、ダイレクトに問題的を提示できても、そうでない方ですと、その周辺部分や具体的に言ってもらわないと、ほとんど通じないということなのですね。 No.2016904『超基本ですみません。EXCELマクロの記述で改行』のコードの書き方で、一応の解決はされているようですが、実際は、Rangeオブジェクトのプロパテイとして、ひじょうに不自然なんですね。 そのご質問とセットで考えると、 例えば、以下のように、Union でつなげていくのがよろしいのではないか、と私は思うのですが、一般的には、マクロで行うにしても、マトリックス(長方形の四角)で扱ったほうが楽なのですね。マトリックスにしておいて、条件で、For Each -In ~などのループで振り分けて、選別して処理していくというのが、マクロとしては簡単なのです。 だから、以下のような方法は、例外中の例外です。 Sub RangeCollecting1() Dim rng As Range Dim UnionRng As Range Set rng = Range("A1:A10") '固定範囲 'Range("B2")の可変範囲 Set UnionRng = Union(rng, Range("B2", Range("B2").End(xlDown))) UnionRng.Select End Sub >A列は10行まで確かに固定なのですが、B列以降のデータが不定。 Sub RangeCollecting2() Dim r As Range Dim i As Integer Dim rc As Range Dim ur As Range Set ur = Range("A1:A10") '固定範囲 Set r = Range("A1").CurrentRegion 'B列以降不定範囲 For i = 2 To r.Columns.Count On Error Resume Next '定数のみを拾う Set rc = r.Columns(i).SpecialCells(xlCellTypeConstants) On Error GoTo 0 If Err.Number = 0 Then Set ur = Union(rc, ur) End If Next i ur.Select End Sub
補足
Wendy02さん、すみません。 実は、・・・説明の仕方が非常にまずいことを 痛感しました。 範囲で欲しかったのは”『 ”の形ではなく□ でした。右端を起点に左上に延ばす範囲指定です。 本当に手間を取らせて申し訳ないです。 P.S.社内では実際のところ、以前にWendy02 さんに教えていただいた”手で範囲・・・”が重宝 されていますが、ワンランク上(自動範囲指定)の マクロの実行をと思い、今回Q&Aをださせていた だきました。
- hana-hana3
- ベストアンサー率31% (4940/15541)
>B列以降のデータが不定。 >欲しいのは、右側の最終行を基本としたデータ範囲です。 誰にでも解る文章で書いてくださいね。 「B列以降のデータが不定」って、B~○○列まで適当にデータがあって、その列の最下行まで選択したいのでしょうか?
補足
本当に、申し訳ないです。 詳細は、Wendy02さんの補足欄で記載した内容 です。すみません、お手数を取らせます。 ー補足(Wendy02さんのAns.を引用ー 範囲で欲しかったのは”『 ”の形ではなく□ でした。右端を起点に左上に延ばす範囲指定です。
補足の仕方ですが、言葉だけで説明されてもわかりにくいのでどんなデータかサンプルを出した方がいいですよ。 A B 1 あ 13 2 い 9 3 う 60 4 え 52 5 お 21 6 か 87 7 き 8 く 9 け 10 こ この例だとB列が6行目までなのでA1:B6を選択したいんです。 とかね。
補足
すみません。説明不足でした。 また、補っていただいてありがとう ございました。その内容のとおりで す。
#3です。 >で、で・・・欲しいのは、右側の最終行を基本としたデータ範囲です ActiveSheet.UsedRange.Address ってことですか?
補足
お手数を取らせて申し訳ないです。 ActiveSheet.UsedRange.Addressです。
B列の行が不定なのであれば下記のような感じでしょうか。 Range("B2:B" & Range("B65536").End(xlUp).Row).Select
補足
※他の方と重ねた補足ですみません。 このような内容しかかけないので お許しください。 ****************** 説明の仕方がわるかったです。申し訳無いです。 A列は10行まで確かに固定なのですが、B列以降の データが不定。 で、で・・・欲しいのは、右側の最終行を基本とした データ範囲です。データ範囲を 左から右下に求めるのではなく、右下(データの最終)から左上に求めたいのです。・・・A列の使用しなかったデータは範囲外にしたいのです。
- hana-hana3
- ベストアンサー率31% (4940/15541)
>この範囲を選択する方法を教えてください。 範囲とは「A1:Bnn」ですか? それとも「B1:○nn」ですか? >(『 みたいにA列に固定データがあるのでうまく 範囲をひろえません。) 該当部分のソースを載せてください。
- ssssssssss
- ベストアンサー率23% (24/103)
複数の範囲を選択するには Range("A1:A10,B2:" & str & ).Select ※「str」は任意のアドレスを示すstring型の変数 でよいと思いますが、お聞きしたい回答だったでしょうか?
補足
説明の仕方がわるかったです。申し訳無いです。 A列は10行まで確かに固定なのですが、B列以降の データが不定。 で、で・・・欲しいのは、右側の最終行を基本とした データ範囲です。データ範囲を 左から右下に求めるのではなく、右下(データの最終)から左上に求めたいのです。・・・A列の使用しなかったデータは範囲外にしたいのです。
お礼
ありがとうございます。 完璧な結果となりました。 P.S.本当にお手数をとらせて申し訳ないです。 最低でも、Wendy02さんから教えていただいた内容は、 熟知して、お礼とさせていただきます。