【问题标题】:Excel vba looping through columns and hide based on cell valueExcel vba循环遍历列并根据单元格值隐藏
【发布时间】: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 应该告诉我们关于他的实际需求和尝试的“全部真相”

标签: vba excel


【解决方案1】:

可能是这样的:

Sub HideColumnWithoutNullString()

    Dim range, colCount, rowCount, hasNull, rowsToCheck

    Dim firstColumn, currentColumn, lastColumn

    Set range = Application.range("G:BM")

    firstColumn = range.Columns(0).Column

    lastColumn = range.Columns(range.Columns.Count).Column

    currentColumn = 0

    rowsToCheck = 1


    For colCount = firstColumn To lastColumn Step 1

        hasNull = False

        For rowCount = 1 To range.Rows.Count Step 1

            If Application.Cells(rowCount, colCount).Value = "NULL" Then

                hasNull = True

                Exit For

            End If

            If rowCount >= rowsToCheck Then
                Exit For
            End If

        Next

        If Not hasNull Then
            range.Columns(currentColumn).Hidden = True
        Else
            range.Columns(currentColumn).Hidden = False
        End If

        currentColumn = currentColumn + 1

    Next

End Sub

其中 rowsToCheck 是脚本必须在每列上检查“NULL”的行数,如果它只需要检查第一行,则将其值设置为 1。

【讨论】:

  • 您正在循环 OP 声明的每一列,不是一次而是两次,每隔一列。在我看来,循环每隔一列会冒隐藏不应该隐藏的列的风险。一些逻辑冲突。
  • 我已经对此进行了测试,它确实有效。但你是对的,我通过了两次列检查,更改为 >= rowCount vs rowsToCheck 解决了它。
【解决方案2】:

这与 Octavio 的回答遵循相同的逻辑,但将检查空列或“NULL”的值。

    Sub SuspenseReport()
    Dim col As Range
    Application.ScreenUpdating = False
    Set Rng = Application.Range("G2:BO8") 
    vLr = ActiveCell.SpecialCells(xlLastCell).Row
    For Each col In Rng.Columns
        vFlag = False
        For vrow = 2 To vLr
            vX = Cells(vrow, col.Column).Value
            If vX = "" Or vX = "NULL" Then
                vFlag = True
            End If
        Next
        If vFlag Then
            col.EntireColumn.Hidden = False
        Else
            col.EntireColumn.Hidden = True
        End If
    Next col
    Application.ScreenUpdating = True
    End Sub

【讨论】:

  • 感谢这工作。你知道我如何让这个迭代每第三列而不是该范围内的每一列吗?
  • @FarisShamsi 将此 For Each col In Rng.Columns 更改为 For Loop step 3 from start to end column
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-11
  • 1970-01-01
  • 2011-12-11
  • 1970-01-01
相关资源
最近更新 更多