実践!Excelマクロ ~現金出納帳を日付順に並び替えてみよう!~

前回に引き続き、現金出納帳を例に、「実践!Excelマクロ」をアップします。
今回は変動するセルの範囲を指定して、並べ替え(ソート)を行った後にセルの計算式を再度セットする一連の流れをマクロ化してみます。それでは早速トライしてみましょう!

現金出納帳を日付順に並び替えるには

この手の表でよく使われるExcelの機能が並べ替え(ソート)です。データを後で追加した場合などバラバラになったデータを並べ替えたい時に大活躍する便利な機能です。

しかし、並べ替えるセルの範囲を毎回指定して並べ替えた後、計算式が正常か確認したり、参照するセルがずれてしまい計算式をコピペしなければいけなかったりと、意外に面倒だったりします。

こんな場合こそマクロを使って一発で並べ替えを実行したいものですよね?
と、言う事で今回は前回の現金出納帳を例に並べ替え(ソート機能)をマクロで実装してみましょう!

ちなみに並べ替えの際に気をつけるべき点は以下の通りです。

並べ替え

  • 並び替え(ソート)により残高の計算式が正常に機能しない可能性がある
  • 行数は挿入機能により最終行は変動する
  • 繰越残高より上の行(4行目より上)は並べ替え(ソート)の対象外とする
  • 最終行の合計欄は並べ替え(ソート)の対象外とする

並べ替えのVBAコードについて

前段の注意点をクリアするために以下の条件でマクロを作成しましょう。

  • 並べ替え(ソート)のセル範囲はA5から最終行の1つ上のF列までとする
  • 並べ替え(ソート)終了後、残高の計算式をセットし直す

■並べ替えボタンにセットするVBAコードは以下の通りです。

Sub orderby_Click()
    Dim wLastGyou As Long
    Dim wSheetName As Variant
    Dim i As Long

    'アクティブなシート名を取得
    wSheetName = ActiveSheet.Name

    '最終行番号を取得
    wLastGyou = Worksheets(wSheetName).UsedRange.Rows.Count

    '並べ替え(ソート)を実行する
    Range("A5:F" & wLastGyou - 1).Sort _
        Key1:=Range("A5"), _
        Order1:=xlAscending, _
        Header:=xlNo

    '残高の計算式を再セットする
    For i = 5 To wLastGyou - 1  '5行目から合計欄の1行上まで指定
        Range("F" & i).Formula = _
            "=IF(OR(D" & i & "<>" & Chr(34) & Chr(34) & ",E" & i & "<>" & Chr(34) & Chr(34) & "),$F$4 +SUM($D$5" & ":D" & i & ")-SUM($E$5" & ":E" & i & ")," & Chr(34) & Chr(34) & ")"
    Next i

End Sub

VBAコードの解説

10行目で並べ替え(ソート)を行う範囲を設定する為、最終行を.UsedRange.Rows.Countで取得します。

並べ替え(ソート)は13行目~17行目で実行しています。
指定しているRange.Sort メソッドの使用方法やパラメータについてはmsdnのRange.Sort メソッドをご参考下さい。

最後に19行目~22行目で残高の数式(Range.Formula プロパティ)を再度設定し、並び替え(ソート)によるセルの参照のずれを無くします。

以上、説明が手抜き過ぎて解説になっていないと怒りの指摘が入りそうですが・・・今回はここまでにさせていただきます・・・。
詳しくはサンプルファイルをダウンロードしてご確認ください。(前回の行挿入、行削除も含んでいます)

今回のサンプルファイルは以下のリンクからダウンロード可能です。

関連エントリー