我正在尝试在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
答案 0 :(得分:1)
一些问题:
&
连接字符串。加号(+
)用于添加; For
循环没有做任何事情:它的身体是空的; Do While
循环最多只会运行一次,因为i
不会增加; For
和Do 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上对此进行测试,以便在您想要回滚更改时不会丢失原始值! ;)