¥で区切られている名称から一部分のみを抜き出すマクロ|CATIAマクロの作成方法
今回の記事は「マクロ案」よりいただいた内容です。
送って頂いた内容は以下のようなマクロです。
ワークベンチ: PartDesign
マクロ案: PartBody名の名前を短くするマクロ
プロダクトをALL CATPART化した際に、
プロダクトに入っているパートファイルの中にALL CATPART化したパートボディがはいっていたり、 ツリーの階層が深いプロダクトだと、パートボディ名がXXXX¥ AAAAA¥BBBBB¥CCCCCC¥DDDD と長くなってしまい画面がパートボディ名でいっぱいになる。 F3で非表示にはできるが、
ツリーが選択できなくなるので作業性が悪い。
パートボディ名を一括でXXXXとかDDDDにするマクロがある と便利です。
今回頂いたマクロは簡単にいえば「区切り文字[¥])」より前側の文字列、もしくは後ろ側の文字列のみを抜き出すという処理をするだけのものです。
Excel VBAでは特にこの「指定したの文字より前側、後ろ側を抜き出すという処理」をよく使うため、検索してみると多くの情報が見つかるのでそれらも参考にしてみてください。
マクロの機能
今回作成したのは¥で区切られている名称の”最初”の文字列のみ抜き出すマクロです。
また、¥で区切られている名称の”最後”の文字列のみ抜き出すという処理も合わせて紹介します。
具体的な機能は以下のとおりです。
・ツリー第1階層の形状セットの名称を¥で区切られている名称の”最後”の文字列に変更する
・ツリー第1階層に複数ある場合は上記の処理を全てのボディー/形状セットに適用する
サンプルコード
マクロのコードは以下のとおりです。
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 |
Option Explicit Sub CATMain() 'アクティブドキュメント等定義 If TypeName(CATIA.ActiveDocument) <> "PartDocument" Then MsgBox "このマクロはPartDocument専用です。" & vbLf & _ "CATPartに切り替えて実行してください。" Exit Sub End If Dim doc As PartDocument: Set doc = CATIA.ActiveDocument Dim pt As Part: Set pt = doc.Part Dim hb As HybridBody Dim b As Body Dim no As Integer '[¥]区切りの1番前を名称にする For Each hb In pt.HybridBodies no = InStr(hb.Name, "¥") If no <> 0 Then hb.Name = Left(hb.Name, no - 1) End If Next hb '[¥]区切りの1番後ろを名称にする For Each b In pt.Bodies no = InStrRev(b.Name, "¥") If no <> 0 Then b.Name = Right(b.Name, Len(b.Name) - no) End If Next b End Sub |
コード解説
アクティブドキュメント等の定義
1 2 3 4 5 6 7 8 9 10 11 12 13 |
'アクティブドキュメント等定義 If TypeName(CATIA.ActiveDocument) <> "PartDocument" Then MsgBox "このマクロはPartDocument専用です。" & vbLf & _ "CATPartに切り替えて実行してください。" Exit Sub End If Dim doc As PartDocument: Set doc = CATIA.ActiveDocument Dim pt As Part: Set pt = doc.Part Dim hb As HybridBody Dim b As Body Dim no As Integer |
まずはじめにアクティブドキュメントを定義をします。
今回のマクロはCATPartのみ有効なものなので、アクティブドキュメントがCATPart以外の場合はTypeName関数を使った条件分岐でマクロを終了するようにしています。つまり、アクティブドキュメントがCATPartの場合のみ変数「doc」にアクティブドキュメントを代入し、マクロの処理を続けます。
アクティブドキュメントが定義できたら、以降で必要になる変数をまとめて定義します。
「Partオブジェクト」「HybridBodyオブジェクト」「Bodyオブジェクト」を定義します。
HybridBodyオブジェクトとBodyオブジェクトはPart内のボディー/形状セットのループ用です。
また合わせて「no」という整数型の変数も用意しておきます。
これは区切り文字[¥]の位置を格納するための変数です。
[¥]区切りの1番前を名称にする
1 2 3 4 5 6 7 |
'[¥]区切りの1番前を名称にする For Each hb In pt.HybridBodies no = InStr(hb.Name, "¥") If no <> 0 Then hb.Name = Left(hb.Name, no - 1) End If Next hb |
ここでは区切り文字[¥]で区切られている文字列のうち一番初め(左)にある文字列のみを抜き出し、形状セット名を更新するという処理を行なっています。
「For Each hb In pt.HybridBodies」を使うことでPart内の全ての形状セット(言い換えればツリー第1階層にある全ての形状セット)に対してループ処理を行うことができます。
「InStr関数」を使って形状セット内の[¥]マークの位置を取得し、「Left関数」を使って[¥]マークより左側の文字列のみを抜き出すという処理を行います。
その抜き出した文字列を形状セットの名称とすれば処理は完了です。
[¥]区切りの1番後ろを名称にする
1 2 3 4 5 6 7 |
'[¥]区切りの1番後ろを名称にする For Each b In pt.Bodies no = InStrRev(b.Name, "¥") If no <> 0 Then b.Name = Right(b.Name, Len(b.Name) - no) End If Next b |
こちらでは前項とは逆で、区切り文字[¥]で区切られている文字列のうち一番最後(右)にある文字列のみを抜き出し、ボディー名を更新するという処理を行なっています。
基本的な処理内容は前項の形状セットの場合と同じです。
こちらの場合、右側から区切り文字[¥]を取得する必要があるので「InStrRev関数」「Right関数」を使う必要があります。
こちらも抜き出した文字列をボディーの名称とすれば処理は完了です。
まとめ
今回は¥で区切られている名称の”最初”の文字列/”最後”の文字列のみを抜き出すマクロについての内容でした。ここでは最初と最後だけを抜き出しましたがうまいことやれば、好きな部分だけを抜き出して名称に反映させることも可能です。
冒頭でもいっていた通り、今回行った処理はExcel VBAで非常によく使われる内容です。
そのため、「VBA 特定の文字 抜き出し」「VBA 文字列 左側」などで検索すれば今回やった内容をはじめとする、さまざまな文字列の変更方法が紹介されています。
ただそれらサイトで紹介されているのはほとんどの場合Excel VBAなので、CATIA VBAだけでは使えない関数が出てくる場合があります。(※今回使用した関数ももしかしたらCATIA VBAだけでは使用できないかもしれません)
そういった場合はCATIAにExcel VBAのライブラリを読み込ませれば使用可能になります。もし関数が使えない場面に出くわしたら「ExcelCATIAマクロでExcelを操作する方法」を参考にExcel VBAのライブラリを読み込ませてみてください。