列を追加/削除する


まずは簡単な、列の削除からいきましょう。列はListColumnですから、次のようにして特定の列を削除できます。

Sub Sample1()
    Range("A1").ListObject.ListColumns(3).Delete
End Sub

あるいは

Sub Sample2()
    Range("A1").ListObject.ListColumns("記号").Delete
End Sub

のように、列の名前でもいけます。「テーブルの部位を特定する」で解説しましたが、ListColumnsコレクションで「2列目から4列目まで」とか「3列目と5列目」のような指定はできません。

あるいは、Rangeとテーブルの名前を使った構造化参照だったら「何列から何列まで」を指定できます。

Sub Sample3()
    Range("テーブル1[[日付]:[記号]]").Delete
End Sub

ただし、構造化参照でも「何列と何列」のように非連続の列を指定することはできません。こちらも、詳しくは「テーブルの部位を特定する」をご覧ください。

列の挿入

さて、次は列の挿入です。まずは同じように考えてみましょう。削除はDeleteでした、挿入はAddを使います。

Sub Sample4()
    Range("A1").ListObject.ListColumns.Add
End Sub

実行すると、テーブルの右側に新しい列が挿入されます。挿入される列の名前(タイトル)は、Excelが便宜的につけます。

このAddメソッドには「どこに挿入するか」を指定できる、引数Positionがあります。引数Positionを指定すると、指定した位置の左側に新しい列が挿入されます。

Sub Sample5()
    Range("A1").ListObject.ListColumns.Add Position:=3
End Sub

もちろん次のように「Position:=」を省略することも可能です。詳しくは「引数名って書かなくていいの?」をご覧ください。

Sub Sample6()
    Range("A1").ListObject.ListColumns.Add 3
End Sub

さて、挿入した列のタイトルが「列1」「列2」では味気ないですね。挿入した列のタイトルを指定しましょう。ヘルプによると、Addメソッドは「ListColumnオブジェクトを返す」ということですから、先頭のセルに任意の文字列を指定してやればいいです。

Sub Sample7()
    Range("A1").ListObject.ListColumns.Add(3).Range(1) = "読み"
End Sub

挿入した列に数式を代入する

列を挿入して終わりではありません。列を挿入するということは、その列に何かを代入したいんです。一般的にはここへ何らかの数式を代入することが多いでしょう。たとえば、[記号]列の左に新しく[読み]という列を挿入し、その列にPHONETIC関数を代入してみましょう。

Sub Sample8()
    Range("A1").ListObject.ListColumns.Add(3).Range(1) = "読み"
    Range("A1").ListObject.ListColumns(3).Range(2) = "=PHONETIC(テーブル1[@名前])"
End Sub

PHONETIC関数は、「Range(2)」と1つのセルへ代入していることに留意してください。これもテーブル機能の素晴らしさですね。テーブルでは、列内の1つのセルに数式を代入すると、同じ数式が全部のセルへ自動的に代入されます。本来データベースとはそういうものです。部分的に異なる数式を代入する方がイレギュラーです。もちろん、列内で1つの数式を変更すると、ほかの数式もすべて同じように変更されます。したがって、マクロで数式を代入するときも、1つのセルに入れればいいです。

最後に、みんな大好きVLOOKUP関数を代入してみましょう。VLOOKUP関数で参照する元表は、Sheet2に作りました。

Sub Sample9()
    Range("A1").ListObject.ListColumns.Add(5).Range(1) = "地域"
    Range("A1").ListObject.ListColumns("地域").Range(2) = "=VLOOKUP(テーブル1[@記号],Sheet2!$A$1:$B$3,2,FALSE)"
End Sub

けっこう長いですね。しかも「Range("A1").ListObject.ListColumns」がウザイです。ここはWithでくくりましょう。

Sub Sample9()
    With Range("A1").ListObject.ListColumns
        .Add(5).Range(1) = "地域"
        .Item("地域").Range(2) = "=VLOOKUP(テーブル1[@記号],Sheet2!$A$1:$B$3,2,FALSE)"
    End With
End Sub

さらに、挿入する列の位置を「Add(5)」と決め打ちしているのが美しくありません。じゃ、[数値]列が分かんなかったら、どーすんのよ!って話です。「Add(5)」の"5"というのは、[数値]列の位置です。これはIndexプロパティで分かります。

Sub Sample9()
    Dim N As Long
    With Range("A1").ListObject.ListColumns
        N = .Item("数値").Index
        .Add(N).Range(1) = "地域"
        .Item("地域").Range(2) = "=VLOOKUP(テーブル1[@記号],Sheet2!$A$1:$B$3,2,FALSE)"
    End With
End Sub

これで[数値]列がどこであってもOKです。何なら次のように、変数を使わなくてもいけます。ただ、ここまでまとめると、逆に可読性が下がりますかね。

Sub Sample9()
    With Range("A1").ListObject.ListColumns
        .Add(.Item("数値").Index).Range(1) = "地域"
        .Item("地域").Range(2) = "=VLOOKUP(テーブル1[@記号],Sheet2!$A$1:$B$3,2,FALSE)"
    End With
End Sub

すみません、ちょっと調子に乗りました。あ、でも、実務の場合、こういうケースでは「[数値]列の左」というよりも、「[記号]列の右」に新しい列を挿入する、と考えるのが普通です。だったら、次のようになりますね。

Sub Sample9()
    Dim N As Long
    With Range("A1").ListObject.ListColumns
        N = .Item("記号").Index + 1
        .Add(N).Range(1) = "地域"
        .Item("地域").Range(2) = "=VLOOKUP(テーブル1[@記号],Sheet2!$A$1:$B$3,2,FALSE)"
    End With
End Sub

まぁ、なんです、あれこれ自分で考えてみてください。