[[20130107144416]] 『選択した物だけグラフ表示』(のBI太) ページの最後に飛ぶ

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

 

『選択した物だけグラフ表示』(のBI太)

 A列に品物コードが約800種類、Z〜CR列まで月ごとの出庫数が5年分の表があります。
 各品物の月ごとの出庫傾向を棒グラフで見ようと思い、各品物コードごとにグラフSheetを作成すると
 BookがSheetだらけになってすごく大きなファイルになりそうです。
 又1枚のSheetにしようとすると「使用可能な系列の数は、1グラフあたり最大255個です。」と表示されてできません。
 またもし表示できたとしてもあまりにも細かいグラフになってしまって、どれが何でいつの棒なのか判別できなくなりそうです。
 品物コードの一つ選択するとその品物のみのグラフが表示される様にするにはどの様なマクロを作ればよいかお教え下さい。

 例。

	A	B	C	D
1		4月	5月	6月
2	A	100	300	400
3	B	200	100	300
4	C	100	200	100
5	D	200	100	100
6	E	100	100	400
7				
8	品物	4月	5月	6月
9	C	100	200	100
10				

 A9に品物、
 B9 =INDEX(B2:B6,MATCH($A9,$A$2:$A$6,0))  右へコピー。

 このデータを使ってグラフ化。

 (GobGob)

 GobGobさん、ありがとうございます。少ない容量で見やすいグラフができました。
 そこで希望ですがA列の見たい品物コードをクリックして選択すると”パッ”とグラフが変化する事ってできますでしょうか?
 さらに贅沢を言えば複数選択すれば一緒に表示されればもっとうれしいですが可能でしょうか?
 (のBI太)

 >クリックして選択すると”パッ”とグラフが変化

 VBAですねー。識者さん回答をお待ちを。。。。

 (GobGob)

 こんな感じの表にすれば、ピボットグラフが使えそうですね。(ROUGE)
 
	[A]	[B]	[C]
[1]	品目	月	出庫数
[2]	A	4月	100
[3]	A	5月	300
[4]	A	6月	400
[5]	B	4月	200
[6]	B	5月	100
[7]	B	6月	300
[8]	C	4月	100
[9]	C	5月	200
[10]	C	6月	100
[11]	D	4月	200
[12]	D	5月	100
[13]	D	6月	100
[14]	E	4月	100
[15]	E	5月	100
[16]	E	6月	400


 ご要望と違うかもしれませんが、
 GobGob さんの表をお借りして、A 列で表示したいセルを選択した状態で、
 下記を実行でどうでしょうか。

 一度グラフを作成して、グラフの名前を実際の名前にしてください。
 (名前はマクロの記録で確認できるかと思います。)

 Sub Sample()
    Const DATA_SIZE = 4  '// データの列数
    Range("A1").Resize(1, DATA_SIZE).Copy Destination:=Range("AA1").Resize(1, DATA_SIZE)

    Dim rr As Long
    rr = 1

    Dim r As Range
    For Each r In Selection
        rr = rr + 1
        Cells(r.Row, "A").Resize(1, DATA_SIZE).Copy Destination:=Cells(rr, "AA").Resize(1, DATA_SIZE)
    Next

    ActiveSheet.ChartObjects("グラフ 1").Activate '// 実際の名前に変更
    ActiveChart.SetSourceData Source:=Range("AA1").Resize(rr, DATA_SIZE)
 End Sub
 (Mook)

 (Mook)さんありがとうございます。
 (GobGob)さんの例題のリストだとうまくできましたが
 当方のはA列の品物コードが約800行分有るのでグラフそのものが
 「使用可能な系列の数は、1グラフあたり最大255個です。」と表示されてできません 。(横軸になる月数は5年分約70列分有ります)
 VBAでも「”パッ”とグラフが変化する」っていうのは不可能なのでしょうか?
 (のBI太)

 グラフでデータ範囲を指定する処理を、マクロで行っているだけなので
 マクロを使ってもグラフが出来る機能が拡張されるわけではないので
 手動で出来ない機能は、マクロを使っても出来るようになりません。

 グラフ内で255系列が最大なのは、 EXCEL の制限ですからグラフを複数に分ける
 などの工夫をする必要があるでしょう。

 マクロを使えばいろいろな「やり方」を便利に出来るようにはなりますが、
 「どうやる(やりたい)」かはユーザが決めないとなりません。
 (Mook)

 表とグラフが同じシートだとして
 シートのコードペインに

  Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim myChart As Chart
    Dim r As Range
    Dim cnt As Long
    Dim i As Long

    Set myChart = ChartObjects("グラフ 1").Chart
    For Each r In Target
        If r.Column = 1 Then
            With myChart.SeriesCollection.Add(r.EntireRow.Columns("Z:CR"), xlRows, False, False)
                .Name = r.Value
            End With
            cnt = cnt + 1
            For i = 1 To myChart.SeriesCollection.Count - cnt
                myChart.SeriesCollection.Item(1).Delete
            Next i
        End If
    Next r
  End Sub

 (暇奴)

 (暇奴)さんのVBAを実行すると次の箇所で止まってしまいます。

 表示「実行時エラー 424 オブジェクトが必要です」
 .Name = r.Value

 (のBI太)

