寸法線の前後に文字列を追加するマクロ|CATIAマクロの作成方法

今回はお問い合わせより頂いた内容です。

Drawing 寸法テキスト前後の文字挿入

寸法テキスト前後の文字を挿入して使っているのですが、文字の履歴が5つしかなく
もっと履歴を増やせたらと思っていますが、ご存知ありませんでしょうか?
もし、設定で出来なければマクロを作成(ざっくりと言い方ですみません。)していただけること可能でしょうか?

お問い合わせの回答としては5つより多くする設定することはできません
CATIAのヘルプページ「Adding Text Before/After the Dimension Value」を見ても、テキストの履歴を増やす方法は書かれていないのでおそらく不可能です。

というわけで、今回は簡単なマクロを作成しました。
必要最低限の機能しか付けていませんが、実用性はかなり高いです。

コード解説は行っていませんが、コード内にコメント文を多く記載しているので処理内容は理解できると思います。

 

マクロの機能

今回作成したマクロは「選択した寸法線の前後に文字列を追加するマクロ」です。
上のgif画像を見ればマクロ機能はある程度理解することができると思います。

寸法線以外のオブジェクトを選択してもマクロの実行は可能ですが、選択するオブジェクトが多ければ多いほど処理時間は長くなるので、何も考えずにシート全体を選択するなどのことは避けましょう

また、プルダウンメニュー内にある項目以外の文字列を入力したい場合は、プルダウンメニューに直接入力して実行することもできます。(このときの値は項目には追加されない一時的なもの)

プルダウンメニューの項目を編集するにはテキストファイルを変更する必要があります
(テキストファイルについては次項の「事前準備」を参照下さい)

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

  マクロの機能まとめ ・選択した寸法線の前後に任意の文字列を追加する
・寸法線は複数選択していても可
   (寸法線以外のオブジェクトを選択していても可)
・寸法線が複数選択されている場合はすべての寸法線に同じ文字列が追加される
・上側のプルダウンメニューの内容がテキスト前側に追加する文字列
・下側のプルダウンメニューの内容がテキスト後側に追加する文字列
・プルダウンメニューの横にあるチェックボックスでテキスト追加をしないこともできる
   (チェックボックスにチェックが付いている場合のみテキストが追加される)
・プルダウンメニューの値はテキストファイルの編集により変更可能(事前準備参照)
・プルダウンメニュー内に直接入力した文字列の利用も可能
   (プルダウンメニュー内には入力した文字列は残らない)
・追加され散る文字列を消したい場合はプルダウンメニューの空白を選び追加する

 

事前準備

本マクロは事前に「ユーザーフォーム」と「テキストファイル」の準備をしておく必要があります。
ここの準備をしておかないと、以降で紹介するコードを実行してもエラーが発生するので先に済ませておきましょう。
 

ユーザーフォームの準備

今回のマクロはユーザーフォームを使います。
ユーザーフォームを作成し、上画像のようにコントロールを配置して下さい。
また各コントロールの名称も上画像にならってそれぞれ変更してください。
(たとえば、ユーザーフォームの名称は「UF_Add_Text」に変更)

コントロールの名前と数さえ合っていれば本マクロの実行自体は可能なので、自身の使いやすさに合わせてコントロールの配置は変更してもらっても構いません。

ユーザーフォームの作成が面倒な方、作成したけどうまく実行できない方は下記よりユーザーフォームのデータ(.frm/.frx)をダウンロードしてください。

ユーザーフォームデータ(zip)のダウンロードはこちらをクリック

ダウンロードしたzipファイルを解凍すると「UF_Add_Text.frm」「UF_Add_Text.frx」という2つのファイルが入っています。

VBEの[File]タブの[Import File]より「UF_Add_Text.frm」をインポートすればユーザーフォームが読み込まれます。(frxファイルは自動的に読み込まれるのでfrmファイルと同じ階層(フォルダ)に入れておく必要があるので注意しましょう)
 

テキストファイルの準備

今回のマクロではテキストの前後に追加するための文字列をユーザーフォームに記憶させておく必要があります。これはVBE上で指定することもできますが、本マクロを共有することを考えると、好きなテキストを指定できるよう各々がカスタマイズできるようにしておいた方が親切です。

というわけで、今回はテキストファイルを1つ作成し、そこに書かれている値をComboBox(プルダウンメニュー)の中に入れていくようにします。つまり、ここで用意するテキストファイルの値を変更すればComboxの内容も変化するということです。

まずはテキストファイルを1つ作成します。
(ここではDesktopにAdd_Text_Macro_ComboBox_Value.txtというファイルを作成します)

