Excel VBA中Named Range在Case Is函数中失效问题排查
问题原因及修正方案
你的问题出在比较逻辑的类型不匹配:
原代码中Target.Address是字符串类型(比如$C$16),而你替换后的Range("Answer")是一个Range单元格对象。VBA会自动把Range对象转换成它的默认属性值(即单元格的内容),所以实际是在把Target的地址字符串和C16单元格的内容做比较,这两个值几乎不可能相等,因此Case分支永远不会触发,也不会报错。
修正方案一:直接比较地址字符串
把Case Is = Range("Answer")改成Case Is = Range("Answer").Address,明确获取命名区域的地址字符串来和Target的地址比较,和原代码逻辑完全一致:
Private Sub Worksheet_Change(ByVal Target As Range) Select Case Target.Address Case Is = Range("Answer").Address Select Case Target.Value Case "Please select from the dropdown list": Macro3 Case "Yes - Standard form": Macro1 Case "Yes - Bespoke": Macro2 Case "No": Macro3 End Select End Select End Sub
修正方案二:更严谨的交集判断(推荐)
如果后续命名区域可能扩展为多个单元格,或者用户可能选中多个单元格触发Change事件,用Intersect判断Target是否和命名区域重叠会更可靠:
Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Range("Answer")) Is Nothing Then Select Case Target.Value Case "Please select from the dropdown list": Macro3 Case "Yes - Standard form": Macro1 Case "Yes - Bespoke": Macro2 Case "No": Macro3 End Select End If End Sub
内容的提问来源于stack exchange,提问作者Simon Carter
相关产品推荐
相关产品推荐

