• ベストアンサー

VBAでの範囲選択 並び替え

いつもお世話になっています。 早速ですが   A  B   1 a1  10 2 a1  11 3 a1  12 4 b1  15 5 b1  13 6 b1  11 7 c1  80 とある場合 Cells.Find("b1") で始まりを見つけることは出来ると思うのですが b1の終わり(これではA6)を どうすれば取得できるのでしょうか? end(xlUp)では A列の最終行になりますし・・・・ 選択後B列を並び替えを実施したいのです またc1も同じように処理したいのですが・・・・ よろしくお願いします

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

  • ベストアンサー
  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.2

A列が並び替えられているとして(A6以下にb1は存在しない)。 Sub try() Dim r As Range Dim rr As Range Set r = Columns("A").Find("b1", After:=Range("A" & Rows.Count)) Set rr = Columns("A").Find("b1", After:=r, Searchdirection:=2) MsgBox Range(r, rr).Address End Sub こんな感じとか?

hou66
質問者

お礼

ありがとうございます このやり方で出来ます  Find("b1", lookat:=xlWhole,After:=Range("A" & Rows.Count))を入れて完全一致にしました。  また続きの質問がでてきたのですが 別途作ります

その他の回答 (4)

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

はじめまして VBAだけでは、最初にFindで見つけたら、後は1行ずつチェックしていく方法しか思いつきません。 そこで、関数を併用した別解です。 C1に =IF(A1="b1",ROW(),"") と入力し、データのある最後の行までオートフィルしておけば、 WorksheetFunction.Min ([C:C]) で最初の行 WorksheetFunction.Max ([C:C]) で最後の行 が取得できます。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.4

こういう場合の考え方として、質問のような考え方をするのはまれで、上行から最初のb1をFindナリで見つけ、後はそれ以下の行についてFindNextで見つけるを繰り返すというやり方が定番でしょう。 VBAコードは、「Find VBA」でWEB照会すること。 VBAで一発で最終を見つける(架空で言えばReverseFindのような)ものはありません。 ー 逐次下行から上行にIF文でb1を探す他ないと思う。 ーー 検索範囲を狭めて、MATCH関数(WorkSheetFunction.Match)を尺取虫的に適用する方法もあろう。 ーー 関数でなら(配列数式ですが) 例データA1:A9) a a d s f a d a s ーー =MAX(IF(A1:A10="a",ROW(A1:A10),0)) と入れて SHIFT,CTRL,ENTERのキーを同時押しする。 結果 8 詳しく考えてないが、SUMPRODUCT関数でも出来るかも知れない。 ーー 上記について これを直VBA化は、あまり勉強したことが無い。 (配列数式のような神がかり的やり方を避けるために小生はVBAを使っているから) http://www.moug.net/tech/exvba/0040052.htm のような解説は有るが詳しく見てないが。

hou66
質問者

補足

ありがとうございます A列は並び替え行われていますので a1のかたまり b1のかたまりとあります。 その範囲がファイルごとに異なるために 範囲を探し出し B列の並べ替えを実施したいのです

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.3

#2です。 ところで並び替えならA列・B列を選択して、データ>並び替えで、 ・最優先されるキーをA列:昇順 ・2番目に優先されるキーをB列:昇順or降順 で出来ますが、それとは違うのでしょうか? ちなみにExcel2007はわかりませんけど。

hou66
質問者

補足

ありがとうございます。 細かく申しますとシートの20行目以下にa1 b1 c1 とあるのですが それぞれの量が不定のために始まりも終わりも都度異なるのです そのため、それぞれが判明すればその範囲での範囲選択を行い 並びかえを実施したいのです。

  • hallo-2007
  • ベストアンサー率41% (888/2115)
回答No.1

行番号でよければ Sub Sheet3_ボタン1_Click() MsgBox WorksheetFunction.Match("b1", Columns(1), False) MsgBox WorksheetFunction.Match("b1", Columns(1), True) End Sub こんな感じは如何でしょうか。

関連するQ&A