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
我会很感激任何帮助。
最好的祝福,
亚历克斯
亚历克斯这样做是一个稍微复杂的方式。 但它的作品:)
注意 :这仅适用于参考同一工作簿中的图纸或公开工作簿的公式。
逻辑 :
- 此代码标识具有公式的单元格,然后循环遍历它们
- 然后,当循环遍历所有具有公式的单元格时,它会检查该单元格的
.Precedents
。 这是最棘手的部分。 没有简单的方法来获得位于另一个工作表或工作簿上的.Dependents
或.Precedents
。 你可以称之为这个属性的限制。 所以我正在使用另一种方法来获得那些:) - 一旦我得到这个单元格的地址,我正在检查它是否为空,然后基于这个条件,我隐藏了这个单元格。
码
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
检查,但可能会隐藏源数据的真正错误(例如除以零)