ExcelファイルをCATDrawingのテーブルに出力|CATIAマクロの作成方法
今回はExcelで作成した表をCATDrawingのテーブルをに出力するマクロを紹介していきます。
CATIAとExcelを連携させるマクロのなかでも、Excelと連携するメリットが非常に感じられるマクロとなっています。
Excelとの連携方法は下記ページで解説しているので先に一読しておくことをオススメします。
マクロの機能
タイトルのとおり本ページで紹介するマクロの機能は
「ExcelファイルをCATDrawingのテーブルに書き出す」というものです。
このマクロの主な目的はCATDrawingでの”テーブル作成の効率化”です。
CATIAで作成するテーブルはご存知の通り、あまり使い勝手が良いとはいえません。
そこで、「Excelで作成した表をテーブルとして書き出すことでより簡単にテーブルを編集できるようにしよう」という目的のため作成したのが今回のマクロです。
・出力先はアクティブなビューもしくはシートの原点
※値を出力するだけのマクロなので以下の内容は非対応
フォント/フォントサイズ
行/列サイズ
罫線の線種
左揃え/中央揃え/右揃え
マージ(Excelでいうセルの結合) など
出力したテーブルは「CATDrawingのテーブルをExcelファイルに出力」で紹介したマクロを使うことで再びExcelファイルとして出力することもできます。
テーブルの作成とか修正がかなり楽になりそうですね!
サンプルコード
マクロのコードは下記のとおりです。
マクロ実行後に選択したExcelファイルの値を新規テーブルに書き出します。
※エラーが出る場合はおそらくExcelライブラリが読み込まれていません
詳しくは後述のコード解説「Excelの定義」の項を参照ください。
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 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
Sub CATMain() Dim DrwDOC As DrawingDocument 'DrawingDocument(CATDrawing)として宣言 If TypeName(CATIA.ActiveDocument) <> "DrawingDocument" Then 'アクティブドキュメントがDrawingDocumentか確認 MsgBox "このマクロはDrawingDocument専用です。" _ & vbLf & _ "ドラフティングワークベンチに切り替えて実行してください。" Exit Sub 'DrawingDocumentでない場合はマクロを終了 End If Set DrwDOC = CATIA.ActiveDocument Dim Excel As Object Set Excel = CreateObject("Excel.Application") Dim OpenFileName As String OpenFileName = Application.GetOpenFilename(FileFilter:="Excelファイル,*.xlsx") If OpenFileName <> "False" Then Dim WB As Workbook Set WB = Workbooks.Open(OpenFileName) Else MsgBox "キャンセルされました" Exit Sub End If Dim WS As Worksheet Set WS = WB.Sheets(1) 'Excelの1つ目にあるシートを定義 Dim MaxRow As Integer Dim MaxCol As Integer With WS.UsedRange MaxRow = .Find("*", , xlFormulas, , xlByRows, xlPrevious).Row MaxCol = .Find("*", , xlFormulas, , xlByColumns, xlPrevious).Column End With Dim DS As DrawingSheet Set DS = DrwDOC.Sheets.ActiveSheet 'アクティブなシートを定義 Dim VIW As DrawingView Set VIW = DS.Views.ActiveView 'アクティブなビューを定義 Dim MyTable As DrawingTable Set MyTable = VIW.Tables.Add(0#, 0#, MaxRow, MaxCol, 4.6, 17.5) '(X座標,Y座標,行数,列数,セル高さ,セル幅)をそれぞれ指定 Dim i As Integer Dim j As Integer For i = 1 To MaxRow For j = 1 To MaxCol Dim ExcelTXT As String ExcelTXT = WS.Cells(i, j).Value MyTable.SetCellString i, j, ExcelTXT '列番,行番,入力する値 Next j Next i WB.Close False End Sub |
本マクロは値を出力するだけなので幅やサイズなどの細かい調整は手動ですることになります。
上記コードにいろいろ書き足すことでフォントサイズの変更や行/列幅の変更も可能になります。
コード解説
本マクロのコードを上から順に部分ごとにわけて解説していきます。
アクティブドキュメントの定義
1 2 3 4 5 6 7 8 9 |
Dim DrwDOC As DrawingDocument If TypeName(CATIA.ActiveDocument) <> "DrawingDocument" Then MsgBox "このマクロはDrawingDocument専用です。" & vbLf & _ "ドラフティングワークベンチに切り替えて実行してください。" Exit Sub End If Set DrwDOC = CATIA.ActiveDocument |
まずはじめにアクティブドキュメントの定義をします。
今回のマクロはCATDrawingでのみ有効なものなので、アクティブドキュメントがCATDrawing以外の場合はTypeName関数を使った条件分岐でマクロを終了するようにしています。
条件分岐の先、つまりはアクティブドキュメントがCATDrawingの場合は変数「DrwDOC」にアクティブドキュメントを代入します。
Excelの定義
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Dim Excel As Object Set Excel = CreateObject("Excel.Application") Dim OpenFileName As String OpenFileName = Application.GetOpenFilename(FileFilter:="Excelファイル,*.xlsx") If OpenFileName <> "False" Then Dim WB As Workbook Set WB = Workbooks.Open(OpenFileName) Else MsgBox "キャンセルされました" Exit Sub End If Dim WS As Worksheet Set WS = WB.Sheets(1) |
CATIAマクロ上でExcel VBAを使用できるようにExcelを定義します。
上記コードでExcelが定義できない場合は、参照設定がされていない可能性があります。
詳しくは下記ページの「Excelマクロのライブラリを読み込む」の項を一読ください。
Excelを定義後は「GetOpenFilenameメソッド」を使って、
出力元となるExcelファイル(ブック)をユーザーに選択させ、変数「WB」として代入します。
変数「WB」を定義したら、WBの1つ目のシートを変数「WS」に代入します。
このWSに書かれている値がテーブルに出力されます。
Excelファイルの最大行数/列数を取得
1 2 3 4 5 6 7 |
Dim MaxRow As Integer Dim MaxCol As Integer With WS.UsedRange MaxRow = .Find("*", , xlFormulas, , xlByRows, xlPrevious).Row MaxCol = .Find("*", , xlFormulas, , xlByColumns, xlPrevious).Column End With |
出力元となるExcelの表のサイズ、つまりは値が入力されている最大行数/列数を取得します。
これは「Findメソッド」を使うことで簡単に取得することができます。
「Findメソッド」を使った入力範囲の取得はExcelマクロでよく使われ、多くの情報が存在するのでここでは割愛します。(詳しくは「Excelマクロ Findメソッド」等で検索してみて下さい)
取得した値はそれぞれ、最大行数は「MaxRow」、最大列数は「MaxCol」に代入します。
CATDrawingに新規テーブルを作成
1 2 3 4 5 6 7 8 |
Dim DS As DrawingSheet Set DS = DrwDOC.Sheets.ActiveSheet 'アクティブなシートを定義 Dim VIW As DrawingView Set VIW = DS.Views.ActiveView 'アクティブなビューを定義 Dim MyTable As DrawingTable Set MyTable = VIW.Tables.Add(0#, 0#, MaxRow, MaxCol, 4.6, 17.5) '(X座標,Y座標,行数,列数,セル高さ,セル幅)をそれぞれ指定 |
次に先ほど取得したExcelファイルの最大行数/列数のサイズのテーブルを作成します。
まずは、はじめに取得したアクティブドキュメント(DrawingDocument)を使いアクティブなシート、アクティブなビューを順に定義します。
つぎに定義したアクティブビューに
「Tablesコレクション」の「Addメソッド」を使って、新規のテーブルを作成します。
Dim MyTable As DrawingTable
Set MyTable = VIW.Tables.Add(X座標,Y座標,行数,列数,セル高さ,セル幅)
今回のコードでは「.Add(0#, 0#, MaxRow, MaxCol, 4.6, 17.5)」と書いているので、
アクティブビューのX座標=0,Y座標=0の位置にMaxRow×MaxColでセル高さ4.6mm/幅17.5mmのテーブルが作成されます。
※MaxRowとMaxColは先ほど取得した出力元となるExcelの表サイズ。
セル高さ/幅が整数の場合はシャープ[#]を付けて入力。(10mmの場合は「10#」と入力)
これで出力元のExcelと同じサイズのテーブルができたので、あとは値を入力していくだけです。
値の入力
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Dim i As Integer Dim j As Integer For i = 1 To MaxRow For j = 1 To MaxCol Dim ExcelTXT As String ExcelTXT = WS.Cells(i, j).Value MyTable.SetCellString i, j, ExcelTXT '列番,行番,入力する値 Next j Next i |
Excelの各セルから値を読み取り、テーブルの該当するセルに値を書き出していきます。
値は取得したMaxRow×MaxCol回のループで、1つずつ書き出していきます。
DrawingTableとExcelの番地の考え方は同じでどちらも「(行数,列数)」で表すことができます。
つまりループを使いExcelの番地(i,j)の値をDrawingTableの番地(i,j)に書き出すという処理を行えば、Excelの値をすべてテーブルに書き出すことができるという訳です。
テーブルへの値の入力は「DrawingTableオブジェクト」の「SetCellStringメソッド」を使います。
Dim MyTable As DrawingTable
MyTable.SetCellString 列番,行番, 入力する値
まとめ
今回はExcelで作成した表をCATIAのテーブルに書き出す方法のについての内容でした。
今回紹介したマクロは値を書き出すだけだったため、行/列幅やフォントサイズ、マージなどには対応していませんでした。これらにも対応できるようにすればCATIAで作成したテーブルを見た目そのままにExcelに書き出すことができるのでぜひ挑戦してみて下さい。
個人的にはマージ(エルの結合)は再現したかったのですが少し難しかったため、いったん値だけ書き出すマクロを紹介しました。マージについて理解できれば追記していこうと思います。
以下のページでは今回やった内容の逆の処理を行っているので、コチラも併せてどうぞ。