web-dev-qa-db-ja.com

MSExcelデータバリデーターはカスタムマクロの呼び出しを受け入れません

コンテンツを検証する動作中のVBマクロがあります。2つの文字列パラメーター(セル値と正規表現)を取り、TrueまたはFalseを返します。内部でCreateObject("VBscript.regexp")を使用します。

このマクロを使用してセルを検証する必要があります。カスタムバリデーターとして設定しようとすると

=Rex(E2, "\d{1,2}\:\d{2}")

ここで、Rexは同じスプレッドシート(​​Alt-F11およびタイプ)で定義された関数であり、E2は検証しようとしているセルであり、「指定した名前付き範囲が見つかりません」というメッセージが表示されます。

同じスプレッドシートの他の場所(たとえば、上部の隅のセルA1)に同じ関数を挿入した場合:

=Rex(E2, "\d{1,2}\:\d{2}")

セルE2が15:07のような正しい値を修正した場合はTRUE15xxが気に入らない場合はFALSE-半分は解決されましたが、実際には終わり。バリデーターを標準的な方法で統合する必要があります。

私はMSExcel2010を使用しています。マクロ自体は

Public Function Rex(ByVal vsStringIn As String, ByVal vsPattern As String) As Boolean
    Dim objRegEx As Object
    Set objRegEx = CreateObject("VBscript.regexp")

    objRegEx.Global = True
    objRegEx.Pattern = vsPattern

    Rex = objRegEx.Test(vsStringIn)
    Set objRegEx = Nothing
End Function

そして問題は次のようになります

MS Excel validator problem

3
h22

興味深い問題。 UDFがデータ検証で常に機能するとは限らないようです! :-(

次の選択肢:

  • 代わりに条件付き書式を使用し、間違った値を強調表示するだけです
  • 検証を行うには、正規表現の代わりに通常のExcel数式を使用します。あなたの場合、
    = IFERROR(IF(SEARCH( ":"、D3)、AND(ISNUMBER(VALUE(LEFT(D3、SEARCH( ":"、D3)-1)))、ISNUMBER(VALUE(RIGHT(D3、LEN(D3) -SEARCH( ":"、D3)))))、FALSE)、FALSE)
    がその仕事をします。良くありませんが、少なくとも機能的です! ;-)

補足:チェックする値が文字列ではなく数値(時間形式)の場合、UDFも上記の数式も機能しません!

1
Peter Albert

古い質問であることは知っていますが、質問を複製したくありません。

解決策:UDF数式を別のセルに適用してから、その値をデータ検証で使用できます。色を白に変更するだけで、一時的な値を非表示にできます。

詳細情報: http://support.Microsoft.com/kb/16052

0
Gerhard Powell