【Excel VBA】2つの列を入れ替えるマクロ

Excel VBA
スポンサーリンク

 

Excelを使っていると、ときどき行や列を入れ替えたくなるときがあります。

行や列を入れ替えるのは結構面倒で、通常以下のような手順を踏まなければいけません。

  • 列を選択する
  • 選択した列を「切り取り」
  • 入れ替えたい列の前(後)に挿入
  • 入れ替えたい列を選択する
  • 「切り取り」
  • 先ほどの列があった場所に挿入

という具合でしょうか。

こういう面倒なことはマクロにやらせてしまうのがいいでしょう。

今回は列の入れ替えを作ってみました。下のようになります。ご利用される場合は、

  • Excelを起動。
  • 【Alt】+【F11】を押すか、「開発」メニューの「Visual Basic Editor」をクリックして、VBEを起動。
  • 「挿入」メニューから「標準モジュール」を挿入

して、そこに下記のコードを貼付けて使ってください。

[vb]
Option Explicit

Public Sub ExchangeColumns()
Dim UserSelectCell As Range
Dim tgtRange_1 As Range
Dim tgtRange_2 As Range
Dim tgtValue_1 As Variant
Dim tgtValue_2 As Variant

‘ 現在選択されているセルの列をRangeオブジェクトに代入
Set tgtRange_1 = Range(Selection.End(xlUp), Selection.End(xlDown))

‘ 入れ替える列をインプットボックスで聞く
‘ このときマウスで入れ替え列のどれかのセルをクリックするだけでよい
‘ キャンセルが押されると何もせずに終了される
On Error GoTo ExchangeColumns_Error
Set UserSelectCell = Application.InputBox( _
Prompt:="1st Column : " & tgtRange_1.Address & vbCrLf & "Select 2nd Column", _
Title:="Click And Select Any Cell(s)", _
Type:=8)
On Error GoTo 0

‘ 入れ替え列をオブジェクトに代入
Set tgtRange_2 = Range(UserSelectCell.End(xlUp), UserSelectCell.End(xlDown))

‘ それぞれの列の値を記憶
tgtValue_1 = tgtRange_1.Value
tgtValue_2 = tgtRange_2.Value

‘ それぞれの列の値を入れ替えてオブジェクトに代入
Application.ScreenUpdating = False
tgtRange_1.Value = tgtValue_2
tgtRange_2.Value = tgtValue_1
Application.ScreenUpdating = True

ExchangeColumns_Error:
‘ オブジェクトを破棄
Set UserSelectCell = Nothing
Set tgtRange_1 = Nothing
Set tgtRange_2 = Nothing
End Sub
[/vb]

使うときは、現在選択しているセルのある列が1つ目の列になります。2つ目の列はインプットボックスで聞いてくるので、任意の列をクリックします。このとき列を1列丸ごと選択する必要はありません。その列上のセルをクリックすればOKです。

スクリーンショット 2014-08-07 23.25.14

スクリーンショット 2014-08-07 23.25.50

注意点としては、あらかじめ選択しておくセル、マクロを実行してから指定するセル共に、列の一番下のセルを選択しないことです。これをすると列がすべて選択されてしまい、実行に少し時間がかかってしまいます。

 

コメント

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