Excel / VBA:检查单元格引用是否返回0

我写了一个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 

我会很感激任何帮助。

最好的祝福,

亚历克斯

亚历克斯这样做是一个稍微复杂的方式。 但它的作品:)

注意 :这仅适用于参考同一工作簿中的图纸或公开工作簿的公式。

逻辑

  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 

快照

运行macros之前的工作表1

在这里输入图像说明

这是工作表2的外观

在这里输入图像说明

这是Sheet1如何照顾macros观

在这里输入图像说明

在循环中使用Cells(1, i)意味着您正在沿着行1中的列而不是列A中的行。我会怀疑您希望Cells(i, 1)代替。

由于对“ Cells和“ Rows的调用不合格,它们将引用活动工作表。 从你的描述来看,两者是否都应该引用同一张表并不是100%。 很明显,例如, Sheet2!A1不能为空,因为它包含引用Sheet1!A1的公式。

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

如果事情更复杂,并且您需要检查空白并隐藏Sheet2行,则需要隐藏列A中具有零值的所有行(如果Sheet1上的任何行实际上包含零作为值)或更改Sheet2上的公式以显式处理Sheet1上的空单元格。

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

您的macros中的检查将是:

 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检查,但可能会隐藏源数据的真正错误(例如除以零)