テーブル機能の備忘録 ⑥ 指定範囲をテーブル化

先日から、マクロによるテーブル機能の扱いを纏めている(備忘録)。
infoment.hatenablog.com
今日まで何回か続けていて、ハタと気が付いた。
そういえば、テーブルの作成が抜けていた。
f:id:Infoment:20140404140112j:plain

指定範囲、例えば下記の選択範囲を、テーブル化してみよう。
f:id:Infoment:20200302233233p:plain

マクロの記録では、このようなコードが記録された。

Sub Macro1()

    ActiveSheet.ListObjects.Add(xlSrcRange, Range("$A$1:$D$15"), , xlYes).Name = _
        "テーブル1"

End Sub

これだと、少々味気ない。

  • テーブルの範囲が固定だし
  • 名前も固定だし、
  • xlYesの意味が解らない。

そこで、もう少し丁寧に見てみる。
オブジェクトブラウザで調べてみると、このように書いてある。
f:id:Infoment:20200302234047p:plain

ということは、選択範囲をテーブル化し、且つ一行目をヘッダー化するなら、
こんな感じが良いかもしれない。

Sub Macro1()
    Dim Tb As ListObject
    ' 選択範囲をテーブル化(Source)
    ' 一行目をヘッダーにする(XlListObjectHasHeaders)
    Set Tb = ActiveSheet.ListObjects.Add(Source:=Selection, _
                                         XlListObjectHasHeaders:=xlYes)
End Sub

これを関数化すれば、更に使い勝手が良くなると思う。

Function MakeTable(source_range As Range, _
          Optional table_name As String = vbNullString) As ListObject
    ' 一行目をヘッダーにする(XlListObjectHasHeaders)
    Set MakeTable = ActiveSheet.ListObjects.Add(Source:=source_range, _
                                                XlListObjectHasHeaders:=xlYes)
                                                
    ' テーブルの名前。無指定なら、年月日_時分秒をテーブル名に盛り込んで名前の重複を避ける。
        Select Case table_name
            Case vbNullString
                MakeTable.Name = "Table_" & Format(Now, "yyyymmdd_hhmmss")
            Case Else
                MakeTable.Name = table_name
        End Select
End Function

Sub test()
    Dim Tb As ListObject
    Set Tb = MakeTable(Selection)
End Sub

次回に続きます。

参考まで。