Excel2010だと問題ありませんでしたが、2002で試したら同じエラーがでました(マナ)

 いつもNewSeriesメソッドを使っていたので、
 勉強のつもりでと思いましたが、なかなかうまくいきません。
 結局どういう書き方するものなのかわかりませんでしたが、
 とりあえず↓で動きました。

 Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim myChart As Chart
    Dim r As Range
    Dim cnt As Long
    Dim i As Long
    Set myChart = ChartObjects("グラフ 1").Chart
    For Each r In Target
        If r.Column = 1 Then
            Application.Wait Now + TimeValue("00:00:01")    '★何故だかこれがないとエラー?
            With myChart
                .SeriesCollection.Add r.EntireRow.Columns("Z:CR"), xlRows, False, False
                .SeriesCollection(.SeriesCollection.Count).Name = r.Value
            End With
            cnt = cnt + 1
            For i = 1 To myChart.SeriesCollection.Count - cnt
                myChart.SeriesCollection.Item(1).Delete
            Next i
        End If
    Next r
 End Sub 

 ただし、255系列の件は、MooKさんが言われるとおりなので、無理と思います。
 というより、そもそも255系列も同時に表示しても識別できないのでは??

 (暇奴)さん(?)の改良版VBA実行したらエラーは出ないんですが項目軸が月(1行目)ではなくA列(品名)になってしまいます。
 (ROUGE)さんの表用かと思いましたが同じでした。
 参照すべき命令がどこかで行と列とで間違っているようですが全く分かりません。
 よろしくお願いします。

 追伸
 255行系列以上不可の件で品名セルを選択するたびにその行のみグラフを作っては消し、消しては作りってできないでしょうか?
 どうもグラフ名の番号が増えていく(グラフ名が変化する)様なのでやっぱり無理でしょうね?
 (のBI太)

確認お願いします(マナ)

 >項目軸が月(1行目)ではなくA列(品名)になってしまいます。

 系列を選択したとき、数式バーにはどう表示されていますか? こんな感じのはずなのですが。
 =SERIES("A",Sheet1!$Z$1:$CR$1,Sheet1!$Z$2:$CR$2,1)

これと差し替えて試してみて下さい(マナ)

 Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim myChart As Chart
    Dim r As Range
    Dim cnt As Long
    Dim i As Long

    Set myChart = ChartObjects("グラフ 1").Chart
    For Each r In Target
        If r.Column = 1 Then
            With myChart.SeriesCollection.NewSeries
                 .Name = r.Value
                 .XValues = Range("Z1:CR1")
                 .Values = r.EntireRow.Range("Z1:CR1")
            End With
            cnt = cnt + 1
            For i = 1 To myChart.SeriesCollection.Count - cnt
                myChart.SeriesCollection.Item(1).Delete
            Next i
        End If
    Next r
 End Sub

 (マナ)さんでしたか、失礼いたしました。
 ちゃんと動きました。
 しかも1行だけでグラフ作成すれば255行以上の場所をクリックしてもきちんとグラフが”パッ”と変化します。
 あと一つだけ教えて下さい。
 グラフを別Sheet(Graph Sheet)に作成した場合はどの様にすればよいでしょうか?

 (のBI太)

一行だけ変更してください(マナ)

 Set myChart = ChartObjects("グラフ 1").Chart
 ↓
 Set myChart = Charts("Graph1")

 ※Graph1は実際のシート名に修正

 皆さんのおかげで考えていた通りの物ができました。
 本当にありがとうございました。

 最後にもし良ければ今後の為に少し教えて下さい

 最初にもある様に当初グラフを作成しようとした時は「使用可能な系列の数は、1グラフあたり最大255個です。」とエラー表示され
 作成できなかったグラフが、今回のVBAで作成できたのでしょうか?

 又、品物1行分だけで作成したグラフで、どの品物でもグラフ表示できるんでしょうか?

 簡単でよいので解説をよろしくお願いします。

 (のBI太)

質問内容がよくわからないのですが??(マナ)

 > 作成できなかったグラフが、今回のVBAで作成できたのでしょうか?

 行っていることは、こんな感じです。

 1)選択したセルがA列であった場合
 2)その行のデータを新しい系列として追加
 3)それまであった系列を削除
 4)セルを複数選択した場合は、同様に新しい系列として追加

 VBAでは、基本的には一連の操作を自動化しているだけです。
 なので255系列までというのは、VBAでも同じでできないと思います。

 > 255行以上の場所をクリックしてもきちんとグラフが”パッ”と変化します。

 もしかして、255の意味を取り違えていますか?
 同時に255個までという意味で、データ行はどこでも問題ありませんよ。

 > 又、品物1行分だけで作成したグラフで、どの品物でもグラフ表示できるんでしょうか?

 試してみればわかることだと思いますが。
 というか、出来たのではなかったのでしょうか。

 (マナ)さん説明ありがとうございました。

 (のBI太)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.