元データの列の並び順を直すには?

Question 54.4   Previous Next
その時によって列の並びが違います。それをいつも同じ並びに替えたいと思います。 たとえば、元のデータは
  A列…記号(A1)
  B列…枚数(B1)
  C列…通し番号(C1)
  D列…電話番号(D1)
  E列…姓名(E1)
  F列…住所(F1)  とします。 これを

  A列…通し番号
  B列…姓名
  C列…住所
  D列…電話番号
  E列…不要
  F列…不要
と並び替えたいのですが、どのようにすればいいでしょうか?
もし「C1」に「通し番号」と書かれていたら、その列はA列の左側に挿入するというような考え方なのでしょうか? if関数はわかるのですが、その列の選択のマクロがわかりません。 よろしくお願い致します
Answer   Copyright (C) 2002.8.7 永井善王
ポイントは3つですね。
第1は、その列をどう見つけるか
第2は、見つけた列をどう選択するか
第3は、見つけた列を切り取ってA列の左側に挿入すると、他の列がそれぞれ右に1列ずれてしまうのでどうすればよいかという点です。

この課題のマクロは、いろいろな組み方があるかと思います。
しかし、元データは6列で、そのうち整列させたい列が4列と小規模ですし、「if関数はわかるのですが」とありますので、If文を使ったシンプルなマクロで十分かと思います。
'------------------------------------------------------------------------------
Sub 元データの列の並び順を直す_そのシートで()
    Worksheets("Sheet1").Activate
    For 元列 = 1 To 6                           'A列からF列まで
        If Cells(1, 元列) = "電話番号" Then     'もしその列の1行目が"電話番号"なら
            Columns(元列).Cut                   'その列を切り取る
            Columns(1).Insert Shift:=xlToRight  'A列の前へ切り取ったセルを挿入する
            Exit For                            'For...Nextを抜け出す
        End If
    Next
    For 元列 = 1 To 6
        If Cells(1, 元列) = "住所" Then
            Columns(元列).Cut
            Columns(1).Insert Shift:=xlToRight
            Exit For
        End If
    Next
    For 元列 = 1 To 6
        If Cells(1, 元列) = "姓名" Then
            Columns(元列).Cut
            Columns(1).Insert Shift:=xlToRight
            Exit For
        End If
    Next
    For 元列 = 1 To 6
        If Cells(1, 元列) = "通し番号" Then
            Columns(元列).Cut
            Columns(1).Insert Shift:=xlToRight
            Exit For
        End If
    Next
End Sub
'------------------------------------------------------------------------------
For...Next文が4つもあって、まことに幼稚に見えるでしょうが、それぞれの反復回数は最大でもタッタ6回ですから実行時間は問題になりません。
なお、元データに、通し番号、姓名、住所、電話番号の列が
絶対にあるならば、2つ目以後の For...Next文のカウンタ(元列)の初期値指定を、順に1づつアップさせて、さらに反復回数を減らすことが可能になります。
サンプルブックのダウンロードは ここをクリック  (YNxv9984_CutInsert.xls 35KB)
※ 一旦、ブックをハードディスクに保存し、後で改めて開いてから実行してください。

 

Excel VBA Macro