2017-06-30 27 views
2

Excel VBAを使用していますが、まだかなり新しいです。私は質問を検索し、いくつかの似たようなものを見つけましたが、私のニーズに正しく修正することはできませんでした。範囲内のセル値を更新するExcelの範囲内の別のセルを変更することに基づいて範囲を変更する

私は、ユーザがB列に手作業でデータを入力する(有効なリストから)場合、B列にN/Aを選択すると、col Dの関連データをクリアする必要があります。 H(同じ行)。シートには一定の固定数の行があります。

私はいくつかの方法を試しましたが、ここで私の理解の限界を押しています。以下の方法は簡単なようですが、試してみるたびにExcelのクラッシュが発生します。私はそれを適切なワークシートモジュールに入れました。

Private Sub Worksheet_Change(ByVal Target As Range) 

    Dim i As Long 
    For i = 1 To 500 
     If Range("B" & i).Value = "N/A" Then 
      Range("D" & i,"H" & i).Value = "" 
     End If 
    Next i 
End Sub 

誰でも私が汚れている場所について私に手がかりを与えることはできますか?

+1

ワークシートを変更する前にイベントを無効にする必要があります。そうしないと、 'Worksheet_Change'イベントが発生し、ワークシートに変更が加えられ、' Worksheet_Change'イベントが発生します。ワークシートを変更してください.... – YowE3K

+0

YowE3Kの説明をありがとう。その部分は今より多くの意味があります。私は以前にその問題を実際に襲ってきたのです。 – Etienne145

答えて

1

次のコードでは、あなたの記憶あふれを停止する必要があります:

Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim c As Range 
    'check whether anything needs to be processed 
    If Not Intersect(Target, Columns("B")) Is Nothing Then 
     Application.EnableEvents = False ' stop other events from firing 
     'process each cell that has changed 
     For Each c In Intersect(Target, Columns("B")).Cells 
      If c.Value = "N/A" Then 
       c.Offset(0, 2).Value = "" 
       c.Offset(0, 6).Value = "" 
      End If 
     Next 
     Application.EnableEvents = True ' allow other events to fire 
    End If 
End Sub 

注:ASHは自分の答えで述べたように、あなたが実際に文字列N/Aをチェックされていませんが、#N/Aエラーをチェックしている場合あなたのIfステートメントを変更する必要があります。

+0

偉大な、それはカップルの小さな変更で動作しました。それは間違った細胞をクリアしていましたが、数分間インすると、0,1と0,5のオフセットが働いていました。私はいくつかの細胞が融合していると思う? – Etienne145

1
If Range("B" & i).Value = "N/A" Then 

セルは#N/Aを持っている場合は、その.Valueはテキストでも数でもないですが、エラーコード2042Error Variant。エラーバリアントを文字列と比較することはできません。ランタイムエラーのタイプが不一致です。

ので、エラーケースをチェックするために、あなたが表示されたテキストを取得したい場合は、最後に

If Application.IsNA(Range("B" & i).Value) Then 

を使用することができ、

If isError(Range("B" & i).Value) Then 

使用したり、特定のエラーNAをチェックします

If Range("B" & i).Text = "#N/A" Then 
:それはタイプ何でも電池は、あなたが .Textプロパティ(ではないが、それをテストするための推奨方法)を使用することができます10

最後に、これを修正した後、@ YowE3kがコメント内で述べたように、Worksheet_Changeルーチンのエントリでイベントを無効にします。そうしないと、リエントラントルーチンと何かが推測されます:stackoverflow

+1

私は実際に "N/A"というユーザ入力のテキスト文字列を評価しようとしています。しかし、数回ポップアップするとエラーが発生しているので、#N/Aの情報は役に立ちます。ありがとう – Etienne145

関連する問題