Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし : 指定なし)
セル範囲の選択
投稿日時: 18/02/18 19:19:38
投稿者: hisayanxp

いつもお世話になります。
 
B2からE10の範囲にデータが入力されています。
一番左上のセルから一番左下のセルを選択するのに下記の記述をすると、セルの最下端まで選択されます。
 
Sub sample1()
    Range("B2", Cells(Rows.Count, "B")).Select
End Sub
 
これをデータが入力されている、B2からB10までが選択できる記述にする方法が全く浮かびません。
ご教示いただくとありがたいです。
よろしくお願いします。

回答
投稿日時: 18/02/18 19:50:27
投稿者: simple

セル範囲を指定する方法については、下記スレッドが参考になるでしょう。
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_cell.html
(記事の後半にあるEndプロパティの使い方が参考になるはずです)
 
ここに載っているコードはある種の定型的な「よくあるパターン」ですので、
ご自分で発見していくというよりも、
まとめて予め読んでおいて、それをいかに使っていくか、
という点に注力したほうがよいかと思います。
 
なお、その記事では、
実行結果との対応をつけるために、
コード中で Select していますが、
普通はSelectを使いません。動作を続けることが多い。
 
Rangeの指定方法に重点を置いて読みこなしてください。

回答
投稿日時: 18/02/19 10:28:51
投稿者: もこな2

Simpleさんのコメントで十分だとおもいますけど、せっかくなので投稿。
 
Endプロパティのお話であれば、このMougサイト内にもありますのでこちらも参考にしてみるのもよいかもしれません。
http://www.moug.net/tech/exvba/0050088.html

回答
投稿日時: 18/02/19 11:10:46
投稿者: WinArrow
投稿者のウェブサイトに移動

hisayanxp さんの引用:

 
B2からE10の範囲にデータが入力されています。
一番左上のセルから一番左下のセルを選択する

 
これをデータが入力されている、B2からB10までが選択できる記述にする方法が全く浮かびません。

 
この説明から、[End]を使ったセル範囲の取得が想像できます。
 
セルB2にカーソルを置き
[Ctrl]+[Shift]+[*]・・・・(または、テンキーを使う場合は、[Ctrl]+[*])
を押すという操作を
マクロの記録でコードを作成すると
    Selection.CurrentRegion.Select
というコードが出来上がります。
SelectionをRange("B2")に置き換えて、
更にその中の「1列目を指定する」という要素を追加すると
    Range("B2").CurrentRegion.Columns(1).Select
というコードになります。
 
セル範囲の取得には、いくつかの前提条件があり、
いろいろな方法がありますから、状況を考えながら、どれが適しているかを判断するとよいでしょう。
 
 
 
 
 
 
 

投稿日時: 18/02/19 15:24:11
投稿者: hisayanxp

simpleさん、もこな2さん
ありがとございます。お教えいただいたHPを勉強しなおしています。
WinArrowさん、ありがとうございます。
お教えいただいた記述では、データに空白の行があるさいに、終端行を選択できませんでした。
 
 Range("B2").CurrentRegion.Columns(1).Select
 
これをなんとか変えて終端のセルを選択できないか、やってみましたが駄目でした。
SpecialCellsを使っても案の定駄目でした。
 
何か良い方法はあるでしょうか。

回答
投稿日時: 18/02/19 16:24:49
投稿者: mattuwan44

>お教えいただいた記述では、データに空白の行があるさいに、終端行を選択できませんでした。
それは、数式は入れているが結果を空白に見せているだけってことでしょうか?
なので計算結果が空白でない最後の行ということですか?
 
それともA列は空白だがB列の最後のデータ行という場合にB列のデータ最終行を取得できなかったという事でしょうか?
 
その辺を詳しく伝えないと、他人もエクセル君にもあなたのしたいことが伝わりませんよ。

回答
投稿日時: 18/02/19 16:53:48
投稿者: WinArrow
投稿者のウェブサイトに移動

hisayanxp さんの引用:

