VBA入門
入力規則(Validation)

ExcelマクロVBAの基本と応用、エクセルVBAの初級・初心者向け解説
公開日:2013-06-20 最終更新日:2021-10-31

第126回.入力規則(Validation)


マクロ VBA 入力規則 Validation

VBAの入力規則はValidationオブジェクトになります。
Validationオブジェクトを扱うには、RangeオブジェクトのValidationプロパティを使用します。


入力規則は、シート上で設定しておいた方が良い場合が多いですが、マクロVBAで設定する必要も出てきます。

Validationオブジェクトには、多数のプロパティがあり、その設定値を調べることはとても大変になります。

設定すべきプロパティと設定値については、マクロの記録を実行して調べるのが良いでしょう。
自動記録されたVBAコードを読む時の参考に、以下の一覧をお使いください。


Validationオブジェクト

Validationオブジェクトのメソッド

Add 指定された範囲に入力規則を追加します。
Delete オブジェクトを削除します。
Modify セル範囲のデータの入力規則を変更します。

Validationオブジェクトのプロパティ

AlertStyle 入力規則でのエラーのスタイルを返します。
値の取得のみ可能です。XlDVAlertStyle クラスの定数を使用します。
Application 対象となるオブジェクトが指定されない場合は、Excel アプリケーション (Application オブジェクト) を返します。
対象となるオブジェクトが指定された場合は、指定されたオブジェクトを作成した Application オブジェクトを返します。
OLE オートメーションを使っていて、オブジェクトのアプリケーションにアクセスするときなどに、このプロパティを使います。値の取得のみ可能です。
Creator 現在のオブジェクトが作成されたアプリケーションを示す 32 ビットの整数を取得します。
値の取得のみ可能です。
長整数型 (Long) の値を使用します。
ErrorMessage 入力規則でのエラー メッセージを設定します。値の取得および設定が可能です。
文字列型 (String) の値を使用します。
ErrorTitle 入力規則で発生するエラーでのダイアログ ボックスのタイトルを設定します。
値の取得および設定が可能です。文字列型 (String) の値を使用します。
Formula1 条件付き書式または入力規則に使用されている値またはオブジェクト式を返します。
定数値、文字列値、セル参照、または数式を使用できます。値の取得のみ可能です。
文字列型 (String) の値を使用します。
Formula2 条件付き書式または入力規則の 2 番目の部分に使用されている値またはオブジェクト式を返します。
Operator プロパティに xlBetween または xlNotBetween が設定されている場合にだけ、このプロパティを使用できます。
定数値、文字列値、セル参照、または数式を指定できます。値の取得のみ可能です。
文字列型 (String) の値を使用します。
IgnoreBlank True の場合、入力規則において特定のセル範囲への空白値の入力を許可します。
値の取得および設定が可能です。ブール型 (Boolean) の値を使用します。
IMEMode 日本語の入力規則の内容を設定します。
使用できる定数は、次に示す XlIMEMode クラスの定数のいずれかです。
値の取得および設定が可能です。
長整数型 (Long) の値を使用します。
InCellDropdown True の場合、入力規則で可能な値を含むドロップダウン リストを表示します。
値の取得および設定が可能です。
ブール型 (Boolean) の値を使用します。
InputMessage 入力規則での入力メッセージを設定します。
値の取得および設定が可能です。
文字列型 (String) の値を使用します。
InputTitle 入力規則ダイアログ ボックスのタイトルを設定します。
値の取得および設定が可能です。
文字列型 (String) の値を使用します。
Operator 入力規則の演算子を表す長整数型 (Long) の値を取得、または設定します。
Parent 指定されたオブジェクトの親オブジェクトを取得します。
値の取得のみ可能です。
ShowError True の場合、ユーザーが無効なデータを入力すると、入力規則でのエラー メッセージが必ず表示されます。
値の取得および設定が可能です。ブール型 (Boolean) の値を使用します。
ShowInput True の場合、ユーザーが入力規則のセル範囲を選択すると、入力規則での入力メッセージが必ず表示されます。
値の取得および設定が可能です。ブール型 (Boolean) の値を使用します。
Type セル範囲に設定されている入力規則の種類を表す長整数型 (Long) の値を返します。
XlDVType クラスの定数を使用します。
Value セル範囲に含まれるデータが入力規則に合った有効なデータであるかどうかを示すブール型 (Boolean) の値を取得します。

よく使うプロパティ・メソッドの中から、使い方が難しいADDメソッドのみ掲載します。

Addメソッド

Validation.Add(Type, AlertStyle, Operator, Formula1, Formula2)

Type 入力規則の種類を指定します。
AlertStyle 入力規則でのエラーのスタイルを指定します。
使用できる定数は、XlDVAlertStyle クラスの xlValidAlertInformation、xlValidAlertStop、xlValidAlertWarning のいずれかです。
Operator データ入力規則の演算子を指定します。
使用できる定数は、XlFormatConditionOperator クラスの xlBetween、xlEqual、xlGreater、xlGreaterEqual、xlLess、xlLessEqual、xlNotBetween、xlNotEqual のいずれかです。
Formula1 データ入力規則での条件式の最初の部分を指定します。
Formula2 データ入力規則での条件式の 2 番目の部分を指定します。
引数 Operator が xlBetween または xlNotBetween 以外の場合、この引数は無視されます。


入力規則(Validation)の使用例

 A  B  C   D
設定する入力規則 ここに設定   関東地方
1~12の整数     東京都
1以上の整数     神奈川県
最大10文字     埼玉県
ひらがな入力     千葉県
半角のみ入力     茨城県
男,女のリスト     栃木県
関東地方のリスト、他は入力不可     群馬県
関東地方のリスト、他は注意表示      

