2

我编写了一个 VBA 脚本,它应该隐藏引用另一个工作表中空单元格的行。可以这么说,工作表 1 包含单元格 A1,它是空的。工作表 2 的单元格 A1 包含“Sheet1!A1”,但打印 0。我的脚本应该遍历所有行并隐藏包含空引用的行,但似乎没有这样做。如果你能帮助我找出我的错误,那就太好了。到目前为止,这是我的代码:

Sub Hide()
Application.ScreenUpdating = False
Dim i As Integer
For i = 1 To 1000
If IsEmpty(Cells(1, i)) Then
Rows(i).EntireRow.Hidden = True
End If
Next i
Range("A1").Select
Application.ScreenUpdating = True
End Sub

我会非常感谢任何形式的帮助。

此致,

亚历克斯

4

2 回答 2

1

亚历克斯在这里是一种稍微复杂的方法。但它有效:)

注意:这仅适用于引用同一工作簿中的工作表或打开的工作簿工作表的公式。

逻辑

  1. 此代码识别具有公式的单元格,然后遍历它们
  2. 然后在遍历所有具有公式的单元格时,它会检查.Precedents该单元格的。这是最棘手的部分。没有简单的方法来获取另一个工作表或工作簿上的那个.Dependents.Precedents那个谎言。你可以称之为这个属性的限制。所以我正在使用另一种方法来获得那些:)
  3. 获得该单元格的地址后,我将检查它们是否为空,然后根据条件隐藏该单元格。

代码

Sub Sample()
    Dim ws As Worksheet
    Dim rng As Range, acell As Range, bcell As Range

    '~~> This is the sheet which has the formula
    Set ws = Sheets("Sheet1")

    With ws
        '~~> Get the address of all the cells which have formulas
        Set rng = .Cells.SpecialCells(xlCellTypeFormulas)

        '~~> Loop through the cells
        For Each acell In rng
            If acell.EntireRow.Hidden = False Then
                If acell.Value = 0 Then
                    On Error Resume Next
                        '~~> Clear any precedents/dependent arrows if any
                        .ClearArrows
                        '~~> Show precedents
                        acell.ShowPrecedents
                        '~~> Navigate to the relevant cell in the other worksheet
                        acell.NavigateArrow True, 1
                        '~~> Compare address and name to check if they are not from ws
                        If ActiveCell.Address <> rng.Address Or ActiveCell.Worksheet.Name <> .Name Then
                            Set bcell = Sheets(ActiveCell.Worksheet.Name).Range(ActiveCell.Address)
                            '~~> Check if it not empty
                            If Len(Trim(bcell.Value)) = 0 Then
                                '~~> If empty, hide the row
                                .Rows(acell.Row).EntireRow.Hidden = True
                            End If
                        End If
                        '~~> Clear any precedents/dependent arrows if any
                        .ClearArrows
                        .Activate
                    On Error GoTo 0
                End If
            End If
        Next
    End With
End Sub

快照

运行宏之前的工作表 1

在此处输入图像描述

这就是 Sheet 2 的外观

在此处输入图像描述

这就是 Sheet1 在宏之后的样子

在此处输入图像描述

于 2012-08-05T23:04:38.187 回答
0

在循环中使用Cells(1, i)意味着您正在沿着第 1 行中的列而不是沿着 A 列中的行工作。我怀疑您想要Cells(i, 1)

由于对Cells和的调用Rows是不合格的,它们将引用活动表。根据您的描述,两者是否应参考同一张表并不是 100% 清楚。很明显,例如,它Sheet2!A1不能为空,因为它包含引用的公式Sheet1!A1

因此,您可能想要检查 上的空单元格,Sheet1但实际上隐藏 上的行Sheet2Worksheets("Sheet1").Cells(i, 1)这将改变对和的调用Worksheets("Sheet2").Rows(i)

如果事情更复杂,并且您需要检查是否为空并隐藏行,Sheet2那么您将需要隐藏 A 列中具有零值的所有行(如果任何行Sheet1实际上包含零作为value) 或更改公式Sheet2以显式处理Sheet1.

例如,中的公式Sheet2!A1可以是:=IF(ISBLANK(Sheet1!A1),#N/A,Sheet1!A1)

然后,您的宏中的检查将是:

If IsError(Cells(i, 1).Value) Then
  If (Cells(i, 1).Value = CVErr(xlErrNA)) Then
    Rows(i).EntireRow.Hidden = True
  End If
End If

您可以只使用IsError检查,但这可能会隐藏源数据的真正错误(例如除以零)

于 2012-08-05T23:02:49.447 回答