• ベストアンサー

EXCELマクロ、範囲選択はできたものの・・・

こんにちは。 Wendy02さんはじめ、みなさんのお力をお借りして、 できあがりまじかのグラフですが、恥を承知で教えて ください。 教えてもらったマクロ Sub getMyRange3() Dim r As Range  With ActiveSheet.Range("A1").CurrentRegion    Set r = Cells(65536, .Cells(.Cells.Count).Column).End(xlUp)   Range("A1", r).Select  End With  Set r = Nothing End Sub ****************** ・データ範囲には0が存在する場合がある。 ・末尾データの0は範囲には入れない のことを考慮すると、期待の範囲がとれません。 オートフィルタでの処理も考えましたが、必要な 0までもフィルタされます。 ****************** masa_peeさんの作られたデータサンプルをお借りすると データ的には、    A  B  1 あ 13  2 い  0  3 う 60  4 え 52  5 お  0  6 か  0 というデータのなかで欲しい範囲は、A1からB4です

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんにちは。Wendy02です。 #3のgaloon さんへ 実は、ここまで至る話は、 http://oshiete1.goo.ne.jp/kotaeru.php3?q=2019619 (http://okwave.jp/kotaeru.php3?q=2019619) という長い話があって、成立しています。私は、たまたま、そのスレッドの後に書いた者であって、みなさんのおかげで出来上がったものなのです。 つまり、B列であって、B列でないことも考慮してなくてはならないっていうことなのですね。(たぶん……) Do While 1 < r.Row And (IsNull(Cells(r.Row, "B").Value) Or Cells(r.Row, "B").Value = 0) Set r = Cells(r.Row - 1, r.Column) それは、ともかくとして、 tabtab9さんへ 実は、私は、なんとなく、自分の書いたものに満足できていないのです。それは、セルを1つずつ調べるのは、少なくとも、最善手ではありません。それで、猶予を与えていただいたので、もう一度、ご質問を読み直してみて、 >オートフィルタでの処理も考えましたが、必要な0までもフィルタされます。 というのをヒントに作ってみました。この方が、納まりがよく格好が良いし、私らしいコードです。巨大なデータになった時に、おそらく、かなりの速度の違いが出るはずです。うまくいくかは分りませんが。 Sub getMyRange5()   Dim r As Range   Application.ScreenUpdating = False   With ActiveSheet.Range("A1").CurrentRegion    .AutoFilter field:=.Columns.Count, Criteria1:="<>0"    Set r = .Cells(65536, .Columns.Count).End(xlUp)    .AutoFilter    Range("A1", r).Select   End With   Set r = Nothing   Application.ScreenUpdating = True End Sub

tabtab9
質問者

お礼

Wendy02さん、こんばんは。 ヒントになんて・・・ うそでも悪い気がしません。 ぼくにとっては、ある意味 雲の上のひとだったので・・・ ごめんなさいです。ちょっと冷静に なれません。 これからもよろしくお願いいたします。

tabtab9
質問者

補足

>つまり、B列であって、B列でないことも考慮してなくてはならないっていうことなのですね。(たぶん……) すみません。そこまで高尚な考えは持ち合わせていなかったです。分かりやすい例えが例えを生んだ結果です。 ホントにすみませんでした。

その他の回答 (3)

  • galoon
  • ベストアンサー率28% (38/133)
回答No.3

ANo.1 galoon です。 ダメでしたか、失敬。 後学のため全ロジックを一応載せておきます。 Sub getMyRange3() Dim r As Range With ActiveSheet.Range("A1").CurrentRegion Set r = Cells(65536, .Cells(.Cells.Count).Column).End(xlUp) Do While 1 < r.Row And (IsNull(Cells(r.Row, "B").Value) Or Cells(r.Row, "B").Value = 0) Set r = Cells(r.Row - 1, r.Column) Loop Range("A1", r).Select End With Set r = Nothing End Sub では。

tabtab9
質問者

お礼

なんだか、お偉方の登場で完全に僕は 面食らっています。galoonさんも、あ のgaloonさんだし・・・ うれしいのと、申し訳なさでいっぱいです。 どうもありがとうございました。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんにちは。Wendy02です。 Sub getMyRange4() Dim rng As Range Dim i As Long Dim c As Range  With ActiveSheet.Range("A1").CurrentRegion   Set rng = .Columns(.Columns.Count)   For i = rng.Rows.Count To 1 Step -1    If rng.Cells(i).Value <> 0 _     And rng.Cells(i).Value <> "" Then     Set c = rng.Cells(i)     Exit For    End If   Next i   If Not c Is Nothing Then   Range("A1", c).Select   End If  End With  Set rng = Nothing: Set c = Nothing End Sub 注:B列まで限定というと、今回のコードは正確ではありません。あくまでも、領域の右端下から検索します。 この手のものは、いくつか案が出てくるはずですから、いくつかご自身のサンプルを作って試してみるとよいですね。後は、疑問に思うことは、ヘルプでチェックしておいたほうがよいです。1度では、とても覚えられないと思いますが、何度か出会うとなんとなく分ってきます。 それと、どういう考え方(ロジック)で作られているか、考えてみるとよいと思います。

tabtab9
質問者

お礼

すごーいです。 わがままな上にわがままを重ねてしまいました。 今度こそ、これで十分です。 ありがとうございました。 うれしいです。 P.S.galoonさんの記述も今、試みています。

tabtab9
質問者

補足

Wendy02さん、すみません。 処理的にはWendy02さんのおかげで、期待の結果を得ることができました。 >この手のものは、いくつか案が出てくるはずですから、 というお話や、”できたのでもういい”、という気持ちは、みなさんに申し訳無いというのと、僕もイヤなので、もうちょっとだけ開けさせてください。

  • galoon
  • ベストアンサー率28% (38/133)
回答No.1

取得した r を元にして B 列の値が 0 であるかぎり r を上にずらしていって 0 以外の値がある一を探してみればいかがですか? Set r = Cells(65536, .Cells(.Cells.Count).Column).End(xlUp) Do While 1 < r.Row And (IsNull(Cells(r.Row, "B").Value) Or Cells(r.Row, "B").Value = 0) Set r = Cells(r.Row - 1, r.Column) Loop ちょっと処理に時間がかかる場合もありますけどね(^^;

tabtab9
質問者

補足

ありがとうございます。 今、実行してみました。 説明不足が原因だと思います。 実行したら、全件が範囲になりました。 申し訳ありません。