寸法線の前後に文字列を追加するマクロ|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
まとめ
今回は「寸法線の前後に文字列を追加するマクロ」についての内容でした。
「寸法線の前後に文字列を追加する」という処理自体は数行で書ける処理ですが、ユーザーフォームとテキストファイルを使い利便性を高めた結果、今回のような長いものとなってしまいました。
マクロの実行としてユーザーフォームボタンを使うことで、今回のようなユーザーフォームが開いている間は何度でも実行可能なマクロが作成可能になります。
また、何も知らないユーザーからしてもかなり使いやすいマクロとなるので、マクロになれてきた方はユーザーフォームを取り入れていくことを個人的にはオススメします。
CATIAマクロを本気で勉強するなら












