• ベストアンサー

《エクセル2000VBA》これで実行時エラー '1004'が出るのはなぜでしょう?

こんにちは。VBAの実行時エラーで困っています。 内容を抜粋したものが、下記のものになります。 If Worksheets(sname1).Range("M6") <> Empty Then MsgBox (sname1) MsgBox (Worksheets(sname1).Range("M6")) '該当入力シートの一番下の行を探す Worksheets(sname1).Range("M65536").End(xlUp).Offset(1).Select sname1はシート名の変数です。 2つのMsgBoxが間違いなく表示されますので、sname1に存在するシート名は入っていると思います。 今の状態で、該当入力シートの一番下の行を探す時点で実行時エラーが出てしまうのですが、なぜでしょうか?

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

  • ベストアンサー
  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.4

Select が原因と思います。 Worksheets(sname1).Activate を Worksheets(sname1).Range("M65536").End(xlUp).Offset(1).Select の上に書いたらどうでしょう?

bari_saku
質問者

お礼

ありがとうございます、エラーが消えました!

その他の回答 (4)

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

>なぜ違いが出るのかを教えていただけませんでしょうか。 基本的には、マクロは、標準モジュールに書くようにしてくださいね。シート・モジュールに書くものは、シートのイベントやボタン・コントロールのイベントだけにしてください。 その違いですが、#1さんの回答がなぜダメだったかというのは、ちょっと難しいことですが、Rangeオブジェクトには、シートに直結しているものと、そうでないものがあるということです。シート・モジュールに書くとシートに直結してしまうのですね。 Range("M65536").End(xlUp).Offset(1).Select これは、シートモジュールに書くと、そのシートに属したM65536というアドレスですよ、という意味になってしまいます。別のシートにしてしまうと、そのシートがActiveでないのに、そのシートのセルをSelectしてください、といわれてもできませんという、エラーが出ます。 つまり、SelectやActivateでなければ、問題が出ません。 '<標準モジュール>で書くと Worksheets(sname1).Select '.Active でも可 'シートをアクティブにして、 Range("M65536").End(xlUp).Offset(1).Select '自由に選択(Select)することができるようになります。 ただ、これで間違いがないのですが、きちんと書くなら、 やっぱり、#4 のpapayukaさんがお書きになっているように、シートを明示するというのが、プログラムとしての正しい書き方だと思っています。 (以下は、With で省略しています) With Worksheets(sname1)  .Select  .Range("M65536").End(xlUp).Offset(1).Select End With でも、本当に、Selectする必要があるかどうかを見極める、というのが、次の課題になってきますね。

bari_saku
質問者

お礼

ご丁寧にありがとうございました。 (書く場所ですが、ゆくゆくはボタンコントロールで行う予定のものですので、このままにしておこうかと思っています)

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

#1 さんの答えで間違いないのですが、基本的なことですが、それは、「標準モジュール」に書かれていないのではありませんか? ともかく、その点を調べてみてください。

bari_saku
質問者

お礼

…まさにその通りです。集計するシートのオブジェクトに書いています。 標準モジュールにコピペしたら、問題なく動きました。 もしよろしければ、なぜ違いが出るのかを教えていただけませんでしょうか。

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.2

一見して問題なさそうなので、コード全体を見てみないとわからないですね。コードの提示は可能ですか? それから、こういうときはステップイン(F8)で実行すると糸口がみつかるかもしれません。 試しに、 Worksheets(sname1).Range("M65536").End(xlUp).Select のように、Offset を除いてみたらどうなりますか?

bari_saku
質問者

お礼

ここに載せるため、コードの余計な部分を削除しているうちに、何とか解決できそうになってきました。 お手数をおかけしました、ありがとうございました。

  • kmb01
  • ベストアンサー率45% (63/138)
回答No.1

Worksheets(sname1).Select Range("M65536").End(xlUp).Offset(1).Select とすればいいはず

bari_saku
質問者

お礼

ごめんなさい。 結果、変わりません… 私のやり方が悪いのでしょうか。

