0

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

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”行中有数据时,我想将所有存储的行设置为显示。我希望以正确的方式更新我的迭代器“i”。任何帮助将不胜感激。

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

在此处输入图像描述

4

3 回答 3

2

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

If ActiveSheet.Range("B" & i).Value <> vbNullString Then ...
于 2013-06-09T20:31:06.897 回答
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
    
于 2013-06-10T01:08:30.600 回答
0

我不太了解你的问题,但这条线经常出错

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
于 2013-06-09T20:11:17.713 回答