表(テーブル)の作成と編集|AutoCAD VBAマクロの作成方法
AutoCAD VBAで表の作成と編集を行うにはTableオブジェクトを利用する必要があります。本ページではこのTableオブジェクトを使って表の新規作成や削除、設定の変更をする方法を解説していきます。Tableオブジェクトの操作はExcel VBAでセルを操作する方法に似ているため、Excel VBAの経験者にとっては、理解しやすい内容になっています。
本ページで学べる内容は以下のとおりです。
Tableオブジェクトについて
表の作成方法
既に存在している表の取得方法
表の情報を取得する方法
表の設定を変更する方法
表を削除する方法
Tableオブジェクト
AutoCAD VBAで表(テーブル)を操作するにはTableオブジェクトを使用します。
Tableオブジェクトを取得する基本的な方法として「指定のインデックスから表を取得」「指定のオブジェクトID / ハンドルから表を取得」「表を新規作成して取得」「ユーザー選択から取得」の4つがあり、それぞれ下記のコードで取得することができます。既存の表を編集したいのか新規で表を作成したいのかによって取得方法が異なるため、状況に応じて使い分ける必要があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Dim oTable As AcadTable '指定のインデックスから表を取得 (※インデックスは0始まり) Set oTable = ThisDrawing.ModelSpace.Item(0) 'オブジェクトID / ハンドルから表を取得 Set oTable = ThisDrawing.ObjectIdToObject(xxx) 'xxxにオブジェクトID入力 Set oTable = ThisDrawing.HandleToObject(xxx) 'xxxにハンドル入力 '表を新規作成 Dim arr_dPos(0 To 2) As Double Set oTable = ThisDrawing.ModelSpace.AddTable(arr_dPos, 5, 7, 5, 20) Call ThisDrawing.Regen(acActiveViewport) '描画更新 'ユーザー選択で表取得 On Error Resume Next Call ThisDrawing.Utility.GetEntity(oTable, Empty, "表選択") On Error GoTo 0 |
上記コードはモデル空間内の表を対象としていますが、ペーパー空間内の表も同様の方法で取得可能です。両空間の違いについては「ModelSpaceとPaperSpace」を参照ください。
セルの番地について
Tableオブジェクトは表のセルを操作する際に対象のセルの番地(行数目と列数目)を指定する必要があります。Excel VBAの場合、セルの始まりの番地は (1,1) と表しますが、Tableオブジェクトの場合はセルの始まりの番地は (0,0) となっているためExcel VBA経験者は注意が必要です。
表の作成
表を新規作成するためにはModelSpace,PaperSpace,BlockオブジェクトのAddTableメソッドを使って下記のように記載します。(※下記コードはModelSpaceを例とした場合)
Dim oTable As AcadTable
Set oTable = ThisDrawing.ModelSpace.AddTable_
(InsertionPoint, NumRows, NumColumns, RowHeight, ColWidth)
引数は作成する表の配置位置の座標が入った配列(InsertionPoint)、行数(NumRows)、列数(NumColumns)、行高さ(RowHeight)、列幅(ColWidth)です。これにより、指定した位置に指定のサイズの表を作成することができ、戻り値(oTable)としてAcadTableオブジェクトが取得できます。
下記はアクティブドキュメントのモデル空間に下記はアクティブドキュメントのモデル空間に各セルの値にそれぞれの番地を設定した5×7の表を作成するサンプルコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
Sub AddTable() Dim oTable As AcadTable Dim arr_dPos(0 To 2) As Double Dim r As Long Dim c As Long '表作成 Set oTable = ThisDrawing.ModelSpace.AddTable(arr_dPos, 5, 7, 5, 20) 'すべてのセルのマージを解除 Call oTable.UnmergeCells(0, 0, oTable.Rows - 1, oTable.Columns - 1) 'テーブルのセルループ For r = 0 To oTable.Rows - 1 '行高さ変更 oTable.RowHeight = 9 For c = 0 To oTable.Columns - 1 'セルの位置合わせを[中央]に設定 Call oTable.SetCellAlignment(r, c, acMiddleCenter) '文字の高さを設定 Call oTable.SetCellTextHeight(r, c, 2.5) 'セルの値を設定 Call oTable.SetCellValue(r, c, "(" & CStr(r) & "," & CStr(c) & ")") Next Next '描画更新 Call ThisDrawing.Regen(acActiveViewport) End Sub |
AddTableメソッドで作成される表は現在の表スタイルに依存します。上記コードでは表スタイルで何らかのセルがマージされていることを想定しすべてのセルに対してマージ解除の処理を行っています。
表の編集
行/列の挿入と削除
行/列の挿入はそれぞれTableオブジェクトのInsertRows、InsertColumnsメソッドを使います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Dim lIndex As Long Dim dSize As Double Dim lCount As Long '行の挿入 lIndex = 0 '挿入する行インデックス dSize = 5 '挿入する行の高さ lCount = 2 '挿入する行の数 Call oTable.InsertRows(lIndex, dSize, lCount) '列の挿入 lIndex = 0 '挿入する列インデックス dSize = 20 '挿入する列の幅 lCount = 2 '挿入する列の数 Call oTable.InsertColumns(lIndex, dSize, lCount) |
いずれも挿入する行/列のインデックス(0始まり)と挿入する数、挿入する行/列のサイズ(幅/高さ)を指定します。挿入する行/列の数は指定したインデックスから連続しての数となります。たとえばインデックスを0で挿入する数を5とした場合、1行目から5行分の計5つの行が挿入されます。(列も同じ)
行/列の削除はそれぞれTableオブジェクトのDeleteRows、DeleteColumnsメソッドを使います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Dim lIndex As Long Dim lCount As Long '行の削除 lIndex = 0 '削除する行インデックス lCount = 2 '削除する行の数 Call oTable.DeleteRows(lIndex, lCount) '列の削除 lIndex = 0 '削除する列インデックス lCount = 2 '削除する列の数 Call oTable.DeleteColumns(lIndex, lCount) |
いずれも削除する行/列のインデックス(0始まり)と削除する数を指定します。
挿入時と同じ考えで指定のインデックスを基準として指定の数だけの行/列の削除が可能です。
セルの値の取得と変更と削除
セルの値の取得にはTableオブジェクトのGetCellValueメソッド、変更にはSetCellValueメソッドを使います。いずれもセルの番地を入力することで対象のセルを指定することができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Dim lRow As Long Dim lCol As Long Dim sValue As String 'セルの値取得 lRow = 1 lCol = 2 sValue = oTable.GetCellValue(lRow, lCol) 'セルの値変更 lRow = 1 lCol = 2 sValue = "New Value" Call oTable.SetCellValue(lRow, lCol, sValue) |
セルの値の削除にはTableオブジェクトのDeleteCellContentメソッドを使います。専用メソッドが用意されてはいますが上記のSetCellValueメソッドで空文字(“”)を設定することでも削除可能です。
1 2 3 4 5 6 7 8 9 |
Dim lRow As Long Dim lCol As Long 'セルの値削除 lRow = 1 lCol = 2 Call oTable.DeleteCellContent(lRow, lCol) |
セルのマージとマージ解除
指定の範囲のセルを結合(マージ)するにはTableオブジェクトのMergeCellsメソッド、指定の範囲のセルの結合を解除するにはUnmergeCellsメソッドを使います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Dim lRowMin As Long Dim lRowMax As Long Dim lColMin As Long Dim lColMax As Long lRowMin = 0 '最小の行インデックス lRowMax = oTable.Rows - 1 '最大の行インデックス lColMin = 0 '最小の列インデックス lColMax = oTable.Columns - 1 '最小の列インデックス 'セルのマージ Call oTable.MergeCells(lRowMin, lRowMax, lColMin, lColMax) 'セルのマージ解除 Call oTable.UnmergeCells(lRowMin, lRowMax, lColMin, lColMax) |
いずれのメソッドも範囲を指定するために最小の行/列インデックスと最大の行/列インデックスを入力します。現在の表の行数はRowsプロパティ、列数はColumnsプロパティで取得ができるため、上記コードの場合は表全体を範囲として指定しています。(インデックスは0始まりのため-1で調整)
表の削除
TableオブジェクトはAcadObjectから継承されたオブジェクトのため、AcadObjectがもつDeleteメソッドを使用することができます。Deleteメソッドは実行したオブジェクト自身を削除するためのメソッドで、下記のように記載します。(※[Table] = 削除するHatchオブジェクト)
Call [Table].Delete
まとめ
今回の内容をまとめると以下のとおりです。
表の操作はTableオブジェクトを使う
表の作成には適用するパターン名やタイプなどの情報を入力する必要がある
表のセル内の情報を取得、設定するにはセルの番地を指定する必要がある
セルの操作の考え方はExcel VBAと同じだが、セルの始まりは(0,0)のため注意
表の削除はDeleteメソッドを呼び出すだけ
ここでは表の操作として必要となる最低限の基本的な方法しか触れていませんが公式ヘルプを見るとわかる通り、Tableオブジェクトには大量のメソッドが用意されています。これらを使うことで表やセルに対して、罫線の操作やテキストの高さ設定、セルのマージン(余白)の設定など、本ページでは解説していない様々な操作を行うことが可能になります。