ExcelVBA入力規則・条件付き書式の設定確認

このQ&Aのポイント
  • ExcelVBAを使用して、セルに入力規則・条件付き書式が設定されているかを判定する方法を教えてください。
  • 上記の方法では、設定されていないシート上で実行するとエラーが発生します。エラーを使わずに判定する方法があれば教えてください。
  • Windows7とExcel2010の環境で、ExcelVBAの入力規則・条件付き書式の設定を確認する方法をお教えください。
回答を見る
  • ベストアンサー

ExcelVBA入力規則・条件付き書式の設定確認

環境 Windows7 Excel2010 セルに入力規則・条件付き書式が設定されているかを判定する方法をお教え願います。 試した方法は If Not Intersect(Range("A1").SpecialCells(xlCellTypeAllValidation), Range("A2")) Is Nothing Then  MsgBox "入力規則が設定されていています。" End If If Not Intersect(Range("A1").SpecialCells(xlCellTypeAllFormatConditions),Range("A2")) Is Nothing Then  MsgBox "条件付き書式が設定されていています。" End If 上記だと1つも設定されていないシート上で行うと実行時エラーとなります。 調べるとこのようなものを見つけました。 On Error Resume Next Range("A1").Validation.Type Err.Number <> 0 Then→エラーなら未設定となる。 できればエラーを使わず、判定を行いたいです。 ご教授をお願いいたします。

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

  • ベストアンサー
回答No.2

#1です。読み落しがありましたので追加補足します。 > できればエラーを使わず、判定を行いたいです。 バックグラウンドエラー(目に見えないエラー)を発生させず、 エラー処理もしない、という意図でしたら、  [条件付き書式]については   → .Count プロパティでチェックできるので、可能です。  [入力規則]については   → 未設定かどうか判別可能なプロパティは     すべて実行時エラーになる為、回避できません。 とりあえず、エラー処理はどうしても必要ですが、  設定済の[入力規則]であれば、  初期値=0 を返すことのないプロパティとして、  validation.AlertStyle プロパティで判別します。 formatConditions.Count による判別は、 複数セル範囲についても可能ですから、部分的には、 よく思い返せばこの方が良かったかな、というレベルのものです。 対して、[入力規則]に関して今回紹介する方法は、 対象を単一セルに限定しますし、かなり変わったやり方です。 少なくとも[入力規則]の有無の判別については、#1で紹介したように、 Is Nothing 判定を用いるのが普通、だと思われます。 [入力規則]と[条件付き書式]の両方を調べる、という時は、 対象を単一セルに限定しない方法を選ぶべきですし、 やはり、Is Nothing 判定で統一した方が見た人が解り易いかも知れません。 [条件付き書式]についてはformatConditions.Count による判別で 十分ですし寧ろ正統的ではありますが、他の記述との組合わせ的に、、、 まぁ、ここら辺はお好みで選んで構いません。 ' ' ================================ Sub Re8929321a() Dim n As XlDVAlertStyle   With Range("A1")     On Error Resume Next     n = .Validation.AlertStyle     On Error GoTo 0     If n <> 0 Then       MsgBox "入力規則が設定されていています。"     End If     If .FormatConditions.Count > 0 Then       MsgBox "条件付き書式が設定されていています。"     End If   End With End Sub ' ' ================================

Uyrjyyf6sd
質問者

お礼

回答ありがとうございます。 やりたいことが実現できました!

その他の回答 (1)

回答No.1

