- ベストアンサー
VBA実行時エラー1004 rangeメソッド失敗 globalオブジェクトエラー
- VBA初心者の方がエクセルでグラフを作成する際に実行時エラー'1004'rangeメソッドは失敗しました。'_global'オブジェクトというエラーメッセージが表示され、マクロの実行ができない状況です。原因としては、Rangeメソッドを使用する際に変数の定義がまずい可能性があります。
- 具体的には、Rangeメソッドの引数に不適切な値が指定されている可能性があります。例えば、Range("A8:A1587,e8:e1587")のような形式で指定されている場合、このような指定方法ではエラーが発生することがあります。変数を使用せずに直接セル範囲を指定するなど、適切な値を指定するように修正する必要があります。
- このエラーの解決方法としては、範囲の指定方法を見直すことや、変数の定義を正しく行うことが重要です。また、デバッグを行いながらエラーの原因箇所を特定し、修正するようにしましょう。VBA初心者の方でしたら、VBAの基礎知識を学ぶことや、他の資料やサイトを参考にすることも有効です。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
>ご指摘を受けたところを書き換えて回してみた結果、書き換えた箇所 >でエラーがでます。(実行時エラー’1004’’cells’メソッドは失敗 >しました。’global’オブジェクト) >しかし、何が原因でエラーになるか自分では分かりません。 ≪例1≫ Range(Cells(8, 1), Cells(1587, 2)).Select 上記の例では、RangeとかCellsの上位オブジェクトであるシート名が省略されています。 ActiveSheet.Range(ActiveSheet.Cells(8, 1), ActiveSheet.Cells(1587, 2)).Select というわけです。 マクロ実行時に、Activeな(Excelで表示されている)シートが上位オブジェクトとして、自動的に認識されます。 ≪例2≫ Sheets("Sheet2").Range(Cells(8, 1), Cells(1587, 2)).Select 上記の例では、Rangeのみシート名が記述されています。 Sheets("Sheet2").Range(ActiveSheet.Cells(8, 1), ActiveSheet.Cells(1587, 2)).Select というわけです。 Activeなシートが、Sheet2の場合はエラーになりません。 しかし、ActiveなシートがSheet2以外の場合、エラーが発生します。 直前に、 Sheets("Sheet1").Select などとしていれば、ActiveシートがSheet1になっていますから、エラーになります。 Sheets("Sheet2").Range(Sheets("Sheet2").Cells(8, 1), Sheets("Sheet2").Cells(1587, 2)).Select と書いておけば安心です。 Withステートメントを使えばスッキリ纏めることができます。 With Sheets("Sheet2") .Range(.Cells(8, 1), .Cells(1587, 2)).Select End With # Sheets("Sheet2")の上位オブジェクトが省略されていることにも気がついてください。 >そこで自分で基礎を勉強したいのですが推薦できる参考書などがござ >いましたら、教えていただけませんか? 私自身は、入門書程度の雑誌を1冊買っただけです。どれが良いとかはよく分かりません。 「マクロの記録」を活用して、参考コードを取得し、汎用性のあるコードに編集しています。 新しい単語があれば、文字カーソルを単語の上に置き、F1キーを押してVBAのヘルプを必ず見るようにしています。 躓いた時は、Web検索して欲しい情報を得たり、あるいは、こうした掲示板で先輩方のお力をお借りしています。 Excel(エクセル)VBA入門:目次 http://oshiete1.goo.ne.jp/kotaeru_reply.php3?q=4651404 エクセル入門・初級編 http://www.kenzo30.com/excel_kiso.htm
その他の回答 (7)
- xls88
- ベストアンサー率56% (669/1189)
>実行してみた結果、*の行でエラー’1004’RANGEメソッドは失敗しました:’ >global’オブジェクトというエラーがでました。 私が提案したコードですが、まずいところがあります。 回答番号:No.7の≪例2≫で説明した問題が起きているようです。 ActiveChart.SeriesCollection(1).XValues = Range("A8:A1587") の行を実行するときに、Activeになっているのは Chart.Add した ActiveChart つまり、グラフシートではないでしょうか? グラフシートには Range("A8:A1587") はありませんからエラーになるのは当然ですね。 ということで、 Range("A8:A1587") を、上位オブジェクトのWorkSheetで修飾すればOKになるはずです。 ヒントで止めておきます。 どこに、どのように記述すればよいか考えてみてください。
- xls88
- ベストアンサー率56% (669/1189)
回答番号:No.5の回答内容で記述ミスがありました。 ActiveChart.SeriesCollection(1).XValues = Range("A1:A1587") は ActiveChart.SeriesCollection(1).XValues = Range("A8:A1587") です。
補足
xls88さん 何度も申し訳ありません。 NO.6のように書き換えました。 しかし、実行してみた結果、*の行でエラー’1004’RANGEメソッドは失敗しました:’global’オブジェクトというエラーがでました。 確かにrangeの範囲、指定方法もこれで間違いはないかと思うのですが・・・・ しかし、回りません。 丸投げで申し訳ありません。 現状のプログラムを以下に示します。 Sub 実験繰り返し() Dim s As Integer For s = 0 To 3 Charts.Add ActiveChart.ChartType = xlXYScatter With Sheets("20081216_210647") ActiveChart.SetSourceData _ Source:=.Range(.Cells(8, s + 2), .Cells(1587, s + 2)), _ PlotBy:=xlColumns End With * ActiveChart.SeriesCollection(1).XValues = Range("A8:A1587") ActiveChart.SeriesCollection(1).Name = s ActiveChart.Location Where:=xlLocationAsNewSheet, Name:=s With ActiveChart .HasTitle = True .ChartTitle.Characters.Text = s .Axes(xlCategory, xlPrimary).HasTitle = True .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "t" .Axes(xlValue, xlPrimary).HasTitle = True .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "生" End With Next End Sub
- xls88
- ベストアンサー率56% (669/1189)
>ひとつのグラフにひとつの列データというグラフを作りたい 現状では Source:=.Range(.Cells(8, 1), .Cells(1587, s + 2)) というように、矩形範囲を設定しています。 ですから、当然の結果、複数系列のグラフが描画されます。 1グラフ1系列、項目軸データはA列固定、ということなら以下のようになると思います。 With Sheets("20081216_210647") ActiveChart.SetSourceData _ Source:=.Range(.Cells(8, s + 2), .Cells(1587, s + 2)), _ PlotBy:=xlColumns End With ActiveChart.SeriesCollection(1).XValues = Range("A1:A1587")
お礼
xls88さん 遅くなりました。 おかげ様で回りました。ありがとうございます。 感動してます!!これからもよろしくお願いします。 それでは失礼致します。
- xls88
- ベストアンサー率56% (669/1189)
>回答番号:No.3 この回答へのお礼 Withが脱落していました。 With Sheets("20081216_210647") ActiveChart.SetSourceData _ Source:=.Range(.Cells(8, 1), .Cells(1580, s + 2)), _ PlotBy:=xlColumns End With ここは、直していただけたのですね? エラーの出るコードを、一部だけでなく、全文拝見できないでしょうか。
補足
xls88さん ありがとうございます。一応プログラムは回るようになりました。 しかし、出来上がったグラフに関してなのですが、エクセルのA列を横軸、続くB以下のアルファベットを縦軸としてグラフ0のB列、グラフ1にB,C列、グラフ2に、B,C,D列、・・・・・・というようなグラフが出来上がりました。・・・(ア) 自分の最終目標としてるのは、横軸をA列、続くB以降のアルファベットを縦軸にして、グラフ0にB列、グラフ1にC列、グラフ2にD列、・・・・というようなひとつのグラフにひとつの列データというグラフを作りたいと思っています。 (ア)のようになる原因は(イ))(以下プログラム中)だと思い、(イを以下の With Sheets("20081216_210647") ActiveChart.SetSourceData _ Source:=.Range( _ Range(Cells(8, 1), Cells(1580, 1)), _ Range(Cells(8, s + 2), Cells(1580, s + 2))), _ PlotBy:=xlColumns End With と書き直したのですが上手くいって無いのが現状となります。 以下は(ア)のプログラムとなります。!:(イ) Sub 成功繰り返し() Dim s As Integer For s = 0 To 3 Charts.Add ActiveChart.ChartType = xlXYScatter !With Sheets("20081216_210647") !ActiveChart.SetSourceData _ ! Source:=.Range(.Cells(8, 1), .Cells(1587, s + 2)), _ ! PlotBy:=xlColumns !End With ActiveChart.SeriesCollection(1).Name = s ActiveChart.Location Where:=xlLocationAsNewSheet, Name:=s With ActiveChart .HasTitle = True .ChartTitle.Characters.Text = s .Axes(xlCategory, xlPrimary).HasTitle = True .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "t" .Axes(xlValue, xlPrimary).HasTitle = True .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "生" End With Next End Sub
- xls88
- ベストアンサー率56% (669/1189)
進んでいますか? SetSourceDataで、PlotBy:=xlColumnsとなっていますから 現在指定しているセル範囲の1列目は項目になっていると思います。 Sourceで、現在指定しているセル範囲の、2列目からを指定するようにすれば良いと思います。 それから、セル範囲の指定ですが、左上隅セルと右下隅セルを指定すればよいので ActiveChart.SetSourceData _ Source:=Sheets("20081216_210647").Range( _ Range(Cells(8, 1), Cells(1580, 1)), _ Range(Cells(8, s + 2), Cells(1580, s + 2))), _ PlotBy:=xlColumns は、 ActiveChart.SetSourceData _ Source:=Range(Cells(8, 1), Cells(1580, s + 2)), _ PlotBy:=xlColumns と出来ると思います。 シートを明示するなら、Rangeだけだなく、Cellsも修飾しなければ意味がないと思います。 Sheets("20081216_210647") ActiveChart.SetSourceData _ Source:=.Range(.Cells(8, 1), .Cells(1580, s + 2)), _ PlotBy:=xlColumns End With
お礼
xls88さん お気にかけて頂き、ありがとうございます。 現状としては、上手く進んでいません。 ご指摘を受けたところを書き換えて回してみた結果、書き換えた箇所でエラーがでます。(実行時エラー’1004’’cells’メソッドは失敗しました。’global’オブジェクト) しかし、何が原因でエラーになるか自分では分かりません。 原因はやはり、自分の基礎的な部分が無いからだと思います。 そこで自分で基礎を勉強したいのですが推薦できる参考書などがございましたら、教えていただけませんか?
- xls88
- ベストアンサー率56% (669/1189)
> また新たにグラフのx軸に指定したい列の数値まで、 > グラフにプロットされるという違う問題がでてきました ActiveChart.SetSourceData _ Source:=Sheets("20081216_210647").Range( _ Range(Cells(8, 1), Cells(1580, 1)), _ Range(Cells(8, s + 2), Cells(1580, s + 2))), _ PlotBy:=xlColumns 上記で、SetSourceDataに指定するセル範囲を書きなおしてください。 プロットするデータがあるセル範囲に変えればよいです。 そして、項目軸ラベルに使用する範囲指定を追加します。 (例にあげたセル番地は出たらめです。実態に合わせてください。) ActiveChart.SeriesCollection(1).XValues = Range("A1:H1")
補足
ありがとうございます! 早速試してみます。
- xls88
- ベストアンサー率56% (669/1189)
> Range("cells(8,1):cells(1580,1),cells(8,s+2):cells(1580,s+2)").Select 上記は Range("A8:B1580").Select というようにしたいのでしょうか? Rangeの引数がダブルクオーテーションで囲まれています。 定数ということで、折角の変数Sが、単なる文字列化しています。 sの値が反映されません。 やるなら Range(Range(Cells(8, 1), Cells(1580, 1)), Range(Cells(8, s + 2), Cells(1580, s + 2))).Select というようにします。
お礼
ありがとうございます。「実行時エラー1004 rangeメソッドは失敗しました。globalオブジェクトのエラー」の表示はなくなりました。 しかし、また新たにグラフのx軸に指定したい列の数値まで、グラフにプロットされるという違う問題がでてきました。この列をx軸に指定する事はできますか? 違う質問になり、まことに申し訳ないのですが、もしよろしかったら、教えていただけませんか?
お礼
xls88さん 遅くなりました。 おかげ様で回りました。ありがとうございます。 感動してます!!これからもよろしくお願いします。 それでは失礼致します。