Excel VBA,基于数字嵌套循环/隐藏行

亲爱的stackoverflow社区

在工作中,我必须写一个macros,它应该能够根据列中的数字隐藏行。 在一个单元中可以是多个,input也应该允许一次显示多个数字。

for example: row 1: 20, 30, 15 row 2: 20 row 3: 13, 76 

所以如果我input20,30,它应该只显示行1和2)

我通常使用Java / c#和Im编写新的VBA代码,所以我非常感谢帮助:

我的计划是显示一个input框,并将这些数字拆分成一个数组。 然后,我想通过一个for循环,其中我为每个循环添加两个检查是否有任何数字相等的每一行。 如果不是,则隐藏行。 如果是这样,显示,然后我想退出每个循环,并转到下一行。 要退出嵌套循环,我试图使用一个虽然布尔,但它似乎并没有工作。

现在它只显示所有input数字的行(在示例中只有row1)。

  Sub SortingTest() Dim numbers() As String myNum = Application.InputBox("Enter BKPS (separate multiples by , )") numbers = Split(myNum, ",", -1, compare) 'Userinput Vars Dim row As Integer row = 1 Dim saveNumber As String 'Looping Vars Dim existingNum As String Dim existingNumsArray() As String Dim checkRows As Long Dim saveElement As String Dim done As Boolean done = False ' Range("B3").Value = 10 ' Saves the Input as Array: For Each Element In numbers saveNumber = Element Cells(2, row).Value = saveNumber row = row + 1 Next Element Dim b As Integer Do While done = False For b = 1 To 100 'hardcoded, should be length of document. b == row; existingNum = Cells(b, 3).Value existingNumsArray = Split(existingNum, ",", -1, compare) ' loop thru input numbers For Each Element In numbers saveElement = Element 'loop thru given numbers For Each inputElement In existingNumsArray If saveElement <> inputElement Then Rows(b).Hidden = True ElseIf saveElement = inputElement Then Rows(b).Hidden = False done = True Exit For End If Next Next Next Loop End Sub 

非常感谢你的回答。 你把所有的行都藏了起来,所以我调整了它们。

 Option Explicit Function ArrOr(a As Variant, b As Variant) As Boolean Dim runner As Variant ArrOr = True If IsArray(a) Then For Each runner In a If ArrOr(runner, b) Then Exit Function Next Else For Each runner In b If Trim(a) = Trim(runner) Then Exit Function Next End If ArrOr = False End Function Sub SortingBKPS() Dim numbers As Variant, vars As Variant, i As Long, xRows As Range numbers = Split(Application.InputBox("Enter BKPS (separate multiples by , )"), ",") With Sheets("Sheet1") vars = .Range("B1", .Cells(.Rows.Count, 2).End(xlUp)).Value2 For i = 2 To UBound(vars) .Rows(i).EntireRow.Hidden = True If ArrOr(Split(vars(i, 1), ","), numbers) Then If xRows Is Nothing Then Set xRows = .Rows(i) Else Set xRows = Union(xRows, .Rows(i)) End If End If Next xRows.EntireRow.Hidden = False End With End Sub 

通过分解它很容易做到:

 Option Explicit Function ArrOr(a As Variant, b As Variant) As Boolean Dim runner As Variant ArrOr = True If IsArray(a) Then For Each runner In a If ArrOr(runner, b) Then Exit Function Next Else For Each runner In b If Trim(a) = Trim(runner) Then Exit Function Next End If ArrOr = False End Function Sub SortingTest() Dim numbers As Variant, vars As Variant, i As Long, xRows As Range numbers = Split(Application.InputBox("Enter BKPS (separate multiples by , )"), ",") With Sheets("Sheet1") vars = .Range("B1", .Cells(.Rows.Count, 2).End(xlUp)).Value2 For i = 1 To UBound(vars) If ArrOr(Split(vars(i, 1), ","), numbers) Then If xRows Is Nothing Then Set xRows = .Rows(i) Else Set xRows = Union(xRows, .Rows(i)) End If End If Next xRows.EntireRow.Hidden = True End With End Sub 

通过逐行运行这个代码,它应该是相当多的自我解释(也知道你已经有一些“编码”的知识)

不过,如果你有任何问题,请问;)

你也可以用下面的方法来做:

 Sub SortingTest() Dim numbers As Variant Dim RangeCompare As Range Dim MyRow As Integer Dim NumFound As Boolean numbers = Application.InputBox("Please,list the values in this format: " & _ vbCrLf & "{value, value, value, ...}", _ Default:="{#, #, #}", Type:=64) For MyRow = 1 To Cells(Rows.Count, 1).End(xlUp).row Set RangeCompare = Range(Cells(MyRow, 1), Cells(MyRow, Columns.Count).End(xlToLeft)) NumFound = False For Each rCell In RangeCompare For Each Element In numbers If rCell = Element Then NumFound = True Exit For End If Next Element If NumFound = True Then Exit For Next rCell If NumFound = False Then Rows(MyRow).Hidden = True End If Next MyRow End Sub 

我认为这很容易理解,但可以自由地要求解释。