アプリ版:「スタンプのみでお礼する」機能のリリースについて

次のマクロですが、順調に動いていたと思うと
急にタイトルのエラーで落ちたりします。


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

もできなくなります。

オブジェクトへの参照方法が今ひとつわかっていないのですが、
どの場合でもエラーなく実行するにはどうすればいいのでしょうか?

A 回答 (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
    • good
    • 1
この回答へのお礼

やっぱり、ご指摘の通り、親オブジェクトをきちんと
指定した方が安心感がありますね。

今後はそっちで書いていきたいと思います。

ありがとうございました。

お礼日時:2006/01/25 13:17

>オブジェクトへの参照方法が今ひとつわかっていないのですが、


>どの場合でもエラーなく実行するにはどうすればいいのでしょうか?

エラートラップなしでエラーが発生すると、変数はクリアされますから、すべてのプロシ-ジャに、
 On Error Go To xxxx
を記述して、適切なエラー処理を行うことですね。

あとは、各モジュールの先頭に
Option Explicit
を記述すること。
今後のためには、VBEのオプションで、
「変数の宣言を強制する」にチェックを入れておくこと。
プロジェクトのコンパイルをすること。

> Set mySh = Thisworkbook.Sheets("Sheet1")
> Debug.Print mySh.Cells(1,1)

これのエラーについては、
No1さんと同じですが、

mySh が宣言されている場所と内容。
上記コードが書かれている場所が問題です。

この回答への補足

>mySh が宣言されている場所と内容。

#1さんに補足しましたが、プロシージャーレベルで宣言
しています。

どうもご指摘のエラー時でmyShがクリアされているのが
原因のような気がします。

補足日時:2006/01/24 10:38
    • good
    • 1

こんばんは。

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

補足日時:2006/01/24 10:37
    • good
    • 0

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

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