2012-08-05 85 views
2

我写了一个VBA脚本,该脚本应该隐藏在其他工作表中引用空单元格的行。可以这么说,表1包含单元格A1,它是空的。工作表2的单元格A1包含“Sheet1!A1”,但打印出0.我的脚本应该穿过所有行并隐藏包含空引用的脚本,但似乎没有这样做。 如果你能帮我弄清楚我的错误,那将会很棒。这里是我的代码到目前为止:Excel/VBA:检查单元格引用是否返回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 

我会很感激任何形式的帮助。

最好的问候,

亚历

+0

+ 1后,这个问题问得好!让我想一会儿:) – 2012-08-05 23:09:07

回答

0

在循环中使用Cells(1, i)意味着你沿着列1行,而不是倒在A列的行我会怀疑你的工作要Cells(i, 1)代替。

由于CellsRows的调用未被限定,它们将引用活动工作表。从您的描述中,并不是100%清楚两者是否应该引用同一张表。很明显,例如,Sheet2!A1不能为空,因为它包含一个涉及Sheet1!A1的公式。

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

如果事情比较复杂的电话,你需要两个检查空虚和隐藏Sheet2行,那么你要么需要隐藏与A列中零值的所有行(可能如果Sheet1上的任何行实际上包含零作为值,则会出现问题)或更改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检查,但可能会隐藏与真正的错误源数据(例如除以零)

1

亚历克斯这里是一个稍微复杂的做法。但它的工作原理:)

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

逻辑

  1. 该代码识别其具有下式,然后通过它们循环的细胞
  2. 然后同时通过其具有下式的所有单元循环,它检查该单元格的.Precedents 。这是最棘手的部分。没有简单的方法来获取位于另一个工作表或工作簿上的.Dependents.Precedents。你可以称之为这个属性的限制。所以我正在使用一个替代方案来获取这些:)
  3. 一旦我得到该单元格的地址,我正在检查它们是否为空,然后根据条件,我隐藏了单元格。

CODE

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运行前宏

enter image description here

这是表2的外观

enter image description here

而且这是工作表Sheet1的外观宏

enter image description here