简体   繁体   English

设计用于基于单元格值隐藏行的简单宏的随机失败

[英]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:如上所述,我观察到的失败分为两类:

  1. an issue with Sub definition or the initial if not statement Sub 定义或初始 if not 语句的问题
  2. an issue where no feedback is offered by the debugger调试器不提供反馈的问题

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM