- ベストアンサー
'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 もできなくなります。 オブジェクトへの参照方法が今ひとつわかっていないのですが、 どの場合でもエラーなく実行するにはどうすればいいのでしょうか?
- みんなの回答 (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
その他の回答 (2)
- bonaron
- ベストアンサー率64% (482/745)
>オブジェクトへの参照方法が今ひとつわかっていないのですが、 >どの場合でもエラーなく実行するにはどうすればいいのでしょうか? エラートラップなしでエラーが発生すると、変数はクリアされますから、すべてのプロシ-ジャに、 On Error Go To xxxx を記述して、適切なエラー処理を行うことですね。 あとは、各モジュールの先頭に Option Explicit を記述すること。 今後のためには、VBEのオプションで、 「変数の宣言を強制する」にチェックを入れておくこと。 プロジェクトのコンパイルをすること。 > Set mySh = Thisworkbook.Sheets("Sheet1") > Debug.Print mySh.Cells(1,1) これのエラーについては、 No1さんと同じですが、 mySh が宣言されている場所と内容。 上記コードが書かれている場所が問題です。
補足
>mySh が宣言されている場所と内容。 #1さんに補足しましたが、プロシージャーレベルで宣言 しています。 どうもご指摘のエラー時でmyShがクリアされているのが 原因のような気がします。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。Wendy02です。 >次のマクロですが、順調に動いていたと思うと って、コードの行を書くのではなくて、プロシージャとして出していただき、その条件や状態、また、そのマクロ自体の目的を明記してください。 実行時エラー(1004)が出ているようですから、おそらくは、その置かれているシートやシートの状況に依存しているのだと思います。そのコード単独では、エラーが出るとは思えません。 それと、Debug.Print を置いて、何をみているのでしょうか?Debug.Print の後で、オブジェクトを失って、エラーが出る特殊な場合はありますが、ここでは、それが当たらないと思います。
補足
実際は次のような感じです。 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
お礼
やっぱり、ご指摘の通り、親オブジェクトをきちんと 指定した方が安心感がありますね。 今後はそっちで書いていきたいと思います。 ありがとうございました。