Excel VBAの並べ替えマクロを短く整理する方法|重複処理を減らして読みやすいコードに改善

Excel

Excel VBAでデータ整理を自動化する場合、処理内容が増えるにつれてコードが長くなりがちです。特に同じ範囲指定や条件式を何度も記述していると、修正やメンテナンスが難しくなります。この記事では、並べ替え処理や数式入力を行うVBAコードを例に、コードを短くするポイントや、可読性を保ちながら整理する方法について解説します。

VBAコードを短くする前に確認したいポイント

VBAのコードを短縮するときは、単純に文字数を減らすだけではなく、後から見たときに理解しやすい構造を維持することが重要です。

例えば、変数を減らしすぎたり、1行に処理を詰め込みすぎたりすると、一見短くても修正しにくいコードになります。そのため、頻繁に使う範囲やシートなどを変数化する方法が有効です。

今回のようなデータ加工と並べ替えを行うマクロでは、最終行取得、範囲指定、数式設定、ソート設定の重複を減らすことが短縮のポイントになります。

最終行取得と範囲指定をまとめる

元のコードでは、最終行を取得した後に何度も「Range(“G2:G” & r)」や「Range(“H2:H” & r)」などの範囲指定を行っています。

このような場合は、対象シートや最終行を変数として保持するとコードを短くできます。

例えば以下のように記述すると、同じシートを何度も参照する必要がなくなります。

Dim ws As Worksheet
Set ws = ActiveSheet
Dim r As Long
r = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

この後の処理も「ws.Range」と統一できるため、コード全体の見通しが良くなります。

数式入力部分を簡潔にする方法

Formulaプロパティへの代入は、複数行に分けることで読みやすくしていますが、短縮することも可能です。

ただし、文字列内のダブルクォーテーションが多い数式は、無理に1行化すると逆に分かりにくくなるため注意が必要です。

例えばG列への数式設定は、変数を利用すると以下のように整理できます。

ws.Range("G2:G" & r).Formula = "=SUBSTITUTE(SUBSTITUTE(A2,"" "",""""),"" "","""")&""|""&IF(C2="""",""法人"",TEXT(C2,""yyyymmdd""))"

数式自体が複雑な場合は、短さよりも修正しやすさを優先する方が安全です。

COUNTIFSの重複を減らしてH列計算を整理する

H列の計算では、同じ条件でCOUNTIFSを2回実行しています。この部分は処理の目的を変えずに整理できます。

現在の処理は「同じG列キーの中に延滞と未収が両方存在する場合に1を設定する」という内容です。

例えば、補助列を使わずに配列処理やDictionaryを利用すると、データ量が多い場合は高速化も期待できます。

ただし、数百行程度のデータであれば現在のCOUNTIFS方式でも十分実用的であり、無理に短縮する必要はありません。

Sort処理をWithでまとめて簡潔にする

並べ替え処理ではWithブロックを使用しているため、すでに比較的整理された書き方になっています。

さらに短くする場合は、対象範囲を変数化すると同じRange記述を繰り返さずに済みます。

例えば以下のようにできます。

Dim rng As Range
Set rng = ws.Range("A1:H" & r)
With ws.Sort
.SortFields.Clear
.SetRange rng
.Header = xlYes
.Apply
End With

SortFieldsの追加部分は条件が異なるため、省略しすぎるより現在の形を残した方が理解しやすい場合があります。

短縮例として整理したVBAコード

全体を整理すると、以下のように変数を活用して重複を減らした形にできます。

Sub 並べ替え()
Dim ws As Worksheet: Set ws = ActiveSheet
Dim r As Long: r = ws.Cells(ws.Rows.Count,"A").End(xlUp).Row

With ws
.Range("G2:G" & r).Formula = "=SUBSTITUTE(SUBSTITUTE(A2,"" "",""""),"" "","""")&""|""&IF(C2="""",""法人"",TEXT(C2,""yyyymmdd""))"
.Range("H2:H" & r).Formula = "=--(COUNTIFS(G$2:G$" & r & ",G2,F$2:F$" & r & ",""延滞"")*COUNTIFS(G$2:G$" & r & ",G2,F$2:F$" & r & ",""未収"")>0)"

With .Sort
.SortFields.Clear
.SortFields.Add ws.Range("H2:H" & r), , xlDescending
.SortFields.Add ws.Range("G2:G" & r), , xlAscending
.SortFields.Add ws.Range("F2:F" & r), , xlAscending, "延滞,未収"
.SetRange ws.Range("A1:H" & r)
.Header = xlYes
.Apply
End With
End With
End Sub

このようにすると処理内容は維持したまま、シート参照や範囲指定の繰り返しを減らせます。

まとめ|VBAは短さより管理しやすさを優先する

Excel VBAのコードは、短くすることだけを目的にすると逆に読みにくくなることがあります。

今回のようなデータ加工マクロでは、最終行や対象範囲を変数化し、同じ記述を減らすだけでも十分に整理されたコードになります。

特に業務で長期間使うマクロの場合は、数文字でも短くすることより、誰が見ても修正できる構造にすることが重要です。

コメント

タイトルとURLをコピーしました