【VBA】列順序の入れ替え処理
- uniteen
- 2015年9月5日
- 読了時間: 3分
こんばんわ。
総額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の値を順々に
変えていけば対応できそうな気がします。
では。
Comments