[英]Random Failure of Simple Macro Designed to Hide Rows Based on Cell Value
My Macro is failing w/ seemingly no explanation.我的宏失败,似乎没有任何解释。 I'm thinking it could be a syntactical issue.我认为这可能是一个语法问题。
It is designed to hide/show certain rows based on a certain cell's (FacilityChoice) value.它旨在根据特定单元格的 (FacilityChoice) 值隐藏/显示特定行。 The value is input via Data Validation List.该值通过数据验证列表输入。
It will work for a while, but sometimes the Debugger highlights one of my first two lines.它会工作一段时间,但有时调试器会突出显示我的前两行之一。 I have been able to fix this simply by deleting and replacing the final character in each line.我已经能够通过删除和替换每行中的最后一个字符来简单地解决这个问题。
Other times the Macro simply does not work & the debugger offers no feedback.其他时候,宏根本不起作用,调试器不提供任何反馈。
As described above, the failures I have observed fall into two categories:如上所述,我观察到的失败分为两类:
In scenario 1, I was able to fix the problem simply by deleting/rekeying the final character in the line.在场景 1 中,我能够简单地通过删除/重新输入行中的最后一个字符来解决问题。
I have been unable to successfully address scenario 2.我一直无法成功解决方案 2。
Please see code below:请看下面的代码:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Application.Intersect(Range("FacilityChoice"), Range(Target.Address)) Is Nothing Then
'Gen Office Scenario
If ActiveWorkbook.Sheets("SNA Tool").Range("FacilityChoice").Value = ActiveWorkbook.Sheets("References").Range("E2") Then
ActiveSheet.Rows(17 & ":" & 23).EntireRow.Hidden = False
ActiveSheet.Rows(25).EntireRow.Hidden = False
ActiveSheet.Rows(29 & ":" & 30).EntireRow.Hidden = False
ActiveSheet.Rows(37 & ":" & 39).EntireRow.Hidden = False
ActiveSheet.Rows(43 & ":" & 45).EntireRow.Hidden = False
'POP Scenario
ElseIf ActiveWorkbook.Sheets("SNA Tool").Range("FacilityChoice").Value = ActiveWorkbook.Sheets("References").Range("E3") Then
ActiveSheet.Rows(17 & ":" & 23).EntireRow.Hidden = True
ActiveSheet.Rows(25).EntireRow.Hidden = True
ActiveSheet.Rows(29 & ":" & 30).EntireRow.Hidden = True
ActiveSheet.Rows(37 & ":" & 39).EntireRow.Hidden = True
ActiveSheet.Rows(43 & ":" & 45).EntireRow.Hidden = True
'Warehouse Scenario
ElseIf ActiveWorkbook.Sheets("SNA Tool").Range("FacilityChoice").Value = ActiveWorkbook.Sheets("References").Range("E4") Then
ActiveSheet.Rows(17 & ":" & 23).EntireRow.Hidden = True
ActiveSheet.Rows(25).EntireRow.Hidden = True
ActiveSheet.Rows(29 & ":" & 30).EntireRow.Hidden = True
ActiveSheet.Rows(37 & ":" & 39).EntireRow.Hidden = True
ActiveSheet.Rows(43 & ":" & 45).EntireRow.Hidden = True
'Rapid Scenario
ElseIf ActiveWorkbook.Sheets("SNA Tool").Range("FacilityChoice").Value = ActiveWorkbook.Sheets("References").Range("E5") Then
ActiveSheet.Rows(17 & ":" & 23).EntireRow.Hidden = True
ActiveSheet.Rows(25).EntireRow.Hidden = True
ActiveSheet.Rows(29 & ":" & 30).EntireRow.Hidden = True
ActiveSheet.Rows(37 & ":" & 39).EntireRow.Hidden = True
ActiveSheet.Rows(43 & ":" & 45).EntireRow.Hidden = True
End If
End If
End Sub
You can use Select Case
and a little re-arrangement to simplify your code:您可以使用Select Case
和一些重新排列来简化您的代码:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim wsRef As Worksheet, bHide As Boolean
If Application.Intersect(Me.Range("FacilityChoice"), Target) Is Nothing Then Exit Sub 'no action
Set wsRef = ThisWorkbook.Worksheets("References")
Select Case Me.Range("FacilityChoice").Value
Case wsRef.Range("E2").Value
bHide = False
Case wsRef.Range("E3").Value, wsRef.Range("E4").Value, wsRef.Range("E5").Value
bHide = True
Case Else
Exit Sub 'no action...
End Select
'set row visibility
Me.Range("A17:A23,A25,A29:A30,A37:A39,A43:A45").EntireRow.Hidden = bHide
End Sub
Note in a worksheet event handler you can use Me
to refer to the worksheet: it's safer than using ActiveSheet
请注意,在工作表事件处理程序中,您可以使用Me
来引用工作表:它比使用ActiveSheet
更安全
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.