長さ違いのボルトデータを一括で作成するマクロ|CATIAマクロの作成方法

今回の記事はマクロ案募集でいただいた内容です。
送って頂いた内容は以下のようなマクロです。

ワークベンチ: メカニカル・デザイン

マクロ案 : 
例えば、ボルトの長さ違いを5mm単位で作成する場合、マスターモデルを作成後、
モデルで長さを変更して、名前を付けて保存を繰り返します。
これを、エクセルに、長さとファイル名を記載して、マクロを使って、一括で作成できないでしょうか?

今回頂いたようないわゆる「雛形データ」が必用になるマクロは各々都合のいいテンプレートを使いたいと思ます。そこで今回は非常にシンプルな雛形データを使ってサンプルマクロを紹介していきます。

コードとしては内容を理解しやすくなるようなテンプレを使っているので、コード内容が理解できたら自身の好きなテンプレートに対応するよう各自で書き換えて下さい。

 

マクロの機能

今回作成したマクロはExcelファイルの値を読み取り、長さ違いのボルトデータを一括で作成するマクロです。(※上画像はデータの中身が見れるように手動で開いたものです。実際は出力したデータは開かす保存先のフォルダが開かれるだけです)

具体的な機能は以下のとおりです。

 icon-wrench マクロの機能まとめ ・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から値を取得し、パラメータの値を変更しながら別名保存していくだけの流れになっています。

今回は見やすいように長さパラメータと式を使ってパッドの長さを変更していましたが、パッドのパラメータを直接指定して変更することもできます。(今回のように長さパラメータを噛ませる必要がないということ)

冒頭でもいった通り、雛型のデータは人によって使いやすさや、都合のいいものなどがあると思います。今回のサンプルマクロはあくまでも参考に、自身に合わせたマクロに書き換えて下さい。
 

サンプルマクロ集に戻る
目次へ戻る
 

icon-book CATIAマクロを本気で勉強するなら

 

2024年8月26日CATIA,CATIAマクロ