[[20141013225035]] 『マクロでグラフを書こうとすると、「動作を停止し』(グラフカケナイネン) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『マクロでグラフを書こうとすると、「動作を停止しました」のメッセージがでる。』(グラフカケナイネン)

はじめまして。質問させていただきます。

 マクロ機能を利用してグラフを作成しようとしています。
シート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


Mookさんありがとうございます。

現在2010の環境しか使えない状況ですが、教えて頂いたマクロを試してみたところ
「'Add'メソッドは失敗しました」という実行時エラーを吐くようです。
2013の環境でテストできたらまた報告いたします。

※上で載せたマクロはワークシートのモジュールに記述したものであり、引数のカッコはミスです。

(グラフカケナイネン) 2014/10/14(火) 17:40


Mookさん 先のコメントの続きです。

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

************************************************************************************************************************************

(グラフカケナイネン) 2014/10/16(木) 21:08

確認のために少し修正しましたが、250系列でも問題ありませんが?

 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


>頂いたマクロも「With .ChartObjects.Add(0, 0, 500, 500).Chart」で停止してしまいました。

つまり、あいかわらず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


もう一度と思って試してみたら、確かにこちらでも再現しました。
データと別のシートにグラフを作成することならOKみたいです。

(マナ) 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.