上画像のように「,」区切りでComboBoxに入れたい値を書いていきます
1行目にはテキストの前側に入れたい文字列を、
2行目にはテキストの後ろ側に入れたい文字列をそれぞれ入力します。

また、3行目には「,,True,True,0,0」と入力しておいてください。
3行目の値はユーザーフォームの最新の状態を保存しておくための値が自動的に入るので特にいじる必要はありません。今回のマクロでは、以前ユーザーフォームを閉じたときの位置や値を記憶しておき、次に開くときに前回の状態を再現することができます。
つまり3行目は前回の状態を再現する際に必要な情報を保存しておくための行というわけです。

 

サンプルコード

事前準備が終わったら標準モジュールを作成し、下記のコードを入力します。
ユーザーフォームをダウンロードしていない方は、ユーザーフォームのコードも入力して下さい。

標準モジュールの「Sub CATMain()」を実行すればユーザーフォームが呼び出されます。
あとはCATIA上で寸法線を選択し、[Run]ボタンを押せば文字列が追加されます。
  

標準モジュールコード

※下記コードの「txt_path」には先ほど用意したテキストファイルのフルパスを入力して下さい。

Option Explicit

Public txt_path As String                      'ComboBoxの値を保存しておくテキストファイルのフルパス
Public latest_Combo_Before_Values              'Combo_Beforeの値をまとめた配列
Public latest_Combo_After_Values               'Combo_Afterの値をまとめた配列
Public latest_Combo_Before_Value As String     '前回のCombo_Beforeの値
Public latest_Combo_After_Value As String      '前回のCombo_Afterの値
Public latest_Check_Before_Value As Boolean    '前回のCheck_Beforeの値
Public latest_Check_After_Value As Boolean     '前回のCheck_Afterの値
Public latest_UF_left As Double                '前回のユーザーフォームの位置(Left)
Public latest_UF_top As Double                 '前回のユーザーフォームの位置(Top)
'―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――

Sub CATMain()

  'ComboBoxの値を保存しておくテキストファイルのフルパスを指定
    txt_path = "C:\Users\ユーザー名\Desktop\Add_Text_Macro_ComboBox_Value.txt" '自身のフルパスを設定
    
  'ComboBoxの値をテキストファイルから取得
    Dim FileNo As Integer
    FileNo = FreeFile
    
    Open txt_path For Input As #FileNo
    
    Dim data As String      'テキストファイルのデータを一時的に格納
    Dim i As Integer        'カウント変数(ループ用)
    Dim Before_txt_data     'テキスト前データ(テキストファイルの1行目をCSVデータとして取得)
    Dim After_txt_data      'テキスト後データ(テキストファイルの2行目をCSVデータとして取得)
    Dim latest_data         '前回情報データ(テキストファイルの3行目をCSVデータとして取得)

    For i = 1 To 3
        Line Input #FileNo, data
        
        On Error Resume Next 'テキストファイルの内容によってはエラーが発生するので無視する
        If i = 1 Then
            latest_Combo_Before_Values = data
            Before_txt_data = Split(data, ",")  '1行目をCSVデータとして配列に格納
        ElseIf i = 2 Then
            latest_Combo_After_Values = data
            After_txt_data = Split(data, ",")   '2行目をCSVデータとして配列に格納
        ElseIf i = 3 Then
            latest_data = Split(data, ",")   '3行目をCSVデータとして配列に格納
        End If
        On Error GoTo 0
        
    Next i
    Close #FileNo
    
    
  'テキスト前データをCombo_Beforeに格納
    For i = 0 To UBound(Before_txt_data) - 1
        UF_Add_Text.Combo_Before.AddItem Before_txt_data(i)
    Next i
    UF_Add_Text.Combo_Before.AddItem ""
    
    
  'テキスト後データをCombo_Afterに格納
    For i = 0 To UBound(After_txt_data) - 1
        UF_Add_Text.Combo_After.AddItem After_txt_data(i)
    Next i
    UF_Add_Text.Combo_After.AddItem ""
    
    
  '前回のユーザーフォームを再現
    latest_Combo_Before_Value = latest_data(0)
    latest_Combo_After_Value = latest_data(1)
    latest_Check_Before_Value = latest_data(2)
    latest_Check_After_Value = latest_data(3)
    latest_UF_left = latest_data(4)
    latest_UF_top = latest_data(5)
    
    With UF_Add_Text
        .Combo_Before.Value = latest_Combo_Before_Value
        .Combo_After.Value = latest_Combo_After_Value
        .Check_Before = latest_Check_Before_Value
        .Check_After = latest_Check_After_Value
        .Left = latest_UF_left
        .Top = latest_UF_top
    End With
    
    
  'モードレスでユーザーフォームを表示
    UF_Add_Text.Show vbModeless


