エクセルのvbaで最終行を取得する並び替え

このQ&Aのポイント
  • エクセルのvbaを使用して、最終行を取得する並び替えの方法について学びたいです。
  • マクロの記録を使って、F列→M列→J列の順に優先してA列からAL列を昇順に並び替えるvbaを作成しましたが、10000行までという書き方になってしまいました。
  • 最終行を取得する方法を教えていただきたいです。
回答を見る
  • ベストアンサー

エクセルのvba(最終行を取得する並び替え)

初めまして、エクセルのvbaについて質問をさせてください。 マクロの記録を使って、以下の通りF列→M列→J列の順に優先して、A列からAL列を昇順に並び替えるvbaを作成したのですが、10000行までとう不恰好な書き方になっています。最終行までという書き方に変えたいのですが、色々試したもののうまくいきません…!この場合、最終行を取得するにはどのような書き方にすれば良いのでしょうか…??(T-T) '並び替え ActiveWorkbook.Worksheets("当月").Sort.SortFields.Clear ActiveWorkbook.Worksheets("当月").Sort.SortFields.Add Key:=Range("F2:F10000"_ ), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _ xlSortTextAsNumbers ActiveWorkbook.Worksheets("当月").Sort.SortFields.Add Key:=Range("M2:M10000"_ ), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal ActiveWorkbook.Worksheets("当月").Sort.SortFields.Add Key:=Range("J2:J10000"_ ), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("当月").Sort .SetRange Range("A1:AL10000") .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With

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

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

こんにちは。 最終行を求める方法は幾つかありますが、今回紹介するのは、  連続領域の最後のセルの行位置 です。 イメージし易いように、手作業で行った場合の手順  [A1]を選択  Ctrl+A キーを押して連続領域を選択  Ctrl+Shift+Enter キーを押して連続領域の最後のセルを選択  この時[名前ボックス](数式バー左)に表示されるアドレスを見て [AL10000]のように表示された数字部分が、求めたい最終行になります。 最終行を求めた数値を一旦"変数"(nLastRow)に格納します。 求めた最終行を  "F2:F" & nLastRow のような形で、セル範囲参照文字列に連結します。 With ステートメントを整理して、見易く書き換えます。 同じ"オブジェクト"を参照する記述が断続的に並んだ場合には、 コードを読み易く → 後から編集し易く、 且、多少のパフォーマンス向上を望める書き方です。 "With ステートメント"、"With ブロック"、"With フレーズ" など、それぞれ"VBA "とアンド検索する等して 調べて確認しておいてください。 ' ' // Sub Re9336028a() Dim nLastRow As Long   With ActiveWorkbook.Worksheets("当月").Range("A1").CurrentRegion     nLastRow = .Cells(.Cells.Count).Row   End With   With ActiveWorkbook.Worksheets("当月").Sort     With .SortFields       .Clear       .Add Key:=Range("F2:F" & nLastRow), SortOn:=xlSortOnValues, _         Order:=xlAscending, DataOption:=xlSortTextAsNumbers       .Add Key:=Range("M2:M" & nLastRow), SortOn:=xlSortOnValues, _         Order:=xlAscending, DataOption:=xlSortNormal       .Add Key:=Range("J2:J" & nLastRow), SortOn:=xlSortOnValues, _         Order:=xlAscending, DataOption:=xlSortNormal     End With     .SetRange Range("A1:AL" & nLastRow)     .Header = xlYes     .MatchCase = False     .Orientation = xlTopToBottom     .SortMethod = xlPinYin     .Apply   End With End Sub ' ' // 因みに、今回の課題の例のように、  1行めがタイトル行、の場合の、並べ替え については、 仮に、最終行を指定することなく、 それぞれ列全体を範囲として指定しても、 処理の過程、処理の結果、 すべて全く同じことになりますので、 省略した形で、以下のような書き方も出来ます。 ' ' // Sub Re9336028()   With ActiveWorkbook.Worksheets("当月").Sort     With .SortFields       .Clear       .Add Key:=Range("F:F"), SortOn:=xlSortOnValues, _         Order:=xlAscending, DataOption:=xlSortTextAsNumbers       .Add Key:=Range("M:M"), SortOn:=xlSortOnValues, _         Order:=xlAscending, DataOption:=xlSortNormal       .Add Key:=Range("J:J"), SortOn:=xlSortOnValues, _         Order:=xlAscending, DataOption:=xlSortNormal     End With     .SetRange Range("A:AL")     .Header = xlYes     .MatchCase = False     .Orientation = xlTopToBottom     .SortMethod = xlPinYin     .Apply   End With End Sub ' ' // マクロの記述の内、行末にある" _"(半角スペースとアンダーバー) の半角スペース1文字分は書き換えることなく、そのままにして下さい。 質問文中にご提示されたサンプルコードは所々スペースが消えていて "構文エラー"を招くものになっています。 これからのこととして、マクロを扱う時は、 ご自身で何を書いてあるのか解らないものを動かすことがないように、 記述の意味を少しずつでも、確かめるようにしてください。 頑張ってください。

