まずは簡単な、列の削除からいきましょう。列は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
まぁ、なんです、あれこれ自分で考えてみてください。