• ベストアンサー

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も同じように処理したいのですが・・・・ よろしくお願いします

  • hou66
  • お礼率50% (79/155)

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

  • ベストアンサー
  • 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/17068)
回答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

  • 【VBA】範囲選択し降順で並び替え

    A列の最初の行から、F列の最終行迄を範囲選択し、C列降順で並べ替えをしたいです。最終行は、C列の最終行を指定します。 下記、「Rangeから始まる行」でエラーとなる為、ご教示宜しくお願いします。 Sub 使用頻度で並べ替え() Dim FastRow As Integer Dim LastRow As Integer FastRow = Cells(1, 1).End(xlDown).Row LastRow = Range("C" & Rows.Count).End(xlUp).Row Range("A & FastRow:F" & LastRow).Sort Columns("C"), xlDescending, Header:=xlNo End Sub

  • エクセル 全通り出力

    Sub test01() a = Cells(Rows.Count, "A").End(xlUp).Row 'A列最終行取得 b = Cells(Rows.Count, "B").End(xlUp).Row 'B列最終行取得 For i = 1 To a '1行からA列最終行まで繰り返し For n = 1 To b '1行からB列最終行まで繰り返し x = x + 1 Cells(x, "C") = Cells(i, "A") & " " & Cells(n, "B") 'C列に結合して転記 Next n Next i End Sub こちら過去の解答にあったのですが、a,b,c,dに数字が入っていて、 Eに組み合わせを出力する場合どう変えればよいのでしょうか?

  • エクセル2003のVBAの範囲選択について質問です。

    エクセル2003のVBAの範囲選択について質問です。 OSはXPです。 Range("B1:C" & Range("A" & Cells.Rows.Count).End(xlUp).Row).Select この意味は、B1セルからC()の範囲指定をするのに、()をA列の最終行を探すことによって指定する、ということだと思います。いろいろなサイトを参照させてもらいました。 この場合のA列の最終行を探す方法は、A列のデータが歯抜けの場合に正しく探せないので、一旦最終行を探し、そこから上に見に行って最初にデータが入っている行を探している、で正しいと思います。 私が知りたいのは、逆に歯抜けの場合はそこを最終行として指定する方法です。つまり、一旦最終行を探し、上に見に行くのではなく、A列の上から下に見に行って、空白(歯抜け)が見つかったところを最終行と指定する方法です。xlDownを使うのだろう、というところまでは判ったのですが、どうにもその先が判りません。 歯抜けの場合の方がマイナーなのか、この方法を具体例を記載しているサイトを見つけることができませんでした。 よろしくお願いいたします。

  • 何列の何行目が最終行なのか取得するコードはありますでしょうか?

      A列  B列  C列 1  ○   ○ 2        ○ 3               ○ これは最終行が3行目と言うのがぱっと見でわかりますが もっと列も行も多い場合、 シート内の何列の何行目が最終行なのか取得するコードはありますでしょうか? Cells(65536, ?).End(xlUp).Row を行ないたいのですが 毎回何列の行が一番下かを取得する方法があれば教えてください。 よろしくお願い致します。

  • EXCEL VBA 取得したセルの列の最終行

    お客さんからいただいたEXCELフォーマットに沿って、集計ツールを作成していますが 下記でつまってしまいました。 Wb.Worksheets("Sheet1").Cells.Find("実施日").Select Sel_Col = Selection.Column Last_Row = Wb.Worksheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row ※1 For i = Last_Row To 2 Step -1 If Wb.Worksheets("Sheet1").Cells(Sel_Col, i).Value = Day Then ※2 If Wb.Worksheets("Sheet1").Cells(Sel_Col, i).Offset(-5).Value = "A" Then A_count = A_count + 1 ElseIf Wb.Worksheets("Sheet1").Cells(Sel_Col, i).Offset(-5).Value = "B" Then B_count = B_count + 1 ElseIf Wb.Worksheets("Sheet1").Cells(Sel_Col, i).Offset(-5).Value = "C" Then C_count = C_count + 1 End If Else End If Next i まず※1の箇所ですが、Sheet1の実施日と入力されているセルの列番号を取得して その列の最終行を取得したいのですが、上記作成したものですと入力されている列全部の 中での最終行が取得されてしまいます。 この場合、Sel_Col をどのように使えばよろしいでしょうか? 次に※2ですが、※1で取得した列の最終行から1つずつ上に上がりながら 日付が今日であれば、そのセルから5つ左のセルのA、B、Cいずれかを カウントするという造りにしたいと思っています。 実行すると1004エラーでアプリケーション定義、オブジェクト定義のエラーと 出てしまいます。 Wbはset Wbとして開いたブックを定義しています。 DayはDay = Dateで今日の日付を取得しています。 独学で無茶苦茶なコードですが、 どなたか詳しい方、ご教示お願いいたします。

  • VBAについて

    VBAで最終行を取得する際に、""などを無視するようにしたいのですが、どうすればよいのでしょうか? 最終行は以下のように取得しています。 GYOMAX_T = SH.Cells(65536, cnt).End(xlUp).Row すみませんが、よろしくお願いいたします。

  • エクセルVBA:範囲選択について

    初歩的な質問ですが、よろしくお願いします。 Excel2000です。 グラフを描くための範囲選択をしたいのですが、うまくいきません。 状況は、 ・列A、列Bにデータが入っている。(データの数はAB同じで2行以上) ・開始点は一定。(ここでは、行10と仮定します) ・終了点が変化する。(但し、終了点は常に一番下のデータ) これだけです。 一番下のデータを参照するので、 Range("A10 : Range("B10").End(xlDown)").Select Range("A10 : Range("B65536").End(xlUp)").Select Range("A10 : Cells(ActiveSheet.Rows.Count, 2).End(xlUp)").Select と書きましたが、全てダメでした。 直接書くのがダメなら変数を使おうと思い、 Dim StopCell as Range Set StopCell = Range("B65536").End(xlUp) Range("A10 : StopCell").Select と書きましたが、ダメでした。 このとき、変数StopCellには「セル」ではなく、「セルの値」が代入されているようです。 Valueと書いていないのに値が代入されていること、オブジェクト変数なのに数値が代入されていることが納得できません。 どこをどのように間違えているのでしょうか。 また、目的のマクロはどのようになるのでしょうか。 大村あつし著「かんたんプログラミングExcel2000VBA基礎編」および「同 コントロール・関数編」で勉強していますが解決しません。 ご教授ください。

  • (再)エクセル データ並び替え

    前回、こちらで質問させて頂いた者です。 http://okwave.jp/qa/q7917475.html 一度は解決したのですが、 エクセルの表を作り変える必要が出てきて、セルの位置などが変わってしまい、 教えていただいたマクロではエラーが出てしまって並び替えができなくなってしまいました。 前回:1行目がタイトル行     データは2行目以降(A・B列は2行ずつ結合) ↓ 変更:4行目がタイトル行     データは5行目以降(A・B・C列は2行ずつ結合)     少し変わっただけなので、このへんかな~と勝手に見当をつけて自分でマクロをいじってみたのですが、検討違いのようでエラーばっかりで直りません(T0T) (マクロはとっても苦手です・・) 下のマクロが、以前の質問で回答してくださった方から教えていただいたマクロなんですが、 ここのどこを変えれば、変更後の表に対応できるようになりますでしょうか? どなたか教えてください~(>_<) ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ Sub 並び替え() 'この行から Dim i As Long Application.ScreenUpdating = False 'セルの分割 For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row Step 2 With Cells(i, 1) .UnMerge .Offset(, 1).UnMerge .Offset(1) = Cells(i, 1) .Offset(1, 1) = Cells(i, 2) End With Next i Cells(1, 1).CurrentRegion.Sort key1:=Cells(1, 1), order1:=xlAscending, Header:=xlYes _ , key2:=Cells(1, 2), order2:=xlAscending, Header:=xlYes 'セルの再結合 For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row - 1 Step 2 Application.DisplayAlerts = False With Cells(i, 1) .Resize(2, 1).Merge .Offset(, 1).Resize(2, 1).Merge End With Next i Application.ScreenUpdating = True End Sub 'この行まで ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ また、わがままで申し訳ないのですが、グループごとに並び変えるときに、さらに名簿順になるように並び替えられると助かるのですが、何か文を追加することで、そういう並び替えになりますか? もし可能なら、それも教えて頂きたいです。 なにとぞ、よろしくお願いしますm(_ _)m

  • 【VBA】"オブジェクトが必要です"メッセージ出力

    VBAを使用し、A列に日付、B列に数量、C列に単価、D列に金額を入力し、 数量*単価にて、金額を求めるVBAを作成しています。 そこまでは上手くいくのですが、D列で求めた金額を最終行で合計する事で 躓いてしまっています。 行は常に追加され可変の為、最終行を「Cells(Row.Count, 1).End(xlUp).Row」 にて引っ張ってこようと思っております。以下のようなVBAを記載しましたが、 「オブジェクトが必要です」とのメッセージがでて、処理が上手くいきません。 どのような問題があるのか、お分かりの方、ご回答頂けますと幸いです。 ■環境  Windows7  Excel2010 ■VBA Sub test() Dim i As Long Dim j As Long Dim k As Long For i = 2 To Cells(Row.Count, 1).End(xlUp).Row Cells(i, 4) = Cells(i, 2) * Cells(i, 3) Next j = Cells(Row.Count, 1).End(xlUp).Row + 1 k = Cells(j, 1).End(xlUp).Row Cells(j, 4) = WorksheetFunction.Sum(Cells(2, 4), Cells(k, 4)) End Sub

  • マクロセルの値によってセルの色を消す

    エクセル2013です。 セルの値が0又は空白の場合でそのセルが色塗りされていたら色を消す というマクロをを作成しました。 ただ700行55列では処理が遅いです。 Sub 色消() '成功 Dim 最終行 Dim 最終列 Dim 対象セル As Range 最終列 = Cells(8, Columns.Count).End(xlToLeft).Column '8行目の最終列を取得 最終行 = Cells(Rows.Count, 1).End(xlUp).Row 'A列の最終行を取得 For Each 対象セル In Range(Cells(10, 17), Cells(最終行, 最終列)) If 対象セル.Value = 0 Or 対象セル = "" Then 対象セル.Interior.ColorIndex = 0 End If Next 対象セル End Sub 対象範囲から対象セルを全部見つけて一括処理すれば早いのではと 以下のマクロを作成してみましたが Set 対象範囲 = Cells.Find(What:=0 Or "", LookIn:=xlValues, LookAt:=xlWhole) で構文ERRです。 どこを直せばいいのでしょうか? よろしくお願いします。 Sub 色消2() '2014/8/4 '失敗 Dim 対象範囲 Dim 最終行 Dim 最終列 最終列 = Cells(8, Columns.Count).End(xlToLeft).Column '8行目の最終列を取得 最終行 = Cells(Rows.Count, 1).End(xlUp).Row 'A列の最終行を取得 対象範囲 = Range(Cells(10, 17), Cells(最終行, 最終列)) Set 対象範囲 = Cells.Find(What:=0 Or "", LookIn:=xlValues, LookAt:=xlWhole) If Not 対象範囲 Is Nothing Then 対象範囲.Interior.ColorIndex = 0 End If End Sub

専門家に質問してみよう