osashi
質問者

お礼

ご丁寧に回答いただいてありがとうございました(=^x^=)とても助かりました…!

その他の回答 (1)

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

http://officetanaka.net/excel/vba/cell/cell10.htm などを読んでください。 エクセルVBAの基本の中級必須知識。 ある列だけに注目してよい場合(範囲の下辺が凸凹でない場合)では Sub test04() lr = Range("A1000").End(xlUp).Row MsgBox lr End Sub が便利かな。 ーーー CurrentRegion法 Sub test3() Range("A2").Select Range("A2").CurrentRegion.Select 'Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select MsgBox Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Address End Sub -- UsedRange法 略 ーー Lastrow法、」Lastcell法など Googleで照会のこと。 ーー 考えている範囲の間に空白行や空白列がないか注意が必要です。 End(xlup)では心配いりません。 ーー Googleで「END(xlup)」で照会せよ。 最終行・最終列の取得方法(End,CurrentRegion,SpecialCells,UsedRange) など、たくさん記事があるよ。

osashi
質問者

お礼

ご丁寧にありがとうございました★(*^o^*)回答いただけてとてもありがたかったです!

関連するQ&A

  • VBA エクセルでオートフィルタをされているデータ

    エクセルでオートフィルタをされているデータを 昇順で並べ替えするコードを取得したのですが ActiveWorkbook.Worksheets("置換").AutoFilter.Sort.SortFields.Clear ActiveWorkbook.Worksheets("置換").AutoFilter.Sort.SortFields.Add Key:=Range("A1:A5203"), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("置換").AutoFilter.Sort .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With なのですが どれが並べ替えのコードなのでしょうか? ActiveWorkbook.Worksheets("置換").AutoFilter.Sort.SortFields.Clear これはオートフィルタの並べ替えを解除するコードだと思いますが ActiveWorkbook.Worksheets("置換").AutoFilter.Sort.SortFields.Add Key:=Range("A1:A5203"), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal これは何のコードでしょう?

  • エクセルVBAでデータ並べ替え

    マクロ記録をとると次のようになりました。 これをA列をキーに並べるもっと簡単なコードを教えてください。 Range("A2:G501")となっていますが、これ以上でも対応できるようにしたいです。 どなたか教えていただけないでしょうか。 Sub Macro1() Range("A1").Select ActiveWorkbook.Worksheets("***").Sort.SortFields.Clear ActiveWorkbook.Worksheets("***").Sort.SortFields.Add Key:=Range("A1"), SortOn _ :=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("***").Sort .SetRange Range("A2:G501") .Header = xlNo .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End Sub

  • ワードVBAからエクセルのソートができない

    こんにちは MS Word 2007から条件に合う語を抜き出してエクセルに貼り付けた後、ソートをするマクロを書いているのですが、ソートの部分で「型が一致しない」というエラーが出てしまい困っています。エクセルのVBAでは問題なく動作しています。 次がエクセルVBAで作ったソートのVBAです。 ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("A1"), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("Sheet1").Sort .SetRange Range("A1:A6") .Header = xlNo .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With これをWord VBAに貼り付けて、一部を変更しました。 myExcel.workbooks(BookName).sheets(1).Sort.SortFields.Clear myExcel.workbooks(BookName).sheets(1).Sort.SortFields.Add Key:=Range("A1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With myExcel.workbooks(BookName).sheets(1).Sort .SetRange Range("A1:A6") .Header = xlNo .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With myExcelは事前に作成したExcelオブジェクトです。BookNameは作成したブックのファイル名です。2行目「myExcel.workbooks(BookName).sheets(1).Sort.SortFields.Add Key:=Range("A1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal」でエラーになります。 「型が一致しない」と表示されます。ちょこちょこ書き換えているのですがエラーは解消されません。 Windows 7/8 64bit Word 2007. Excel 2007 解決策をご存じでしたら教えてください。

  • エクセルの並べ替えをマクロで

    知識が無くなかなか解決しません。教えて下さい。 エクセル(2000)のマクロの記録で並べ替えを記録すると下記の様になりました。 Range("A1:M57").Select ActiveWorkbook.Worksheets("表2").Sort.SortFields.Clear ActiveWorkbook.Worksheets("表2").Sort.SortFields.Add Key:=Range("C2:C57"), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal ActiveWorkbook.Worksheets("表2").Sort.SortFields.Add Key:=Range("D2:D57"), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("表2").Sort .SetRange Range("A1:M57") .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With Range("A2").Select End Sub 次のように改良する方法を探しています。 (1)Range("A1:M57").Select → 表によって行数が違う為、行数とおりに範囲選択したい。 M65536とすれば良いのかもしれませんが、パソコンの処理能力が低く、なるべく負担が掛からない様にしたいのですが。列数はA列からM列の限定です。 (2)ActiveWorkbook.Worksheets("表2")  → ("表2")限定ではなく他のシート名でも並べ替えが出来る様にするにはどのようにすれば良いのでしょうか。 いろいろ試しましたがうまく出来ません。お知恵をお貸し下さい。よろしくお願い致します。

  • エクセルVBA

    よろしくお願いいたします。 エクセルのVBAですが、下記のコードを実行すると処理が遅いです。処理が早くなるコード教えてください。 よろしくお願いいたします。 Sub Macro3() Dim aa As Variant Dim i As Variant Application.ScreenUpdating = False Range("A14:i46").Select aa = ActiveSheet.Name ActiveWorkbook.Worksheets(aa).Sort.SortFields.Clear ActiveWorkbook.Worksheets(aa).Sort.SortFields.Add Key:=Range("B15:B46"), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal ActiveWorkbook.Worksheets(aa).Sort.SortFields.Add Key:=Range("C15:C46"), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets(aa).Sort .SetRange Range("A14:i46") .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With For i = 0 To 31 Cells(15 + i, 7).Select If Selection.Value = 0 Then Selection.EntireRow.Hidden = True End If Next i Range("A1").Select Application.ScreenUpdating = True End Sub

  • エクセルのマクロ記録を他のシートでも実行したい

    エクセル2010を使用しています。 シート1でマクロ記録を使用しデータの並び替えをし、 同じブック内にシート1をコピーしてシート2としました。 このシート2でもシート1で行ったデータの並び替えをしたいのですが シート2ではマクロは実行されませんでした。 わからないながらもVBAを見たところ下記のように 記述されおりましたが、どのような修正をすればよいかご教授いただけると助かります。 ちなみに、シート1でマクロを記録し、そのシートを同ブック内に複数コピーして それぞれのシートでマクロを実行させるということを考えています。 Sub Macro1() ' ' Macro1 Macro ' ' Range("A11:Q17").Select ActiveWorkbook.Worksheets("1").Sort.SortFields.Clear ActiveWorkbook.Worksheets("1").Sort.SortFields.Add Key:=Range("B11:B17"), _ SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:="日,月,火,水,木,金,土" _ , DataOption:=xlSortNormal ActiveWorkbook.Worksheets("1").Sort.SortFields.Add Key:=Range("A11:A17"), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("1").Sort .SetRange Range("A11:Q17") .Header = xlGuess .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End Sub

  • 複数シートでしょう可能なマクロ作成法

     マクロ初心者です。お教えください。  マクロを用いてデータ処理を行っています。1月のシートを用いてマクロ作成をすると、プログラムの 途中ですが以下のようになります。    Application.CutCopyMode = False ActiveWorkbook.Worksheets("1月").Sort.SortFields.Clear ActiveWorkbook.Worksheets("1月").Sort.SortFields.Add Key:=Range("R13"), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("1月").Sort  この1月限定部分を変更して12ヶ月のいずれの月でも使用可能にしたいのですが、  どのように変更すべきかお教えください。  よろしくご教授ください。  

  • 【Excel2010マクロ】シート名を固定したくな

    マクロには全然詳しくないので、マクロの記録を利用して下記のようなデータの並び替えのマクロを作成したのですが、sheet名が「Sheet2」(大文字小文字区別無し)じゃないとマクロが動きません。 -------------------- Sub 並び替え() ' ' 並び替え Macro ' ' Columns("A:A").Select Columns("A:AR").Select With ActiveWorkbook.Worksheets("Sheet2").Sort .SortFields.Clear .SortFields.Add Key:=Range("AN:AN"), Order:=xlAscending, DataOption:=xlSortNormal .SortFields.Add Key:=Range("AC:AC"), Order:=xlAscending, DataOption:=xlSortNormal .SortFields.Add Key:=Range("AD:AD"), Order:=xlAscending, DataOption:=xlSortNormal .SortFields.Add Key:=Range("AF:AF"), Order:=xlAscending, DataOption:=xlSortNormal .SortFields.Add Key:=Range("AG:AG"), Order:=xlAscending, DataOption:=xlSortNormal .SortFields.Add Key:=Range("AH:AH"), Order:=xlAscending, DataOption:=xlSortNormal .SortFields.Add Key:=Range("AJ:AJ"), Order:=xlAscending, DataOption:=xlSortNormal .SortFields.Add Key:=Range("AK:AK"), Order:=xlAscending, DataOption:=xlSortNormal .SortFields.Add Key:=Range("AN:AN"), Order:=xlAscending, DataOption:=xlSortNormal .SetRange Range("A:AR") .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End Sub -------------------- マクロを実行するsheet名は都度変わりますので、sheet名を固定しなくてもデータを並び替えられるようにするには、どのようにしたらよろしいのでしょうか?

  • Excelマクロを任意のワークシートで走らせるには

    ソーティングの一連の作業をマクロに記録して、別のワークシート上では走らせたら再現しませんでした。記録内容を確認すると、どうやらもともとの作業を記録したワークシートを指定しているようでした。 具体的には、以下の様なコマンドでワークシート「hogehoge01」が指定されているように思います。 ActiveWorkbook.Worksheets("hogehoge01").Sort.SortFields.Clear ActiveWorkbook.Worksheets("hogehoge01").Sort.SortFields.Add Key:=Range( _ "K2:K679"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _ xlSortNormal 実際には、hogehoge01をテンプレートにした別の任意のワークシートで走らせたいのですが、 なにか対策はありますでしょうか。 よろしくお願いします。

  • マクロ 並び替え エラーがでる

    マクロの記録で以下のようなマクロを作りましたが、実行するとエラー91「オブジェクト変数またはブロック変数が設定されていません」とでます。どう直したらよいでしょうか? Sub Macro6() Columns("A:L").Select Selection.AutoFilter ActiveWorkbook.Worksheets("Sheet1").AutoFilter.Sort.SortFields.Clear ActiveWorkbook.Worksheets("Sheet1").AutoFilter.Sort.SortFields.Add Key:=Range _ ("A1:A497"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _ xlSortNormal With ActiveWorkbook.Worksheets("Sheet1").AutoFilter.Sort .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With Range("B2").Select End Sub

専門家に質問してみよう