2016-08-23 7 views
0

I次のコードを持っている:スキャン値を求めると残し条件が満たされたとき、ブランク(またはゼロ)

Sub DELETE2() 

Dim dat As Variant 
Dim rng As Range 
Dim i As Long 

Set rng = Range("C12:K89") 
dat = rng 
For i = LBound(dat, 1) To UBound(dat, 1) 
    If dat(i, 1) = "3" Or dat(i, 1) = "2" Then 
     dat(i, 1) = "" 
    End If 
Next 
rng = dat 

End Sub 

私の目標は、その範囲内の値3または1と離れると、すべてのセルを見つけることでした条件が満たされても動作していない場合は空白(または0で塗りつぶします)。エラーメッセージも出力もありません。

+0

しかし最速だろう

Dim c As Range For Each c In rng If c.Value = "3" Or c.Value = "2" Then c.Value = "" End If Next c 

、あなただけです最初の列をループします。また、なぜあなたは「rng」を定義していますか? '&'演算子は何を認識していますか?文字列を連結するだけで、使用する範囲に89行がある場合、 'rng'は行8989まで移動します。 – arcadeprecinct

+0

&を削除するのを忘れました。では、全範囲をスキャンするにはどうすればよいですか? – Pablo

答えて

1

私はExcel Replace Allがこれを簡単に提供し、これを行うためのマクロは必要ないと思います。

マクロコードを探している場合は、以下のコードを試してみてください。以下のコードを試してみましたが、私のサンプルデータでうまく動作しました。

Sub DELETE2() 

Dim rng As Range 
Dim cellval As Variant 


Set rng = Range("C12:K89") 

For Each cellval In rng.Cells 

     If (cellval .Value = "3" Or cellval .Value = "2") Then cellval .Value = "" 


Next cellval 

End Sub 
+0

セルを直接ループする場合は、 'For Each cell in rng'を使うだけです。ただし、変数を暗くする必要があります。また、入力を共有してくれたので、変数 'Row'のようなプロパティーを@arcadeprecinct変数 – arcadeprecinct

+0

として使用しないでください。 – Siva

+0

(ほぼ)うまく見えますが、まだ 'cellval'を宣言していません。ドキュメントの 'Option Explicit'セクションをチェックしてください:http://stackoverflow.com/documentation/excel-vba/1107/vba-best-practices – arcadeprecinct

1

シヴァはすでに答えを与えたが、ここにコードを「修正」する方法です:

ループに配列全体を通じて、列のための二番目のパラメータを使用し

Dim i As Long 
Dim j As Long 
'... 
For i = LBound(dat, 1) To UBound(dat, 1) 
    For j = LBound(dat, 2) To UBound(dat, 2) 
     If dat(i, j) = "3" Or dat(i, j) = "2" Then 
      dat(i, j) = "" 
     End If 
    Next j 
Next i 

あなたは配列上でFor Eachループを使用できますが、参照ではなく値のみを取得するため、配列内の要素を置換しない要素にのみアクセスできます。

あなたは配列でそれを行うにはしたくない場合は、それがFor EachループとなりますReplaceメソッドは、おそらく1については

関連する問題