我完全是 VBA 新手,正在尝试实现以下目标,但没有成功。非常感谢您的帮助。
我需要实现的目标:
如果有人为每一行选择 Action = “Delete” AND Summary = “True”,则 MsgBox “Alert: 如果删除该块,子网络和主机也将被删除
我知道我需要做什么,但我不知道语法。以下是我已经整理好的。只有当我选择 A2 =“删除”时,它才有效。
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A2:A138")) Is Nothing Then
Select Case Range("A2")
Case "Delete": MsgBox "Alert: If the Block is deleted, the child networks and hosts will also be deleted"
End Select
End If
End Sub
答案1
您几乎已经到达目标了,做得好!
仅当我选择 A2 =“删除”时它才有效。
那是因为:Select Case Range("A2")
。你只告诉它查看A2
。如果你想让它查看任何更改的行的 A 列中的值,你可以使用这个:Select Case Range("A" & Target.Row)
。函数内的引用Range()
是字符串,因此它们的工作方式与工作表中的函数相同Indirect()
。你可以将它们拼凑在一起。
此外,没有检查用户是否也在 B 列中选择了“True”。下面的代码是我为您量身定制的解决方案。我偏爱嵌套If
语句,只是因为我用得更多,Select Case
但您可以将其重新设计成您最满意的格式。
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A2:B138")) Is Nothing Then
If UCase(Range("A" & Target.Row)) = "DELETE" Then
If UCase(Range("B" & Target.Row)) = "TRUE" Then
MsgBox "Alert: If the Block is deleted, the child networks and hosts will also be deleted", vbOKOnly + vbExclamation
End If
End If
End If
End Sub
这里有一些功能与问题中的代码不同。
- 我扩大了
Intersect
范围以包括 B 列,以便任一列的更改都会触发该子程序。 - 我使用 转换范围值
UCase
并将其与 进行比较,DELETE
因为默认比较是二进制的,而不是基于文本的,因此Delete
和dElEtE
不相等。如果您的用户输入“delete”而不是使用下拉列表,此代码仍将有效。 - 我添加了对 B 列值的检查。
- 我用 美化了您的消息框
vbExclamation
。