Vba 扫描范围查找值,并在条件满足时保留空白(或零)

Vba 扫描范围查找值,并在条件满足时保留空白(或零),vba,excel,Vba,Excel,我有以下代码: 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 E

我有以下代码:

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填充),但这不起作用,没有错误消息或输出

我认为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

我认为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

Siva已经给出了答案,但这里有一种“修复”代码的方法:

要在整个数组中循环,请为列使用第二个参数

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
可以对数组上的每个循环使用
,但只能访问数组中的元素而不能替换它们,因为只能获取值,而不能获取引用

如果不想使用数组,可以对每个循环使用

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

替换方法可能是最快的,尽管Siva已经给出了答案,但这里有一种“修复”代码的方法:

要在整个数组中循环,请为列使用第二个参数

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
可以对数组上的每个
循环使用
,但只能访问数组中的元素而不能替换它们,因为只能获取值,而不能获取引用

如果不想使用数组,可以对每个循环使用

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

Replace方法可能是最快的方法,但是

对于一种方法,您只在第一列上循环。还有,你为什么要这样定义
rng
?您知道
&
操作员的工作吗?它只是连接字符串,所以如果您使用的范围有89行,
rng
将一直到第8989行。忘记删除该行了&。那么,我应该改变什么来扫描整个范围呢?首先,你只是在第一列上循环。还有,你为什么要这样定义
rng
?您知道
&
操作员的工作吗?它只是连接字符串,所以如果您使用的范围有89行,
rng
将一直到第8989行。忘记删除该行了&。那么,我应该改变什么来扫描整个范围呢?如果你直接在单元格中循环,你可以对rng中的每个单元格使用
。然而,你应该调暗你的变量。您也不应该将
等属性用作variables@arcadeprecinct,感谢分享您的意见。我将结合您的最佳实践修改答案看起来(几乎)不错,但您仍然没有声明
cellval
。查看文档中的
选项Explicit
部分:@arcadeprecinct,我的错,我错过了,再次感谢,我将修改它。如果您直接在单元格中循环,您可以对rng中的每个单元格使用
。然而,你应该调暗你的变量。您也不应该将
等属性用作variables@arcadeprecinct,感谢分享您的意见。我将结合您的最佳实践修改答案看起来(几乎)不错,但您仍然没有声明
cellval
。查看文档中的
选项Explicit
部分:@arcadeprecinct,我的错,我错过了,再次感谢,我会修改它。