2016-06-30 6 views
0

親愛なるstackoverflowのコミュニティ、私は列の数値に基づいて行を非表示にすることができるはずマクロを記述する必要があり、作業時エクセルVBA、ネストされたループ/非表示の行

。それらは1つのセルで複数のものになることができ、入力は一度に複数の数値を表示できるようにする必要があります。

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

私は20、30を入力してあれば、それは行1 & 2にのみ表示されるはずです)

I VBAに新しいJava/C#とイムと通常のコード、Idは本当に助けに感謝して:

私の計画は、入力ボックスを表示し、それらの数字を配列に分割することでした。 次に、for-Loopを使って各行を調べたいと思います。そこでは、各ループが2つずつ追加され、数字が等しいかどうかがチェックされます。そうでない場合は、行を非表示にします。そうであれば、showを実行してから、ループごとに両方を終了して次の行に移動します。ネストされたループを終了するには、私はブール値の間にdoを使ってみましたが、うまくいきません。

今のところ、すべての入力番号(例では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  
+0

Excelにインデックス付きの行がありません。だから 'row = 1'で始まります。 – Fratyx

+0

ありがとうございます!しかし、同じ行でランタイムエラーが発生しています。 – Betci

+0

Hmm。問題は解決しませんが、行番号は 'Cells'関数の**最初の**パラメータでなければなりません。 – Fratyx

答えて

0

それを行うことは非常に簡単です:

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 

線で、このコード行を実行して、それが説明するほとんど自己なければなりません(また、あなたが "で、すでにある程度の知識を持って知っていますご質問があれば、静止画)」

コーディング、ちょうど頼む;あなたが答えるために)

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 
0

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 

を私はそれが理解しやすいと思いますが、説明のためにお気軽に。

関連する問題