ファイル名をパーツ番号と同じにする|CATIAマクロの作成方法
今回はマクロ案募集で頂いた内容です。
頂いた内容は以下のとおりです。
ワークベンチ: パートデザイン
マクロ案: プロパティのパーツ番号を変更した際に、
その変更したパーツ番号が、 ファイル名に反映されるようにしたい。
アセンブリデザインでも同様に出来ればなお、うれしいです。
「ファイル名=パーツ番号」にしたいということですが
大前提として開いているファイルの名前を変更(リネーム)することはできません。
これは「CATIAだから」「マクロだから」という訳ではなく、コンピュータの仕様です。
試しに何らかのファイルを開いた状態で、ファイル名を変更しようとしてみて下さい。
変更できないことが確認できると思います。
という訳で要望に全く忠実なマクロは実現不可能です。
しかしただ出来ませんというのもアレなので、本ページでは代替案を紹介していきます。
要望は「リネーム」ですがリネームという操作自体ができないということで、すこし違ったアプローチの仕方でファイル名を変更していきます。
マクロの機能
タイトルのとおり本ページで紹介するマクロの機能は
「ファイル名(ドキュメント名)をパーツ番号と同じにする」というものです。
マクロの機能をまとめると以下のとおりです。
(パーツ番号が「ABC」の場合、ファイル名は「ABC.CATPart」となる)※1
・既に同じ場合はマクロを中断
・ドキュメントが新規作成でまだ保存がされていない場合はマクロを中断
※1 パーツ番号が「ABC.CATPart」の場合はファイル名が「ABC.CATPart.CATPart」となります。
処理の流れについて
リネームは手動操作で行う場合、ファイルを選択して「名前の変更」から行います。
しかし冒頭でもいっている通り、そのファイルが開かれている場合にはリネームができません。
これはマクロでも同じで、開いているドキュメントファイルの名前を変えることはできません。
参考に情報の多いExcelマクロの場合を見てみましょう。
Excelマクロでも同様に「開いているファイルの名前を変えたい」という場合がありますが
そういった場合には以下のどちらかの方法で解決することが多いようです。
CASE1
1. ファイルを閉じる
2. ファイル名を変更
3. 再度ファイルを開く
CASE2
1. ファイルを別名で保存
2. 元のファイルを削除
あたかもリネームしたようにみせてるんですね!
というわけで今回紹介するマクロも上記2つのどちらかの処理で対応していきます。
CATIAが扱うデータはExcelと違いかなり重いものが多いため、ファイルの保存や開く/閉じるといった処理はどうしても時間がかかってしまいます。
その点を考慮するとCASE2の処理内容の方が処理時間が短くて済むため、以下で紹介するサンプルコードは上記のCASE2の処理でファイル名を変更していきます。
ファイル名を変更したことにはなりますが、実質的には別ファイルとなってしまうためCATProduct/CATDrawingなどとリンクを持ったCATPartには対応できません。
マクロの実行自体は可能ですがファイル名変更後リンクが切れてしまいます。
さらにリンクが繋がっていた元ファイルは削除されるため実行する際は十分に注意してください。
サンプルコード
マクロのコードは下記のとおりです。
マクロを実行するとアクティブドキュメントのファイル名がパーツ番号と同じになります。
アクティブドキュメントのデータが重いほどマクロの処理にも時間がかかります。
※上記で説明した通りリンクの繋がっているCATPartでは使用しないでください。
はじめは不要なファイルで実行結果の確認をすることをオススメします。
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 |
Option Explicit Sub CATMain() If TypeName(CATIA.ActiveDocument) <> "PartDocument" Then MsgBox "CATPartに切り替えてからマクロを実行してください。" Exit Sub End If Dim DOC As PartDocument Set DOC = CATIA.ActiveDocument Dim PT As Part Set PT = DOC.Part If DOC.Path = "" Then MsgBox "現在のドキュメントを保存してから実行してください。" Exit Sub End If If DOC.Name = PT.Name & ".CATPart" Then MsgBox "既にPart名とファイル名が同じです。" Exit Sub End If Dim DOCPath As String DOCPath = DOC.Path Dim DOCFullName As String DOCFullName = DOC.FullName DOC.SaveAs (DOC.Path & "\" & PT.Name & ".CATPart") Kill (DOCFullName) End Sub |
コード解説
本マクロのコードを上から順に部分ごとにわけて解説していきます。
単純かつ短いコードですが、「ファイルの削除」という操作を行うため十分に注意が必要です。
しっかりと処理の内容を理解してから、自身の環境に合わせて書き換えて下さい。
アクティブドキュメント/パーツの定義
1 2 3 4 5 6 7 8 9 10 |
If TypeName(CATIA.ActiveDocument) <> "PartDocument" Then MsgBox "CATPartに切り替えてからマクロを実行してください。" Exit Sub End If Dim DOC As PartDocument Set DOC = CATIA.ActiveDocument Dim PT As Part Set PT = DOC.Part |
まずはじめにアクティブドキュメントの定義をします。
今回のマクロはCATPartでのみ有効なものなので、アクティブドキュメントがCATPart以外の場合はTypeName関数を使った条件分岐でマクロを終了するようにしています。
条件分岐の先、つまりはアクティブドキュメントがCATPartの場合、変数「DOC」には「アクティブドキュメント」を、変数「PT」には「アクティブドキュメントのパーツ」を代入しています。
条件分岐
1 2 3 4 5 6 7 8 9 |
If DOC.Path = "" Then MsgBox "現在のドキュメントを保存してから実行してください。" Exit Sub End If If DOC.Name = PT.Name & ".CATPart" Then MsgBox "既にPart名とファイル名が同じです。" Exit Sub End If |
条件分岐文を使って「マクロ実行ができない場合」と「マクロを実行必要がない場合」にはマクロを中断するようにしています。
1つ目のIf文は「マクロ実行ができない場合」です。
現在のアクティブドキュメント(以下DOC)を別名保存するわけですが、この別名保存する場所はDOCの保存場所と同じにしておく必要があります。
そのため以降でDOCの保存場所を取得する処理をするのですが、DOCが保存がされていないとその処理でエラーが発生してしまいます。
それを避けるためここでDOCが保存されているかを確認しています。
2つ目のIf文は「マクロを実行必要がない場合」です。
これは単純にパーツ名とファイル名が同じだった場合にマクロを中断するようにしています。
ドキュメントを別名保存
1 2 3 4 5 6 7 |
Dim DOCPath As String DOCPath = DOC.Path Dim DOCFullName As String DOCFullName = DOC.FullName DOC.SaveAs (DOC.Path & "\" & PT.Name & ".CATPart") |
ドキュメントを現在の保存場所と同じ場所に”別名”で保存します。
このとき保存名は「パーツ番号.CATPart」にします。
まずは「Documentオブジェクト」の「Pathプロパティ」と「FullNameプロパティ」を使って保存場所とフルパスを取得しておきます。
たとえばデスクトップ上にある「Part1.CATPart」の場合はそれぞれ以下のように取得されます。
Pathプロパティ C:\Users\ユーザー名\Desktop
FullNameプロパティ C:\Users\ユーザー名\Desktop\Part1.CATPart
保存場所が取得できたところで、その場所に別名保存していきます。
別名保存は「Documentオブジェクト」の「SaveAsメソッド」を使います。
SaveAsメソッドは「DOC.SaveAs()」のように書き、()内に保存するためのパスを入力します。
たとえばデスクトップ上に「Part2.CATPart」という名前で保存する場合は
「C:\Users\ユーザー名\Desktop\Part2.CATPart」と()内に入力します。
今回の場合は先にPathプロパティで取得していた保存場所を使って、以下のように入力することでパーツ番号と同じ名前で別名保存をしています。
DOC.SaveAs (DOC.Path & “\” & PT.Name & “.CATPart”)
元のドキュメントファイルを削除
1 |
Kill (DOCFullName) |
現在アクティブドキュメントの保存場所には「パーツ番号と同じ名前のCATPart」と「オリジナルのCATPart」の2つドキュメントファイルが存在している状態です。
このうちオリジナルのCATPartは消しておきます。
ファイルの削除は「Killステートメント」を使います。
使い方はシンプルで、削除したいファイルのフルパスを()の中に入力するだけです。
(参考「Kill ステートメント (VBA) | Microsoft Docs」)
たとえばデスクトップにある「Part1.CATPart」を削除したい場合は
「Kill(C:\Users\ユーザー名\Desktop\Part1.CATPart)」と入力します。
オリジナルのCATPartのパスは先に取得しているので
「Kill (DOCFullName)」と書けばオリジナルのCATPartを削除することができます。
まとめ
今回はドキュメントファイル名をパーツ番号と同じにする方法についての内容でした。
開いているファイルに対して「リネーム」という操作はできませんが、別名保存をして一度別のファイルとすることでリネームが可能になります。(リネームといっていいのかはわかりませんが)
ただこの方法はリネームとは違い別のファイルとなってしまうところが問題です。
アセンブリーの場合は繋がっている全てのドキュメントを別名保存する必要があり、あまり現実的ではないと判断したため割愛しました。
「開いているファイルをリネーム」というメソッドもしくはプロパティがない以上、マクロを使うよりも手動で行った方が速く済むかもしれません。
CATIAマクロを本気で勉強するなら