2016-05-18 17 views
0

一度、vbaで範囲変数を設定すると、値に基づいて行や列セルを削除する方法がありますか?例えば設定範囲オブジェクトから行を削除する方法

Dim Lrange as Range 

Set Lrange = Range("A1:E5") 

For each row in Lrange 
    If cell(Lrange.row, 3).value = "Somestring" Then 
     LRange.row.delete 
    End if 
Next 

が、これは可能ですか私は範囲を操作するために、ワークシートに保存しなければならないでしょうか?

ご提案は大歓迎です!

答えて

0

あなたが値に基づいて、ワークシート内の行を削除したい場合は、次のようなコードはそれを行うだろう...

Sub DeleteRows() 
Dim aRange As Range, aRow As Range, aCell As Range 
    Set aRange = Range("A1:E5") 
    For Each aRow In aRange.Rows 
     For Each aCell In aRow.Cells 
      If aCell.Value = "Somestring" Then 
       aRow.EntireRow.Delete 
       Exit For 
      End If 
     Next aCell 
    Next aRow 
End Sub 

あなたは、オブジェクトがあるという範囲を変更したい場合値に基づいて、VBAで参照し、その後、次のようなコードはそれを行うだろう...

Sub DeleteRowsInObject() 
Dim aRange As Range, aRow As Range, aCell As Range 
Dim bRange As Range, found As Boolean 
    Set aRange = Range("A1:E5") 
    For Each aRow In aRange.Rows 
     found = False 
     For Each aCell In aRow.Cells 
      If aCell.Value = "Somestring" Then found = True 
     Next aCell 
     If Not found Then 
      If bRange Is Nothing Then 
       Set bRange = aRow 
      Else 
       Set bRange = Union(bRange, aRow) 
      End If 
     End If 
    Next aRow 
    Set aRange = bRange 
    Set bRange = Nothing 
End Sub 

あなたは、それはいくつかのように行/列だと非連続的であり、Rangeオブジェクトに注意する必要があります通常のプロパティ/メソッドは必ずしも期待する値を提供するとは限りません。

+0

範囲は複数の非連続セクションに分割されますか?スプレーシートのように上にシフトしている細胞を模倣する方法はありますか? –

+0

@Srick - 'debug.print aRange.address'をルーチンの最後に追加すると、aRangeがどのように"分割 "するのかがわかります。あなたが達成しようとしているものによっては、Variant型の配列を使うほうが良いでしょう。 – OldUgly

+0

これで範囲値をループして配列に格納します。私はいくつかのワークブックから1つのマスターブックに範囲を移動しようとしていますが、ソースブックの特定のユーザー入力がプロシージャのバグを起こしていることがわかりました。ご協力いただきありがとうございます ! –

0

削除しようとしている場合は、行を逆方向にループべき:例えば

Dim Lrange    As Range 
Dim n      As Long 
Set Lrange = Range("A1:E5") 

For n = Lrange.Rows.Count To 1 Step -1 
    If Lrange.Cells(n, 3).Value = "Somestring" Then 
     Lrange.Rows(n).Delete 
    End If 
Next 

関連する問題