VBA / Excel隐藏不需要的行

时间:2013-06-09 19:51:50

标签: excel vba excel-vba

我正在尝试生成一个宏,该宏将在非常大的电子表格中隐藏不需要的行,并且只显示具有相关数据的行。

Sub hiddenrows()
Dim i As Long
Dim totalRows As Long

totalRows = ActiveSheet.UsedRange.Rows.Count

ActiveSheet.Rows("10:" & totalRows).Hidden = False

For i = 10 To totalRows

    If ActiveSheet.Range("B" & i).Value <> vbNullString Then
    corr = i
    i = i + 1
    End If
    If ActiveSheet.Range("C" & i).Value <> vbNullString Then
    geo = i
    i = i + 1
    End If
    If ActiveSheet.Range("D" & i).Value <> vbNullString Then
    dis = i
    i = i + 1
    End If
    While ActiveSheet.Range("E" & i).Value <> vbNullString
      If ActiveSheet.Range("E" & i).Value <> vbNullString Then
      act = i
      act2 = i + 1
      act3 = i + 2
      Cells(corr, 1).EntireRow.Hidden = False
      Cells(geo, 1).EntireRow.Hidden = False
      Cells(dis, 1).EntireRow.Hidden = False
      Cells(act, 1).EntireRow.Hidden = False
      Cells(act2, 1).EntireRow.Hidden = False
      Cells(act3, 1).EntireRow.Hidden = False
      i = i + 3
      Else
      i = i - 1
      End If
    Wend
Next

End Sub

我认为我已经掌握了基本的代码结构,但我知道我的语法/执行已经过时了。

让我尝试更好地解释一下代码。我首先尝试计算行数并将其存储为我的“LastRow”变量。然后我想浏览所有行并将它们设置为隐藏。之后,使用较大的“For”循环,我想将特定行存储为变量'corr','geo','dis'和'act'。当“act”行中有数据时,我想设置要显示的所有存储行。我的迭代器“我”我希望以适当的方式更新。任何帮助将不胜感激。

我已经更新了我目前正在使用的代码,但它的效果不如我想的那样好。我添加了一张图片来更好地描述我在寻找什么。基本上,如果“活动描述”列中有任何内容,我想要显示与特定描述相对应的走廊,地理位置和规则。但是如果活动描述中没有任何内容,那么它就不会显示不必要的信息。我基本上想要将这个巨大的excel文件压缩到只有你能看到的有用的信息。我希望这会有所帮助。

enter image description here

3 个答案:

答案 0 :(得分:2)

If "Bi" <> ""将始终评估为true,因为字符串“Bi”实际上不等于空字符串。如果您要比较地址"B" & i处的单元格的值,则可以这样做,假设宏针对ActiveSheet运行:

If ActiveSheet.Range("B" & i).Value <> vbNullString Then ...

答案 1 :(得分:1)

以下VBA过程反映了您的问题附带的图像中的数据结构。据我了解,您希望保留“活动描述”中具有条目的行,以及显示这些条目的组织框架的行。您想要隐藏工作表中的其他行(不包括第1-9行)。

代码说明

  • 明确将Sheet2设置为要操作的工作表。

  • 与您解决问题的方法一样,例程首先隐藏工作表中的所有数据行(重置以前隐藏的任何行),然后有选择地取消隐藏具有活动描述的行以及提供组织信息的行对他们来说。

  • 它从下到上循环遍历数据行。这样就无需在找到描述后回溯,以取消隐藏与该描述相关的组织行。

  • 当找到活动描述时,它将被取消隐藏,并设置标志以指示该描述的组织行也需要取消隐藏。

  • 当循环向上移动数据表时,它会在遇到描述时取消隐藏描述的组织行,并在处理每种组织行时将相关标志重置为零。

      Option Explicit
    
      Sub hiddenrows2()
    
          Dim i As Long
          Dim firstRow As Long
          Dim lastRow As Long
          Dim dis As Long, _
              geo As Long, _
              cor As Long
    
          dis = 0
          geo = 0
          cor = 0
    
          With Worksheets("Sheet2")
              firstRow = 10
              lastRow = .Cells(Rows.Count, 6).End(xlUp).Row
              .Range(firstRow & ":" & lastRow).EntireRow.Hidden = False
              .Range(firstRow & ":" & lastRow).EntireRow.Hidden = True
              i = lastRow
              Do While i >= firstRow
                  If .Range("E" & (i)).Value <> "" Then
                      dis = 1
                      geo = 1
                      cor = 1
                      .Range(i & ":" & (i + 2)).EntireRow.Hidden = False
                  ElseIf (.Range("D" & i).Value <> "") And dis = 1 Then
                      dis = 0
                      .Range("D" & i).EntireRow.Hidden = False
                  ElseIf (.Range("C" & i).Value <> "") And (geo = 1) Then
                      geo = 0
                      .Range("C" & i).EntireRow.Hidden = False
                  ElseIf (.Range("B" & i).Value <> "") And (cor = 1) Then
                      cor = 0
                      .Range("B" & i).EntireRow.Hidden = False
                  End If
                  i = i - 1
              Loop
          End With
    
      End Sub
    

答案 2 :(得分:0)

我不太了解你的问题,但这一行是一个frequestly错误

  

LastRow = Sheet2.Rows.Count

如果你的任何一行是空白的,那么就会停止。

例如:

row 1 value = 1
row 2 value = 2
row 3 value = 3
row 4 value =
row 5 value = 5

你的变量lastrow将是表格的总和。

total = Cells(Rows.Count,1).End(xlUp).Row要好得多,并且会返回总值。 5

对于你的问题:

Cells(i, 1).EntireRow.Hidden = true

其中i是总行的增量值

或:

Dim yo As Range
Set yo = Cells(i, 1).EntireRowç
yo.EntireRow.Hidden = True