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【カラムス】プロパティの引数列番号を変えることで
変更できます。


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

スポンサーリンク
スポンサーリンク

フォローする

スポンサーリンク
スポンサーリンク