関連するQ&A

  • VBAで実行時エラー 1004 がでる

    Excel2013です。以下のコードでエラーがでます。 どのシートがアクティブでもデータを閉じる時に特定のシート(sheet1)のA行の最終行の一つ下をアクティブにし上書き保存して閉じるようにしたいです。 以下記述したコードです。 Sub Auto_Close() Worksheets(1).Activate Range("A60000").End(xlUp).Offset(1).Select 'Aセル60000から最終行のセルの一つ下に下がる ActiveWorkbook.Save End Sub 閉じるときは問題ないのですが、開いたときにエラーがでます。 以下エラー文です。 実行時エラー 1004 'Worksheets'メソッドは失敗しました'_Global'オブジェクト どこを直せばいいのでしょうか? アドバイス願います。

  • エクセルVBA の変数を使うべきでしょうか?

    はじめまして。エクセル初心者です。 書籍やサイトで勉強させてもらっていますが、VBAがなかなか難しくてすぐに壁にぶつかってしまいます。少々困ってしまい、詳しい方のアドバイスを頂ければと質問を投稿させていただきました。 どうか宜しくお願い致します。質問ですが、 以下のようなコードで、sheet5のB列の任意のセルをダブルクリックした場合、sheet5のBCD列の同じ行のセル値がsheet1の指定した列に入力されるという処理を作りました。 これで一応目的の動作はするのですが、数が増えると「コンパイルエラー・プロシージャが大きすぎます」というメッセージがでてしまいます。列や行には規則性があるので、もしかしたら変数というものを使ってコードを書き直せばいいのかなと思いネットで調べてみたのですが、今のところさっぱり理解できません。 申し訳ありませんが、分かりやすくご教授いただけないでしょうか。バージョンは2003を使っています。 また、下のコードですと、sheet5のBCDいずれかのセルに空白があった場合、sheet1の列に入力されるときに入力される行がずれてしまいます。今は空白を何かで埋めて対処しているのですが、この問題の解決策も教えて頂けると助かります。どうか宜しくお願い致します。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, cancel As Boolean) If Target.Address = "$B$2" Then Worksheets("sheet1").Range("B" & Rows.Count).End(xlUp).Offset(1).Value = Target.Value Worksheets("sheet1").Range("H" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("B2") Worksheets("sheet1").Range("K" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("C2") Worksheets("sheet1").Range("M" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("D2") Worksheets("sheet1").Activate cancel = True End If If Target.Address = "$B$3" Then Worksheets("sheet1").Range("B" & Rows.Count).End(xlUp).Offset(1).Value = Target.Value Worksheets("sheet1").Range("H" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("B3") Worksheets("sheet1").Range("K" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("C3") Worksheets("sheet1").Range("M" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("D3") Worksheets("sheet1").Activate cancel = True End If If Target.Address = "$B$4" Then Worksheets("sheet1").Range("B" & Rows.Count).End(xlUp).Offset(1).Value = Target.Value Worksheets("sheet1").Range("H" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("B4") Worksheets("sheet1").Range("K" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("C4") Worksheets("sheet1").Range("M" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("D4") Worksheets("sheet1").Activate cancel = True End If   ・     ・   ・     ・   ・     ・ End Sub

  • VBA 実行時エラー1004 

    初めまして。 VBA初心者です。 現在、あるセルの範囲に対して、1の数値が入っているなら 直線を引くマクロを作成中です。 実行すると「実行時エラー1004 アプリケーション定義またはオブジェクト定義のエラーです。」 と表示されます。 サイト等を見ながら、下記プログラムを書いてみました。 修正頂けると幸いです。解説も頂きたいです。 無茶苦茶なプログラムだと思いますが、 宜しくお願い致します。 Sub test01() Dim x As Range Dim c As Range Dim X1 As Single, Y1 As Single, X2 As Single, Y2 As Single Set x = Range("D4:E9") For Each c In x If Worksheets("Sheet1").Range("c").Value = 1 Then X1 = Worksheets("Sheet1").Range("c").Left + Worksheets("Sheet1").Range("c").Width Y1 = Worksheets("Sheet1").Range("c").Top + Worksheets("Sheet1").Range("c").Height / 2 X2 = Worksheets("Sheet1").Range("c").Offset(0, 1).Left Y2 = Worksheets("Sheet1").Range("c").Offset(0, 1).Top + Worksheets("Sheet1").Range("c").Offset(0, 1).Height / 2 Worksheets("Sheet1").Shapes.AddLine X1, Y1, X2, Y2 End If Next c End Sub

  • 印刷後のVBAの実行 (3)

    Private Sub Workbook_BeforePrint(Cancel As Boolean) If ActiveSheet.Name = "Sheet1" Then If Range("D6").Value = "" Then Cancel = True MsgBox ("名前を入力してください") Range("D6").Select Exit Sub End If Else If ActiveSheet.Name = "Sheet2" Then If Range("C11").Value = "" Then Cancel = True MsgBox ("受付時間を入力してください") Range("C11").Select Exit Sub End If Else Exit Sub End If End If If Worksheets("Sheet1").Range("D5") = "不要" Then GoTo P1 ActiveSheet.Range("A70:Y70").Copy If Worksheets("Sheet3").Range("A1").Value = "" Then Worksheets("Sheet3").Range("A1").PasteSpecial Paste:=xlPasteValues Else Worksheets("Sheet3").Range("A65536").End(xlUp).Offset(1, 0).PasteSpecial _ Paste:=xlPasteValues End If Application.CutCopyMode = False P1: ActiveSheet.Range("A1").Select End Sub sheet1のD5に「不要」と入っていたら 24~33行目の作業がキャンセルになりますが sheet2のD5にも「不要」と入っていたら、同じ様にキャンセルできる様に出来ますでしょうか? ご回答お願いします

  • excel vbaのエラー原因について

    よろしくお願いします。初心者で勉強中です。以下のコードを作成してみましたがエラーが出ます。いろいろ調べてみましたが解決策がわからないので、教えて頂ければと思います。 ・シートは31シートあります(1番左のシート名は"初期設定"、2番目は 1日、3番目は2日と・・・、順に30日まであります。) 。 ・やりたい事。 ・2番目シートの(A1からA10)までをコピーし、1番目シートのA2にはりつける。3番目シートの(A1からA10)までをコピーし、1番目シートの先ほど貼り付けたデータの1つ下の行にはりつける・・・順に30日までのデータをすべて1番目シートに貼り付けたいと思っています。 ・"初期設定シート"の1行目には文字が入っているので、データの貼り付けは2行目からにする予定です ・作ったコード Sub 練習() Dim maxrow As Long Dim i As Long maxrow = Sheets(1).Range("a1").End(xlDown).Row For i = 2 To 31 Sheets(i).Select Sheets(i).Range("A1", "A10").Select Selection.Copy Worksheets(1).cells(maxrow+1,1) Next i End Sub ・F8で1文ずつ確認すると、Selection.Copy Worksheets(1).cells(maxrow+1,1) を実行したときに、「実行時エラーがでます」。 EXCEL2000を使用しています。 よろしくお願いします。

  • VBAが動かない。

    初心者ですが、必要にせままれてVBAを習得努力中ですが、参考書からC&Pして何とか動き?始めたが、途中実行時エラー:1004に引っかかって作動しなくなり使用を止めていました。現在1-2-3のロータスのマクロでなんとかしのいでいますが、やはりエクセルを使用しないと物事はスムーズに進みません。これはデータ入力後の作業の出だしのマクロです。どなたかご教授いただけませんか? QT Sub シート挿入() '初回の追加() Worksheets.Add After:=Worksheets("データ_変換") ActiveSheet.Name = "1" 'シート修正の追加() Worksheets.Add After:=Worksheets("1") ActiveSheet.Name = "2" End Sub Sub 初回、修正のデータ抽出() Dim xRange As Range, yRange As Range Dim sName, allName Set xRange = Worksheets("データ_変換").Range("A4").CurrentRegion allName = Array("1", "2") For Each sName In allName Range("D2").Value = sName Set yRange = Worksheets("データ_変換").Range("A1").CurrentRegion xRange.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=yRange, _ CopyToRange:=Worksheets(sName).Range("A1") Next Set xRange = Nothing: Set yRange = Nothing End Sub UNQT 以上ですが、シート1,2を追加した後それぞれのシートに抽出条件回数(D列)である1,2毎にフルデータを抽出するもので、フィールド名は4行目A列からBI列で約2000件のデータです。 当初はなにもしないでマクロ実行時にそれぞれのシートにフルレングスのフィールド行とデータがA1からBI1のフィールド名とともに書き出されました。また自動的に「データ_変換」のフィールド行が同シートの上のA1にコピーされD列の下の2行目に2の数字が書き込まれて作業は無事完了していました。 以上よろしくお願いします。

  • 実行時エラー 1004について 【超初心者です】

    マクロ超初心者です。 WindowsXP Excel 2003です。 データ入力用にマクロを作成してみましたが、 「実行時エラー 1004 アプリケーション定義・・・・」というメッセージが出てきます。 シート1「入力」を入力用画面として、 シート2「データ」にシート1で入力した内容が反映されるものです。 シート1「入力」の入力用画面はセルの結合が多く、 入力するセル以外はシートの保護をかけています。 下記のようなマクロです。 Sub 登録() ActiveSheet.Unprotect Password:="×××" 最終行 = Sheets("データ").Range("A" & Rows.Count).End(xlUp).Row + 1 Sheets("データ").Range("A" & 最終行).Value = 最終行 Sheets("データ").Range("B" & 最終行).Value = Range("C2:D2").Value Sheets("データ").Range("C" & 最終行).Value = Range("C3").Value Sheets("データ").Range("D" & 最終行).Value = Range("E3").Value          Sheets("データ").Range("C2:D2").ClearContents Sheets("データ").Range("C3, E3").ClearContents MsgBox "登録しました" ActiveSheet.Protect Password:="×××", DrawingObjects:=True, contents:=True, UserInterfaceOnly:=True End Sub   超初心者で、何をどうしたらいいのかまったくわかりません。   なるべく専門用語がないように   ご指導いただくとありがたいです。   非常に困っておりますので、よろしくお願いします。   

  • VBA 実行時エラー1004(その2)

    毎度お世話になっております。 シート「sheet2」のA列のリスト内容を、シート「M_得意先」のリストからVLOOKUPして、指定のセルに書き出していくというコードを作成してみたのですが、VLOOKUPを実行する段階でエラーが出てしまいます。 少し変更して、同一シート内でのVLOOKUPは問題なく実行できたのですが...原因をご存知の方教えてください。 Dim b As String Dim endRcell2 As Long Dim cnt10 As long Sheets("sheet2").Select Sheets("sheet2").Range("A1").CurrentRegion.Select 'データ全体選択 Selection.SpecialCells(xlCellTypeLastCell).Select '最終行検出 endRcell2 = ActiveCell.Row cnt10 = 2 Do ↓実行時エラー1004が出る行 b = Application.WorksheetFunction.VLookup(Sheets("Sheet2").Range("A" & cnt10).Value, Sheets("M_得意先").Range(Cells(1, 1), Cells(endRcell, 2)), 2, False) ↑実行時エラー1004が出る行 Sheets("sheet2").Range("E" & cnt10).Value = b cnt10 = cnt10 + 1 Loop Until cnt10 = endRcell2

  • 印刷後のVBAの実行 (2)

    Private Sub Workbook_BeforePrint(Cancel As Boolean)   If ActiveSheet.Name = "Sheet1" Then     If Range("D6").Value = "" Then       Cancel = True       MsgBox ("名前を入力してください")       Range("D6").Select       Exit Sub     End If   Else     If ActiveSheet.Name = "Sheet2" Then       If Range("C11").Value = "" Then         Cancel = True         MsgBox ("受付時間を入力してください")         Range("C11").Select         Exit Sub       End If     Else              Exit Sub     End If   End If   ActiveSheet.Range("A70:Y70").Copy   If Worksheets("Sheet3").Range("A1").Value = "" Then     Worksheets("Sheet3").Range("A1").PasteSpecial Paste:=xlPasteValues   Else     Worksheets("Sheet3").Range("A65536").End(xlUp).Offset(1, 0).PasteSpecial _       Paste:=xlPasteValues   End If   Application.CutCopyMode = False   ActiveSheet.Range("A1").Select End Sub 先日、上記のコードを回答者の方から教えてもらい、とても助かっていますが sheet1のD5に「不要」という文字が入っていた場合、 sheet3への貼り付け(23~30行目の作業)をキャンセルして、最後にsheet1のA1を選択するようにはどの様にしたらいいでしょうか?

  • excel vba のエラー原因が分かりません

    データ入力シート「Hit Data] データ表示シート「User Sheet」 とあります。 データ表示シート「User Sheet」に「次へ」「前へ」「最初へ」「最後へ」とボタンをつくり、データ入力シート「Hit Data]から、都度データを呼び出せるようにするプログラムをとあるサイトを参考にして作成しましたが、エラーが出てしまいどうしてもうまくいきません。 どこに問題があるのか見ていただけないでしょうか? '以下標準モジュールのプログラムです Public trg As Range Sub Saisyo()  Set trg = Worksheets("Hit Data").Range("A3")  Call Tenki End Sub Sub Saigo()  Set trg = Worksheets("Hit Data").Range("A60000").End(xlUp)  Call Tenki End Sub Sub Mae()  If trg.Row >= 4 Then   Set trg = trg.Offset(-1, 0)   Call Tenki  Else   MsgBox "これより前のレコードはありません"  End If End Sub Sub Tsugi()  If trg.Row < Worksheets("Hit Data").Range("A60000").End(xlUp).Row Then   Set trg = trg.Offset(1, 0)   Call Tenki  Else   MsgBox "これより後ろのレコードはありません"  End If End Sub Sub Tenki()  Worksheets("User Sheet").Range("D9").Value = trg.Offset(0, 0)  Worksheets("User Sheet").Range("D10").Value = trg.Offset(0, 1)  Worksheets("User Sheet").Range("D11").Value = trg.Offset(0, 2)  Worksheets("User Sheet").Range("D12").Value = trg.Offset(0, 3) End Sub '以下 User Sheet"のシートモジュールに記載されたプログラムです。 Private Sub Worksheet_Activate() Call Saisyo End Sub '表示されるエラーの内容 'saisyo・・・アプリケーション定義またはオブジェクト定義のエラーです。 'saigo・・・同上 'mae・・・オブジェクト変数またはWithブロック変数が設定されていません 'tugi・・・同上

専門家に質問してみよう