【问题标题】:Simplify repetitive VBA hiding row code for Excel为 Excel 简化重复的 VBA 隐藏行代码
【发布时间】:2021-09-29 09:30:49
【问题描述】:

我是 VBA 的新手,所以请与我交流。

我正在寻找一种方法来简化我用来根据某个单元格值隐藏单元格的以下代码。

这是其中的一部分,但它一直持续到一张纸上的第 202 行(其他纸上更多)。

虽然这段代码给出了想要的结果,但添加的越多,它就会变得越慢。

Private Sub Worksheet_Change(ByVal Target As Range)
    If Range("AD31").Value = "Yes" Then
        Rows("32:39").EntireRow.Hidden = False
    ElseIf Range("AD31").Value = "No" Then
        Rows("32:39").EntireRow.Hidden = True
    End If
    If Range("AD40").Value = "Yes" Then
        Rows("41:48").EntireRow.Hidden = False
    ElseIf Range("AD40").Value = "No" Then
        Rows("41:48").EntireRow.Hidden = True
    End If
    If Range("AD49").Value = "Yes" Then
        Rows("50:57").EntireRow.Hidden = False
    ElseIf Range("AD49").Value = "No" Then
        Rows("50:57").EntireRow.Hidden = True
    End If
    If Range("AD58").Value = "Yes" Then
        Rows("59:66").EntireRow.Hidden = False
    ElseIf Range("AD49").Value = "No" Then
        Rows("59:66").EntireRow.Hidden = True
    End If

...等等

谢谢

【问题讨论】:

    标签: excel vba simplify


    【解决方案1】:

    也许是这样,但不确定它会对性能产生什么影响。我认为您已经研究了加快代码速度的常规方法。

    Private Sub Worksheet_Change(ByVal Target As Range)
    
    Dim r As Long
    
    For r = 31 To 58 Step 9
        If Cells(r, "AD").Value = "Yes" Then
            Cells(r + 1, 1).Resize(8).EntireRow.Hidden = True
        End If
    Next r
    
    'or possibly just
    'For r = 31 To 49 Step 9
    '    Cells(r + 1, 1).Resize(8).EntireRow.Hidden = (Cells(r, "AD").Value = "Yes")
    'Next r
    
    End Sub
    

    【讨论】:

      【解决方案2】:

      使用Filter() 公式评估来替代@SJR 的有效答案的MS 365 一次性获得“是”匹配的行号。

      注意完全限定的范围引用,

      • 或者通过例如ThisWorkbook.Worksheets("Sheet1")
      • 或项目的工作表代码(名称)

      在此示例中,我将所有代码都包含在 With ... - End With 语句中; 所以请注意

      • .开头的.Cells(...)指的是Sheet1,

      • .Evaluate. 开头,将其标记为 Excel.Worksheet 类的成员,并再次引用 Sheet1。 (而没有点前缀的EvaluateExcel.Application 的成员,这需要另一种方法来完全限定范围引用)

          With Sheet1         ' project's sheet Code(Name), change to your needs
          'a) get vertical 2-dim array of found row numbers
              Dim YesRows As Variant
              YesRows = .Evaluate("=Filter(Row(AD:AD),AD:AD=""Yes"")")
      
              'b) hide following rows
              Dim i As Long
              For i = 1 To UBound(YesRows)
                  .Cells(YesRows(i, 1) + 1, 1).Resize(8).EntireRow.Hidden = True
              Next
          End With
      
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-29
        • 1970-01-01
        • 1970-01-01
        • 2022-12-23
        • 2014-10-24
        • 2011-05-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多