条件循环的VBA代码

时间:2016-05-18 22:26:14

标签: excel vba excel-vba

我正在尝试在Excel中创建一个条件循环宏。 B列包含姓氏,C列包含名字,D列包含姓氏和名字。我试图让宏检测列D = C列+ B列。

如果D = C + B,则清除D.

的内容

因此,以下适用于单行:

Sub ClearContentsD ()

If Range("D1").Value = Range("C1").Value + Space(1) + Range("B1") Then Range("D1").ClearContents

End Sub

没有添加的Space(1)它不起作用,我不能让它遍历整个工作表:

Sub ClearContentsLoop()

Application.ScreenUpdating = False

    Dim i As Long
    For i = 1 To Rows.Count

    Next i

Do While Cells(i, 4).Value = Cells(i, 3).Value + Space(1) + Cells(i, 2).Value
Cells(i, 4).ClearContents

Loop

Application.ScreenUpdating = True

End Sub

VBA不喜欢我的Do While。任何帮助将不胜感激。

CJ

2 个答案:

答案 0 :(得分:1)

一些问题:

  • 您必须使用&连接字符串。加号(+)用于添加;
  • 你的For循环没有做任何事情:它的身体是空的;
  • 您的Do While循环最多只会运行一次,因为i不会增加;
  • 为什么你想要两个循环(ForDo While),这是一个谜。
  • 一张工作表有很多行,您只使用一小部分,因此不要遍历所有这些行(For)并使用UsedRange

可能的纠正:

Sub ClearContentsLoop()
    Dim i As Long

    Application.ScreenUpdating = False
    For i = 1 To ActiveSheet.UsedRange.Rows.Count
        If Cells(i, 4).Value = Cells(i, 3).Value & " " & Cells(i, 2).Value Then
            Cells(i, 4).ClearContents
        End If
    Next i
    Application.ScreenUpdating = True
End Sub

答案 1 :(得分:0)

有一种方法可以忽略您正在评估的值中的空间。试试这个:

Application.ScreenUpdating = False

    Dim i As Long
    For i = 1 To Rows.Count
        If InStr(1, Cells(i, 4).Value, Cells(i, 2).Value, vbTextCompare) > 0 And InStr(1, Cells(i, 4).Value, Cells(i, 3).Value, vbTextCompare) > 0 Then Cells(i, 4).ClearContents
    Next i

Application.ScreenUpdating = True

<强>解释

通过使用 InStr 函数,您正在测试另一个文本字符串是否存在,如果找到至少一个匹配项,则该函数返回一个非零值(发现比赛的位置)。在上面的示例中,您将同时测试是否存在名字和姓氏,如果找到了这两个名称,则代码会清除单元格的内容。

并且,正如评论部分所指出的,您需要在循环内执行此操作,以便按照指定评估和更新工作表长度内的所有单元格。

请务必在原始数据的COPY上对此进行测试,以便在您想要回滚更改时不会丢失原始值! ;)