2016-07-25 180 views
0

これら2つの問題は、Worksheet_ChangeとTargetを使用すると切り詰められます。ターゲットが参照していると思われるセルの内容を削除すると起こります。私は目を通すための私のコードを与えるだろう、それは非常に簡単です:(VBAにPSは、比較的新しい、任意のヒントは素晴らしいことだ!)のコードは、私が最初のシートと型を開いたときに、私が何をしたいんMS Excel VBA、スタック領域不足、実行時エラー '-2147417848(800 10 108)': 'Range'オブジェクトの 'Value'メソッドが失敗しました

Private Sub Worksheet_Change(ByVal Target As Range) 

'## Determine if change to cell Q6 
If Target.Cells.count > 1 Then Exit Sub 

If Target = Range("Q6") Then 
    'Determine if the 1 is contained within cell Q6 
    vRangeValue = Range("Q6").Value 
    vStringValue = 1 
    Application.EnableEvents = False 

     'Paste value in R6 
    If vRangeValue = vStringValue Then 
     Range("R6").Value = 1 
    End If 

End If 

'Remove 1 from R6 
Range("R6").Value = 0 
Range("R7").Value = 1 
Application.EnableEvents = True 

End Sub 

1をQ6に入れます(R6に1を入れて素早く0に戻します)。それはまた、R7に1を入れます。私は小切手を求めていたので、速くなりました。しかし、シートの中のどのセルの内容をも削除すると(タイトル通り)、タイトルに指定された2つのエラーのうちの1つが表示されています。 私はグーグルで試したことがありますが、私が見つけたすべての例は理解できないほど具体的なものなので、私はここで相談したいと考えました。何か助けてくれてありがとう、そしてもし私が何かばかげたことをやったのなら、ごめんなさい!

答えて

2

ここにいくつかの問題があります。 Worksheet_Changeイベントはあなたがポイントを得る... Worksheet_Changeイベントを発生させたワークシートを変更Worksheet_Changeイベントを、発射のワークシートを、変更されているので

まず、あなたはスタック領域が不足しています。

これを処理する1つの方法は、イベントハンドラが再帰するのを防ぐ再入力フラグを追加することです。もう1つは(あなたが試したように)イベントを止めますが、以下を参照してください...私の個人的な好みは、私が実際に気にしている他のイベントに干渉しないように、再エントリーフラグを使用することです。

第2に、RangeのデフォルトプロパティはValueです。それはセルの内容を比較している... ...ここ

If Target = Range("Q6") Then 

を "テスト" を意味します。テストしているのは、ValueRange("Q6")Targetに割り当てているかどうかは、Trueです。しかし、この時点では、イベントハンドラが発生し、Application.EnableEvents = Falseがコード内のその行の下にあるため、問題はありません。

このセクションでは、余分な作業の束を行い、単純な比較や代入に凝縮することができます:私はもっとこのような何かしたい

vRangeValue = Range("Q6").Value 
vStringValue = 1 
'... 
If vRangeValue = vStringValue Then 
Range("R6").Value = 1 
End If 

Private Changing As Boolean  'Module level scope 

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Changing Or Target.Cells.Count > 1 _ 
    Or Application.Intersect(Target, Range("Q6")) Is Nothing Then Exit Sub 

    Changing = True 
    If Target.Value = 1 Then 
     Range("R6").Value = 1 
    End If 

    'Range("R6").Value = 0 '<--No clue why you do this. 
    Range("R7").Value = 1 
    Changing = False 
End Sub 
関連する問題