如果指定列为空,则VBA在表中隐藏行

时间:2014-12-12 19:44:32

标签: vba excel-vba excel

我正在尝试添加到一个宏,它将隐藏名为Authorization的列中没有文本的每一行。请看下面的代码,我认为这可能是在正确的轨道上,但它不会隐藏任何行。

Cells.EntireRow.Hidden = False
For Each cell In Range("Authorization").End(xlUp)
If cell = "" And cell.Offset(1, 0) = "" Then cell.EntireRow.Hidden = True
Next cell

1 个答案:

答案 0 :(得分:0)

编辑添加如何定义动态命名范围 事实上,您已将整列设置为名称“授权”,我认为这会使您的代码冻结,因为整个列是100万行(如果您有2007或更高版本),代码仍然会检查为空行,所以它做了100万次。 1选项不是将其设置为整个列,而是可以使用“动态命名范围”,它将随着数据的添加而扩展和增长。有几种不同的公式可以做到这一点,但根据您的数据可能包含空白的事实,此公式版本将向下扩展到列中最后一个填充的行。我的例子使用colum A,因为你没有指定你正在使用的列,所以改变A以满足你的需要。

  1. 您需要从公式选项卡
  2. 打开名称管理器
  3. 在对话框中,找到“授权”名称。
  4. 选择它,您应该在对话框的底部看到其当前公式,将其替换为以下公式: = OFFSET(Sheet 1中$ A $ 3,0,0,MATCH( “*”,工作表Sheet $ A:!$ A,-1)-2,1)
  5. 在上面的公式中:

    Sheet1是我的表,用你的表替换它 $ 3 $是名称的起始行,因此根据您的评论,将其设置为第A行第3行 0,0,默认情况下您不需要更改 $ A $ A $是它计算值的列,因此根据需要进行更改 -1是默认值,保持原样 -2从计数中减去2,因为我们从第3行开始,所以如果你改变起始行,改变它 最后一个,定义了命名范围涵盖的列数,在您的示例中它只是1,因此不需要更改。

    一旦以这种方式定义了名称,下面的代码应该可以更快地运行,因为它只会循环到输入数据的最后一行。我可以看到一个可能的问题,那就是如果A列中的最后一个单元格是空白的,但是该行的其余部分不是,这将错过最后一行。我可以通过使用不同的列来计算最后一行的构成来解决这个问题,但需要知道whicj列总是会有一个值。

    <原始答案和代码> 不确定你的代码是否符合你想要它的描述,也就是你似乎试图检查当前单元格下面的行,这是你真正想要的吗?无论如何你的语法有点错误。我已经编写并测试了它并且它可以工作,我已经交换了你的偏移,所以我的代码检查命名范围“授权”中的单元格,然后还检查右边的单元格。根据您的需求进行修改

    Sub test()
    Dim c As Range
    For Each c In Range("Authorisation").Cells
        If c.Value = "" And c.Offset(0, 1).Value = "" Then c.EntireRow.Hidden = True
    Next c
    End Sub