我正在尝试生成一个宏,该宏将在非常大的电子表格中隐藏不需要的行,并且只显示具有相关数据的行。
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文件压缩到只有你能看到的有用的信息。我希望这会有所帮助。
答案 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