- ベストアンサー
office(Access)の条件付き書式について
メインフォームで指定した条件で抽出したクエリーデータを表形式サブフォームに表示しているのですが、サブフォームの各セルに規定のデータが入力されていない場合や規定の条件以外で更新を行った場合は背景色を黄色にしたくて「条件付き書式」であれこれ試してみたのですが出来ません。 セルへの入力項目と規定の入力データは以下の通りです。 (1)社員コード 固定長(6文字)の半角数値 (2)社員名 10文字以内の全角文字 よろしくお願いいたします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>Dim 修理者コード as String これが間違い。 正規表現オブジェクトを受け取る変数が「文字型」じゃオカシイでしょ? 正しくはRegExp型なんですが、Access標準オブジェクトではないので、 参照設定に正規表現を指定しないと、エラーになります。 サンプルでは面倒くさいので、何でもOKのVariant型(型指定がない)に しているはずです。 理論上の「修理者コード」は引数で渡される「文字列」の方です。これは 画面コントロールなので、Nullもあり得ます。それでやはりVariant型に しているのです。 正規表現オブジェクトにどのようなプロパティやメソッドがあるかは 下記を参照してください。 http://msdn.microsoft.com/ja-jp/library/cc392487.aspx また、正規表現の構文は下記です。 http://msdn.microsoft.com/ja-jp/library/cc392020.aspx イキナリは難しいので、"^\d{6}$"の解説をします。 "\d"は「数字(半角)」という意味です。"{6}"は桁数で6文字限定を 表わします。"^"は「先頭に一致」、"$"は「末尾に一致」ということ。 それに他の文字を許す記号が無いので、次のような意味になります。 「先頭が数字6文字である」And「末尾が数字6文字である」And 「間に任意の文字を許さない」 この条件を満たすには数字6文字以外にあり得ませんね。 他のやり方としてはLenで文字数を確認し、"\D"を使って非数字を 検出する方法もあります。以下はサンプルです。 If Len(文字列) = 6 Then 正規表現.Pattern = "\D" 半角数字6桁 = Not 正規表現.Test(文字列) '★ End If ★非数字が見つかったらTrueになるので、結果の反対(論理否定)を 戻り値にするようにしています。
その他の回答 (1)
- nda23
- ベストアンサー率54% (777/1415)
これが最善ではないと思いますが、以下のようにします。 判断メソッドを作成します。 Function 半角数字6桁(ByVal 文字列) As Boolean Dim 正規表現 半角数字6桁 = False If IsNull(文字列) Then Exit Function Set 正規表現 = CreateObject("VBScript.RegExp") 正規表現.Global = True 正規表現.Pattern = "^\d{6}$" 半角数字6桁 = 正規表現.Test(文字列) End Function Function 漢字10文字以内(ByVal 文字列) As Boolean Dim 正規表現 漢字10文字以内 = False If IsNull(文字列) Then Exit Function If Len(文字列) > 10 Then Exit Function Set 正規表現 = CreateObject("VBScript.RegExp") 正規表現.Global = True 正規表現.Pattern = "[\x00-\xFF]" 漢字10文字以内 = (正規表現.Execute(文字列).Count = 0) End Function フォームが入力、フィールドが社員コード、社員名とすると、 次のように条件書式を記述します。 【社員コード】 条件:「式」を選択 式:半角数字6桁(Forms!入力!社員コード) フォント、色:適宜 【社員名】 条件:「式」を選択 式:漢字10文字以内(Forms!入力!社員名) フォント、色:適宜 [関数の説明] (1)半角数字6桁 Nullは不一致とみなし、Falseを返す。 正規表現で半角数字6桁であるかどうかをBooleanで返す。 (2)漢字10文字以内 Nullは不一致とみなし、Falseを返す。 10文字より多ければFalseを返す。 正規表現で半角文字を検索し、なければTrueを返す。 (1)の方はLen、StrConv、StrCompを組み合わせて、 条件付書式の式に記述することもできます。できれば その方が良いのですが、長くなるので、関数化して います。
お礼
お礼が遅くなり申し訳ありませんでした。 回答頂きありがとうございました。 回答を頂いてから参考書を開いて内容を理解しようと努力してはみましたが、CreateObject("VBScript.RegExp")や "^\d{6}$"の意味が理解できぬまま半角数字6桁の判断メソッドを以下のようにモジュールに記述し試してみましたが、「オブジェクトが必要です」とメッセージが表示されSet 正規表現のところを指してコンパイルエラーとなり行き詰ってしまいました。 申し訳ありませんが何処が原因なのかもう一度教えて頂けないでしょうか。お願いいたします。 Function 半角数字6桁(ByVal 文字列) As Boolean Dim 修理者コード as String 半角数字6桁 = False If IsNull(文字列) Then Exit Function Set 修理者コード = CreateObject("VBScript.RegExp") 修理者コード.Global = True 修理者コード.Pattern = "^\d{6}$" 半角数字6桁 = 修理者コード.Test(文字列) End Function
お礼
ありがとうございました! おかげさまで今日完成することができました。 2度目の回答を頂き修正してみましたが、「型が一致しません」とエラーメッセージを表示する ので行き詰っていたのですが今日原因が解りました! 原因はデータ入力フォームがメイン/サブフォーム形式のサブフォームなので条件付き書式で Forms!メーンフォーム名!サブフォーム名!社員コードと記述しなければならないところを Forms!サブフォーム名!社員コードと記述していました。 今回私の質問に対し親切丁寧な回答を頂きほんとうにありがとうございました。