2017-12-20 15 views
0

これは数式やショートカットを使って解決策があるのか​​、それともVBAを使用する必要があるのか​​どうか疑問に思っていました。私が作業しているスプレッドシートには、112行、31列、および33行に "Y"(これは使用されているレポートの目的ではY =正)が含まれています。私は行のどこかに "Y"を含む人の行と名前だけがスプレッドシートに残されているので、行(列E-AA)全体で単一の "Y"を含まない行を削除しようとしています。私はある程度成功した結果を出すが、 "Y"(私はYを含む33行を数え、VBAコードは14だけを示した)を持つすべての行を含んでいない他の人からのVBAコードのスニペットを見つけた。行の複数のセルに1つの文字が含まれている行を削除する

enter image description here

Iを用いたコード:

Sub sbDelete_Rows_IF_Cell_Contains_String_Text_Value() 
    Dim lRow As Long 
    Dim iCntr As Long 
    lRow = 112 
    For iCntr = lRow To 1 Step -1 
     If Cells(iCntr, 5).Value = "N" Then 
      Rows(iCntr).Delete 
     End If 
    Next 
    End Sub 

を上記のコードは、これらの結果生成:

enter image description here

"Y" または "のいずれかを含む関心の列をそれらのセル内の「N」は列E〜AAである。もし私が十分に明確でないか、詳細に進む必要がある場合は、私に知らせてください。

+0

あなたのループの使用COUNTIFで数をカウントします0の場合は行を削除します。 – SJR

答えて

2

これ、私はそれがさらに最適化することができ確信しているにもかかわらず、手で仕事をするでしょう:

Sub foo() 
    Dim lRow As Long 
    Dim iCntr As Long 
    lRow = 112 
    For iCntr = lRow To 1 Step -1 
     For i = 5 To 27 Step 2 
     If Cells(iCntr, i).Value = "N" Then 
      Value = Value & " Delete" 
     Else 
      Value = Value & " Keep" 
     End If 
     Next i 

     If Not InStr(Value, "Keep") > 0 Then 
      Rows(iCntr).Delete 
     End If 
     Value = "" 
    Next iCntr 
End Sub 
+0

Xabierはこれがすごくうまくいった!ありがとう! – KyleC

+0

@KyleCあなたは私の応答を回答としてマークできますか?ありがとう。 – Xabier

+0

確かに私はチェックボックスに当たったので、答えが出てこない場合は、私に知らせてください、もう一度ありがとうございます。 – KyleC

1

を数式、フィルタリングおよびコピー/ペーストを使用して、それを行うには:

この式を追加します。各行に:=COUNTIF($E2:$AA2,"Y")
これは、それ自身の上に単一のYを含むセルを数えます。

データにフィルタを追加し、フィルタに0を除外します。

フィルタ処理されたデータセットをコピーして新しいワークシートに貼り付けます。その後、元のデータを消去し、元のデータに再度ペーストすることができます。これを一度しかやっていないのであれば便利です。

編集:VBAで上記の手順を行うには

(しかし場所で、削除を行うのではなく第二のシートに移動):

Public Sub Test() 

    Dim rDataRange As Range 

    'Define range to look at. NB: This is a basic set-up. 
    'Real scenario would allow user to make selection, or find the limits of the dataset with a FindLastCell function. 
    Set rDataRange = ThisWorkbook.Worksheets("Sheet1").Range("E1:AA112") 

    'This block will remove any autofilters that already exist, and then put a formula to the right of the dataset 
    'to count the Y. 
    With rDataRange 
     .Parent.AutoFilterMode = False 
     .Offset(1, .Columns.Count).Resize(.Rows.Count - 1, 1).FormulaR1C1 = "=COUNTIF(RC5:RC27,""Y"")" 
    End With 

    With rDataRange 
     'This block filters the dataset to only show 0 in the formula. 
     'The dataset is resized to include the formula. 
     With .Resize(, .Columns.Count + 1) 
      .AutoFilter Field:=rDataRange.Columns.Count + 1, Criteria1:="0" 
      .Offset(1).Resize(.Rows.Count - 1).SpecialCells(xlVisible).EntireRow.Delete 'Resized again to exclude the header. 
     End With 

     'The formula and filter are removed. 
     .Offset(1, .Columns.Count).Resize(.Rows.Count - 1, 1).ClearContents 
     .Parent.AutoFilterMode = False 
    End With 

End Sub 
関連する問題