Excel 如何基于行中的值快速隐藏VBA中的行

Excel 如何基于行中的值快速隐藏VBA中的行,excel,vba,show-hide,Excel,Vba,Show Hide,这是我第一次使用这个网站,所以请原谅我的任何不恰当的解释。我有一个工作宏,可以根据行的内容隐藏/取消隐藏行,我只是希望它更快。使用复选框,选中该复选框时,D列中所有带有“x”的行都将被取消隐藏,没有“x”的行将被隐藏。取消选中时也会发生同样的情况,只是它引用的是C列,而不是D列 现在,这段代码有效。这比我想的要慢一点,因为我和一群人分享这个。有没有加快速度的办法?我对VB非常陌生(互联网是一个非常聪明的好老师),但这并不重要。我已经改进了代码——在它选择每一行,然后引用该列之前,这太糟糕了。任何

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

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

非常感谢各位, DS


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

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

对于值不同于“x”的行,必须使用类似“=IF({0}”“x”,ROW({0}),-1”的公式

子测试()
Dim inputRange As范围
最后一排一样长
Dim myFormula作为字符串
朦胧的划子像绳子一样相连,我像绳子一样长
作为变量的模糊结果
带工作表(“基础”)
lastRow=.Range(“D”和.Rows.Count).End(xlUp).Row
设置输入范围=.Columns(“D”).Resize(lastRow)
Application.ReferenceStyle=xlR1C1
myFormula=“=IF({0}=”“x”),行({0}),-1)”
myFormula=VBA.Strings.Replace(myFormula,{0},inputRange.Address(ReferenceStyle:=xlR1C1))
结果=应用程序。评估(myFormula)
结果=应用程序。转置(结果)
Application.ReferenceStyle=xlA1
对于i=LBound(结果)到UBound(结果)
如果(结果(i)>-1),则
rowsJoined=rowsJoined&“A”&结果(i)&IIf(i
作为子应用程序的第一行添加:
Application.screenUpdate=false
,并将另一行添加到
Msgbox(“完成”)
Application.screenUpdate=true
,效果非常好。哇,现在是瞬间。很高兴知道。谢谢,太好了,谢谢!这是个好主意。事实证明,滞后的一个主要原因就是屏幕在不断更新,所以我关闭了它,多亏了KazJaw。但是我将扩展这个工具的功能,所以我将使用这个想法创建一个字符串,然后隐藏行。非常感谢!!我不完全理解这里发生的一切,但看起来不错。我认为字符串需要更长-有没有办法扩展字符串的最大长度?@user2658468哪个字符串需要更长?VBA中字符串的最大长度根据帮助:“可变长度字符串最多可包含约20亿(2^31)个字符。”这对您来说不够吗?
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
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