VBA / Excel隐藏不需要的行
我试图生成一个macros,将隐藏不必要的行在一个非常大的电子表格,并只显示有相关数据的行。
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”variables。 然后,我想要遍历所有行并将其设置为隐藏。 之后,使用较大的“For”循环,我想将特定行存储为variables“corr”,“geo”,“dis”和“act”。 当“行为”行中有数据时,我想要设置所有存储的行显示。 我的迭代器“我”,我希望正在更新适当的方式。 任何帮助将不胜感激。
我已经更新了我目前正在使用的代码,但是效果并不如我所愿。 我添加一张照片来更好地描述我在找什么。 基本上,如果“活动描述”栏中有任何内容比我想显示对应于特定描述的走廊,地理和纪律。 但是,如果活动描述中没有任何内容,则不会显示不必要的信息。 我基本上想压缩这个巨大的Excel文件,只有你能看到的是有用的信息。 我希望这有帮助。
下面的VBA过程反映了伴随您的问题的图像中的数据结构。 据我所知,你想要保留活动描述中有条目的行,以及显示这些条目的组织框架的行。 您想要隐藏工作表中的其他行(不包括第1-9行)。
代码的解释
-
它明确设置Sheet2作为工作表。
-
与您对问题的处理方法一样,例程首先隐藏工作表中的所有数据行(重置以前隐藏的行),然后select性地取消隐藏具有活动描述的数据行以及为其提供组织信息的那些行。
-
它从底部到顶部遍历数据行。 这样可以避免在find说明后为了取消隐藏与该说明相关的组织行而需要回溯的情况。
-
当find一个活动描述时,它是不隐藏的,并且设置标志来指示该描述的组织行也将被取消隐藏。
-
随着循环在数据表格中前进,它将在遇到描述时取消隐藏组织行,并在处理每种组织行时将相关标志重置为零。
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
If "Bi" <> ""
将始终计算为true
因为string“Bi”实际上不等于空string。 如果你的意思是比较地址"B" & i
的单元格的值,你可以这样做,假设macros运行在ActiveSheet
:
If ActiveSheet.Range("B" & i).Value <> vbNullString Then ...
我不太了解你的问题,但这条线是一个frequestly错误
LastRow = Sheet2.Rows.Count
如果你有空白的行,这将停止在这个。
例如:
row 1 value = 1 row 2 value = 2 row 3 value = 3 row 4 value = row 5 value = 5
你的variableslastrow将是表的总数。
total = Cells(Rows.Count,1).End(xlUp).Row更好,并返回总值。 五
对于你的问题:
Cells(i, 1).EntireRow.Hidden = true
其中我是总行的增量值
要么:
Dim yo As Range Set yo = Cells(i, 1).EntireRowç yo.EntireRow.Hidden = True