【问题标题】:Can I use IsEmpty to refer to a different sheet and hide a column?我可以使用 IsEmpty 来引用不同的工作表并隐藏列吗?
【发布时间】:2017-09-29 00:07:13
【问题描述】:

是否可以使用 IsEmpty 来引用与触发宏的位置不同的工作表上的单元格?另外,如果查询结果为True,是否可以隐藏查询的列?

这是我目前构建的: 我的第一个版本是这样的:

If IsEmpty(L1) Then
    Columns("L").EntireColumn.Hidden = True
Else
    Columns("L").EntireColumn.Hidden = False
End If

足够直截了当。但是,只有在我希望查询/隐藏发生的工作表中触发它时才有效。当我从不同的工作表启动宏时,它会隐藏 that 工作表中的列(当然,duh)。

所以,经过几次迭代和错误,我得到了这个:

If IsEmpty(Sheets("Results").Cells(10, 1).Value) Then
    Worksheets("Results").Columns(10).EntireColumn.Hidden = True
Else
    Worksheets("Results").Columns(10).EntireColumn.Hidden = False
End If

这至少不会从 VBA 中引发任何错误。它也做了一个总蹲。 :$ 我开始怀疑是否可以在另一张纸上使用IsEmpty?还是EntireColumn.Hidden 命令?另外,鉴于我需要对 9 列运行此检查,也许有比 9 个 If/Then 语句更好的方法?

【问题讨论】:

  • 绝对可以,试试:If IsEmpty(Sheets("Results").Cells(10, 1)) Then
  • 您的代码对我来说似乎工作正常。
  • 对于问题的最后一点;如果列是连续的,则可以使用 for 循环并迭代列引用,如果不是,则可以创建列引用数组并对其进行迭代。
  • 它是Cells(Rows,Columns),所以也许你正在反转它,应该是Sheets("Results").Cells(1, 10).Value。您可以从 1 到 9 循环检查 9 列。
  • FWIW IsEmpty 与细胞无关,与 Variant 无关。如果你给它一个包含 nothingRange.Value,它将返回True - 甚至不是一个空字符串。

标签: vba excel excel-2010 is-empty


【解决方案1】:

要避免循环通过 9 列的第 1 行,请使用 SpecialCells(xlCellTypeBlanks)。

dim blnks as range
with workSheets("Results")
    with .range(.cells(1, "B"), .cells(1, "K"))
        .entirecolumn.hidden = false
        set blnks = .specialcells(xlCellTypeBlanks)
        if not blnks is nothing then blnks.entirecolumn.hidden = true
    end with
end with

基本上这会取消隐藏所有 9 列,然后隐藏第一行中包含空白单元格的列。请注意,公式返回的零长度字符串(例如"")与真正的空白单元格不同。

【讨论】:

  • 这是一个非常优雅的解决方案,谢谢。是否有与xlCellTypeBlanks 等效的东西为零长度字符串返回true?
  • 对于非公式(即键入或粘贴的值),使用 xlCellTypeConstants 可以应用于 xlErrors、xlLogical、xlNumbers、xlTextValues 或这些的任何按位组合。公式返回的值属于具有相同子参数的 xlCellTypeFormulas 类别。见SpecialCells
  • 谢谢@Jeeped。鉴于xlCellTypeFromulas 的发现,也许使用它而不是与IsEmpty 搏斗会更容易?特别是因为测试的单元格实际上不是空的,而是有""...
【解决方案2】:

我认为您非常接近,只是您的单元格输入方式错误:

If IsEmpty(Sheets("Results").Cells(1, 10).Value) Then
    Worksheets("Results").Columns(10).EntireColumn.Hidden = True
Else
    Worksheets("Results").Columns(10).EntireColumn.Hidden = False
End If

此外,如 cmets 中所述,您可以创建一个循环来检查许多列:

Dim i As Integer
Dim maxi As Integer
i = 1
maxi = 20

While i < maxi

If IsEmpty(ThisWorkbook.Worksheets("Results").Cells(1, i)) Then
    Worksheets("Results").Columns(i).EntireColumn.Hidden = True
Else
    Worksheets("Results").Columns(i).EntireColumn.Hidden = False
End If

i = i + 1
Wend

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多