こんにちは。 せっかくなので、対話型で書いてみました。 ご質問のように単セルを対象に調べる場合でも、 そちらのRange("A1")が、vRtn(0)に代わっているだけで、 ポイントは一緒です。 とにかく、range型変数(例では Target)を用意しておきます。   On Error Resume Next   Set Target = vRtn(0).SpecialCells(xlCellTypeAllValidation)   On Error GoTo 0 という風にエラー発生による中断だけを回避しておいて、   If Target Is Nothing Then range型変数にオブジェクトが格納されているかどうか、 で判別します。 例示のように、range型変数を使い回しする場合では、     Set Target = Nothing のように、range型変数を一旦解放しておかないと、 2回目以降の判定が狂ってしまいます。 > Err.Number <> 0 Then→エラーなら未設定となる。 先頭に[If ]を付けて、こちらが書いた On Error GoTo 0 の 直前におけば、判別は可能ですので、試してみるのもいいでしょう。 ただ、On Error GoTo 0 でエラーを解放する前に判別する必要が ありますので、フローに影響しやすいということもあり、 オブジェクト型については Is Nothing 判定が多く好まれるようです。 細かく考えると Err.Number は、発生したエラーの種類を番号で返しますから、 エラーの種類を特定して場合分けするなどの必要に迫られた時には、 Is Nothing 判定よりも本格的に対応できることになります。 ちょっと厚めの解答ですが、必要なパーツを拾ってお使いください。 ' ' ================================ Sub Re8929321() Dim vRtn() Dim Target As Range Dim sMsg As String   With ActiveSheet     If TypeName(Application.Selection) <> "Range" Then ActiveWindow.RangeSelection.Select     vRtn() = VBA.Array(Application.InputBox(Prompt:="検索範囲を指定してください。", _                       Title:="[入力規則][条件付き書式]範囲の検索", _                       Default:=Application.Selection.Address, _                       Type:=8))     If VarType(vRtn(0)) = vbBoolean Then Exit Sub   End With   sMsg = "[入力規則][条件付き書式]範囲の検索 結果" & _       vbLf & "指定セル範囲 : " & vRtn(0).Address(0, 0) & vbLf   On Error Resume Next   Set Target = vRtn(0).SpecialCells(xlCellTypeAllValidation)   On Error GoTo 0   sMsg = sMsg & vbLf & "指定セル範囲内の[入力規則]設定セル範囲は"   If Target Is Nothing Then     sMsg = sMsg & vbLf & vbTab & "ありませんでした。"   Else     sMsg = sMsg & vbLf & vbTab & Target.Address(0, 0)     Set Target = Nothing   End If   On Error Resume Next   Set Target = vRtn(0).SpecialCells(xlCellTypeAllFormatConditions)   On Error GoTo 0   sMsg = sMsg & vbLf & "指定セル範囲内の[条件付き書式]設定セル範囲は"   If Target Is Nothing Then     sMsg = sMsg & vbLf & vbTab & "ありませんでした。"   Else     sMsg = sMsg & vbLf & vbTab & Target.Address(0, 0)     Set Target = Nothing   End If   MsgBox Prompt:=sMsg, Buttons:=vbInformation, Title:="[入力規則][条件付き書式]範囲の検索 結果" End Sub ' ' ================================

Uyrjyyf6sd
質問者

お礼

回答ありがとうございます。 参考にさせていただきます。

