dポイントプレゼントキャンペーン実施中!

こんにちは。
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です

A 回答 (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

この回答への補足

>つまり、B列であって、B列でないことも考慮してなくてはならないっていうことなのですね。(たぶん……)

すみません。そこまで高尚な考えは持ち合わせていなかったです。分かりやすい例えが例えを生んだ結果です。
ホントにすみませんでした。

補足日時:2006/03/14 20:29
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/03/14 20:25

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

では。
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/03/14 20:28

こんにちは。

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度では、とても覚えられないと思いますが、何度か出会うとなんとなく分ってきます。

それと、どういう考え方(ロジック)で作られているか、考えてみるとよいと思います。

この回答への補足

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

補足日時:2006/03/14 13:14
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/03/14 12:59

取得した 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


ちょっと処理に時間がかかる場合もありますけどね(^^;

この回答への補足

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

補足日時:2006/03/14 13:09
    • good
    • 0

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