ツール番号の置換 の続きの続き
昨日は、加工プログラム内のツール番号を置換する関数について、一旦作成したものに例外処理(PTネジを除外する)を付加してみました。
早速、依頼者に報告です。
「PTネジを除外できました」
「お~!!ありがとうございます・・・あ!」
「え?」
「実はT1を、T01と入力する人もいるんです」
「違っていても良いんですか?」
確認した結果は、以下のとおりでした。
- T1 でも T01 でも、どちらでもNC(数値制御装置)は1番のツールと認識する。
- 二桁の場合、例えば T10 の場合は、T10 のまま。T010 と入力する人はいない。
- 置換後の数値は、T1 でも T01 でもどちらでも良い。
またしても「寛容なシステム」が、表現の揺らぎを許容する事例に遭遇したようです。さてしかし、どうしたものか・・・。
というわけで結局、一から作り直すことにしました。正規表現でパターンを抽出し、一致する番号のみ置換します。
Function ReplaceToolNumber(expression_code As String, _ find_tool_number As Long, _ replace_tool_number As Long) As String Dim myReg As RegExp Set myReg = New RegExp myReg.Pattern = "(.*?)(P?T)(\d+)(\D?)" myReg.Global = True Dim matchCase As MatchCollection Dim mc As Variant Dim sm As SubMatches Dim str As String If myReg.test(expression_code) = True Then Set matchCase = myReg.Execute(expression_code) For Each mc In matchCase Set sm = mc.SubMatches str = str & sm(0) str = str & sm(1) If sm(1) = "T" And CInt(sm(2)) = find_tool_number Then str = str & Format(replace_tool_number, "00") Else str = str & sm(2) End If str = str & sm(3) Next ReplaceToolNumber = str Else ReplaceToolNumber = expression_code End If End Function
※Microsoft VBScript Regular Expressions 5.5 を参照設定済み。
とにかく何かの文字があって、Pがあっても無くてもTがいて、その後に数字が1文字以上続いて、最後に数字以外の文字で終わる。
このパターンをある限り抽出して(myReg.Grobal = True)、ツール番号を置き換えていくわけです。
これは上手くいったか!?と一瞬思ったのも束の間、色々とテストしてみると、戻り値が正しくないものが現れました。
引 数:T1T1
戻り値:T05T(末尾の05がない!)
なお当ブログのマクロは、会社で作ったものの転載ではありません。当時の状況を思い出しながら、一から作り直しています(業務時間内に会社で作成したマクロは、会社に著作権が帰属するため)。仮面ライダーキバのように、時系列が当時と今を交互に行き来しているわけです。本日作成したもののテストに関しては、こちらを参考にしました。いつも有難うございます。
thom.hateblo.jp
当時も今もノンプログラマーの限界か(なんて言い訳、怒られそうですが)、パターンの作りこみが甘かったようです。さて、どうするか。通常の加工プログラムであれば問題なさそうですが、いつ何時、どんな不具合を起こすか分かりません。置換ミスが発生すれば加工ミスに繋がり、損金が発生してしまいます。どうする、どうする、どうする・・・。
結局 T番号が1桁の場合に限り、昨日のプログラムに、例えば「T1」と「T01」の2パターンを通すことにしたのでした(敗北!)。
なお本件は、この後も色々な課題や改善を重ねていくことになります。
- 複数の加工プログラムに対して、まとめて一度に T番号 の置換を行う。
- 置換したものを保存するとともに、置換前のものを old として指定フォルダに退避。
- 差分を見える化して、万が一の置換ミスに気づきやすくする。
- 例えば T1 が T5 に置換される場合、同時に H1 を探し出して H5 に置換する。
- 更新履歴を一覧化する。
などなど、完成までの奮闘記がまだまだ幾つもあるのですが、それはまた、別のお話。
参考まで。