長さ違いのボルトデータを一括で作成するマクロ|CATIAマクロの作成方法
今回の記事はマクロ案募集でいただいた内容です。
送って頂いた内容は以下のようなマクロです。
ワークベンチ: メカニカル・デザイン
マクロ案 :
例えば、ボルトの長さ違いを5mm単位で作成する場合、マスターモデルを作成後、
モデルで長さを変更して、名前を付けて保存を繰り返します。
これを、エクセルに、長さとファイル名を記載して、マクロを使って、一括で作成できないでしょうか?
今回頂いたようないわゆる「雛形データ」が必用になるマクロは各々都合のいいテンプレートを使いたいと思ます。そこで今回は非常にシンプルな雛形データを使ってサンプルマクロを紹介していきます。
コードとしては内容を理解しやすくなるようなテンプレを使っているので、コード内容が理解できたら自身の好きなテンプレートに対応するよう各自で書き換えて下さい。
マクロの機能
今回作成したマクロはExcelファイルの値を読み取り、長さ違いのボルトデータを一括で作成するマクロです。(※上画像はデータの中身が見れるように手動で開いたものです。実際は出力したデータは開かす保存先のフォルダが開かれるだけです)
具体的な機能は以下のとおりです。
・マクロ使用にあたりテンプレデータを作成しておく必要あり(詳細は後述)
・マクロ実行後にデスクトップに新規作成される「BOLT 日時」フォルダに出力
・出力後はフォルダを開く
※注意点
・「BOLT 日時」と同名のフォルダがデスクトップにある場合はマクロ中断
(日時には現在の「年/月/日/時/分/秒」が入力されるため、同名フォルダは存在しないはず )
マスターデータの準備
今回のサンプルマクロを使うにあたりマスターデータを作成しておく必要があります。
マスターデータは複製していくデータの親(マスター)であり、保存されていくデータはこのマスターデータの値が変更されたものになります。また、変更する値を記したExcelファイルもここで併せて作成しておきます。
ここで作成するデータと内容が違うとマクロを上手く実行できない可能性があるのでご注意ください。
CATPartデータ
今回の場合は「ボルトの長さ」を変更していくので下画像のようなデータを作成します。
このとき「長さパラメータ」を作成し、ボルト長さとなる「パッドの押し出し量」と式で紐づけておきます。(マクロではこのパラメータの値のみを変更する処理が行われます)
またコード上ではパラメータを名前から取得しに行くので、長さパラメータの名前は「BOLT長さ」にしておきましょう。「BOLT長さ」の値はExcelファイルから読み取るので、初期値は何mmでも問題ありません。
Excelデータ
Excelデータは非常にシンプルでA列に「保存するファイル名」、B列に「ボルトの長さ」を記載します。このとき1行目は項目を入れるため、CATIAに読み込まれる値としては2行目以降となります。
下画像のように左上詰めで、空白が無いように記載します。
(エラー処理をあまりしていないので、空白などがあるとエラーが発生する場合があります)
サンプルコード
マクロのコードは下記の通りです。
CATIAとExcelマクロの連携については下記リンクで解説しているので、うまく実行できない場合は合わせて参照ください。
※保存場所のパスだけは自身の環境に合わせて書き直す必要あるので注意して下さい。
Sub CATMain() 'アクティブドキュメント確認 If TypeName(CATIA.ActiveDocument) <> "PartDocument" Then MsgBox "CATPartのみ対応のマクロです。" Exit Sub End If 'アクティブドキュメント定義 Dim doc As PartDocument Set doc = CATIA.ActiveDocument 'Part定義 Dim pt As Part Set pt = doc.Part '長さパラメータ定義 Dim parm As Length Set parm = pt.Parameters.Item("BOLT長さ") 'Excel取得 On Error Resume Next Dim appExcel As Excel.Application 'Excelが起動している場合 Set appExcel = GetObject(, "EXCEL.Application") If Err.Number <> 0 Then 'Excelが起動していない場合 Err.Clear Set appExcel = CreateObject("Excel.Application") End If On Error GoTo 0 'Excelファイル選択 Dim path As String path = Application.GetOpenFilename("Excelファイル(*.xlsx),*.xlsx") If path = "False" Then Set appExcel = Nothing Exit Sub End If Application.ScreenUpdating = False appExcel.Visible = True 'ワークブック定義 Dim wb As Workbook Set wb = appExcel.Workbooks.Open(path) 'ワークシート定義 Dim ws As Worksheet Set ws = wb.Sheets(1) '最下行取得 Dim LastRow As Integer LastRow = ws.Cells(ws.Cells.Rows.Count, 1).End(xlUp).Row If (LastRow <> ws.Cells(ws.Cells.Rows.Count, 2).End(xlUp).Row) Or (LastRow < 1) Then MsgBox "Excelファイルに記入漏れがあります。" & vbLf & _ "ファイル内容を修正して再実行してください。" Exit Sub End If 'ファイル名と長さの取得 Dim FileNames() Dim Lengths() ReDim FileNames(LastRow - 2) ReDim Lengths(LastRow - 2) Dim i As Integer Dim cnt As Integer cnt = 0 For i = 2 To LastRow FileNames(cnt) = ws.Cells(i, 1).Value Lengths(cnt) = ws.Cells(i, 2).Value cnt = cnt + 1 Next i Application.ScreenUpdating = True 'Excelファイルを閉じる wb.Close False Set appExcel = Nothing '出力ファイルを保存するためのフォルダを作成 Dim FileSys 'As FileSystem Set FileSys = CATIA.FileSystem Dim SavePath As String SavePath = "C:\Users\ユーザー名\Desktop" '保存場所のパスを入力 ※必ず自分の環境のものに書き換えて下さい Dim FoldName As String FoldName = "BOLT " & Year(Date) & Month(Date) & Day(Date) & _ Hour(Time) & Minute(Time) & Second(Time) '作成するフォルダ名を指定 Dim FoldPath As String FoldPath = SavePath & "\" & FoldName '"'新規フォルダのパス Dim FoldExi As Boolean FoldExi = FileSys.FolderExists(FoldPath) If FoldExi = True Then MsgBox "予期せぬエラーが発生しました。" & vbLf & _ "再度マクロを実行し直してください。" Exit Sub End If Dim CreateFold As Folder Set CreateFold = FileSys.CreateFolder(FoldPath) 'マスターデータ(現在のデータ)のパスを取得 Dim docPath As String docPath = doc.FullName 'パラメータの値を書き換えて別名保存する For i = 0 To UBound(FileNames) parm.Value = Lengths(i) pt.Update Set doc = CATIA.ActiveDocument Dim FileName As String FileName = FoldPath & "\" & FileNames(i) & ".CATPart" '"'出力するCATPartのフルパス Call doc.SaveAs(FileName) Next i 'マスターデータを開き直す doc.Close CATIA.Documents.Open (docPath) 'フォルダの表示 Shell "C:\Windows\Explorer.exe " & FoldPath, vbNormalFocus MsgBox "データ出力が完了しました。" End Sub
コード解説
アクティブドキュメント確認
'アクティブドキュメント確認 If TypeName(CATIA.ActiveDocument) <> "PartDocument" Then MsgBox "CATPartで実行してください" Exit Sub End If
まず、はじめにアクティブドキュメントの定義をします。
今回のマクロはCATPartでのみ有効なものなので、アクティブドキュメントがCATPart以外の場合はTypeName関数を使った条件分岐でマクロを終了するようにしています。
アクティブドキュメント/Part/長さパラメータ定義
'アクティブドキュメント定義 Dim doc As PartDocument Set doc = CATIA.ActiveDocument 'Part定義 Dim pt As Part Set pt = doc.Part '長さパラメータ定義 Dim parm As Length Set parm = pt.Parameters.Item("BOLT長さ")
アクティブドキュメントとPart、長さパラメータを定義します。
長さパラメータは、マスターデータ作成時にも説明した通り、名前から取得するので「pt.Parameters.Item(“BOLT長さ")」と書いて定義します。(長さパラメータの名前さえ一致していればいいので、名前はこれである必要はありません)
Excel取得
'Excel取得 On Error Resume Next Dim appExcel As Excel.Application 'Excelが起動している場合 Set appExcel = GetObject(, "EXCEL.Application") If Err.Number <> 0 Then 'Excelが起動していない場合 Err.Clear Set appExcel = CreateObject("Excel.Application") End If On Error GoTo 0
Excelをオブジェクトとして取得します。
詳しくは「CATIAマクロでExcelを操作する方法」を参照下さい。
選択したExcelファイルのブックとシートを定義
'Excelファイル選択 Dim path As String path = Application.GetOpenFilename("Excelファイル(*.xlsx),*.xlsx") If path = "False" Then Set appExcel = Nothing Exit Sub End If Application.ScreenUpdating = False appExcel.Visible = True 'ワークブック定義 Dim wb As Workbook Set wb = appExcel.Workbooks.Open(path) 'ワークシート定義 Dim ws As Worksheet Set ws = wb.Sheets(1)
ユーザーが選択したExcelファイルを取得し、ブックとシートを定義します。
このとき選択されるファイルは、マスターデータ作成時に併せて作成したExcelファイルと同じテンプレートである必要があります。(違っていても読み込めますが、以降でエラーが発生します)
ファイル名と長さの取得
'最下行取得 Dim LastRow As Integer LastRow = ws.Cells(ws.Cells.Rows.Count, 1).End(xlUp).Row If (LastRow <> ws.Cells(ws.Cells.Rows.Count, 2).End(xlUp).Row) Or (LastRow < 1) Then MsgBox "Excelファイルに記入漏れがあります。" & vbLf & _ "ファイル内容を修正して再実行してください。" Exit Sub End If 'ファイル名と長さの取得 Dim FileNames() Dim Lengths() ReDim FileNames(LastRow - 2) ReDim Lengths(LastRow - 2) Dim i As Integer Dim cnt As Integer cnt = 0 For i = 2 To LastRow FileNames(cnt) = ws.Cells(i, 1).Value Lengths(cnt) = ws.Cells(i, 2).Value cnt = cnt + 1 Next i Application.ScreenUpdating = True
読み込んだExcelファイルから、「ファイル名」と「ボルトの長さ」を取得します。
ここでは2つの配列を使って「ファイル名」と「ボルトの長さ」をそれぞれ格納していきます。
最終的にこの配列の中身の値を使って、CATIAを操作していきます。
Excelファイルを閉じる
'Excelファイルを閉じる wb.Close False Set appExcel = Nothing
配列に値を全て格納したら、用済みになったExcelファイルは閉じておきます。
以降でExcelは使用しないので、併せてExcelオブジェクトも開放しておきます。
出力ファイル保存するためのフォルダを作成
'出力ファイル保存するためのフォルダを作成 Dim FileSys 'As FileSystem Set FileSys = CATIA.FileSystem Dim SavePath As String SavePath = "C:\Users\ユーザー名\Desktop" '保存場所のパスを入力 ※必ず自分の環境のものに書き換えて下さい Dim FoldName As String FoldName = "Capture " & Year(Date) & Month(Date) & Day(Date) & _ Hour(Time) & Minute(Time) & Second(Time) '作成するフォルダ名を指定 Dim FoldPath As String FoldPath = SavePath & "\" & FoldName '"'新規フォルダのパス Dim FoldExi As Boolean FoldExi = FileSys.FolderExists(FoldPath) If FoldExi = True Then MsgBox "予期せぬエラーが発生しました。" & vbLf & _ "再度マクロを実行し直してください。" Exit Sub End If Dim CreateFold As Folder Set CreateFold = FileSys.CreateFolder(FoldPath)
キャプチャを保存するためのフォルダを作成します。
まずは保存場所のパスを取得します。
上記のコードでは保存場所を「SavePath = “C:\Users\ユーザー名\Desktop"」
つまりはデスクトップとしています。
※再三の注意となりますがここのパスはご自身のPCのパスに書き換えて下さい。
多くの場合、「ユーザー名」の部分を自分のものにすれば問題ないと思います。
次に、作成するフォルダの名称を指定します。
上記コードでは「BOLT 日時」というフォルダ名で作成しています。
(日時には現状の日時の年から秒までを取得し、その数字の羅列を入力しています。
たとえば2020年1月2日3時4分56秒の場合、「20200102030456」と入力されます。)
このようにフォルダ名を時間によって変更させることで
デスクトップ上に同じフォルダが存在しないようにしています。
ただ必ずしも存在しないとは言えないので
万が一同じフォルダが存在した場合にはマクロを終了するようにしています。
フォルダの存在を確認するには「FileSystemオブジェクト」の「FolderExistsメソッド」を使います。
最後に、これまでに決めた「保存場所」と「フォルダ名」を組み合わせてフォルダを新規作成します。
フォルダの作成は「FileSystemオブジェクト」の「CreateFolderメソッド」を使って行います。
「FolderExistsメソッド」「CreateFolderメソッド」の使い方は下記ページを参照ください。
パラメータの値を書き換えて別名保存する
'マスターデータ(現在のデータ)のパスを取得 Dim docPath As String docPath = doc.FullName 'パラメータの値を書き換えて別名保存する For i = 0 To UBound(FileNames) parm.Value = Lengths(i) pt.Update Set doc = CATIA.ActiveDocument Dim FileName As String FileName = FoldPath & "\" & FileNames(i) & ".CATPart" '"'出力するCATPartのフルパス Call doc.SaveAs(FileName) Next i 'マスターデータを開き直す doc.Close CATIA.Documents.Open (docPath)
本マクロのメインである「ボルトの長さを変更し、別名保存」の処理をしていきます。
基本的にどのファイルでも別名保存をすると、元のファイルは実質閉じられたことになります。
たとえば今回の場合、マスターデータに対し「1.CATPart」と名前を付けて別名保存をすると、CATIA上で開かれているデータとしては「1.CATPart」のみ、つまりはマスターデータは閉じられてしまったことになります。
というわけで、ここでは下記のような流れで処理を行っていきます。
(ボルトを3種類作成する場合)
① マスターデータのpath取得
② マスターデータを別名保存(新規作成された1つ目のデータ)
③ データ②を別名保存(新規作成された2つ目のデータ)
④ データ③を別名保存(新規作成された3つ目のデータ)
⑤ ④のデータを閉じる
⑥ マスターデータを再度開く
マクロ終了後にマスターデータを開いておく必要がない場合は、上でいう⑥の処理は端折っても問題ありません。(一応、マクロ実行前と同じ状態に戻すために開き直しているだけで深い意味はありません)
フォルダの表示
'フォルダの表示 Shell "C:\Windows\Explorer.exe " & FoldPath, vbNormalFocus MsgBox "データ出力が完了しました。"
最後にデスクトップに作成したフォルダを「Shell関数」を使って開きます。
Shell関数についてはExcelマクロでもよく使われ、多くの解説ページがあるためここでは割愛します。
まとめ
今回は任意のExcelファイルの値を読み取り、長さ違いのボルトデータを一括で作成するマクロについての内容でした。
やっていることは単純でExcelから値を取得し、パラメータの値を変更しながら別名保存していくだけの流れになっています。
今回は見やすいように長さパラメータと式を使ってパッドの長さを変更していましたが、パッドのパラメータを直接指定して変更することもできます。(今回のように長さパラメータを噛ませる必要がないということ)
冒頭でもいった通り、雛型のデータは人によって使いやすさや、都合のいいものなどがあると思います。今回のサンプルマクロはあくまでも参考に、自身に合わせたマクロに書き換えて下さい。
CATIAマクロを本気で勉強するなら