2017-02-16 23 views
1

「偽」値に基づいて行を削除する必要があるスプレッドシートがあります。ネットを研究し、私はこのサイトからいくつかのコードが見つかりました:マクロが実行されるとExcelのVBA(実行時エラー91)のFALSE値に基づいて行を削除

https://www.extendoffice.com/documents/excel/815-excel-remove-rows-based-on-cell-value.html

Sub DeleteRows() 

    Dim rng As Range 
    Dim InputRng As Range 
    Dim DeleteRng As Range 
    Dim DeleteStr As String 
    xTitleId = "Delete Based on Cell Value" 
Set InputRng = Application.Selection 
Set InputRng = Application.InputBox("Range :", xTitleId, InputRng.Address, Type:=8) 
DeleteStr = Application.InputBox("Delete Text", xTitleId, Type:=2) 
For Each rng In InputRng 
If rng.Value = DeleteStr Then 
    If DeleteRng Is Nothing Then 
     Set DeleteRng = rng 
    Else 
     Set DeleteRng = Application.Union(DeleteRng, rng) 
    End If 
End If 
Next 
DeleteRng.EntireRow.Delete '<----- *highlighted error* 

End Sub 

が、私はエラーを「ランタイム91オブジェクト変数が設定されていません」を取得します。

私は、オブジェクトに「DeleteRng」に設定する必要があることを承知していますが、私はわかりませんよ。私はVBAには新しく、それは私が見落としているマイナーなものかもしれません。

+0

。あなたのエラーがどこで発生していますか? –

+0

ワークシートのどの列にFALSE値が含まれていますか? –

+0

ありがとうございました!列Bには「TRUEまたはFALSE」の値が含まれています。違いがあるかどうかは分かりませんが、これらの値は電子メールの検証機能に基づいています。 だから、列Bに私は=のcheckEmail機能を持っている、そしてそれは、TRUEまたはFALSEを返します。それが文字列または関数であれば違いがありますか? – PatrykChristopher

答えて

0

あなたはDeleteRngが、私はそれをテストする場合、コードが私のためにうまく動作しますが、私は、私はあなたがそれを実行しているとき、何が起こっているのかを知っている感じを持っている何か

Sub DeleteRows() 

Dim rng As Range 
Dim InputRng As Range 
Dim DeleteRng As Range 
Dim DeleteStr As String 
Dim xTitleId As String 

xTitleId = "Delete Based on Cell Value" 
Set InputRng = Application.Selection 
Set InputRng = Application.InputBox("Range :", xTitleId, InputRng.Address, Type:=8) 
DeleteStr = Application.InputBox("Delete Text", xTitleId, Type:=2) 

For Each rng In InputRng 
    If rng.Value = DeleteStr Then 
     If DeleteRng Is Nothing Then 
      Set DeleteRng = rng 
     Else 
      Set DeleteRng = Application.Union(DeleteRng, rng) 
     End If 
    End If 
Next 

If Not DeleteRng Is Nothing Then DeleteRng.EntireRow.Delete '<----- *highlighted error* 

End Sub 
0

が含まれていることを最初に確認する必要があります。可能性は、あなたがあなたのボックスに入力しているテキストを見つけることではありません。

は "DeleteRng.EntireRow.Delete" にブレークポイントを入れてみてください。これを行うには、コードの左側にあるウィンドウの薄い灰色のバーをクリックします。

また、私はあなたからのコードを編集します:これは、あなたのオブジェクトの逆を提供します

If Not DeleteRng Is Nothing Then 
    DeleteRng.EntireRow.Delete '<----- *highlighted error* 
Else 
    msgbox "No rows found!" 
End If 

DeleteRng.EntireRow.Delete '<----- *highlighted error* 

。オブジェクトが何かに設定されている場合、逆は何もありません。これは、オブジェクトが設定されていないときにコードがエラーを発生させないようにします。 elseステートメントも削除できますが、そこにelseステートメントがあれば、何も設定されていないかどうかがわかります。

+0

こんにちはブランドン、それは値が文字列または関数の場合に違いがありますか? FALSEの値は電子メール検証機能に基づいているため、DeleteRows()マクロがそれを見つけられないのはなぜですか? – PatrykChristopher

0

(OPに代わって投稿)

私は私のミスを考え出しました!少し助けとコードの変更、そして提案で、私は大文字と小文字を区別していたので、私が入力した値が返された値と異なっていたことに気付きました。

列Bはすべて大文字で表示された「FALSE」値を持っていましたが、すぐにウィンドウが値が実際に「偽」であることを示しました。私は「偽」で正しく検索し、完璧に機能しました!

私はまたにエラー部分を変更:DeleteRngは、それがRangeオブジェクトではありません意味は何もしない場合、あなたはそれを設定することはできません

If Not DeleteRng Is Nothing Then DeleteRng.EntireRow.Delete 
関連する問題