Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 用VBA动态隐藏行_Excel_Vba - Fatal编程技术网

Excel 用VBA动态隐藏行

Excel 用VBA动态隐藏行,excel,vba,Excel,Vba,我有一个电子表格,它隐藏了除日期和指定区域以外的所有行,如下所示: 'Get week no value... wk = Range("$B$2").Value 'If value changes... If Target.Address = "$B$2" Then 'Hide all rows/weeks... Range("allWeeks").Select Application.Selection.EntireRow.Hidden = True '...but show week s

我有一个电子表格,它隐藏了除日期和指定区域以外的所有行,如下所示:

'Get week no value...
wk = Range("$B$2").Value

'If value changes...
If Target.Address = "$B$2" Then
'Hide all rows/weeks...
Range("allWeeks").Select
Application.Selection.EntireRow.Hidden = True

'...but show week selected by 'wk'
Range(wk).Select
Application.Selection.EntireRow.Hidden = False
Option Explicit

Sub HideRows()

    Dim mainRng As Range
    Set mainRng = Range("A2:A" & Range("A" & Rows.count).End(xlUp).Row)

    Dim unionRng As Range

    Dim i As Long
    For i = mainRng.Row To mainRng.Row + mainRng.Rows.count - 1
        If Cells(i, 1).Value2 = "HC" Then
            If Not unionRng Is Nothing Then
                Set unionRng = Union(unionRng, Cells(i, 1))
            Else
                Set unionRng = Cells(i, 1)
            End If
        End If
    Next i

    If Not unionRng Is Nothing Then unionRng.EntireRow.Hidden = True

End Sub
一切都很好。然而。在每个指定的星期内,我都会在要隐藏的行的A列中隐藏由“HC”定义的计算行。Range(wk)的显示将隐藏这些隐藏行,因此我引入了一个循环来关闭所有“HC”隐藏列

Dim x As Integer

For x = 1 To 1500
      If Sheet1.Cells(x, 1).Value = "HC" Then
   Sheet1.Rows(x).Hidden = True

    End If
Next

End Sub

结果是,它有点工作,但我必须等待几秒钟的过程来完成,每次我输入一个单元格,这是使表几乎无法工作。任何指点都将不胜感激

通常,您希望在循环中建立一个要隐藏的行范围,然后分别隐藏该范围。您可以使用以下函数构建要隐藏的范围:

'Get week no value...
wk = Range("$B$2").Value

'If value changes...
If Target.Address = "$B$2" Then
'Hide all rows/weeks...
Range("allWeeks").Select
Application.Selection.EntireRow.Hidden = True

'...but show week selected by 'wk'
Range(wk).Select
Application.Selection.EntireRow.Hidden = False
Option Explicit

Sub HideRows()

    Dim mainRng As Range
    Set mainRng = Range("A2:A" & Range("A" & Rows.count).End(xlUp).Row)

    Dim unionRng As Range

    Dim i As Long
    For i = mainRng.Row To mainRng.Row + mainRng.Rows.count - 1
        If Cells(i, 1).Value2 = "HC" Then
            If Not unionRng Is Nothing Then
                Set unionRng = Union(unionRng, Cells(i, 1))
            Else
                Set unionRng = Cells(i, 1)
            End If
        End If
    Next i

    If Not unionRng Is Nothing Then unionRng.EntireRow.Hidden = True

End Sub

有时,当您想要一次更新太多内容时,UI会变得有点无响应

我发现,在进行这些更改时禁用UI更新,会将速度提高一个数量级:

Sub XXX()
    ...
    On Error GoTo EH
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Application.EnableEvents = False
    Application.StatusBar = "I'm working on it..."

' do lots of changes in cells, rows, sheets...

' Undo the accel changes:
CleanUp:
    On Error Resume Next
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True
    Application.StatusBar = False
Exit Sub
EH:
    ' Do error handling
    MsgBox "Error found: " & Err.Description
    GoTo CleanUp

End Sub

而且

通常,您应该建立一个要隐藏的行范围,然后分别隐藏该范围的行数。通过将所有这些代码放在我自己的代码之上,除了我放在我的终端Sub前面的执行行之外,我在加入@A.M.的应用程序后,使其正常工作。屏幕更新建议。再次感谢。我为你守候。