• ベストアンサー

VBAで範囲指定するのですが・・・

VBA初心者です。 表題にあるようにあるエクセルデーターの範囲を指定したいのですが、 次の条件では範囲特定させるのはやっぱり無理でしょうか。 説明だけでは分かりにくいと思うので添付データーもご参照のうえアドバイスお願いします。 ・列は一定。 ・行は不定。例で言うとイベント数は増えたり減ったり。 ・イベントに対してaaa・bbb・cccが対象であるかどうかを●で表示する。 ・イベントのない枠はゼロ表示される。 ・選択したいセルの横にも文字列がある。 普通ならRange("A1", Cells(Worksheets("Book1").Rows.Count, 4).End(xlUp)) みたいな感じで範囲指定なんですかね? ただ、●が付いたりつかなかったりで右端のセルの特定がそれによって左右されますよね。 たとえば、イベントCのcccに●がついていれば上記の範囲指定で"D6"をえらんでくれるのですが、●が付いていないとき"D5"を右端のセルとして認識して6列を範囲にいれてくれないですよね。 なにかいい方法ないですか? 例えば"0"をValueと認識させない方法があれば、Range("A1", Cells(Worksheets("Book1").Rows.Count, 1).End(xlUp).offset(3,1))とできると思うのですが、そんなこと可能なのかまったくわかりません。 添付データーの黄色の部分を選択したいということです。 よろしくお願いします。

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

  • ベストアンサー
回答No.1

まずは デジカメでの撮影お疲れさんです。 次回は([Alt]+)[PrintScreen]キーを活用しましょう。 画面がコピーされます(ハードコピー) で VBAはあまり得意ではないのですが、偶数範囲までなら Sub Macro1()   Dim a As Long   a = Cells(Rows.Count, 4).End(xlUp).Row   If a Mod 2 = 1 Then a = a + 1   Range("A1:D" & a).Select End Sub でどうでしょうか

daiettosur
質問者

お礼

画像の貼り方ありがとうございます。 知らないなりにこんな画像でも貼っていたらだれか突っ込んでくれるかな、と思っていましたが早速ですね。 で、この式は有効そうなので、実地に活かせるか試してみます。

その他の回答 (4)

  • takana_
  • ベストアンサー率44% (21/47)
回答No.5

答えそのものではないですが、使えそうな関数のサンプルとして Intersect(Range("A1").CurrentRegion, Range("A:D")) Intersect(A,B)は、AにもBにも含まれるセル範囲を取得します CurrentRegionは空白行と空白列で囲まれたセル範囲を取得します

daiettosur
質問者

お礼

これはちょっと難しいですね。 関数の意味を理解するのに手間取っています。 勉強させていただきます。

  • rukuku
  • ベストアンサー率42% (401/933)
回答No.4

はじめまして #3のDOUGLAS_さんと全く同感です。 添付の図をみて、最初に「E列は使えないの?」と思いました。 ただ、E列にの7行目以降にも関数や値が入っているけれど、表示させないようにしているだけだと使えませんが。 その他の方法としては、 B列の奇数行がイベントがある枠は「必ず」なにか入っていて、イベントがない枠は「必ず」なにも入っていない、ならば、B列が使えます。 また、A列の0が入っている行がそう多くないなら、 [A65536].End(xlUp).Row を使って、データの入っている最後の行を取得したら、1,3,5,7,9と上から順にA列の奇数行が0でないか確認していっても、そんな時間はかからないと思います。

daiettosur
質問者

お礼

考え方というのはいろいろあるものですね。 参考にさせていただいて、有効なVBAを組んでみます。

  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.3

>添付データーの黄色の部分を選択したい とのことですが、その右側のE列には必ずデータが入っているのでしたら、 Range("A1:D" & Range("E65536").End(xlUp).Row).Select みたいな感じで選択できますが。。。

daiettosur
質問者

お礼

すみません、D列も数字はランダムに入ります。

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.2

おっしゃることが非常にわかりずらいのですが、要はA列が0でないところまでのA~D列を選択すればいいのですか? ならば、最初の0の位置を取得してその上の行まで選択します。 Sub test01() Dim r As Long r = Application.WorksheetFunction.Match(0, Range("A:A"), 0) Range("A1:D" & r - 1).Select End Sub

daiettosur
質問者

お礼

ありがとうございます。 参考にして試してみます。

関連するQ&A