マイクロソフト エクセル2003で、ある一定人数を超えるごとに

料金のランクが上がっていく階段状グラフ(ステップグラフ)を作ろうと
しています。

データは以下のようなかたちで、aとbの料金プランごとに
ステップグラフを作って比較したいと思ってます。
過去の質問を調べると表の挿入⇒散布図でできるとあったのですが、
そのやり方でやった場合、10人から25人の間はa商品であれば
10円でグラフを横線にしたいのですが、散布図にすると右斜め上の
直線になってしまいます。
人数の値を連続で記載してaとbの値を入力せずに、ステップグラフが
できる方法はないでしょうか?


人数 0.5 2.5 5 10 25 50(人)
a 5 5 5 10 20 40(円)
b 3 4 5 8 10 20(円

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2012/09/02 10:42:15
  • 終了:2012/09/02 22:48:33

ベストアンサー

id:Silvanus No.1

Silvanus回答回数174ベストアンサー獲得回数672012/09/02 12:50:50

マクロを使っても良いのであれば、こんな感じでいかがでしょうか。
エラー処理も何も施していない、芸の無い代物ですが…。

Option Explicit
Option Base 0

Sub AddChargeStepGraph_dankan()

Dim rngSrc As Range
Dim intCnS As Integer
Dim intCnD As Integer
Dim intNoS As Integer
Dim intNoD As Integer
Dim arrDtX() As Variant
Dim arrDtY() As Variant

Set rngSrc = Selection

intNoS = rngSrc.Rows.Count - 1
intNoD = rngSrc.Columns.Count - 1

ReDim arrDtX(intNoD * 2) As Variant
ReDim arrDtY(intNoD * 2) As Variant

ActiveSheet.Shapes.AddChart.Select
    With ActiveChart
        .ChartType = xlXYScatterLinesNoMarkers
        .SetSourceData Source:=rngSrc
        .SetElement (msoElementChartTitleAboveChart)
        .SetElement (msoElementPrimaryCategoryAxisTitleAdjacentToAxis)
        .SetElement (msoElementPrimaryValueAxisTitleRotated)
        .ChartTitle.Text = WorksheetFunction.Index(rngSrc, 1, 1)
        .Axes(xlCategory).AxisTitle.Text = "人数"
        .Axes(xlValue, xlPrimary).AxisTitle.Text = "料金"
            For intCnS = 1 To intNoS
                With .SeriesCollection(intCnS)
                    arrDtX(0) = 0
                    arrDtY(0) = 0
                        For intCnD = 1 To intNoD
                            arrDtX(intCnD * 2 - 1) = _
                              WorksheetFunction.Index( _
                                rngSrc, 1, 1 + intCnD)
                            arrDtY(intCnD * 2 - 1) = _
                              arrDtY(intCnD * 2 - 2)
                            arrDtX(intCnD * 2) = _
                              arrDtX(intCnD * 2 - 1)
                            arrDtY(intCnD * 2) = _
                              WorksheetFunction.Index( _
                                rngSrc, 1 + intCnS, 1 + intCnD)
                        Next
                    .XValues = arrDtX
                    .Values = arrDtY
                End With
            Next
    End With
rngSrc.Select

End Sub

【使い方】
1. ご質問文の中に書かれていた様な形式の表を用意する。
 ・一行目が人数、二行目以降は料金プラン
 ・二行目以降の最左列は料金プラン名
 ・一行目の最左列はグラフ名になる様にしました
2. 下図の様に表を選択する。

3. 上記のマクロ「AddChargeStepGraph_dankan」を実行する。

この方式では、作成された「グラフ」と「料金表(セルの数値)」の
リンクは切れていますので、料金表の数値を変更したり
表そのものを削除する等しても、グラフには変化はありません。
当方はExcel2010上でマクロを作成し、Excel98-2003互換形式(.xls)で
保存する際に注意・警告メッセージが出ないことを確認しましたので
恐らくExcel2003上でも動くと思うのですが
もし期待通りに動作しない場合はその旨お知らせ下さい。

他9件のコメントを見る
id:dankan

ありがとうございます。
ご指示頂いたとおりに書き換えたところ、無事にグラフが描画できました。何度も何度も助けて頂き本当にありがとうございました!

2012/10/29 20:15:35
id:Silvanus

何で一旦動いていたものが動かなくなったのかが気になりますが、
とにかくお困りだったことが解決されて良かったです!
ではでは。

2012/10/29 20:23:43
  • id:taknt
    エクセルのグラフは数値を元に作成するものです。

    数値を入れないで作成することなんてできません。

    セルに数式を入れて 数値を出してから グラフにするしかないです。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません