• ベストアンサー

Excel VBAマクロで実行時エラー'91'が出てしまいます。

実行時エラー'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

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。 そのままのマクロでは、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 で、可視行のみを選択して削除するのが一般的です。

Freah7FbsD
質問者

お礼

分かりやすく解説していただきありがとうございます。 > なお、このようなマクロは、オートフィルタを用い、SpecialCells で、可視行のみを選択して削除するのが一般的です。 よく分からないので調べてみます。

その他の回答 (5)

  • imogasi
  • ベストアンサー率27% (4737/17070)
回答No.6

行削除は1行ずつ、判定・削除を下の行からやっていくのが、ロジックとして間違いないと確認している。 私ならそのやり方でやる。 ーー 今回のケースではiは回数管理の対象であるが、検索範囲はFindで見つかるごとに狭まるのに、最終行数lastrow 回機械的にFindを繰り返すロジックは明らかに破綻する。罠にはまったのでは。 ロジックの再考をすべきです。 Find探索で初めて見つからなく消すが起こったら、探索を中止するとかどうかな。

Freah7FbsD
質問者

お礼

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

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

#3の回答者です。 #4 の onlyromさんの >最近FINDメソッドが流行のようですが 確かに、おっしゃるとおり、最近、Find メソッドを使う方が多いようです。私は、Find は、厳密には、表のワークシートからの使いこなしと、VBAとは若干仕様が違っていた時代もあったようで、Excel 2003までは、敬遠してきたという経緯があります。また、今回の検索自体も、本来、"TRUE" という文字列を探すというのも、若干、私には違和感があります。 それと同じくして、Do ~ Loop も、ループの離脱の判定が簡単に使いこなせない時があります。 別に、よいしょではありませんが、一番分かりやすく間違いが少ないのは、 onlyromさんの #4の方法 For i= 初期値 To 終了値 ~ Next がお勧めです。 なお、行の削除の場合は、逆さ=Step -1 にしていきます。これは、覚えたほうがよいですね。

Freah7FbsD
質問者

お礼

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

  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.4

最近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 を返します。 使用例もちゃんと載っています。 以上。

Freah7FbsD
質問者

お礼

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

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.2

訂正です。 一部間違えました。 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

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.1

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

Freah7FbsD
質問者

お礼

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

関連するQ&A