Apple IDログイン機能メンテナンスのお知らせ

実行時エラー'91'
オブジェクト変数またはWithブロック変数が設定されていません
というエラーが出ます

同じような質問をいくつか見つけました。
FindでTRUEが見つからなくなったときの処理が問題?だと思うんですが、それを解決するために、どうしていいか分かりません。
よろしくお願いします。


AL列にTRUEとある行を削除するマクロです。
処理が正常に終わり、最後にエラーが出ます。

Sub 行削除()
lastrow = Range("AL1").End(xlDown).Row
i = 1
Dim trow As String
Do While i < lastrow
trow = Range("AL:AL").Find(What:="TRUE").Row
Rows(trow).Delete
i = i + 1
Loop
End Sub

A 回答 (6件)

こんにちは。



そのままのマクロでは、Error トラップを設けないと離脱できないはずです。そのマクロの場合は、エラーは避けられないです。
理由は、
trow = Range("AL:AL").Find(What:="TRUE").Row
で、見つからなかったときの判定が出来ないからです。Error トラップをしない方法では、

たぶん、以下のようにすれば良いと思います。
'------------------------------------------
Sub 行削除()
Dim trow As Range
  Do
    Set trow = Range("AL:AL").Find(What:="TRUE", LookIn:=xlValues)
    If trow Is Nothing Then Exit Sub
    Rows(trow.Row).Delete
  Loop
End Sub
'--------------------------------------

なお、このようなマクロは、オートフィルタを用い、SpecialCells で、可視行のみを選択して削除するのが一般的です。
    • good
    • 0
この回答へのお礼

分かりやすく解説していただきありがとうございます。

> なお、このようなマクロは、オートフィルタを用い、SpecialCells で、可視行のみを選択して削除するのが一般的です。

よく分からないので調べてみます。

お礼日時:2008/02/06 20:36

行削除は1行ずつ、判定・削除を下の行からやっていくのが、ロジックとして間違いないと確認している。


私ならそのやり方でやる。
ーー
今回のケースではiは回数管理の対象であるが、検索範囲はFindで見つかるごとに狭まるのに、最終行数lastrow 回機械的にFindを繰り返すロジックは明らかに破綻する。罠にはまったのでは。
ロジックの再考をすべきです。
Find探索で初めて見つからなく消すが起こったら、探索を中止するとかどうかな。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

お礼日時:2008/02/06 20:46

#3の回答者です。



#4 の onlyromさんの
>最近FINDメソッドが流行のようですが

確かに、おっしゃるとおり、最近、Find メソッドを使う方が多いようです。私は、Find は、厳密には、表のワークシートからの使いこなしと、VBAとは若干仕様が違っていた時代もあったようで、Excel 2003までは、敬遠してきたという経緯があります。また、今回の検索自体も、本来、"TRUE" という文字列を探すというのも、若干、私には違和感があります。

それと同じくして、Do ~ Loop も、ループの離脱の判定が簡単に使いこなせない時があります。

別に、よいしょではありませんが、一番分かりやすく間違いが少ないのは、

onlyromさんの #4の方法

For i= 初期値 To 終了値 ~ Next

がお勧めです。
なお、行の削除の場合は、逆さ=Step -1 にしていきます。これは、覚えたほうがよいですね。
    • good
    • 0
この回答へのお礼

本と首っ引きで、やりたいことが解決できそうなのを組み合わせて試していて引っかかっていました。同じことをするにもいろいろやり方があるんだと、勉強になりました。ありがとうございます。

お礼日時:2008/02/06 20:44

最近FINDメソッドが流行のようですが。

。。。
オーソドックスな方法でやると

'--------------------------------------------------
Sub 行削除()
 Dim R As Long
 For R = Range("AL65536").End(xlUp).Row To 2 Step -1
   If Cells(R, "AL").Value = True Then
     Rows(R).Delete xlShiftUp
   End If
 Next R
End Sub
'-------------------------------------------------------

それから、質問する前にヘルプを見る癖をつけると上達が早いと思われます。

(FINDメソッドのヘルプより抜粋)
情報が見つかった最初のセル (Range オブジェクト) を返します。
検索の条件にあてはまるセルが見つからなかった場合は、Nothing を返します。

使用例もちゃんと載っています。
以上。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

お礼日時:2008/02/06 20:39

訂正です。


一部間違えました。

Sub 行削除()
Dim trow As Variant
Do
Set trow = Range("AL:AL").Find(What:="TRUE")
If Not trow Is Nothing Then Rows(trow.Row).Delete
Loop While Not trow Is Nothing
End Sub
    • good
    • 0

Sub 行削除()


Dim trow As Variant
Do
Set trow = Range("A:A").Find(What:="TRUE")
If Not trow Is Nothing Then trow.Rows.Delete
Loop While Not trow Is Nothing
End Sub
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

お礼日時:2008/02/06 20:35

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています