プロが教える店舗&オフィスのセキュリティ対策術

こんにちは。
EXCELマクロでデータの範囲選択の方法を教えてください。
A1~A10には10個のデータ(固定)
B2~不定のデータ
この範囲を選択する方法を教えてください。
(『 みたいにA列に固定データがあるのでうまく
範囲をひろえません。)

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 の最後尾、最後のセルを取るのが一番確実です。
    • good
    • 2
この回答へのお礼

ありがとうございます。
完璧な結果となりました。

P.S.本当にお手数をとらせて申し訳ないです。
最低でも、Wendy02さんから教えていただいた内容は、
熟知して、お礼とさせていただきます。

お礼日時:2006/03/13 06:44

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さんほどの技術をもつとしても、少しずつプログラミングを勉強・・・とのことですが、僕はなぜ

補足日時:2006/03/12 14:04
    • good
    • 0

こんばんは。



良くあることなのですが、マクロコードに慣れている方なら、ダイレクトに問題的を提示できても、そうでない方ですと、その周辺部分や具体的に言ってもらわないと、ほとんど通じないということなのですね。

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をださせていた
だきました。

補足日時:2006/03/12 08:33
    • good
    • 0

>B列以降のデータが不定。


>欲しいのは、右側の最終行を基本としたデータ範囲です。

誰にでも解る文章で書いてくださいね。

「B列以降のデータが不定」って、B~○○列まで適当にデータがあって、その列の最下行まで選択したいのでしょうか?

この回答への補足

本当に、申し訳ないです。
詳細は、Wendy02さんの補足欄で記載した内容
です。すみません、お手数を取らせます。
ー補足(Wendy02さんのAns.を引用ー
範囲で欲しかったのは”『 ”の形ではなく□
でした。右端を起点に左上に延ばす範囲指定です。

補足日時:2006/03/12 08:39
    • good
    • 0

補足の仕方ですが、言葉だけで説明されてもわかりにくいのでどんなデータかサンプルを出した方がいいですよ。


   A B
 1 あ 13
 2 い  9
 3 う 60
 4 え 52
 5 お 21
 6 か 87
 7 き
 8 く
 9 け
10 こ
この例だとB列が6行目までなのでA1:B6を選択したいんです。

とかね。

この回答への補足

すみません。説明不足でした。
また、補っていただいてありがとう
ございました。その内容のとおりで
す。

補足日時:2006/03/12 08:43
    • good
    • 0

#3です。


>で、で・・・欲しいのは、右側の最終行を基本としたデータ範囲です
ActiveSheet.UsedRange.Address
ってことですか?

この回答への補足

お手数を取らせて申し訳ないです。
ActiveSheet.UsedRange.Addressです。

補足日時:2006/03/12 08:44
    • good
    • 0

B列の行が不定なのであれば下記のような感じでしょうか。



Range("B2:B" & Range("B65536").End(xlUp).Row).Select

この回答への補足

※他の方と重ねた補足ですみません。
このような内容しかかけないので
お許しください。
******************
説明の仕方がわるかったです。申し訳無いです。
A列は10行まで確かに固定なのですが、B列以降の
データが不定。
で、で・・・欲しいのは、右側の最終行を基本とした
データ範囲です。データ範囲を 左から右下に求めるのではなく、右下(データの最終)から左上に求めたいのです。・・・A列の使用しなかったデータは範囲外にしたいのです。

補足日時:2006/03/10 15:15
    • good
    • 0

>この範囲を選択する方法を教えてください。



範囲とは「A1:Bnn」ですか?
それとも「B1:○nn」ですか?

>(『 みたいにA列に固定データがあるのでうまく
範囲をひろえません。)

該当部分のソースを載せてください。
    • good
    • 0

複数の範囲を選択するには


Range("A1:A10,B2:" & str & ).Select

※「str」は任意のアドレスを示すstring型の変数

でよいと思いますが、お聞きしたい回答だったでしょうか?

この回答への補足

説明の仕方がわるかったです。申し訳無いです。
A列は10行まで確かに固定なのですが、B列以降の
データが不定。
で、で・・・欲しいのは、右側の最終行を基本とした
データ範囲です。データ範囲を 左から右下に求めるのではなく、右下(データの最終)から左上に求めたいのです。・・・A列の使用しなかったデータは範囲外にしたいのです。

補足日時:2006/03/10 15:09
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!