[[20161111105344]] 『CurrentRegionについて』(ふみ) ページの最後に飛ぶ

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

 

『CurrentRegionについて』(ふみ)

こんにちは。

βさんのコメントを見て、これは便利と思いCurrentRegion.Rows.Countを
使ってみました。

Dim r As Long

r = sh1.Range("B2").CurrentRegion.Rows.Count

として、B列を空白にし、A列に値をA1からA50まで連続していれて、その後
空白セルをはさんでA150ぐらいまで値を入れて走らせてみると50が返ります。

次にB列にも値を入れると、空白があってもA列かB列のいずれかに値が
あると連続とみなす様で、両方に値が無くなったところの行数を返します。

これをどの様に考えたら良いのか教えて下さい。
空白を含んだ行の範囲を取得しようとする事が多いので、とても興味があります。
今までは.End(xlUp)を使っていました。

< 使用 Excel:Excel2007、使用 OS:Windows7 >


試しにB列を空白にしてC列に値を入れるとACはABと同じ状態になり、ADにするとAだけと
同じ状態になります。B列に隣あったAとCを連続した領域と認識するのでしょうか?
(ふみ) 2016/11/11(金) 11:20

 Rows.Countだったから良かったでしょうが、
 Columns.Countで2が返ったら、私なら(便利と言うより)困ると思います。

 素性の知れないデータ並びを対象に使用する気は起らないです。