WinArrowさん、ありがとうございます。
お教えいただいた記述では、データに空白の行があるさいに、終端行を選択できませんでした。
 
 Range("B2").CurrentRegion.Columns(1).Select
 
これをなんとか変えて終端のセルを選択できないか、やってみましたが駄目でした。
SpecialCellsを使っても案の定駄目でした。
 
何か良い方法はあるでしょうか。

 
>データに空白の行があるとき
これは、私のレスの中に
>いくつかの前提条件があり
と書いた、「前提条件」の一つです。
なお、数式が入っていて、「空白に見える」は、データがあると判断されます。
「空白に見える」は、正確に言えば、「空白文字列」といいます。
「空白」と「空白文字列」は、根本的に異なります。
混同しないようにしましょう。
 
CuurentRegionとは、少し違いますが、
UsedRange
を使うこともできます。
 
状況を十分説明されていないので、取りあえず、
Msgbox Activesheet.UsedRange.Address
で、表示されるセル範囲を確認して下さい。
 

$B$2:$E$10
というように表示されたらならば、
 
Activesheet.UsedRange.Columns(1).Select
が使えます。
 
どのような記述が適しているかは、あくまでも、前提条件が重要です。
 

回答
投稿日時: 18/02/19 18:03:05
投稿者: WinArrow
投稿者のウェブサイトに移動

>SpecialCellsを使っても案の定駄目でした。
 
おそらく記述を間違えているだけで・・と思います。
 
記述を説明しないと、あなたが納得できるアドバイスを貰えませんよ!
 
↓は、UsedRangeと略同じになります。
    Range(Range("B2"), Range("B2").SpecialCells(xlCellTypeLastCell)).Select
 
 

回答
投稿日時: 18/02/19 19:55:25
投稿者: WinArrow
投稿者のウェブサイトに移動

UsedRangeを使った場合と、
SpecialCells(xlCellTypeLastCell)を使った場合の
違いを紹介します。
 
前提
セルB2〜E10にデータが入っている
但し、途中に空白行が存在する。
A列は空白
 
(1)UsedRangeを使った場合
  Debug.Print Activesheet.UsedRange.Columns(1).Address
  →$B$2:$B$10
 
(2)SpecialCells(xlCellTypeLastCell)
  Debug.Print Range(Range("B2"), Range("B2").SpecialCells(xlCellTypeLastCell)).Columns(1).Address
  →$B$2:$B$10
 
しかし、A列セルのデータがはいいている状態では、変わります。
(1)UsedRangeを使った場合
  Debug.Print Activesheet.UsedRange.Columns(1).Address
  →$A$2:$A$10
 
(2)SpecialCells(xlCellTypeLastCell)
  Debug.Print Range(Range("B2"), Range("B2").SpecialCells(xlCellTypeLastCell)).Columns(1).Address
  →$B$2:$B$10
 
このように、前提となる条件により、取得する範囲が変わります。
ですから、前提条件を重視しているわけです。
回答者は、質問者さんの説明だけが頼りなんです。
 
 

回答
投稿日時: 18/02/19 22:34:04
投稿者: simple

Sub sample1()
     Range("B2", Cells(Rows.Count, "B").End(xlUp)).Select
End Sub
ではダメだったんですか?

投稿日時: 18/02/21 11:26:36
投稿者: hisayanxp

WinArrowさん、お手数をおかけしました。
前提条件の説明が不足していました。以下のようなイメージです。
 
   A B C D E
1 * * * * *
2 * * * * *
3 * * * * *
4 * * * * *
5 * * * * *
6 * * * * *
7
8 * * * * *
9 * * * * *
10 * * * * *
 
 
お教えいただいた
ActiveSheet.UsedRange.Columns(1).Selectでできました。
またsimpleさん、ありがとうございました。ご記入いただいた
Range("B2",Cells(Rows.Count,"B").End(xlUp)).Selectでもできました。
この式がなぜ思いつかなかったのかと思いました。
 
皆様ありがとうございました。