'1~12の整数
With Range("B2").Validation
  .Delete
  .Add Type:=xlValidateWholeNumber, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="1", Formula2:="12"
End With
'1 以上の整数
With Range("B3").Validation
  .Delete
  .Add Type:=xlValidateWholeNumber, AlertStyle:=xlValidAlertStop, Operator:=xlGreaterEqual, Formula1:="1"
End With
'最大10文字
With Range("B4").Validation
  .Delete
  .Add Type:=xlValidateTextLength, AlertStyle:=xlValidAlertStop, Operator:=xlLessEqual, Formula1:="10"
End With
'ひらがな入力
With Range("B5").Validation
  .Delete
  .Add Type:=xlValidateInputOnly, AlertStyle:=xlValidAlertStop, Operator:=xlBetween
  .IMEMode = xlIMEModeHiragana
End With
'半角のみ入力
With Range("B6").Validation
  .Delete
  .Add Type:=xlValidateInputOnly, AlertStyle:=xlValidAlertStop, Operator:=xlBetween
  .IMEMode = xlIMEModeDisable
End With
'男 , 女のリスト
With Range("B7").Validation
  .Delete
  .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="男,女"
End With
'関東地方のリスト、他は入力不可
With Range("B8").Validation
  .Delete
  .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="=$D$1:$D$8"
End With
'関東地方のリスト、他は注意表示
With Range("B9").Validation
  .Delete
  .Add Type:=xlValidateList, AlertStyle:=xlValidAlertWarning, Operator:=xlBetween, Formula1:="=$D$1:$D$8"
End With

以上のように、Addに先だって、Deleteをするようにして下さい。


入力規則を設定しても無効データが入力されてしまう場合への対処

入力規則を設定した上でシート保護しておいても、
以下のような場合には入力規則に反するデータが入力されてしまいます。

貼り付け(シート保護している場合は入力規則が残ります)
値貼り付け
・右クリックから「ドロップダウンリストから選択

いずれにしろ、キーボードから直接入力せずに他の方法で値をセルに入力する場合になります。

せっかく入力規則を設定しても、規則外のデータが入力されてしまうのでは困ります。
これには、ワークシートのイベントを使うことで対処できます。
イベントについては以下を参照してください。
第124回.Workbookのイベントプロシージャー
・Workbookのイベント一覧 ・イベントプロシージャー追加のVBE操作 ・Workbook_Open:Workbookのイベント ・Workbook_BeforeClose:Workbookのイベント ・Workbook_SheetChange:Workbookのイベント
第125回.Worksheetのイベントプロシージャー
・Worksheetのイベント ・イベントプロシージャー追加のVBE操作 ・Activate:Worksheetのイベント ・BeforeDoubleClick:Worksheetのイベント ・BeforeRightClick:Worksheetのイベント ・Change:Worksheetのイベント ・SelectionChange:Worksheetのイベント ・全てのシートまたは複数のシートに対するイベント
入力規則への貼り付けを禁止する|VBA技術解説
ツイッターで以下の発言をしたのをきっかけに作成したマクロVBAです。入力規則は便利なんだけどさ、値貼り付け出来ちゃダメでしょ!では、問題です。シートに入力規則のリストを設定しました。VBAでそのデータを使ったら規則外のデータが入っていてエラーが出てしまいました。
特定シートで実装する場合は、当該シートのシートモジュールに以下を追加してください。

Private Sub Worksheet_Change(ByVal Target As Range)
  If Target.Validation.Value = False Then
    MsgBox "入力規則に無効データが入力されました。" & vbLf & _
         "入力データを元に戻します。"
    Application.Undo
  End If
End Sub

ブック内のすべてのシートで実装する場合は、ThisWorkbookモジュールに以下を追加してください。

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
  If Target.Validation.Value = False Then
    MsgBox "入力規則に無効データが入力されました。" & vbLf & _
        "入力データをもとに戻します。"
    Application.Undo
  End If
End Sub

実際にはこのようなイベントを入れることよりも、ユーザーに説明しておくことを優先すべきです。
とはいえ、
ついうっかりと言うのもありますので、念の為に入れておくと良い場合もあるでしょう。

また、規則以外の値が入ってしまった場合も考慮して、その後の処理で対処するようにしておきましょう。




同じテーマ「マクロVBA入門」の記事

第89回.オートフィルター(AutoFilter)
第90回.フィルターオプションの設定(AdvancedFilter)
第91回.条件付き書式(FormatCondition)
第126回.入力規則(Validation)
第92回.名前定義(Names)
第93回.ピボットテーブル(PivotTable)
第94回.コメント(Comment)
第95回.ハイパーリンク(Hyperlink)
第96回.グラフ(Chart)
第97回.図形オートシェイプ(Shape)
第136回.フォームコントロール


新着記事NEW ・・・新着記事一覧を見る

TRIMRANGE関数(セル範囲をトリム:端の空白セルを除外)|エクセル入門(2024-08-30)
正規表現関数(REGEXTEST,REGEXREPLACE,REGEXEXTRACT)|エクセル入門(2024-07-02)
エクセルが起動しない、Excelが立ち上がらない|エクセル雑感(2024-04-11)
ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.繰り返し処理(For Next)|VBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.変数宣言のDimとデータ型|VBA入門
5.RangeとCellsの使い方|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.セルのクリア(Clear,ClearContents)|VBA入門
8.メッセージボックス(MsgBox関数)|VBA入門
9.条件分岐(Select Case)|VBA入門
10.ブック・シートの選択(Select,Activate)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。


このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