【发布时间】:2018-02-10 05:09:03
【问题描述】:
在工作表的 F 列和 BM 列之间,如果这些列中的任何值等于“NULL”,则不要隐藏,否则隐藏该列,之前的列和之后的列。循环应该从 G 列开始每隔 3 次评估一次,并在 BM 列结束。
例如,如果 G 列包含值“NULL”,则不执行任何操作并转到 J 列(向前三列)。如果列 J 现在没有值为 NULL 的单元格,则隐藏该列、之前的列(列 I)和之后的列(列 K)。
这就是我遇到的麻烦。我可以根据列是否包含值 NULL 来隐藏列。
这是我尝试过的代码变体。
Sub SuspenseReport()
Dim allColumns As Range
Dim cell As Range
Dim col As Range
Dim x As Integer
Dim i As Integer
Application.ScreenUpdating = False
Set allColumns = Columns("C:E")
allColumns.Hidden = True
Set allColumns = Columns("BN:DY")
allColumns.Hidden = True
Set allColumns = Columns("EB:EU")
allColumns.Hidden = True
Dim rng1 As Range: Set rng1 = Application.Range("G2:BO8") 'maybe limit the range to just one column and range.offet at the end?
For Each col In rng.Columns
If cell.Value = "NULL" Then
cell.EntireColumn.Hidden = False
GoTo ExitIfStat
Else: cell.EntireColumn.Hidden = True
End If
Next col
ExitIfStat:
Next x
'below is another variation I attempted but the for loop would iterate on cell not column
'Dim i As Integer
'i = -1
'For Each col In Range("G1:BO8")
' i = i + 1
' If i Mod 3 = 0 Then
' If col.Value = "NULL" Then
' col.EntireColumn.Hidden = False
' Else: col.EntireColumn.Hidden = True
'col.Offset(0, -1).EntireColumn.Hidden = True
'col.Offset(0, 1).EntireColumn.Hidden = True
' End If
Application.ScreenUpdating = True
End Sub
【问题讨论】:
-
循环每隔一列,如果该列没有空值,则隐藏它以及左右列。这是否意味着只对奇数列感兴趣?在这种情况下,执行第 2 步的循环,测试是否为 null - 如果找到列范围的提前退出循环,如果未找到,则偏移 -1 列,将范围调整为 3 列,然后合并到一个变量中,该变量包含要隐藏的每个范围。最后一口气隐藏范围。也许使用特殊的单元格来排除例如空单元格。
-
考虑一下。似乎有潜在的冲突。如果我在范围的第 1 列和第 4 列中有 NULL。我不会隐藏 1 和 2。我的循环移动到 3,没有 null,所以我隐藏了 2,3 和 4。我现在隐藏了 4,它有一个 NULL。我移动到 5。如果 5 有一个 NULL,我是否取消隐藏 4?您是否有理由可以确定只有其他所有列都适用?
-
@QHarr -- 好点,我认为需要一些样本数据才能以一种或另一种方式给出明确的答案
-
我的第一条评论,我的意思是提前退出行循环而不是列。如果可以解决逻辑,如果在范围中找到最后使用的行并用于确定要读入数组的范围,那么这会快得多,然后对数组进行循环,使用我之前描述的逻辑收集列号,如果适合目的,然后定位工作表以隐藏相应的列。
-
除了 QHarr 正确捕获的内容之外,代码似乎已损坏:没有设置
rng,在使用col变量循环遍历列时使用了一些cell范围...也许 @ FarisShamsi 应该告诉我们关于他的实际需求和尝试的“全部真相”