ツール番号の置換 の続きの続き

昨日は、加工プログラム内のツール番号を置換する関数について、一旦作成したものに例外処理(PTネジを除外する)を付加してみました。

infoment.hatenablog.com

早速、依頼者に報告です。

「PTネジを除外できました」
「お~!!ありがとうございます・・・あ!」
「え?」

「実はT1を、T01と入力する人もいるんです」
「違っていても良いんですか?」

確認した結果は、以下のとおりでした。

  1. T1 でも T01 でも、どちらでもNC(数値制御装置)は1番のツールと認識する。
  2. 二桁の場合、例えば T10 の場合は、T10 のまま。T010 と入力する人はいない。
  3. 置換後の数値は、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)、ツール番号を置き換えていくわけです。

f:id:Infoment:20180728194906p:plain

これは上手くいったか!?と一瞬思ったのも束の間、色々とテストしてみると、戻り値が正しくないものが現れました。

引 数:T1T1
戻り値:T05T(末尾の05がない!)

なお当ブログのマクロは、会社で作ったものの転載ではありません。当時の状況を思い出しながら、一から作り直しています(業務時間内に会社で作成したマクロは、会社に著作権が帰属するため)。仮面ライダーキバのように、時系列が当時と今を交互に行き来しているわけです。本日作成したもののテストに関しては、こちらを参考にしました。いつも有難うございます。
thom.hateblo.jp

当時も今もノンプログラマーの限界か(なんて言い訳、怒られそうですが)、パターンの作りこみが甘かったようです。さて、どうするか。通常の加工プログラムであれば問題なさそうですが、いつ何時、どんな不具合を起こすか分かりません。置換ミスが発生すれば加工ミスに繋がり、損金が発生してしまいます。どうする、どうする、どうする・・・。

結局 T番号が1桁の場合に限り、昨日のプログラムに、例えば「T1」と「T01」の2パターンを通すことにしたのでした(敗北!)。

なお本件は、この後も色々な課題や改善を重ねていくことになります。

  • 複数の加工プログラムに対して、まとめて一度に T番号 の置換を行う。
  • 置換したものを保存するとともに、置換前のものを old として指定フォルダに退避。
  • 差分を見える化して、万が一の置換ミスに気づきやすくする。
  • 例えば T1 が T5 に置換される場合、同時に H1 を探し出して H5 に置換する。
  • 更新履歴を一覧化する。

などなど、完成までの奮闘記がまだまだ幾つもあるのですが、それはまた、別のお話。

参考まで。