[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『マクロでグラフを書こうとすると、「動作を停止しました」のメッセージがでる。』(グラフカケナイネン)
はじめまして。質問させていただきます。
マクロ機能を利用してグラフを作成しようとしています。 シート1枚のみ、内数値データが700×350のセルを埋めている状況です。
同シートへ ChartObjects.addメソッド を用いた途端、 「Microsoft Excelは動作を停止しました」というメッセージの後に Excelが再起動してしまいます。
この現象を回避し、グラフを作成できる方法はありませんでしょうか。 お力添えのほどよろしくお願いします。
< 使用 Excel:Excel2013、使用 OS:Windows8 >
グラフは詳しくありませんが、700×350ということは、データ系列は255を超えている?http://office.microsoft.com/ja-jp/excel-help/HA103980614.aspx#BMcharting現在参照不可
確認してみてください。 (稲葉) 2014/10/14(火) 09:19
シート内のデータを元にして複数のグラフを作る予定です。
おおよそデータ系列は100~200となるはずです。(系列は列で指定。各系列のデータ数が700)
また、今回はグラフの範囲指定もまだ行っていない状況です。
以下にマクロを示しますが、内容はたった一行だけです。
何かわかりましたら是非よろしくお願いします。
Sub test()
ChartObjects.Add(0, 0, 500, 500) End Sub (グラフカケナイネン) 2014/10/14(火) 12:53
実行以前に構文エラーになりませんか?
Sub test() ActiveSheet.ChartObjects.Add 0, 0, 500, 500 End Sub
としても同じ状況でしょうか。
(Mook) 2014/10/14(火) 13:02
現在2010の環境しか使えない状況ですが、教えて頂いたマクロを試してみたところ
「'Add'メソッドは失敗しました」という実行時エラーを吐くようです。
2013の環境でテストできたらまた報告いたします。
※上で載せたマクロはワークシートのモジュールに記述したものであり、引数のカッコはミスです。
(グラフカケナイネン) 2014/10/14(火) 17:40
2013を用いてマクロを試しましたところ、
前回同様に、Excelが再起動する結果となりました。
手動でグラフを作成する分には問題なく、
また、データ系列もしくはデータ数を半分にした場合にはマクロも正常に働きます。
体感では分かりませんが、
シート上のデータ数が多すぎるために、処理に時間がかかることが
マクロが停まってしまう原因なのでしょうか。
(グラフカケナイネン) 2014/10/16(木) 08:38
>また、データ系列もしくはデータ数を半分にした場合にはマクロも正常に働きます。
一行でもエラーがでる問題は解決したのですね。
いずれにせよ今のコードを示したほうが早いのでは?
どんなグラフかわかりませんが、 こちらではデータ数が多くてもちゃんと動いています。
Sub test() Dim r As Range Dim rx As Range, ry As Range Dim i As Long
With Sheets("Sheet1") Set r = .Range("A2").Resize(700, 350)
Set rx = r.Columns(1) Set ry = rx.Offset(, 101).Resize(, 250)
With .ChartObjects.Add(0, 0, 500, 500).Chart .ChartType = xlXYScatter .HasTitle = True .ChartTitle.Characters.Text = "テスト" For i = 1 To ry.Columns.Count With .SeriesCollection.NewSeries .XValues = rx .Values = ry.Columns(i) .Name = ry.Cells(0, i) End With Next End With End With End Sub
(マナ) 2014/10/16(木) 19:08
700×350の数値データがあるシートで試しましたが、
頂いたマクロも「With .ChartObjects.Add(0, 0, 500, 500).Chart」で停止してしまいました。
グラフ化したいデータは、x軸のデータ列とy軸データ列が組となったものが175組あります。 実際にマクロを運用する場合には、この組数と各データ数は増減致します。
第1行目に各データの名前(全データ組で異なる)、 第2行目に各データの種類(シート内でx用とy用の2種のみ)、 第3行目以降に数値データが並びます。 以下に図を示します。
name_1 name_1 name_2 name_2 name_175 name_175 data_x data_y data_x data_y data_x data_y x1(001) y1(001) x2(001) y2(001) … x175(001) y175(001) x1(002) y1(001) x2(002) y2(002) … x175(002) y175(002) : : : : : : : x1(701) y1(701) x2(701) y2(701) … x175(701) y175(701)
問題の箇所はメインのモジュールから呼び出して使っております。 以下に簡略化したコードを示しますが、 処理が開始されてすぐに問題の箇所にぶつかるため、 先に示した1行コードとほぼ同じようなものです。
引数の説明 var_setting():グラフの軸についての設定 num_start:グラフデータの開始組 num_end:グラフデータの最終組 worksheet_now:グラフを書き込むシート title:グラフのタイトル名(下のコード内では使用せず)
Function MAKE_CHARTOBJECT(var_setting() As Variant, num_start As Integer, num_end As Integer, worksheet_now As Worksheet, title As String) As ChartObject '変数========================== Dim i As Integer 'カウンタ Dim ran_item As Range 'y軸の範囲 '==============================
'グラフの作成===================================================================================================================================================== Select Case CStr(var_setting(con_glaph + 2)) 'グラフの種類(散布図またはヒストグラム)
Case "xlXYScatterLinesNoMarkers" Set MAKE_CHARTOBJECT = worksheet_now.ChartObjects.Add(0, 0, 500, 500) 'グラフ貼り付け位置指定
'y軸の範囲を取得----------------------------------------------------- For i = num_start To num_end If ran_item Is Nothing Then Set ran_item = worksheet_now.Columns(i * 2) Else Set ran_item = Union(ran_item, worksheet_now.Columns(i * 2)) End If DoEvents Next i
'グラフの設定--------------------------------------------------------------------------------------------------------------------------------------------- With MAKE_CHARTOBJECT.Chart .SetSourceData Source:=ran_item, PlotBy:=xlColumns .ChartType = xlXYScatterLinesNoMarkers '散布図平滑線ありマーカーなし End With For i = 1 To .SeriesCollection.Count 'y軸それぞれにx軸を設定 With worksheet_now .SeriesCollection(i).XValues = _ Range(.Cells(3, (num_start + (i - 1)) * 2 - 1), .Cells(.Cells(3, (num_start + (i - 1)) * 2 - 1).End(xlDown).Row, (num_start + (i - 1)) * 2 - 1)) End With Next
'y軸--------- 'y軸の設定 'x軸--------- 'x軸の設定
Case "xlColumnClustered" 'ヒストグラムの作成処理 End Select '====================================================================================================================================================================
'グラフ設定========================= 'タイトル等共通部分の設定処理 '=================================== End Function
Function MAKE_CHARTOBJECT(num_start As Integer, num_end As Integer, worksheet_now As Worksheet) As ChartObject '変数========================== Dim i As Integer 'カウンタ Dim ran_item As Range 'y軸の範囲 '============================== 'グラフの作成=====================================================================================================================================================
Set MAKE_CHARTOBJECT = worksheet_now.ChartObjects.Add(0, 0, 500, 500) 'グラフ貼り付け位置指定 'y軸の範囲を取得----------------------------------------------------- For i = num_start To num_end If ran_item Is Nothing Then Set ran_item = worksheet_now.Columns(i * 2) Else Set ran_item = Union(ran_item, worksheet_now.Columns(i * 2)) End If DoEvents Next i 'グラフの設定--------------------------------------------------------------------------------------------------------------------------------------------- With MAKE_CHARTOBJECT.Chart .SetSourceData Source:=ran_item, PlotBy:=xlColumns .ChartType = xlXYScatterLinesNoMarkers '散布図平滑線ありマーカーなし End With
End Function
(マナ) 2014/10/16(木) 22:05
つまり、あいかわらずMookさん提示の1行コードでも停止するということですよね?
新規ブックでどうなりますか。データなしのまっさらシートで実行しても問題ないはずですが。
(マナ) 2014/10/16(木) 22:10
修正くださったコードを試してみました。
新規ブック(データなし)で実行した場合は問題なくオブジェクトが生成されます。
700×350の数値データが存在している場合はやはり停止してしまいました。
Function MAKE_CHARTOBJECT(num_start As Integer, num_end As Integer, worksheet_now As Worksheet) As ChartObject '変数========================== Dim i As Integer 'カウンタ Dim ran_item As Range 'y軸の範囲 '============================== 'グラフの作成===================================================================================================================================================== Set MAKE_CHARTOBJECT = worksheet_now.ChartObjects.Add(0, 0, 500, 500) 'グラフ貼り付け位置指定 'y軸の範囲を取得----------------------------------------------------- For i = num_start To num_end If ran_item Is Nothing Then Set ran_item = worksheet_now.Columns(i * 2) Else Set ran_item = Union(ran_item, worksheet_now.Columns(i * 2)) End If DoEvents Next i 'グラフの設定--------------------------------------------------------------------------------------------------------------------------------------------- With MAKE_CHARTOBJECT.Chart .SetSourceData Source:=ran_item, PlotBy:=xlColumns .ChartType = xlXYScatterLinesNoMarkers '散布図平滑線ありマーカーなし End With End Function
Sub test() Dim co As ChartObject Set co = MAKE_CHARTOBJECT(1, 250, ThisWorkbook.Sheets(1)) End Sub
(グラフカケナイネン) 2014/10/16(木) 23:19
(マナ) 2014/10/16(木) 23:51
(マナ) 2014/10/17(金) 00:04
そういえば以前、似たようなことで半平太さんに教わったような気がします。
(記憶違い?)
(マナ) 2014/10/17(金) 00:43
シートの一番下を選択する方法で試してみましたところ、
グラフを作成することが出来ました。
大変助かりました。感謝いたします。
コメントを下さった稲葉さん、Mookさん、マナさん
お付き合いいただきありがとうございました。
(グラフカケナイネン) 2014/10/17(金) 01:09
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.