【问题标题】:Excel VBA, nested loops / hide rows based on numbersExcel VBA,嵌套循环/基于数字隐藏行
【发布时间】:2016-06-30 07:11:46
【问题描述】:

尊敬的 stackoverflow 社区

在工作中,我必须编写一个宏,它应该能够根据列中的数字隐藏行。这些可以是一个单元格中的多个数字,并且输入还应允许一次显示多个数字。

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

所以如果我输入 20、30,它应该只显示第 1 行和第 2 行)

我通常使用 Java / c# 编写代码,而且我是 VBA 新手,所以非常感谢帮助:

我的计划是显示一个输入框并将这些数字拆分为一个数组。 然后我想用一个for循环遍历每一行,其中我为每个循环添加了两个以检查是否有任何数字相等。如果没有,隐藏行。如果是这样,请显示然后我想退出每个循环并转到下一行。要退出嵌套循环,我尝试使用 do while boolean 但它似乎不起作用。

现在它只显示所有输入数字的行(示例中只有 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    

【问题讨论】:

  • Excel 中没有索引为 0 的行。所以从row=1开始。
  • 谢谢!但仍然在同一行出现运行时错误。
  • 嗯。它不会解决问题,但行号必须是 Cells 函数中的 first 参数。
  • 仅凭外观,您的数字循环中没有退出...所以在点击工作表中的最后一行后,下一个循环将出错...

标签: vba excel sorting


【解决方案1】:

非常感谢您的回答。你的隐藏了所有的行,所以我调整它以显示它们。

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

【讨论】:

    【解决方案2】:

    通过拆分它很容易做到:

    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
    

    通过逐行运行这段代码,它应该是自我解释的(也知道你已经对“编码”有所了解)

    不过,如果您有任何问题,尽管问;)

    【讨论】:

      【解决方案3】:

      你也可以这样做:

      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
      

      我认为这很容易理解,但请随时要求解释。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-07
        相关资源
        最近更新 更多