- ベストアンサー
ExcelVBA入力規則・条件付き書式の設定確認
- ExcelVBAを使用して、セルに入力規則・条件付き書式が設定されているかを判定する方法を教えてください。
- 上記の方法では、設定されていないシート上で実行するとエラーが発生します。エラーを使わずに判定する方法があれば教えてください。
- Windows7とExcel2010の環境で、ExcelVBAの入力規則・条件付き書式の設定を確認する方法をお教えください。
- みんなの回答 (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 ' ' ================================
その他の回答 (1)
- real beatin(@realbeatin)
- ベストアンサー率82% (174/211)
こんにちは。 せっかくなので、対話型で書いてみました。 ご質問のように単セルを対象に調べる場合でも、 そちらの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 ' ' ================================
お礼
回答ありがとうございます。 参考にさせていただきます。
お礼
回答ありがとうございます。 やりたいことが実現できました!