- ベストアンサー
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も同じように処理したいのですが・・・・ よろしくお願いします
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
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 こんな感じとか?
その他の回答 (4)
- rukuku
- ベストアンサー率42% (401/933)
はじめまして VBAだけでは、最初にFindで見つけたら、後は1行ずつチェックしていく方法しか思いつきません。 そこで、関数を併用した別解です。 C1に =IF(A1="b1",ROW(),"") と入力し、データのある最後の行までオートフィルしておけば、 WorksheetFunction.Min ([C:C]) で最初の行 WorksheetFunction.Max ([C:C]) で最後の行 が取得できます。
- imogasi
- ベストアンサー率27% (4737/17069)
こういう場合の考え方として、質問のような考え方をするのはまれで、上行から最初の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 のような解説は有るが詳しく見てないが。
補足
ありがとうございます A列は並び替え行われていますので a1のかたまり b1のかたまりとあります。 その範囲がファイルごとに異なるために 範囲を探し出し B列の並べ替えを実施したいのです
- n-jun
- ベストアンサー率33% (959/2873)
#2です。 ところで並び替えならA列・B列を選択して、データ>並び替えで、 ・最優先されるキーをA列:昇順 ・2番目に優先されるキーをB列:昇順or降順 で出来ますが、それとは違うのでしょうか? ちなみにExcel2007はわかりませんけど。
補足
ありがとうございます。 細かく申しますとシートの20行目以下にa1 b1 c1 とあるのですが それぞれの量が不定のために始まりも終わりも都度異なるのです そのため、それぞれが判明すればその範囲での範囲選択を行い 並びかえを実施したいのです。
- hallo-2007
- ベストアンサー率41% (888/2115)
行番号でよければ Sub Sheet3_ボタン1_Click() MsgBox WorksheetFunction.Match("b1", Columns(1), False) MsgBox WorksheetFunction.Match("b1", Columns(1), True) End Sub こんな感じは如何でしょうか。
お礼
ありがとうございます このやり方で出来ます Find("b1", lookat:=xlWhole,After:=Range("A" & Rows.Count))を入れて完全一致にしました。 また続きの質問がでてきたのですが 別途作ります