関連するQ&A

  • ExcelVBA 二つのセルに入力された時の判定

    セルA1とA2両方に値が入力された時、セルA3に文字を入力するマクロを作りたいです。 下記プログラムで試しているのですが、ステップインで見ると最初のIFでTrue判定されてしまいます。 どうすればこの条件を満たすマクロになるのか、教えて頂けないでしょうか。 以上、宜しくお願い致します。 Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("A1")) Is Nothing Or Intersect(Target, Range("A2")) Is Nothing Then Exit Sub Else If Range("A1").Value <> "" And Range("A2").Value <> "" Then Range("A3").Value = "入力済み" End If End If End Sub

  • 図形のクリアで入力規則の▼が消える

     図形のクリアでG1の入力規則の▼まで一時的に消えてしまいます。コード文でShapesを 用いているのではないかと思いますが、▼で消去を回避する方法が ありましたらお教え願え ますでしょうか? Windows7・SP1 Office2010 Sub 図形のクリア() Dim myRng As Range Dim sp As Variant Set myRng = Range("I10:CW60") For Each sp In ActiveSheet.Shapes If Not Intersect(Range(sp.TopLeftCell, sp.BottomRightCell), myRng) Is Nothing Then On Error Resume Next sp.Delete End If Next Set myRng = Nothing End Sub

  • エクセルVBAでTargetのセルに設定された「名前の定義」の取得方法は?

    例えば、A1、B2、C3セルに「名前の定義」で、それぞれ入力A、入力B、入力C という名前がつけてあります。 それらのセルに入力があった場合、Select Caseで分岐させ作動するマクロをつくりました。 簡略化すると以下のようなもので、一応正しく作動します。 Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("入力A,入力B,入力C")) Is Nothing Then Exit Sub Select Case Target.Address(0, 0) Case "A1" MsgBox "A処理します。" Case "B2" MsgBox "B処理します。" Case "C3" MsgBox "C処理します。" End Select End Sub ただ、せっかくセルに名前を定義してあるのに、個々の入力セルの判定をTarget.Addressでしているのが不満です。 ( ̄~ ̄;) 定義された名前を使えないかと以下のようにやってみましたが実行時エラーで「サポートしてません」となってしまいます。 (T.T) Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("入力A,入力B,入力C")) Is Nothing Then Exit Sub Select Case Target.Names.Name 'ここでエラー Case "入力A" MsgBox "A処理します。" Case "入力B" MsgBox "B処理します。" Case "入力C" MsgBox "C処理します。" End Select End Sub どうやったら、Targetに設定されている名前を取得できるのでしょうか? (^∇^`)? 実際の例はもっと対象が多いので、Select Caseを使わない以下の方法は避けたいのです。 If文の羅列(これでも正しく作動はします。) Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("入力A,入力B,入力C")) Is Nothing Then Exit Sub If Not Intersect(Target, Range("入力A")) Is Nothing Then MsgBox "A処理します。" ElseIf Not Intersect(Target, Range("入力B")) Is Nothing Then MsgBox "B処理します。" Else MsgBox "C処理します。" End If End Sub なにとぞよろしくお願いします。 (o。_。)oペコッ

  • VBA シートプログラムでRangeエラー

    いつもお世話になっております。 Excel2003を使用しております。 シートに直接プログラムを書いています。 (例として、Sheet1とします) シートの内容が変わったときに、色々プログラムを実行していこうと思っているのですが、 Private Sub Worksheet_Change(ByVal Target As Range) のTargetが上手く取得できていない気がします。 今までは上手く動いていたのですが、 急にTargetの値に数値(セルに入力した値)が入ってしまうようになり 上手く組めなくて困っています。 Private Sub Worksheet_Change(ByVal Target As Range) Dim 開始1 As Range Dim 終了1 As Range Dim 開始2 As Range Dim 終了2 As Range Set 開始1 = Range("D5:D63") Set 終了1 = Range("E5:E63") Set 開始2 = Range("F5:F63") Set 終了2 = Range("G5:G63") If ThisWorkbook.ActiveSheet.ProtectContents Then '保護かかってたら End '強制終了 End If If Not Application.Intersect(Target, 開始1) Or Application.Intersect(Target, 実績日開始2) Is Nothing Then Call 開始(Target, 開始1, 開始2) ElseIf Not Application.Intersect(Target, 終了1) Or Application.Intersect(Target, 終了2) Is Nothing Then Msgbox "テスト!" End If End Sub '----------------------------------------------- Sub 開始(ByVal Target As Range, 開始1 As Range, 開始2 As Range) If Not Application.Intersect(Target, 開始1) Is Nothing Then MsgBox Target.Row End If If Not Application.Intersect(Target, 開始2) Is Nothing Then MsgBox Target.Row + 1 End If End Sub 全部シートに書いています。 まだ、テスト段階のため適当なプログラムしか書いておりません。 (指定範囲が変更された場合に、Msgboxを出したりなど 単純なことしかしていません) どこが悪いのか、教えて頂けないでしょうか? よろしくお願い致します。

  • エクセルのオートシェープ削除について

    セルE9:J9までに斜めの斜線を引いて、削除するマクロを 初心者なりに作成しました。 斜線作成は以下のような感じです。 Set myRng = Range("E9:J9") For Each sp In ActiveSheet.Shapes If Not Intersect(Range(sp.TopLeftCell,sp.BottomRightCell), myRng) Is Nothing Then sp.Delete End If Next Set myRng = Nothing で、フォームのボタンに登録させて罫線作ります。 ついでにリドゥボタン(戻る)も作成してやってみたのですが 以下のような感じで Set myRng = Range("E9:J9") For Each sp In ActiveSheet.Shapes If Not Intersect(Range(sp.TopLeftCell, sp.BottomRightCell), myRng) Is Nothing Then sp.Delete End If Next Set myRng = Nothing ですが、L9にリスト表示(入力規則のリストを設定)させたら If Not Intersect(Range(sp.TopLeftCell, sp.BottomRightCell), myRng) Is Nothing Then のところで1004エラーがでます。 リストはどうしても使用しなければならないので、どうしたらよいか? どなたか詳しい方おられましたら、ご指導おねがいします。

  • 入力規則のドロップダウンリストを連動

    以下のサイトを参考に別ブックからデータを参照する方法で苦戦しています。 http://www.eurus.dti.ne.jp/yoneyama/Excel/vba/vba_validation.html Sub name_1()   Dim lCol As Long, lRow As Long   Dim i As Long, nName As String Dim Wb As Workbook ←追記 Set Wb = Workbooks("MyBook.xls") ←追記     On Error Resume Next     With Wb.Sheets("Sheet2")       lCol = .Range("A1").End(xlToRight).Column       ActiveWorkbook.Names("項目リスト").Delete       ActiveWorkbook.Names.Add Name:="項目リスト", _         RefersTo:=.Range(.Cells(1, 1), .Cells(1, lCol))       '----名前の定義       For i = 1 To lCol         lRow = .Cells(1, i).End(xlDown).Row         nName = .Cells(1, i).Value         ActiveWorkbook.Names(nName).Delete         .Range(.Cells(1, i), .Cells(lRow, i)).CreateNames Top:=True       Next i     End With End Sub Sub Macro2()   name_1   With Range("A2:A10").Validation     '--入力規則を削除     .Delete     '--入力規則を設定     .Add Type:=xlValidateList, _       Formula1:="=項目リスト"   End With   '--B2セルへ入力規則を設定   With Range("B2:B10").Validation     .Delete     .Add Type:=xlValidateList, _       Formula1:="=IF(A2="""",A2,INDIRECT(A2))"   End With End Sub Private Sub Worksheet_Change(ByVal Target As Range)   Dim c As Range Dim Wb As Workbook ←追記 Set Wb = Workbooks("MyBook.xls") ←追記     If Not (Application.Intersect(Target, Range("A2:B10")) Is Nothing) Then     name_1     Application.EnableEvents = False       If Target.Column = 1 Then         If Target.Value = "" Then           Target.Offset(0, 1).Value = ""         Else           Set c = Wb.Sheets("Sheet2").Range(Target.Value).Find(Target.Offset(0, 1).Value, lookat:=xlWhole) ←ここでエラー           If c Is Nothing Then             Target.Offset(0, 1).Value = ""           End If         End If       End If       If Target.Column = 2 Then         If Target.Value = "" Then           Target.Offset(0, -1).Value = ""         End If       End If     Application.EnableEvents = True     End If End Sub どのように改変すれば良いのでしょうか?

  • VBA Intersectで範囲の記述

    エクセル2000です。 Intersectで範囲の記述で、名前が定義された範囲、myRng と その2列右どなりを指定したいのですが、 Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Union(Range("myRng"), Range("myRng").Offset(, 2))) Is Nothing Then Exit Sub MsgBox Target.Address End Sub のようにUnionを使わなければできないでしょうか? myRngがA1:A10であれば、 If Intersect(Target, Range("A1:A10,C1:C10")) Is Nothing Then Exit Sub と簡単に記述できるのですが。

  • VBA 範囲選択時エラー

    Private Sub Worksheet_SelectionChangeのVBAでA列B列C列でワンクリックで文字が入力できるように設定致しました。 その後、A列からC列を範囲選択してDeleteするとデバック 「実行時エラー  型が一致しません」と出てしまいます。業務上、そのセルのデータは一気に消したいので困っております。どなたか分かる方よろしくお願い致します。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim rng As Range, rng_1 As Range, rng_2 As Range Application.EnableEvents = False Set rng_1 = Range("H17:H100") Set rng_2 = Range("I17:I100") Set rng_3 = Range("J17:J100") Set rng_4 = Range("K17:K100") Application.EnableEvents = True Set rng = Intersect(Target, rng_1) If Not rng Is Nothing Then Cancel = True If Target.Value = "" Then Target.Value = "(1)" Else Target.Value = "(1)" End If Else Set rng = Intersect(Target, rng_2) If Not rng Is Nothing Then Cancel = True If Target.Value = "(2)" Then Target.Value = Empty Else Target.Value = "(2)" End If Else Set rng = Intersect(Target, rng_3) If Not rng Is Nothing Then Cancel = True If Target.Value = "(3)" Then Target.Value = Empty Else Target.Value = "(3)" End If Else Set rng = Intersect(Target, rng_4) If Not rng Is Nothing Then Cancel = True If Target.Value = "(4)" Then Target.Value = Empty Else Target.Value = "(4)" End If End If End If End If End If End Sub

  • excelVBA rangeのdeleteの検出

    よろしくお願いします。 Sub test() Dim a As Range If a Is Nothing Then MsgBox "1:nothing" '表示する Set a = Range("C3") If a Is Nothing Then MsgBox "2:nothing" '表示しない MsgBox a.Row '表示する a.Delete shift:=xlUp If a Is Nothing Then MsgBox "3:nothing" '表示しない MsgBox a.Row    'エラーになる End Sub 知りたいのはaをdeleteしたことをif文で検出したいのです。どうすればいいのでしょうか。 (setしたあとでdeleteしても既にそれはnothingではありません。set a=nothing をa.Delete shift:=xlUp のあとに挿入すれば、3:nothingは表示します。しかし、今したいのは、deleteしたことを検知することです。)(on error goto を使わずに処理したいです。)

  • エクセル イベントマクロのエラー回避

    イベントマクロを初めて書いてみたのですが A列を全部選択して削除などをするとエラーがて出てしまいます 回避するにはどのようにしたら良いのでしょうか? Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Range("A:A")) Is Nothing Then Select Case Target.Value Case Is = "りんご" cellColor = 3 Case Is = "みかん" cellColor = 6 End Select End If If Not Intersect(Target, Range("B:B")) Is Nothing Then Select Case Target.Value Case Is = "りんご" cellColor = 6 Case Is = "みかん" cellColor = 3 End Select End If Target.Interior.ColorIndex = cellColor End Sub 以上が書いたものです。 皆様の知恵お貸しください 宜しくお願いします。

専門家に質問してみよう