Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 7 Home Premium : Excel 2013)
IsError関数のエラートラップについて
投稿日時: 21/04/02 15:57:47
投稿者: shimoichimabu

入力規則でリストが設定してあるセルをクリックした時だけDropDownリストを表示させるコードを書きましたが、このコードで問題なく、動作しています。しかし、少し気になる点があります。
ステップマクロで実行し、コードの動作を確認したところ、
入力規則のリストが設定していないセルあるいは全く入力規則が設定されていないセルをクリックした時、IsError(ActiveCell.Validation.Type)の部分がデバック画面のクイックウオッチに「アプリケーション定義またはオブジェクト定義のエラーです。」と表示されています。
そのまま、ステップマクロを実行すると、
  ActiveCell.Activate
  Exit Sub
まで実行され、ちゃんと終了します。何が気になるかというと、 IsError(ActiveCell.Validation.Type)がTrueにならないことと、エラー発生しているのに、そのままマクロが実行されてしまうことです。On Error Resume Nextによるものと思いますが。
本当はOn Error Resume Nex を使用せずIsErrorでエラートラップできるかな思っていたのですが・・・・。
 
入力規則のリストが設定してあるセルをクリックした時はIsError(ActiveCell.Validation.Type)の部分はFalseになっています。
 
コード自体は、実用上、結果オーライで問題ないですが、このコードはあまり推奨されないものでしようか?
On Error Resume Nextを使わず、コードを書くことができるでしようか?
 
Private Sub Worksheet_SelectionChange(ByVal target As Range)
 
On Error Resume Next
     
    With ActiveCell.Validation
        
        If IsError(.Type) Then
            ActiveCell.Activate
            Exit Sub
        ElseIf .Type = xlValidateList Then      '入力規則のリストが設定されている時
            CreateObject("WScript.Shell").SendKeys "%{DOWN}" 'DropDownリストを表示させる。
        End If
         
    End With
 
On Error GoTo 0
     
End Sub

回答
投稿日時: 21/04/02 17:28:15
投稿者: mattuwan44

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim rng As Range
    
    If Target.Count > 1 Then Exit Sub
    On Error Resume Next
    Set rng = Me.SpecialCells(xlCellTypeAllValidation)
    On Error GoTo 0
    If rng Is Nothing Then Exit Sub
    If Intersect(rng, Target) Is Nothing Then Exit Sub
    
    If Target.Validation.Type = xlValidateList Then
        CreateObject("WScript.Shell").SendKeys "%{DOWN}"
    End If
End Sub

 
ぱっと思いついた感じでいえば、例えばこんな感じとか?
※動作は未確認です。

回答
投稿日時: 21/04/02 21:37:02
投稿者: WinArrow
投稿者のウェブサイトに移動

既に回答がありますが、
  
エラートラップを使うのでしたら、
If Err <>0 then
というような使い方をしないと
正しく動作しません。
IsError(.Type)ではエラーにはなりません。
アプリケーション定義またはオブジェクト定義のエラーです。
これは、端的に言えば、オブジェクトが認識できていない
というエラーなので、
IsError関数の使い方に問題ありまs。

投稿日時: 21/04/03 17:08:36
投稿者: shimoichimabu

mattuwan44さん、 WinArrowさん回答ありがとうございます。
 
最初、Set rng = Me.SpecialCells(xlCellTypeAllValidation) を記述しておく方法もありますね。
 
エラートラップは、まず、On Error Resume Next が必要ですね。
そして、If Err.Number <> 0。
 
結局、下記のように書き換えました。
ご提言、感謝いたします。
 
Private Sub Worksheet_SelectionChange(ByVal target As Range)
 
On Error Resume Next
     
    With ActiveCell.Validation
         
        If Err.Number <> 0 Or .Type <> xlValidateList Then  '.Type <> xlValidateList:日本語入力でオフ(英語モード)に設定してあるセルもあるので
            ActiveCell.Activate
            Exit Sub
        Else
            CreateObject("WScript.Shell").SendKeys "%{DOWN}" 'DropDownリストを表示させる。
        End If
         
    End With
 
On Error GoTo 0
     
End Sub