End Sub

 

ユーザーフォームコード

Option Explicit

Private Sub Button_Run_Click()

    Dim doc As DrawingDocument
    Set doc = CATIA.ActiveDocument
    
    Dim sel As Selection
    Set sel = doc.Selection


  'ユーザーの選択状態によって条件分岐
    If sel.Count = 0 Then
    
        MsgBox "オブジェクトが選択されていません。" & vbLf & _
               "寸法線を1つだけ選択した状態で実行してください。"
        Exit Sub
        
    ElseIf sel.Count > 0 Then
    
      '選択されているオブジェクトが全て「寸法線」かを確認
        Dim i As Integer
        Dim cnt As Integer
        Dim obj As AnyObject
        Dim objs As Collection
        
        cnt = 0
        Set objs = New Collection
        
        For i = 1 To sel.Count
            Set obj = sel.Item(i).Value
            If TypeName(obj) = "DrawingDimension" Then
                objs.Add obj
                cnt = cnt + 1
            End If
        Next i
        
        If objs.Count = 0 Then
            MsgBox "選択されているオブジェクトに寸法線が存在しません。" & vbLf & _
                   "寸法線を1つ以上選択した状態で実行してください。"
        End If
        
    End If
    
  'ComboBoxの値を取得
    Dim Combo_Before_Value As String
    Dim Combo_After_Value As String
    Combo_Before_Value = Me.Combo_Before.Value
    Combo_After_Value = Me.Combo_After.Value

    
  'テキストに文字列を追加(チェックボックスの値により条件分岐)
    For i = 1 To objs.Count
      'objs内のオブジェクトをDrawingDimensionに変更
        Dim user_dim As DrawingDimension
        Set user_dim = objs.Item(i)
    
      'user_dimからDrawingDimValueを取得
        Dim user_dim_value As DrawingDimValue
        Set user_dim_value = user_dim.GetValue

      'テキストにComboBoxの値を追加(チェックボックスの値によって条件分岐)
        If Me.Check_Before = True And Me.Check_After = False Then
        
            Call user_dim_value.SetBaultText(1, Combo_Before_Value, "", "", "")
            
        ElseIf Me.Check_After = True And Me.Check_Before = False Then
        
            Call user_dim_value.SetBaultText(1, "", Combo_After_Value, "", "")
            
        ElseIf Me.Check_Before = True And Me.Check_After = True Then
        
            Call user_dim_value.SetBaultText(1, Combo_Before_Value, Combo_After_Value, "", "")
        
        End If
    Next i
    
End Sub

'―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)

  '現在のユーザーフォームの情報を保存(次回起動時に再現)
    latest_Combo_Before_Value = UF_Add_Text.Combo_Before.Value
    latest_Combo_After_Value = UF_Add_Text.Combo_After.Value
    latest_Check_Before_Value = UF_Add_Text.Check_Before
    latest_Check_After_Value = UF_Add_Text.Check_After
    latest_UF_left = UF_Add_Text.Left
    latest_UF_top = UF_Add_Text.Top
    
    Dim write_str As String
    write_str = latest_Combo_Before_Value & "," & _
                latest_Combo_After_Value & "," & _
                latest_Check_Before_Value & "," & _
                latest_Check_After_Value & "," & _
                latest_UF_left & "," & _
                latest_UF_top
                
    Dim FileNo As Integer
    FileNo = FreeFile
    Open txt_path For Output As #FileNo
    Print #FileNo, latest_Combo_Before_Values
    Print #FileNo, latest_Combo_After_Values
    Print #FileNo, write_str
    Close #FileNo
    
End Sub

 

まとめ

今回は「寸法線の前後に文字列を追加するマクロ」についての内容でした。

「寸法線の前後に文字列を追加する」という処理自体は数行で書ける処理ですが、ユーザーフォームとテキストファイルを使い利便性を高めた結果、今回のような長いものとなってしまいました。

マクロの実行としてユーザーフォームボタンを使うことで、今回のようなユーザーフォームが開いている間は何度でも実行可能なマクロが作成可能になります。

また、何も知らないユーザーからしてもかなり使いやすいマクロとなるので、マクロになれてきた方はユーザーフォームを取り入れていくことを個人的にはオススメします。
 

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

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

 

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