• ベストアンサー

'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

  • 行を挿入するマクロがうまくいきません。

    Sheets("りんご").Select Rows("1:1").Select Selection.Copy Sheets("みかん").Select Range("人").Select Selection.Insert Shift:=xlDown Application.CutCopyMode = False End Sub というマクロは、りんごのシートにある1行をコピーして、 みかんのシートの人と名前定義してある特定の行にコピーする マクロです。この次に下のマクロを実行すると Sheets("りんご").Select Rows("2:3").Select Selection.Copy Sheets("みかん").Select Range("人").Select Selection.Insert Shift:=xlDown それまでのものが残ってしまい、行がどんどん増えていってしまいます。 いずれかのマクロを実行すればリセットされて行が増えないように コピーするにはどうすればよいでしょうか・・?

  • Rows("20:20").Selectについて

    よろしくお願いします こんな簡単なことが分かりません どなたか教えてください マクロを記録すると Rows("20:20").Select Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove と記録されました また Private Sub Worksheet_Change(ByVal Target As Range)内のマクロで Debug.Print Target.Row と書くと 20が表示されます そこで Rows("20:20").Select の20をTarget.Rowに置き換えるには、マクロではどう書いたらよいでしょうか 色々試しましたがエラーで進みません うまく表現できていませんが、どなたか教えてください  

  • エクセルのマクロ実行→オブジェクトがはみでるエラーについて

    エクセルでマクロを作り、実行したのですが、データを集計し「2」で集約する部分で「オブジェクトからはみでます」というエラーがでます。原因がわかりません。正しく実行できる方法を教えてください。 Selection.Subtotal GroupBy:=2, Function:=xlSum, TotalList:=Array(3, 4, 5, 6, _ 7, 8, 10, 13), Replace:=True, PageBreaks:=False, SummaryBelowData:=False Range("D2").Select   ↓この部分でエラーになります。 ActiveSheet.Outline.ShowLevels RowLevels:=2 Range("A2").Select Selection.Insert Shift:=xlDown Range("P2:R2").Select Selection.Insert Shift:=xlDown Range("B1").Select Selection.SpecialCells(xlCellTypeVisible).Select Selection.Copy

  • sheet1上のマクロでsheet2に画面を切り替えずに行を挿入させたい

    Excel2002ユーザーです。 sheet1上で実行するマクロで、画面を切り替えることなく、 いわば水面下でsheet2の行1に空行を挿入させ、常に最新のデータ(Sheet1上にあるセルの値)を書き込んでいく、 ということをしたいのです。 古いデータは順次、下に送られる形です。 まずデータの書き込み以前に、挿入ができないのです。 sheet1上のマクロで、 Worksheets("sheet2").Rows("1:1").Select Selection.Insert Shift:=xlDown と書き込みましたがダメでした。 (実行時エラー'1004': RangeクラスのSelectメソッドが失敗しました) Sheets("sheet2").Select Rows("1:1").Select Selection.Insert Shift:=xlDown の場合、行挿入はOKですが、sheet2に画面が切り替わってしまいます。 常にsheet1の画面を表示させたままにしてこのようなことを行いたいのですが、 良きアイデア、アドバイスがありましたら御教授ください。 よろしくお願い致します。

  • EXCELマクロデータのある行より下の行削除の構文

    EXCELマクロ構文について教えてください。 データのある行のひとつ下の行全体選択し、 Ctrl+Shift+↓で下部行全て選択し、右クリックで削除する 操作をマクロにしたいのでですが、 マクロ記録では上の操作は Rows("189:189").Select Range(Selection, Selection.End(xlDown)).Select Selection.Delete Shift:=xlU  になります。 この 189 という数字は 下記の変数定義で「lastRow」として取得できるのですが Dim lastRow As Long lastRow = Sheets("2CVS関西").Cells(Rows.Count, 2).End(xlUp).Row + 1 189にlastRow に置き換える方法お教えください。

  • excel:vba

    エクセルVBAで、ROWS(“7:7”)からROWS(“93,93”)まで、行の値を+3ずつアップしてあることを繰り返し実行したいのですが、ROWS(“i:i”)とかROWS(i:i)とかは意味をなさないようです。 どのように処理(記述)すればよいのでしょうか。 感覚的には次のような処理したい。 For i = 7 To 93 Step 3 Rows(i:i).Select Selection.Insert Shift:=xlDown Selection.Insert Shift:=xlDown Next i

  • EXCEL2000で作成したマクロが2007で動作しない

    EXCEL2000で作成したマクロがEXCEL2007上で動作しません。 2つのシートに入ったデータを,「抽出」シートにコピー後, 抽出条件に合わせて抽出するというものなのですが, 「Sheet1」で最終行を取得するところで,正しい範囲を 選択しません。どこが間違えているのか,ご指南頂けないでしょうか? お願いいたします。 下には,正しい結果が出ない所までを貼りつけました。 Sub フィルタオプション() Dim LastRow As Long, LastColumn As Long Dim myData As Range Dim myCriteria As Range Sheets("Sheet1").Select Rows("1:1").Select Selection.Copy Sheets("抽出").Select Rows("3:3").Select ActiveSheet.Paste If Worksheets("Sheet1").FilterMode = True Then   Worksheets("Sheet1").ShowAllData End If With Worksheets("Sheet1") LastRow = .Cells(Application.Rows.Count, "A").End(xlUp).Row End With Sheets("Sheet1").Select Range(Rows(2), Rows(LastRow)).Select Selection.Copy Range("A1").Select Sheets("抽出").Select Range(Rows(4), Rows(4)).Select Selection.Insert Shift:=xlDown

  • Copyメソッド以外の方法でのコピペ

    myRow=100 Sheets(strSheetsName1).Rows("1:" & myRow).Copy Sheets(strSheetsName2).Rows(myRow + 1).Insert Shift:=xlDown コピーして、挿入しつつ貼り付け、という作業を繰り返してるのですが、 このマクロを実行している間に、ブラウザ等でコピー貼り付けができなくなってしまいます。 ブラウザ上でコピーしたつもりが、vbaでコピーした情報が、張り付いてしまいます。 なので、コピペではない方法で、行の情報を取得し貼り付け値のですが 何かいい方法はありますか?

  • エクセルマクロエラー「'Cells'メソッドは失敗しました。'_Global'オブジェクト」について

    Excel 2000のマクロで教えてください。 あるセルに関数をいれるマクロを設定しております。  変数% = 8  Range(Cells(126, 20), Cells(155, 19 + 2 *  変数%)).FormulaR1C1 =  "=(RC[-18]-R[-1]C[-18])/0.04*100" このマクロを走らせると、たまに、 「'Cells'メソッドは失敗しました。'_Global'オブジェクト」 という、エラーがでます。 どういう意味なのでしょうか。 うまくいくときもあるので、よくわかりません。 すみませんが、教えてください。

  • VBAマクロエラー【オーバーフローしました。】

    以下のVBAマクロで突然エラーが出るようになってしまいました。 原因がわからず困っています。 どなたかご教授ください。 該当部分 :S = Range("B2").End(xlDown).Row エラーMrg:実行時エラー'6': オーバーフローしました ----------マクロ文---------- Sub 部担コード読み替え() Dim R_Count As Integer Dim P_Sheet As String Dim S As Integer 'データ取込用のファイルを開く Workbooks(D_Book).Activate Sheets("Data1").Select Columns("C:C").Select Selection.Insert Shift:=xlToRight Range("B2").Select S = Range("B2").End(xlDown).Row Range("C2:C" & S).Formula = "=SUBSTITUTE(SUBSTITUTE(RC[-1],""%"",""1""),""*"",""2"")" Range("C1").Value = "部担コード" Cells.Select Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues Columns("B:B").Select Application.CutCopyMode = False Selection.Delete Shift:=xlToLeft Range("A1").Select Sheets("Data2").Select Columns("C:C").Select Selection.Insert Shift:=xlToRight Range("B2").Select S = Range("B2").End(xlDown).Row Range("C2:C" & S).Formula = "=SUBSTITUTE(SUBSTITUTE(RC[-1],""%"",""1""),""*"",""2"")" Range("C1").Value = "部担コード" Columns("G:G").Select Selection.Insert Shift:=xlToRight Range("G2:G" & S).Formula = "=SUBSTITUTE(SUBSTITUTE(RC[-1],""%"",""1""),""*"",""2"")" Range("G1").Value = "キー" Cells.Select Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues Columns("B:B").Select Application.CutCopyMode = False Selection.Delete Shift:=xlToLeft Columns("E:E").Select Application.CutCopyMode = False Selection.Delete Shift:=xlToLeft Range("A1").Select End Sub

専門家に質問してみよう