[英]Conditionally formatting a looped range of cells based on value in other cell in VBA
[英]VBA code to display message based on cell value in a range of cells
我是VBA的新手。 我正在尝试创建一个宏,该宏将根据不同工作表上一系列单元格的单元格值显示一条消息。我已经有一个宏,本质上是ctlr + F,目标是当输入ID号时新的宏将显示所需的消息。
这就是我所拥有的,并且您可以告诉我我很新,甚至可能与我所需要的不相近:
Sub Worksheet_Calculate()
If Worksheets("worksheet").range("B2:B200") > 0 Then
MsgBox "message needed"
Else
MsgBox "other message needed"
Exit Sub
End If
End Sub
理论上,如果从第一个宏的单元格范围中搜索到的单元格中有0,则它将显示一条消息,否则将显示替代消息。
Worksheet_Calculate
处理程序(应该为Private
)将在每次在该工作表上进行任何计算时执行。
目的是当输入该ID号时,此新宏将...
为此使用Worksheet_Change
处理程序。 您将获得一个ByVal Target As Range
参数,该参数告诉您已修改了哪个单元格。 您可以使用Application.Intersect
来确定Target
是否与特定范围的单元格相交,并采取相应的行动-此站点上有很多示例。
现在,此代码:
If Worksheets("BLD Id List To Be Searched").Range("B2:B200") > 0 Then
隐式获取一个多单元格Range
对象的Value
(它是一个2D变量数组),然后将其与0
进行比较。 这是保证的类型不匹配运行时错误,因为您不能像这样将整个数组与单个值进行比较。
在这里接受@BigBen的建议:
If Application.WorksheetFunction.CountIf([ActiveWorkbook.]Worksheets("name").Range("B2:B200"), ">0") > 0 Then
请注意,如果您打算使用ThisWorkbook
(即包含VBA代码的Excel文档),并且工作表“要搜索的BLD ID列表”在ThisWorkbook
编译时存在,则该代码将更加健壮/使用用户可修改的“标签名称”来证明您是否使用工作表的代码名,而不是从当时正处于活动状态的任何工作簿的Worksheets
集合中取消引用它。
将工作表模块的(Name)
属性更改为BLDListSheet
,然后可以执行以下操作:
If Application.WorksheetFunction.CountIf(BLDListSheet.Range("B2:B200"), ">0") > 0 Then
无需担心使代码与工作表的“选项卡名称”保持同步。
现在,如果宏在每次修改单元格时都运行,那么显示一条消息并忽略修改了哪个特定单元格就没有多大意义了,是吗?
Private Sub Worksheet_Change(ByVal Target As Range)
If Application.Intersect(BLDListSheet.Range("B2:B200"), Target) Is Nothing Then Exit Sub
If IsNumeric(Target.Value) Then
If Target.Value > 0 Then
' modified cell has a new value greater than 0
Else
' modified cell has a new value less than or equal to 0
End If
Else
' Target.Value may not be safe to compare with anything here.
If IsError(Target.Value) Then Debug.Print Target.Address & " contains an error!"
End If
End Sub
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.