CATDrawingのテーブルをcsvファイルとして出力するマクロ|CATIAマクロの作成方法
今回の記事は「マクロ案」よりいただいた内容です。
送って頂いた内容は以下のようなマクロです。
ワークベンチ:ドラフティング
マクロ案:CATDrawingのテーブルをcsvファイルとして出力する
マクロ
今回のマクロではファイルの新規作成というCATIAアプリケーション外での処理も行います。
ファイルの操作はCATIA VBAの「FileSystemオブジェクト」で行います。
全く知らないという方は上記リンクページに軽く目を通しておくと本内容が理解しやすくなります。
マクロの機能
今回作成したのは選択したテーブルをcsvファイルとして出力するマクロです。
具体的な機能は以下のとおりです。
・テーブル内で改行されている文字列は、改行部分を半角スペースに置き換えて出力する
・出力後にcsvファイルを開く
VBAコード
コード全体は下記の通りです。
コピペで実行可能ですが「出力ファイル名作成」部分のパスは、自身の環境に合わせて書き換える必要があるので注意して下さい。
Option Explicit
Sub CATMain()
'アクティブドキュメント等定義
If TypeName(CATIA.ActiveDocument) <> "DrawingDocument" Then
MsgBox "このマクロはDrawingDocument専用です。" & vbLf & _
"CATDrawingに切り替えて実行してください。"
Exit Sub
End If
Dim doc As DrawingDocument: Set doc = CATIA.ActiveDocument
Dim sel: Set sel = doc.Selection
sel.Clear
'FileSystemオブジェクト定義
Dim fso 'As FileSystem
Set fso = CATIA.FileSystem
'テーブルをユーザー選択で取得
Dim filter: filter = Array("DrawingTable")
Dim res As String
res = sel.SelectElement2(filter, "", False)
If res <> "Normal" Then
MsgBox "キャンセルしました。"
Exit Sub
End If
Dim tbl As DrawingTable
Set tbl = sel.Item(1).Value
'出力ファイル名作成
Dim fold_path As String
fold_path = "C:\Users\...\sample\" '最後に"\"を付けたフォルダパス
Dim file_name As String
file_name = "sample.csv"
Dim file_path As String
file_path = fold_path & file_name
'出力ファイルの作成
Dim csv_file As File
Set csv_file = fso.CreateFile(file_path, True)
'編集用にファイルを開く
Dim txtstr As TextStream
Set txtstr = csv_file.OpenAsTextStream("ForAppending")
'出力するcsv文字列を作成
Dim i As Long
Dim j As Long
Dim cell_txt As String
Dim txt As String
For i = 1 To tbl.NumberOfRows
For j = 1 To tbl.NumberOfColumns
cell_txt = tbl.GetCellString(i, j)
If InStr(cell_txt, vbLf) <> 0 Then
cell_txt = Replace(cell_txt, vbLf, " ")
End If
If j = 1 Then
If i = 1 Then
txt = cell_txt
Else
txt = txt + cell_txt
End If
Else
txt = txt + "," + cell_txt
End If
Next j
txt = txt + vbLf
Next i
'作成した文字列をファイルに入力
txtstr.Write txt
txtstr.Close
'出力したcsvファイルを開く
Shell "C:\Windows\Explorer.exe " & file_path, vbNormalFocus
MsgBox "選択したテーブルをcsvファイルで出力しました。"
End Sub
コード解説
アクティブドキュメント等の定義
'アクティブドキュメント等定義
If TypeName(CATIA.ActiveDocument) <> "DrawingDocument" Then
MsgBox "このマクロはDrawingDocument専用です。" & vbLf & _
"CATDrawingに切り替えて実行してください。"
Exit Sub
End If
Dim doc As DrawingDocument: Set doc = CATIA.ActiveDocument
Dim sel: Set sel = doc.Selection
sel.Clear
'FileSystemオブジェクト定義
Dim fso 'As FileSystem
Set fso = CATIA.FileSystem
まずはじめにアクティブドキュメントを定義をします。
今回のマクロはCATDrawingのみ有効なものなので、アクティブドキュメントがCATDrawing以外の場合はTypeName関数を使った条件分岐でマクロを終了するようにしています。つまり、アクティブドキュメントがCATDrawingの場合のみ変数「doc」にアクティブドキュメントを代入し、マクロの処理を続けます。
アクティブドキュメントが定義できたらSelectionオブジェクトも合わせて定義します。以降で「SelectElement2メソッド」を使うためVariant型で定義しておく必要があるので注意しましょう。
また、今回は最終的にcsvファイルとして出力するため「FileSystemオブジェクト」も定義しておきます。このオブジェクトはcsvファイルやtxtファイル等の新規ファイルやフォルダをVBAで作成する際に使用するオブジェクトです。
テーブルをユーザー選択で取得
'テーブルをユーザー選択で取得
Dim filter: filter = Array("DrawingTable")
Dim res As String
res = sel.SelectElement2(filter, "", False)
If res <> "Normal" Then
MsgBox "キャンセルしました。"
Exit Sub
End If
Dim tbl As DrawingTable
Set tbl = sel.Item(1).Value
次にcsvファイルとして出力するテーブルを取得します。
ここではSelectionオブジェクトのSelectElement2メソッドを使ってテーブルを取得します。
出力ファイル名作成
'出力ファイル名作成
Dim fold_path As String
fold_path = "C:\Users\...\sample\" '最後に"\"を付けたフォルダパス
Dim file_name As String
file_name = "sample.csv"
Dim file_path As String
file_path = fold_path & file_name
次にcsvファイルのフルパスを作成します。
上記コードの「fold_path」に保存ディレクトリのパス、「file_name」にファイル名を入力します。最終的にこれら2つの文字列を使ってcsvファイルのフルパス「file_path 」を作成しています。
この部分は自身の環境に合わせて書き換える必要があるので注意して下さい。
出力ファイルの作成&編集用にファイルを開く
'出力ファイルの作成
Dim csv_file As File
Set csv_file = fso.CreateFile(file_path, True)
'編集用にファイルを開く
Dim txtstr As TextStream
Set txtstr = csv_file.OpenAsTextStream("ForAppending")
つぎに空のcsvファイルを作成します。
ファイルの作成は「FileSystemオブジェクト」の「CreateFileメソッド」を使用します。
以降でこの空のcsvファイルにテキストを書き込んでいくために、このファイルの「TextStreamオブジェクト」を取得します。TextStreamオブジェクトは「Fileオブジェクト」の「OpenAsTextStreamメソッド」を使います。
あとは、このTextStreamオブジェクトの「Writeメソッド」を使うことで、ファイルに任意の文字列を書き込むことができます。
出力するcsv文字列を作成
'出力するcsv文字列を作成
Dim i As Long
Dim j As Long
Dim cell_txt As String
Dim txt As String
For i = 1 To tbl.NumberOfRows
For j = 1 To tbl.NumberOfColumns
cell_txt = tbl.GetCellString(i, j)
If InStr(cell_txt, vbLf) <> 0 Then
cell_txt = Replace(cell_txt, vbLf, " ")
End If
If j = 1 Then
If i = 1 Then
txt = cell_txt
Else
txt = txt + cell_txt
End If
Else
txt = txt + "," + cell_txt
End If
Next j
txt = txt + vbLf
Next i
次に空のcsvファイルに書き込むための文字列を作成します。
ここではテーブルの行/列ループで各セルに書かれている値を順に取り出して「txt」の中に追加していきます。このとき間にカンマ[,]を挟むことで、csvファイルとしての文字列を作成することができます。(ここではテーブルの最大行「NumberOfRows」と最大列「NumberOfColumns」を使ってループさせています)
またテーブルが次の行に行く場合は改行コード「vbLf」を追加したり、テーブルのセル内に改行コードがある場合はReplaceで半角スペースにしたりなどの分岐処理もしています。
この処理により「txt」に出力するcsvファイルの値がすべてまとまった状態になります。
作成した文字列をファイルに入力
'作成した文字列をファイルに入力
txtstr.Write txt
txtstr.Close
'出力したcsvファイルを開く
Shell "C:\Windows\Explorer.exe " & file_path, vbNormalFocus
最後に前項で作成した文字列を空のcsvファイルに書き込みます。
書き込みはTextStreamオブジェクトの「Writeメソッド」を使い、引数に書き込みたい文字列を入力するだけです。書き込みが完了したら「Closeメソッド」でTextStreamオブジェクトを終了します。
これでcsvファイルとして出力することができました。
サンプルコードでは最後にShell関数を使って作成したcsvファイルを開くようにしています。
まとめ
今回はCATDrawingのテーブルをcsvファイルとして出力するマクロについての内容でした。
今回のマクロで重要なのは「FileSystemオブジェクト」でファイルを新規作成することと、DrawingTableの行/列ループをするという部分です。
行/列ループはExcel VBAでは非常によく使われる方法なので知っている方も多いと思いますが、初めて知った方はこれを機に覚えておくといつか役に立つと思います。