(半平太) 2016/11/11(金) 11:31


 たとえばマクロで、シート上の、あるリスト領域を相手にする。
 そうした場合に、どういったコードで、その領域を特定するか、これは、そのリストにデータがどのように配置されているか
 ということによって、正しい取得コードを書かなければいけません。

 いつもいつも、CurrentRegion でいいというわけではないですね。

 でも、逆に考えて、 CurrentRegion で【正しく取得できる】ようなシートレイアウト仕様にしておけば
 扱いが簡単かつ、確実になるということは言えると思います。

 CurrentRegion とは 指定領域(セル)が含まれる【連続した領域】ということなんですが、
 じゃぁ、連続した領域って? と悩まれる人も多いでしょうね。

 目で見て確認する方法としては、どこかのセル(例えば B2) を選択して Ctrl/Shift/* 。
 これで選択される領域が、エクセルが【連続していると認識】した領域、つまり Range("B2").CurrentRegion になります。

 連続している という意味は、あるセルがあって、その左右、上下、斜め上下のセルに値があれば
 そこも含む、で、今度はそのセルから見て、左右、上下、斜め上下、・・・・ と、どんどん 陣取りゲームを続けていき
 もう、それ以上、どの陣地からも進めなくなった時点で、陣地の 一番左にあるセルの列、一番右にあるセルの列
 一番上にあるセルの行、一番下にあるセルの行。
 この4本の線で囲まれた矩形が CurrentRegionです。

 感覚的には、矩形の領域に対して、空白行 あるいは 空白列 があったら、そこでおしまい と考えたほうが
 わかりやすいですかね。

(β) 2016/11/11(金) 11:41


>これをどの様に考えたら良いのか教えて下さい。
>空白を含んだ行の範囲を取得しようとする事が多いので、とても興味があります。
>今までは.End(xlUp)を使っていました。

データに空白行(空白データ)はないであろうというのが、
前提にあるときは、CurrentRegionを使いますが、
意外と空白行を多用された表も多いですよね。
特に掲示板ではそういう仕様が解らない場合が多いので、
「紛れ」がないように.End(xlUp)を使った回答が多いと思いますが、
空白で囲まれたアクティブな表のセル範囲を知りたいときは、
CurrentRegionプロパティが便利ではあります。
ただ、Endプロパティも非表示のセルは無視されるので、
ケースバイケースで、色々なやりかたを知っておくことが肝要かと思います。

参考URL>>
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_cell.html#currentregion

(まっつわん) 2016/11/11(金) 11:55


皆さん、ありがとう御座います。

私も質問した後で恐縮ですが、色々調べていました。
いろんな方法があり、また最終行の判定は奥が深そうですね。

βさんが仰る様に、いつもいつも、CurrentRegion でいいというわけではないですが、
CurrentRegion で【正しく取得できる】ようなシートレイアウト仕様に
しておけば、扱いが簡単かつ、確実になる、私もそう思います。

また、まっつわんさんが仰る様に、ケースバイケースで、色々なやりかたを知っておくことが肝要、
その通りだと思います。

勉強になりました。ありがとう御座いました。

(ふみ) 2016/11/11(金) 12:56


私からも追記。

データのあるセルで、CTRL + SHIFT + * を同時押ししてみてください。空白で切れない部分までが範囲になります。
また、CTRL + SHIFT + END というのもあります。 現在は空白でも、入力された事のあるセル末尾が判ります。

End(xlUp) は、CTRL + ↑ になります。表の途中に全空白行があっても、データのある末尾行が得られるので、手堅い方法だと思います。
しかし、表の下に説明文が書いてあるような場合等、そこも対象になってしまうので、そういう場合は CurrentRegion を検討します。
が、CurrentRegion だと表に接している文字列も範囲に含まれるので、そういう場合は一工夫必要になります。
(???) 2016/11/11(金) 12:58


???さん、ありがとう御座います。

CTRL + SHIFT + *の同時押しはβさんが教えてくれたのでやってみていましたが、
CTRL + SHIFT + END は知りませんでした。一度コピペすると、消した後でも範囲となりました。
CTRL + ↑は空白のセルが無いか手動で確認する時に、よく使っています。
私の仲間は空白セルを作らないで、と言っても必ず作ってくれていますので。

アドバイスありがとう御座います。どんどん勉強になります。

(ふみ) 2016/11/11(金) 13:18


 >CTRL + SHIFT + END は知りませんでした。一度コピペすると、消した後でも範囲となりました。 
 ただし、一度保存して開きなおすと入力したことがあるかの情報がクリアされるので注意。
(ねむねむ) 2016/11/11(金) 13:29

ねむねむさん、ありがとう御座います。

やってみました。
しかし、保存せずに閉じて開くとクリアされていますが、保存して閉じて開いても保持されていました。
なぜ?
バージョンとかでしょうか?
(ふみ) 2016/11/11(金) 13:39


空欄だけどENDで出てきたセルは、それを含む行または列を削除し、保存する事によって、情報が消えます。
消えなかったならば、範囲削除しなかったのではないでしょうか。

ちなみに、CTRL + SHIFT + END で飛ぶ最終セルは、マクロでは以下のように書けます。

    MsgBox Cells.SpecialCells(xlCellTypeLastCell).Address
(???) 2016/11/11(金) 13:47

???さん、ありがとう御座います。その通りでした。

Deleteキーで「ピッ」と消しただけで、行削除なぞはしていません。
やってみたらクリアされました。

ねむねむさん、ごめんなさい。
(ふみ) 2016/11/11(金) 13:54


 ???さん
 >空欄だけどENDで出てきたセルは、それを含む行または列を削除し、保存する事によって、情報が消えます。 

 たとえばA5セル、A6セル、A10セルに値を入力してA10セルだけDelキーで値を消す。
 これでA1セルにカーソルがある状態でShift+Ctrl+EndキーでA1セルからA10セルが選択される。

 その後ブックを保存して開き直し、A1セルにカーソルがある状態でShift+Ctrl+EndキーでA1セルからA6セルが選択状態になった。

(ねむねむ) 2016/11/11(金) 13:57


ねむねむさん、わかりました。

最初は使用中のブックで書いてある文字をコピペして消したら保存されましたが、
使用中のブックでも新しいブックでも新しく文字を入力して、それから消したら保存されずクリアされました。
コピペと新しく入力で症状が変わりました。
(ふみ) 2016/11/11(金) 14:12


ねむねむさん、追加情報です。
念の為、新しいブックに文字を書いて、それをコピペしてやってみたらクリアされました。
なぜかVBAを書き込んでいる使用中のブックだけは、行削除しないと保存されます。
(ふみ) 2016/11/11(金) 14:27

セルの書式設定に触ったか、でしょうね。何も触らず文字だけ入力したのであれば、DELキーでの削除でも範囲指定から外れます。
例えば、文字色を変えてから、文字をDELしても、色情報が残るので、範囲に含まれたままになります。単純コピペは書式もコピーされますので、同様。
DELキーではなく、右クリックから「削除」ならば、書式も全部消えて、範囲外になるようです。(というか、消した後にセルを詰めるし…)

行または列指定での削除を薦めるのは、書式がどう触られていても、確実に消して詰めてくれるからです。
(???) 2016/11/11(金) 14:46


 なるほど書式か。

 ???さん、ありがとう。

 ふみさん、長々と引っ張ってしまってすまない。
(ねむねむ) 2016/11/11(金) 14:57

ねむねむさん、こちらこそごめんなさい。

これは私が最初に確認したブック固有の症状と思います。
???さんが仰る様に、どこか触ってしまっているのかも知れません。

新しいブックにコピペしてもクリアされますし、使用中のブックに書かれているコードをコピーして
新しいブックに貼り付け、走らせてからコピペしてみてもクリアされます。

つまり最初に確認した使用中のブックでだけ、新しく入力では無くコピペした時だけ保存されるのです。

なのでおそらくねむねむさんや???さんが再現しようとしても出来ないと思いますし、
どうやっても他のブックではクリアされるのですから、ねむねむさんの仰る事が正しかったです。

この件はこれで終わらせて下さい。申し訳ありませんでした。

(ふみ) 2016/11/11(金) 15:04


こんにちは。解決後に失礼します。

>私の仲間は空白セルを作らないで、と言っても必ず作ってくれていますので。
ここがちょっと気になったので。

これは、何も考えずフツーに入力すれば 自然に上詰めに入力してしまうような仕組みを
作ればいいんです。好ましい行動に誘導する、ユーザーインタフェイスの問題です。
今回のなら、A列に連番の欄を設ければいいかなと思います。
べつに連番が欲しいのではなく、
連番を入れようとすれば自然に上詰めになるんじゃないかと。

( 佳 ) 2016/11/12(土) 12:45


コメント返信:

[ 一覧(最新更新順) ]


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