top of page

【VBA】列順序の入れ替え処理

こんばんわ。

総額8万円の買い物をしました。

スーツ×2、スラックス

んー。これでチェックのエンカウント率が低くなります笑

どうでもよすぎるので、早速本題

表題、Excelの列順序を入れ替えるマクロのご紹介

Adwordsなど、日々システムが変わるせいで

出力されるcsvの列がいつのまにか変わっているなんてことが

日常頻繁に起きております。

レポート処理をVlookupなど、列に依存している関数で

行っておりますと、そりゃいつのまにか原因不明のエラーが

起きてしまいますし、人によって並び方を統一しなければならず

相当めんどくさいです。

そこで、列が入れ替わったり、増減しても

毎回決まった配置にする処理を作りました。

表はそれっぽく適当に作りましたが、

上記のようにバラバラになった列を

このように入れ替えます。

【準備】

別のシートに、配列したい順に書いておきます。

【スクリプト】

Sub 列修正()

Dim class

Dim LastRow

Dim i, j

Dim xxx

i = 1

With Worksheets("Sheet1")

 LastRow = .Cells(Rows.Count, 1).End(xlUp).Row

 class = .Range("A1:A" & LastRow)

End With

With Worksheets(5)

On Error GoTo myError

 For Each xxx In class

 j = WorksheetFunction.Match(xxx, .Rows(2), 0)

If i <> j Then

.Columns(j).Select

Selection.Cut

.Columns(i).Insert Shift:=xlToRight

End If

i = i + 1

Next xxx

End With

Exit Sub

myError:

 MsgBox "WorkSheet5の"&"行に" & xxx & "が存在しません"

End Sub

【解説】

今回の処理は、並び替えを1から数え、それを列に変換することで

処理が進むごとに1,2,3,4・・・ = A,B,C,D・・・となり、

どんどんA列から追加していく形になります。

Sheet1には、配列したい順に名前をいれておき、

LastRowで最終行まで配列をclassに格納しておきます。

配列処理については、classに格納しておいた配列を

For Eachで順々に取り出して、WorksheetFunction.Matchに

順々に代入してます。

Findより、WorksheetFunction.Matchのほうが処理速度が

早いみたいなので、ちゃんと勉強したほうがいいですね。

配列が、並び替えしたいシートの2行目に存在していたとき、

i が jと一致していれば、動かす必要がないのでそのままにしておき、

一致していなければ、指定の列に切り取り挿入していきます。

配列の上からどんどん処理をしていくので、ずれるわけはないのですが

万が一配列自体が存在しないケースを踏まえ、エラーメッセージを

付け加えました。On Errorですね。

エラーが起きた時、myErrorが発動して、メッセージがでるように

しております。これで間違えにもすぐ気づけるはずです。

こんな感じですね。

んー。我ながら綺麗に書けた気がします。

部品化するためには、指定するシートを変数化しなければ

なりませんが、ここはWorkSheet(k)とかにして、kの値を順々に

変えていけば対応できそうな気がします。

では。

bottom of page