2016-09-23 20 views
1

Excel 2010では、Worksheet_Changeイベントから 'Target'をサブルーチンに渡そうとしています。サブは、特定の範囲内で変更が発生したかどうかをチェックし、変更がある場合はそれを行います。私が抱えている問題は、ターゲットが呼び出し側のプロシージャのそれとは異なる振る舞いをしているようです。例えば、呼び出しプロシージャでは、交差点内でTargetを使用することができます。サブオブジェクトに渡して同じことをすると、実行時エラー(1004)が発生します。私のコードは以下の通りです。誰かが私に間違っていることを知らせることができれば、感謝しています。 「シート上のコード - これは、複数のシート上にあるExcelでVBAをターゲットに渡す

Private Sub Worksheet_Change(ByVal Target As Range) 
     SubRout Target 
End Sub 

コードモジュール

Sub SubRout (ByVal Target As Range) 

    Dim ValidChange As Boolean 

    ValidChange = True 

    'Check if change on sheet was a change to cell in named range 
    If Intersect(Target, Names("WB4aWBSRange").RefersToRange) Is Nothing Then ValidChange = False 

    If ValidChange = True And Target.value <> "" Then 

     'Do stuff 

    End If 

End Sub 

実行時エラーが交差ライン上で発生しますが、私はすべてのコードを上に移動した場合それはうまく動作する呼び出しルーチンに。

答えて

3

エラーはそのためではありません。エラーはNames("WB4aWBSRange").RefersToRangeのためです。あなたはそのように使うことはできません。

使用この

If Intersect(Target, Range("WB4aWBSRange")) Is Nothing Then ValidChange = False 
+1

ありがとうございます。これは修正されていますが、私の知る限り、2つの処理方法がどう違うのですか?また、そのコードがWorksheet_Changeイベントまで移動したときにバージョンが機能するのはなぜですか? – laserdunc

+1

私はそれを理解したかもしれないと思います。 'WB4aWBSRange'は、ブックレベルではなくシートレベルの名前付き範囲です。つまり、モジュール内のコードに移動したときに、単一の名前付き範囲に戻すことはできません。正しい?またはマイルオフ!? – laserdunc

+1

@laserdunc - 'Names'はワークシートのプロパティです。ワークシート・モジュールから呼び出すと、ワークシート・スコープで使用されます。非ワークシートモジュールからifを呼び出すと、グローバルスコープで 'Names'が使用されます。 – Comintern

1

文が必要ない場合is Nothingは、最初のブール値を返すので:

私はむしろ、すべての変数を使用しないで、代わりにこれを行うだろう

ValidChange = Not Intersect(Target, Range("WB4aWBSRange")) Is Nothing

を:

If Not Intersect(Target, Range("WB4aWBSRange")) Is Nothing' then 


    If Target.value <> "" Then 


     'Do stuff 

    End If 

End Sub 
関連する問題