0

这是我第一次使用该网站,请原谅我的任何无能解释。我有一个工作宏来根据行的内容隐藏/取消隐藏行,我只是希望它更快。使用复选框,当框中检查框时,所有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
4

1 回答 1

0

您可以使用数组公式并让 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
于 2013-08-07T11:30:41.213 回答