• ベストアンサー

エクセルVBAで入力規則の有無を取得

エクセル2010です。 VBAで特定のセル、たとえばA1セルに入力規則が設定されているかどうか取得したいのです。 セルにVBAで設定することはできるのですが、すでに設定されているかどうかを取得できずに困っています。 ご教示いただければ幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
  • watabe007
  • ベストアンサー率62% (476/760)
回答No.2

>A1セルといった特定のセルに設定されているかを なら入力値の種類を取得すればよいでしょう Dim ret As String On Error Resume Next ret = Range("A1").Validation.Type 'ret = ActiveCell.Validation.Type If Err Then   MsgBox "A1セルに入力規則は設定されていません。" Else   MsgBox "A1セルに入力規則が設定されています。" End If On Error GoTo 0

emaxemax
質問者

お礼

ありがとうございました! これでやりたいことができます。 よいお年をお迎えください。

その他の回答 (6)

  • bunjii
  • ベストアンサー率43% (3589/8249)
回答No.7

>セルにVBAで設定することはできるのですが、すでに設定されているかどうかを取得できずに困っています。 何故必要なんですか? VBAで書き込むときはデータの入力規則に関係なく強制的に書き込めたと思います。 しかし、要望なので参考のために下記のサンプルコードを提示します。 Sub DataType() Dim t, a t = 0 a = ActiveCell.Address On Error Resume Next t = ActiveCell.Validation.Type On Error GoTo 0 Select Case t Case 1 MsgBox "整数のみ入力可能" Case 2 MsgBox "数値のみ入力可能" Case 3 MsgBox "プルダウンリストから選択" Case 4 MsgBox "日付のみ入力可能" Case 5 MsgBox "時刻のみ入力可能" Case 6 MsgBox "文字列のみ入力可能、文字数の規制あり" Case 7 MsgBox "データ入力規則の設定あり" Case Else MsgBox "すべてのデータを入力可能" End Select End Sub 現在のアクティブセルについてチェックします。

emaxemax
質問者

お礼

> 何故必要なんですか? 特定のセル(仮にA1)を選択する際、一定の条件でそのセルに、SelectionChangeイベントで入力規則を設定するのですが、一定の条件を判定できるデータが入力される前(入力規則が設定される前)にA1を選択した場合、「先に必要データを入力して下さい」というような警告メッセージを出したかったのです。 ありがとうございました。

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.6

エラー対策は必要でした。m(_ _)m Dim rng As Range On Error Resume Next Set rng = Intersect(Range("A1"), Cells.SpecialCells(xlCellTypeAllValidation)) On Error GoTo 0 If rng Is Nothing Then   MsgBox "A1セルに入力規則は設定されていません。" Else   MsgBox "A1セルに入力規則が設定されています。" End If

emaxemax
質問者

お礼

ごあ、そうですね、シートに入力規則が一つもなかったらエラーになっちゃいますね。 丁寧に、何度もありがとうございました。 勉強になります。

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.5

xlCellTypeAllValidationで調べる方がエラー処理しなくて良いかな Dim rng As Range Set rng = Intersect(Range("A1"), Cells.SpecialCells(xlCellTypeAllValidation)) If rng Is Nothing Then   MsgBox "A1セルに入力規則は設定されていません。" Else   MsgBox "A1セルに入力規則が設定されています。" End If

emaxemax
質問者

お礼

ご丁寧に、何度もありがとうございました。 勉強になります。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.4

小生も#1さんの回答でよいのではないかと思う? あとは質問者の指定のセルがその範囲に含まれているかどうかを判定するとか。 ここに質問する前に、Googleででも「VBA 入力規則の設定の有無」などで照会すれば済むことだろう。そして回答を参考に修正できる力がないと質問回答が役立てられない。 http://www.relief.jp/docs/excel-vba-check-if-exists-data-validations.htmlのコードに 下記の後半追加してみた。 参考にしてください。 Sub アクティブシートに入力規則が設定されているかを調べる() Dim rng As Range On Error Resume Next Set rng = Cells.SpecialCells(xlCellTypeAllValidation) On Error GoTo 0 If rng Is Nothing Then MsgBox "アクティブシートに入力規則は設定されていません。" Else rng.Select MsgBox "選択されているセルに、入力規則が設定されています。" MsgBox rng.Address(False, False) Set x = Application.InputBox(Prompt:="セル選択", Type:=8) MsgBox x.Address(True, True) If Not Intersect(x, rng) Is Nothing Then MsgBox "そのセルに設定アリ" Else MsgBox "そのセルに設定ナシ" End If End If End Sub ーー Application.InputBoxの応答操作はわかるよね。 調べたい1セル範囲をクリックする。

emaxemax
質問者

お礼

ありがとうございます。 よいお年をお迎えください。

回答No.3

#1さんの回答でも応用してやれば出来るんですけどね。 で、その他にも少し調べればいくらでもヒントが出てくるんですけどね。 「マクロの記録」で得られたコードを眺めてみると・・・ アクティブセルに入力規則が設定されているかどうか?だけなら   Selection.Validation.type コレで得られそうだ、と容易に辿り着きますよね? とりあえず、設定されていれば規則の種類に対応する値が返ってきます。 設定されていなければエラーが返ります。 ウォッチ・イミディエイトを弄って自力でデバッグする癖がなければ、 あるいは、構文の基本的な仕組みをある程度理解していなければ ここまで辿り着けないかもしれませんけどね。 で、ごく簡単にコレを組み込むなら Dim myVar as Variant On Error Resume Next   myVar = Empty   myVar = Selection.Validation.type   ' (1) On Error Goto 0   If Not myVar = Empty Then     MsgBox "設定あり"   Else     MsgBox "設定なし"   End If 読めないことはないと思いますが、一応解説。 入力規則が設定されていなければ(1)でエラー・・ですが、 エラー無視の指定をしているので、 変数「myVar」には何も代入しないままで進行していきます。 つまり、入力規則が設定されていなければ myVar は空っぽ。 myVar に何らかの値が入っていれば、設定されている。 と区別ができるわけですね。 繰り返しに組み込むなら、その都度 Empty に戻してやるのをお忘れなく。 ・・・と思ったら、打っているうちに被っちゃいましたね(笑)。 あー・・ついでにもう一つ、 On Error Resume Next は、 関係ないエラーもほとんど無視して進行させてしまうので注意です。 想定していないエラーが発生しているのを無視して進めた結果、 データがおかしくなる・・なんて可能性もありますので、ご利用は計画的に。

emaxemax
質問者

お礼

ありがとうございました。

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.1

入力規則が設定されているかどうかをサンプルマクロ http://www.relief.jp/docs/excel-vba-check-if-exists-data-validations.html

emaxemax
質問者

お礼

ありがとうござます。 ただ、ご紹介のURLは、入力規則がシートに設定されているかどうかを取得するものです。 これではSet rng = Cells.SpecialCells(xlCellTypeAllValidation) で取得したセル範囲を総当たりして、その中にA1があるかどうかなら調べられますが、A1セルといった特定のセルに設定されているかを取得するものではありません。

関連するQ&A