2016-06-30 2 views
0

Liebe Gemeinde StackoverflowExcel VBA, verschachtelte Schleifen/verstecken Zeilen basierend auf Zahlen

Bei der Arbeit habe ich ein Makro schreiben, die in der Lage sein sollte, Zeilen in einer Spalte anhand von Zahlen zu verbergen. Diese können mehrere in einer Zelle sein und die Eingabe sollte auch erlauben, mehr als eine Zahl gleichzeitig anzuzeigen.

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

Also, wenn ich geben Sie 20, 30, sollte es nur die Zeilen 1 & 2 zeigen)

ich in der Regel Code mit Java/C# und ich bin neu in VBA, so Id wirklich zu schätzen Hilfe:

Mein Plan war, ein Eingabefeld anzuzeigen und diese Nummern in ein Array zu teilen. Dann möchte ich jede Zeile mit einem for-Loop durchlaufen, in dem ich zwei für jede Schleife hinzugefügt habe, um zu prüfen, ob irgendwelche Zahlen gleich sind. Wenn nicht, blende die Zeile aus. Wenn ja, zeige und dann möchte ich beide für jede Schleifen beenden und in die nächste Zeile gehen. Um verschachtelte Schleifen zu beenden, habe ich versucht, einen do-Befehl zu verwenden, während boolean funktioniert, aber es scheint nicht zu funktionieren.

Im Moment werden nur die Zeilen mit allen Eingängen angezeigt (nur row1 im Beispiel).

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  
+0

In Excel gibt es keine 0-indizierte Zeile. Beginnen Sie mit "row = 1". – Fratyx

+0

danke! immer noch einen Laufzeitfehler auf der gleichen Linie bekommen. – Betci

+0

Hmm. Es wird das Problem nicht lösen, aber die Zeilennummer muss der ** erste ** Parameter in der "Zellen" -Funktion sein. – Fratyx

Antwort

0

Durch das Aufteilen es ist sehr einfach zu tun:

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 

durch diesen Code Zeile für Zeile ausgeführt wird, sollte es ziemlich selbsterklärend sein (auch zu wissen, Sie haben schon einige Kenntnisse in " Codierung ")

Dennoch, wenn Sie irgendwelche Fragen haben, fragen Sie einfach;)

1

Vielen Dank für Sie beantworten. Du hast alle Zeilen versteckt, also habe ich sie angepasst, um sie zu zeigen.

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 
0

können Sie auch tun es die folgende Art und Weise:

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 

Ich denke, es ist leicht zu verstehen, aber zur Erklärung frei fragen fühlen.