2017-08-29 13 views
1

アクセスフォームのテキストボックスにエントリを検証したいとします。テキストボックスの後ろのフィールドには、各プロジェクトレコードを識別するプロジェクト番号が格納されます。私たちは現在、テキストボックスのbefore_updateイベントの中でDo Whileループを非常に複雑にしています。しかし、私はコードを強化しています。より洗練された正規表現検証を行う方法を理解したいと思います。ここに技術的な詳細があります。VBAと正規表現を使用してアクセスプロジェクト番号フィールドを検証

プロジェクト番号には、PJ17-14-000などの標準形式があり、3つのブロックに分割され、ダッシュで区切られています。各ブロックのルールは次のとおりです。

最初のブロックはプロジェクトタイプ/会計年度ブロックです。最初の2文字は常にアルファベット文字で、異なる高水準のプロジェクトタイプを反映するように変更されます。 PJ、EL、RM、ERはいくつかの例ですが、これらは任意の2つのアルファ文字です。次の2文字は常に数値で、プロジェクトが開始された会計年度を反映します。 PJ17-14-000は、例えば、2017年度に開始されました。

2番目のブロックは、プロジェクトが確立された順序を示す番号です。したがって、PJ17-1-000は2017年度に開始された最初のPJプロジェクトです。PJ17-2-000が第2です。等々。この数字の桁数には理論的な制限はありませんが、実質的には4桁を超えることはありません。 しかし、これは重要です。先頭の数字はゼロになることはありません。したがって、PJ17-01-000などのプロジェクト番号は使用しません。この検証では、このような番号を拒否する必要があります。代わりに、アナリストは単にPJ17-1-000と入力する必要があります。

最後に、最後のブロックは常に、サブプロジェクトを表す正確に3つの数字です。ほとんどのプロジェクトは1つの部分(サブプロジェクトなし)しか持たないので、最後のブロックは000です。しかし、いくつかはサブプロジェクトが多いため、PJ17-1-001、PJ17-1-002、PJ17-1-003(そうですオン)レコード。 3番目のブロックでは、数値に先行ゼロを付けることができます(通常は行います)。

これはプロジェクト番号自体のルールです。ここでは楽しい部分があります:私たちのデータベースは、アナリストが複数のプロジェクト番号をスペースで区切ってプロジェクトフィールドに入力できるようにします。 (リンクされたテーブルとサブフォームを使用するより優れたデザインがあることは分かっていますが、これは私たちのレガシーシステムです)なぜプロジェクトには2つの数字があるのか​​というのは長い複雑な話ですが、それのために。したがって、プロジェクト番号フィールドには、「PJ17-1-000 ER16-143-000 PI16-23-000」などの集約プロジェクト番号が必要な場合があり(したがって、許可する必要があります)、

したがって、妥当性検査は、単一のプロジェクト番号に対して上記の規則に従う必要があり、正確に1つのスペースで区切られた任意の数のプロジェクト番号が許可されるべきです。どうすればいい?

私はvbscript.regexpで遊び始めましたが、この複雑な問題に取り組む方法を理解できませんでした。その作業を行う方法や現在の獣よりもエレガントで読みやすく/保守しやすい方法についての助けを感謝してください。

答えて

2

使用

^[A-Z]{2}\d{2}-[1-9]\d*-\d+(?: [A-Z]{2}\d{2}-[1-9]\d*-\d+)*$ 

単一のプロジェクトのコードパターンが[A-Z]{2}\d{2}-[1-9]\d*-\d+あるregex demo

を参照してください:

  • [A-Z]{2} - 2つの大文字のASCII文字(注:objRegEx.IgnoreCase = Trueが、これはまた、小文字と一致するかどうかASCII文字)
  • \d{2}から2桁の数字
  • - - ハイフン
  • [1-9]\d* - 9から1から桁及びその後0+任意の数字
  • - - ハイフン
  • \d+から1桁以上。

全体パターンは^<code>(?: <code>)*$ある:

  • ^ -
  • <code>ストリング
  • の開始 - のゼロまたはそれ以上の配列 -
  • (?: <code>)*上述したように、プロジェクトコードパターン:
    • - aスペース
    • <code> - プロジェクトコードパターン
  • $上述したよう - 文字列の末尾。

VBAコード:

Function IsProjCodeValid(s As String) As Boolean 
    Dim objRegEx As Object 
    Set objRegEx = CreateObject("VBScript.RegExp") 
    objRegEx.IgnoreCase = True 
    objRegEx.Pattern = "^[A-Z]{2}\d{2}-[1-9]\d*-\d+(?: [A-Z]{2}\d{2}-[1-9]\d*-\d+)*$" 

    IsProjCodeValid = objRegEx.Test(s) 
End Function 
+0

うわーそれは高速でした!私が考えなければならないことの1つは、サブプロジェクト番号のコードです。これは単なる「1桁以上」ではありません。それはちょうど3桁です。ですから、私は\ d +を\ d {3}に変更するだけでよいと思います。仕事をしているようだ。その音は正しい? –

+0

@EmilyFTW:桁数が常に3であれば、yes、 '\ d {3}'を使用します。 –

関連する問題