• ベストアンサー

'Cells'メソッドは失敗しました '_Global'オブジェクト

次のマクロですが、順調に動いていたと思うと 急にタイトルのエラーで落ちたりします。 Set mySh = Thisworkbook.Sheets("Sheet1") Debug.Print mySh.Cells(1,1) また、そのときは・・・ mySh.Rows("4:4").Select Selection.Insert Shift:=xlDown や mySh.Select Rows("4:4").Insert Shift:=xlDown や mySh.Rows("4:4").Insert Shift:=xlDown もできなくなります。 オブジェクトへの参照方法が今ひとつわかっていないのですが、 どの場合でもエラーなく実行するにはどうすればいいのでしょうか?

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

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

こんにちは。Wendy02です。 >Cells(4,4)に時刻が入っていて、Webから取得した文字列 うーん。余談にはなるのですが、最近、同じ系列の質問が多くなりましたね。 >    If Format(Cells(4, 4), "hh:mm") <> Format(myVal, "hh:mm") Then まあ、ある程度、なれてくれば感覚的には分るのですが、Cells を唐突に用いるとエラーが発生する確率が高くなります。私も、経験ありますが、以前はさっぱり分らなかったです。Cellsも、Applicationに対するグローバルオブジェクトなのに、シートの属性をつけないといけないのですね。ちょっと、気をつけたほうがよいです。With ~.Cells と使います。こういうことも、一応「明示的(explicit)」といいます。 ちょっと、以下のもので研究してみてください。 '<標準モジュール推奨> Sub Test2()   Dim myTime1 As Variant   Dim myTime2 As Variant   Dim myVal As String '  myVal = "15:30"   With ThisWorkbook.Worksheets("ABC")    If IsDate(.Cells(4, 4).Text) Then myTime1 = CDate(.Cells(4, 4).Text)    If IsDate(myVal) Then myTime2 = CDate(myVal)    If myTime1 <> Empty And myTime2 <> Empty Then      If Format(myTime1, "hh:mm") <> Format(myTime2, "hh:mm") Then       .Rows("4:4").Insert Shift:=xlDown      End If    End If   End With End Sub

noname#27115
質問者

お礼

やっぱり、ご指摘の通り、親オブジェクトをきちんと 指定した方が安心感がありますね。 今後はそっちで書いていきたいと思います。 ありがとうございました。

その他の回答 (2)

  • bonaron
  • ベストアンサー率64% (482/745)
回答No.2

>オブジェクトへの参照方法が今ひとつわかっていないのですが、 >どの場合でもエラーなく実行するにはどうすればいいのでしょうか? エラートラップなしでエラーが発生すると、変数はクリアされますから、すべてのプロシ-ジャに、  On Error Go To xxxx を記述して、適切なエラー処理を行うことですね。 あとは、各モジュールの先頭に Option Explicit を記述すること。 今後のためには、VBEのオプションで、 「変数の宣言を強制する」にチェックを入れておくこと。 プロジェクトのコンパイルをすること。 > Set mySh = Thisworkbook.Sheets("Sheet1") > Debug.Print mySh.Cells(1,1) これのエラーについては、 No1さんと同じですが、 mySh が宣言されている場所と内容。 上記コードが書かれている場所が問題です。

noname#27115
質問者

補足

>mySh が宣言されている場所と内容。 #1さんに補足しましたが、プロシージャーレベルで宣言 しています。 どうもご指摘のエラー時でmyShがクリアされているのが 原因のような気がします。

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

こんばんは。Wendy02です。 >次のマクロですが、順調に動いていたと思うと って、コードの行を書くのではなくて、プロシージャとして出していただき、その条件や状態、また、そのマクロ自体の目的を明記してください。 実行時エラー(1004)が出ているようですから、おそらくは、その置かれているシートやシートの状況に依存しているのだと思います。そのコード単独では、エラーが出るとは思えません。 それと、Debug.Print を置いて、何をみているのでしょうか?Debug.Print の後で、オブジェクトを失って、エラーが出る特殊な場合はありますが、ここでは、それが当たらないと思います。

noname#27115
質問者

補足

実際は次のような感じです。 Cells(4,4)に時刻が入っていて、Webから取得した文字列 myValと比較し、時刻が変わっていたら1行挿入するという ものです。 どうもmyValの値を取得しぞこなっていて、そこでエラー になっていたようです。 >エラートラップなしでエラーが発生すると、変数はクリアされますから、 と、#2さんから回答をもらっていますが、エラーの時点で myShがクリアされてしまっていて、オブジェクトが特定 できてなかったのかもしれません。 Sub Test()   Dim mySh As Worksheet   Dim myVal As String     Set mySh = ThisworkBook.Sheets("ABC")     mySh.Select     If Format(Cells(4, 4), "hh:mm") <> Format(myVal, "hh:mm") Then         Rows("4:4").Insert Shift:=xlDown     End If     Set mySh = Nothing End Sub

関連するQ&A