Excel VBA 列を入れ替える

スポンサーリンク

データの2つの項目列を入れ替える方法

AとBの場所を入れ替えるとき、まずはAをどこかに格納し、次にBをAの場所に代入します。
最後に、格納していたAをBの場所に代入して完了です。

では、ワークシートのデータの2つの列を入れ替えるにはどうしたらいいでしょう。問題はAをどこに格納するかです。一般的な変数では、セルの書式が格納できませんし、オブジェクト型変数では、Aの場所にBを代入した時点で、オブジェクト型変数の中身がBに変わってしまいますので変数にAを一時的に格納して待避するのは現実的ではありません。

こんなときは、別の空いているセル範囲にAを一時的に待避させます。では、確実に空いているセル範囲はどこでしょう。それは、新しく追加したワークシート上のセル範囲です。

ワークシートを追加してそのワークシートにAを待避させBをAの場所に代入し、追加したワークシートにあるAをBの場所に代入して、追加したワークシートを削除すれば実現できます。

データの2列目と4列目を入れ替えるコードと解説

Sub 列入替()
Application.ScreenUpdating = False
Worksheets.Add
ActiveSheet.Next.Activate
With ActiveSheet
.Columns(2).Copy .Previous.Range("A1")
.Columns(4).Copy .Columns(2)
.Previous.Columns(1).Copy .Columns(4)
Application.DisplayAlerts = False
.Previous.Delete
Application.DisplayAlerts = True
End With
Application.ScreenUpdating = True
End Sub
2行目【Application.ScreenUpdating = False】
Application【アプリケーション】オブジェクトのScreenUpdating【スクリーンアップディーティング】プロパティにFalseを設定することにより画面の更新を止めて処理を高速化します。


3行目【Worksheets.Add】
Worksheets【ワークブックス】コレクションのAdd【アド】メソッドで、2列目の待避場所のワークシートを追加します。引数を省略したので、現在アクティブなシートの左隣りに追加されます。


4行目【ActiveSheet.Next.Activate】
3行目でシートを追加した際にアクティブシートが元のアクティブシートから左隣りに追加されたシートになるためWorksheet【ワークシート】オブジェクトのNextプロパティを使用してアクティブシートの右隣りのシートを参照してActivate【アクティベイト】メソッドでアクティブにします。つまり、元のシートをアクティブにします。


5行目【With ActiveSheet】
アクティブシートをWith【ウィズ】ステートメントで指定します。つまり、元のシートを指定します。


6行目【.Columns(2).Copy .Previous.Range(“A1”)】
With【ウィズ】ステートメントで指定したWorksheet【ワークシート】オブジェクトの行を表すColumns【カラムス】プロパティの引数に2を指定し、2列目を参照してCopy【コピー】メソッドを使用してコピーします。Copy【コピー】メソッドの貼付け先を表す引数Destination【ディスティネーション】にはWorksheet【ワークシート】オブジェクトのPrivious【プリビアス】プロパティを使用してWith【ウィズ】ステートメントで指定したアクティブシートの左隣りのシート、つまり追加したシートを参照してA1セルにコピーした元シートの2列目を貼り付けます。

左隣りを参照するPrivious【プリビアス】プロパティや右隣りを参照するNext【ネクスト】プロパティはあくまでも参照するだけです。参照したシートを選択やアクティブにするにはSelect【セレクト】メソッドやActivate【アクティベイト】メソッドを追記します。


7行目【.Columns(4).Copy .Columns(2)】
Wiht【ウィズ】ステートメントで指定したWorksheet【ワークシート】オブジェクトの列を表すColumns【カラムス】プロパティに引数に4を指定して、4列目を参照してCopy【コピー】メソッドを使用してコピーします。貼付け先を表す、引数Destination【ディスティネーション】にはColumns【カラムス】プロパティの引数に2を指定して2列目に貼り付けます。つまり、4列目をコピーして2列目に貼り付けます。


8行目【.Previous.Columns(1).Copy .Columns(4)】
With【ウィズ】ステートメントで指定したアクティブシートのPreviou【プリビアス】プロパティを使用して、アクティブシートの左隣りを参照して列を表す、Columns【カラムズ】プロパティの引数に1を指定し1列目を参照してコピーします。つまり、一時的に追加したシートに待避していた元シートの2列目のデータを参照してコピーします。貼付け先を表す、引数Destination【ディスティネーション】には、With【ウィズ】ステートメントで指定したアクティブシートの列を表す、Columns【カラムズ】プロパティの引数に4を指定しアクティブシートの4列目に貼り付けます。これで、2列目のデータを4列目のデータが入れ替わりました。


9行目~11行目【Application.DisplayAlerts = False
.Previous.Delete
Application.DisplayAlerts = True】

Application【アプリケーション】オブジェクトのDisplayAlerts【ディスプレイアラート】プロパティにFalseを設定してワークシートを削除するときに発生する確認メッセージのダイアログボックスを抑止します。

With【ウィズ】ステートメントで指定したアクティブシートのPrevious【プリビアス】プロパティを使用して左隣りのシートを参照してDelete【デリート】メソッドで削除します。つまり、列のデータの一時待避場所として追加したシートを削除します。

そして、Application【アプリケーション】オブジェクトのDisplayAlerts【ディスプレイアラート】プロパティにTrueを設定して確認メッセージのダイアログボックスの抑止を解除します。


13行目【Application.ScreenUpdating = True】
Application【アプリケーション】オブジェクトのScreenUpdating【スクリーンアップディーティング】プロパティにTrueを設定して、抑止していた画面の更新を解除します。


※入れ替えたい列はColumns【カラムス】プロパティの引数列番号を変えることで変更できます。


以上で、列を入れ替える方法についての解説を終了します。ありがとうございました。

スポンサーリンク

関連記事・広告