【问题标题】:How to hide rows in VBA based on values in row, quickly如何根据行中的值快速隐藏 VBA 中的行
【发布时间】:2013-08-06 21:15:04
【问题描述】:

这是我第一次使用该网站,请原谅我的任何无能解释。我有一个工作宏来根据行的内容隐藏/取消隐藏行,我只是希望它更快。使用复选框,当框中检查框时,所有D列中的“ X”的行都没有,那些没有“ X”的行被隐藏了。未选中时也会发生同样的情况,只是它引用的是 C 列,而不是 D。

现在,此代码有效。它只是比我想要的慢一点,因为我正在与一群人分享这个。关于如何加快速度的任何想法?我对 VB 非常陌生(互联网非常聪明,而且是一位好老师),但这没关系。我已经改进了代码——在它选择每一行之前,然后引用列,这很糟糕。任何加快速度的想法(最好不移动屏幕)都会很棒。

非常感谢各位, DS

Sub NewLuxCheck()
    Dim x As Integer
    NumRows = Range("A42", "A398").Rows.Count
    Range("A42").Select
    If ActiveSheet.Shapes("checkbox2").OLEFormat.Object.Value = 1 Then
        For x = 42 To NumRows + 41 Step 1
            If Worksheets("Base").Range("D" & x).Value = "x" Then
                Worksheets("Base").Range(x & ":" & x).EntireRow.Hidden = False
            Else
                Worksheets("Base").Range(x & ":" & x).EntireRow.Hidden = True
            End If
        Next
    Else
        For x = 42 To NumRows + 41 Step 1
            If Worksheets("Base").Range("C" & x).Value = "x" Then
            Worksheets("Base").Range(x & ":" & x).EntireRow.Hidden = False
            Else
                Worksheets("Base").Range(x & ":" & x).EntireRow.Hidden = True
            End If
        Next
    End If
    MsgBox ("Done")
End Sub

【问题讨论】:

  • 作为第一行添加到您的子:Application.ScreenUpdating = false 并在 Msgbox ("Done") 之前添加另一行:Application.ScreenUpdating = true
  • 效果很好。哇,现在是瞬间的。很高兴知道。谢谢,太好了。

标签: excel vba show-hide


【解决方案1】:

您可以使用数组公式,让 Excel 返回出现“x”值的行号数组。 这会更快,但您必须重新组织代码并创建单独的函数等。

这里的示例数组公式在“D”列中找到行,单元格的值为“x”。然后以“A1,A5,A10”的形式创建此行号的字符串 ...表示在第 1、5、10 行中找到了“x”。最后 Range(rowsJoind).EntireRow.Hidden 用于一步隐藏/取消隐藏的所有行。

对于值与 'x' 不同的行,您必须使用像 '=IF({0}""x"", ROW({0}), -1)' 这样的公式。

Sub test()
    Dim inputRange As Range
    Dim lastRow As Long
    Dim myFormula As String
    Dim rowsJoined As String, i As Long
    Dim result As Variant

    With Worksheets("Base")
        lastRow = .Range("D" & .Rows.Count).End(xlUp).Row
        Set inputRange = .Columns("D").Resize(lastRow)

        Application.ReferenceStyle = xlR1C1
        myFormula = "=IF({0}=""x"", ROW({0}), -1)"
        myFormula = VBA.Strings.Replace(myFormula, "{0}", inputRange.Address(ReferenceStyle:=xlR1C1))
        result = Application.Evaluate(myFormula)
        result = Application.Transpose(result)
        Application.ReferenceStyle = xlA1

        For i = LBound(result) To UBound(result)
            If (result(i) > -1) Then
                rowsJoined = rowsJoined & "A" & result(i) & IIf(i < UBound(result), ",", "")
            End If
        Next i

        .Range(rowsJoined).EntireRow.Hidden = False
    End With
End Sub

【讨论】:

  • 谢谢!这是一个好主意。事实证明,延迟的一大来源就是屏幕在更新,所以我把它关掉了,多亏了 KazJaw。但我将扩展此工具的功能,因此我将使用创建字符串,然后隐藏行的想法。非常感谢!!
  • 我不完全理解这里发生的一切,但看起来不错。我认为虽然字符串需要更长 - 有没有办法扩展字符串的最大长度?
  • @user2658468 哪个字符串需要更长?最大限度。 VBA 中字符串的长度根据帮助:“可变长度字符串最多可以包含大约 20 亿 (2^31) 个字符。”这对你来说还不够吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-25
  • 2016-01-11
  • 1970-01-01
相关资源
最近更新 更多