[[20170114013202]] 『マクロでのグラフ作成』(ひーぽん) ページの最後に飛ぶ

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

 

『マクロでのグラフ作成』(ひーぽん)

下記のようなリストがあります。

	出図	イベント	 出荷
品番A	2月1日	7月1日	 12月1日
品番B	5月1日	7月1日	 9月1日
品番C	4月1日	10月1日	 12月1日
品番D	3月1日	9月1日	 12月1日
品番E	5月1日	6月1日	 11月1日

また、下記のようなフェーズの設定とします。
フェーズ1:〜出図
フェーズ2:出図〜イベント
フェーズ3:イベント〜出荷

各フェーズ毎に各月の品番点数を縦棒グラフで推移を取りたいです。
マクロにて、フェーズ1のグラフ作成、フェーズ2のグラフ作成、
フェーズ3のグラフ作成・・・というイメージです。

どなたか知見のある方、ご教授をお願い致します。

< 使用 Excel:Excel2013、使用 OS:Windows7 >


 マクロではなく、手作業で、各グラフをつくることはもちろん、できるんですよね?

 であれば、それぞれの操作をマクロ記録してみましょう。
 場合によっては、そのまま使えるコードが生成されるかもしれません。
 通常はできあがったコードの中の 固定領域部分を変動化させ、無駄に生成される Select や Selection といったものを
 お化粧直しします。

(β) 2017/01/14(土) 07:27


β様

アドバイスありがとうございます。グラフ作成を手作業で行う事はできます。
少し補足をさせて頂きます。

上記の例で行きますと、例えば上記のリストからフェーズ1のグラフを作成しようとした場合
下記のような表に置き換えそれを縦棒グラフに置き換える形になるかと思います。
    1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
品番A  1
品番B  1  1  1  1
品番C  1  1  1
品番D  1  1
品番E  1  1  1  1

表に置き換える、という作業が完全に手作業になりますし、記憶できる作業でも無いように感じます。
表からグラフへは問題無いかと思いますが・・・。

小職の知識では上記のような考え方になるのですがいかがでしょうか?
お手数おかけ致します。

(ひーぽん) 2017/01/14(土) 11:50


 私自身はグラフは苦手なので、具体的なお手伝いは、他の回答者さんにおまかせするとして。

 >>例えば上記のリストからフェーズ1のグラフを作成しようとした場合 
 >>下記のような表に置き換えそれを縦棒グラフに置き換える形になるかと思います。 

 そう思っているのは ひーぽん さんだけで、回答側としては 最初の説明で、こんな形のレイアウトということは
 思いつかないのでは?

 何がフェーズ2 で 何がフェーズ3 なのか、それらについても 具体的に説明されてはいかがですか?

 >>表に置き換える、という作業が完全に手作業になりますし、記憶できる作業でも無いように感じます

 ということは、グラフを作成するというより、元表を 別レイアウトに仕立て上げる ということがテーマですね?
 そういうテーマにして質問すれば、マクロ、数式、ビボット等のエクセル操作 様々な方法が提示されると思いますよ。

 というか、レイアウト変換、ひーぽんさんだったら、どのようにしますか?
 もしかしたら、(じょずな手順を使えば)マクロ記録できるかもしれませんよ。

 別レイアウトができれば、あとは、さっさっさ と処理できるわけですね。

 であれば、レイアウト変換をテーマにして、このレイアウトをこのように変えたいという質問にすべきですね。

(β) 2017/01/14(土) 11:58


β様

どうもありがとうございました。
他の方からのアドバイスを待ちつつ、一度マクロ記録での実現を試みてみます。
(ひーぽん) 2017/01/14(土) 13:03


 グラフは苦手ですが、既存レイアウトを別レイアウトに展開するということなら お手伝いができるかと思います。

 ただ、やはり、もう少し、レイアウト要件、データ要件を明確にされたほうが、回答がつきやすいと思います。

 たとえばアップされた展開後のイメージ、上に 1月〜12月 とありますね。 これは常に 1月から12月なんだろうか?
 それとも、元データの出図日の月を、現れるだけすべて表示するのか、あるいは、月ではなく日付なのか?

 月だとして、その月の年はいつなんだろう?
 出図日に 2017/1/10 と 2016/1/10 があったら、どう反映させるのだろう?(あるいは、反映させないのだろう?)

 そういった、こもごものこと、ひーぽんさんにとっては、要件は自分の頭に中にあるので、そんなのとうぜんこうだ!
 ということでしょうけど、回答側では、いろんな解釈、いろんな想像をしますので。

 追加です。

 A列(?)の品番、同じものがあちこちに登場するのか、しないのかも、考える上での重要なポイントになります。

(β) 2017/01/14(土) 17:39


 たとえば、1月〜12月は、常に 1月〜12月。
 出図日の年は無視して、月だけを参照。
 品番は、複数回出現することもありうる。出現ごとに該当の品番、月のところに 1 を加算。
 同じシートのJ列〜V列に展開する。

 こういうことだとしたら

 Sub Sample()
    Dim v As Variant
    Dim i As Long
    Dim j As Long
    Dim dic As Object
    Dim id As String
    Dim m As Long
    Dim c As Range

    Set dic = CreateObject("Scripting.Dictionary")

    With Range("A1", Range("A" & Rows.Count).End(xlUp))
        ReDim v(1 To .Rows.Count, 1 To 13)
        For Each c In .Cells
            If c.Row = 1 Then
                i = 1
                v(1, 1) = c.Value
                For j = 1 To 12
                    v(1, j + 1) = j & "月"
                Next
            Else
                m = Month(c.Offset(, 1).Value)
                id = c.Value
                If Not dic.exists(id) Then
                    i = i + 1
                    dic(id) = i
                End If
                v(dic(id), m + 1) = v(dic(id), m + 1) + 1
                v(dic(id), 1) = c.Value
            End If
        Next
    End With

    Columns("J").Resize(, 13).ClearContents
    Range("J1").Resize(dic.Count, 13).Value = v

 End Sub

 あとは 出来上がった表から、好きなようにグラフを展開してください。
 この部分は、マクロ記録で大丈夫ですね?

(β) 2017/01/14(土) 18:06


>下記のような表に置き換えそれを縦棒グラフに置き換える形になるかと思います。

なぜそうなるのか、わかりません。
元の表は

>下記のようなリストがあります。

のことでしょうか?
それとも、提示されていない?

βさん、最後のResizeが1行分たりないです。

(マナ) 2017/01/14(土) 20:49


 >>βさん、最後のResizeが1行分たりないです。 

 タイトル行分、ディクショナリーにいれてませんでしたね!
 御意!! です。

 Range("J1").Resize(dic.Count+1, 13).Value = v

 ですね。

 ご指摘深謝。

 いずれにしてもマナさんも指摘しておられるように、『なるかと思います』と思っているのは、ひーぽんさんだけですので。

 このあと フェーズ2だのフェーズ3だのあるようですけど、それって、どんなものなのか
 回答側からはさっぱりわかりませんよ。

(β) 2017/01/14(土) 21:08


βさま、マナさま

暖かいアドバイスありがとうございます。また、言葉足らず知識不足で申し訳ありません。
まず、元の表は改めて下記に記載いたします。年の概念も含めてとなります。

	出図	イベント	 出荷
品番A	17/2/1  17/7/1	 17/12/1
品番B	17/5/1  17/7/1	 17/9/1
品番C	17/4/1	17/10/1	 17/12/1
品番D	17/3/1	17/9/1	 17/12/1
品番E	17/5/1	17/6/1	 17/11/1

やりたい事は
・横軸に当月(今なら17/1月)から先2年間(今なら18/12月)までの月単位で、
 縦軸に品番点数を取り縦棒グラフ化をしたいです。
・以下3種類のグラフ化をしたいです。(別々のグラフで全て縦棒グラフ)
 1 出図前の品番の品番点数
 2 出図後〜イベントまでの品番点数
 3 イベント後〜出荷までの品番点数
・品番が複数回出現する事もございます。その際同じ品番であれば合算して点数表現としたいです。

ここまで親身に相談にのっていただけて非常に感謝しております。

(ひーぽん) 2017/01/14(土) 23:53


ごめんなさい。まだ、全然わかっていません。
こうではないのですか?

生データ(全データ)

提示のリストに基づき、フェーズ1のデータ抜粋
グラフ用に加工した表を作成

フェーズ1用グラフ作成

で、最初の生データに相当するものが提示されていないのでは?

(マナ) 2017/01/15(日) 00:07


マナさん

すみません。マナさんのおっしゃる生データにあたるものが

	出図	イベント	 出荷
品番A	17/2/1  17/7/1	 17/12/1
品番B	17/5/1  17/7/1	 17/9/1
品番C	17/4/1	17/10/1	 17/12/1
品番D	17/3/1	17/9/1	 17/12/1
品番E	17/5/1	17/6/1	 17/11/1
になります。

ここから、フェーズ1のデータとしては例えば
17/1月軸であれば品番A〜Eが該当の為5件
17/2月軸であれば品番B〜Eが該当の為4件
というのを抜粋しグラフ用の表に作成・・・かと思われます。

ややこしくて申し訳ございません。

(ひーぽん) 2017/01/15(日) 00:28


 こんばんわ。

 (ひーぽん) 2017/01/14(土) 11:50 のレイアウトを拝見する限りでは、
 工程管理図みたいな期間を表す横棒グラフを作りたいのでしょうか?

 それぞれの始点は出図はグラフの左端で、イベントと出荷は、それぞれ出図とイベントの月から、
 終点は出図やイベント・出荷の日付の1月前まで
 と言う事で合ってますか?

 (ひーぽん) 2017/01/14(土) 11:50 のレイアウトなら別にマクロで無くても関数で簡単に出来ますね。
 マクロが良いんですか?
 それにグラフ化しなくても1のセルの背景色を変えればグラフっぽくなると思いますよ。

 レイアウトの表にする数式です。
 別シートで1行目が月(日付データで表示形式で m月 もしくは yyyy年m月 として下さい。)
 A列に品番、B2以下に結果を表示させます。

 B2 =IF(Sheet1!$B2>B$1,1,"")
 下右に必要数フィルコピー

 出図〜レイアウトの式は、
 B2 =IF(AND(Sheet1!$C2>B$1,Sheet1!$B2<=B$1),1,"")

 レイアウト〜出荷の式は
 B2 =IF(AND(Sheet1!$D2>B$1,Sheet1!$C2<=B$1),1,"")

 マクロ希望なら他の方にお任せします。

(sy) 2017/01/15(日) 00:42


 説明を読んでもよくわかりません。

 出図『前の』という表現、出図列にあるのは 出図『後』ではないのですか?
 出図前ということは、まだ出図されていないわけで、どんな品番がいつ出図されるかわからないのでは??

 また、出図『後』〜イベント『まで』というのもよくわかりません。

 アップされた例に対応して、それぞれのフェーズで、どんな表(グラフの元ネタ)をつくりたいのか
 具体的なサンプルをアップしてもらえれば想像できるかもしれませんが・・・

 なので、以下は、いきあたりばったりのコードです。
 フェーズ1の表をSheet2に、フェーズ2の表をSheet3に、フェーズ3の表をSheet4に作成します。(のつもりです)

 結果、そちらの思惑とは異なるんだろうと思いますが、Test1,Test2,Test3を実行して結果と、そちらの思惑の
 相違点を教えてください。

 Sub Test1()    'Phase-1
    MakeList 1, "Sheet2"
 End Sub

 Sub Test2()    'Phase-2
    MakeList 2, "Sheet3"
 End Sub

 Sub Test3()    'Phase-3
    MakeList 3, "Sheet4"
 End Sub

 Sub MakeList(phase As Long, shn As String)
    Dim dic As Object
    Dim stDate As Date
    Dim edDate As Date
    Dim styymm As String
    Dim edyymm As String
    Dim inyymm As String
    Dim c As Range
    Dim x As Long
    Dim id As String

    Set dic = CreateObject("Scripting.Dictionary")

    stDate = Date - Day(Date) + 1       '当月1日
    edDate = DateAdd("m", 23, stDate)    '24か月目の1日
    styymm = Format(stDate, "yyyymm")
    edyymm = Format(edDate, "yyyymm")

    With Sheets("Sheet1")   '★元シート
        With .Range("A2", .Range("A" & Rows.Count).End(xlUp))
            ReDim v(1 To .Rows.Count, 1 To 24)
            For Each c In .Cells
                inyymm = Format(c.Offset(, phase).Value, "yyyymm")
                If inyymm >= styymm And inyymm <= edyymm Then
                    x = DateDiff("m", stDate, c.Offset(, phase).Value) + 1
                    id = c.Value
                    If Not dic.exists(id) Then
                        dic(id) = dic.Count + 1     '1からの連番
                    End If
                    v(dic(id), x) = v(dic(id), x) + 1
                End If
            Next
        End With
    End With

    With Sheets(shn)
        .Cells.ClearContents
        .Range("B1").Value = stDate
        With .Range("B1").Resize(, 24)
            .DataSeries Rowcol:=xlRows, Type:=xlChronological, Date:=xlMonth, Step:=1, Trend:=False
            .NumberFormatLocal = "yyyy""年""mm""月"""
        End With
        .Range("A2").Resize(dic.Count).Value = WorksheetFunction.Transpose(dic.keys)
        .Range("B2").Resize(dic.Count, 24).Value = v
    End With

 End Sub

(β) 2017/01/15(日) 00:52


 syさんからの説明、あぁ、そういうことなのかなと。

 ただ、やはり、ひーぽんさんの言葉できちんと説明してください。
 で、私がアップしたコードの実行結果は、おそらく、いやいや、そうではない というものでしょうから
 どこが違っているかも、きちんと説明願います。

 いずれにしても、グラフ用の表を作るのは、コメントしたように 関数でもマクロでも、あるいは手作業操作でも
 できるんだろうなと思っています。

 で、各フェーズごとの展開が完成したとして、最終的にグラフをつくるところは、ひーぽんさんのほうで
 いかようにもできるはずですね。

(β) 2017/01/15(日) 00:57


 ところで、出図『前』の開始は、どの品番でも 当月 でいいのですか?

(β) 2017/01/15(日) 00:59


syさま

ご連絡ありがとうございます。
PJの管理をするために今回の検討をしているのですが、
syさまのおっしゃる工程管理図のようなイメージの横軸の各品番の日程感に対し
縦軸で各月の負荷を見たいという内容になります。

ですのでsyさまのおっしゃる工程管理図を見ながら
縦軸に出図準備が今月何件、イベント準備が何件、出荷準備が何件・・・
というのを自動で算出しグラフ化をしたいということになります。

宜しくお願い致します。

βさま

ありがとうございます。
出図前の開始はどの品番でも当月で構いません。
一度マクロ確認致します。
(ひーぽん) 2017/01/15(日) 01:05


 横軸が日付で月単位
 縦軸が該当月の品番点数

 と言う事ですか?
 じゃあ本当にマクロでする必要性は無さそうですね。

 以下のレイアウトのような表を作ってグラフ化して下さい。
    |[A]     |[B]|[C]|[D]|[E]|[F]|[G]|[H]|[I]|[J]|[K] |[L] |[M] |[N]|[O]|[P]|[Q]|[R]|[S]|[T]|[U]|[V]|[W] |[X] |[Y] 
 [1]|期間    |1月|2月|3月|4月|5月|6月|7月|8月|9月|10月|11月|12月|1月|2月|3月|4月|5月|6月|7月|8月|9月|10月|11月|12月
 [2]|出図    |  5|  4|  3|  2|  0|  0|  0|  0|  0|   0|   0|   0|  0|  0|  0|  0|  0|  0|  0|  0|  0|   0|   0|   0
 [3]|イベント|  0|  1|  2|  3|  5|  4|  2|  2|  1|   0|   0|   0|  0|  0|  0|  0|  0|  0|  0|  0|  0|   0|   0|   0
 [4]|出荷    |  0|  0|  0|  0|  0|  1|  3|  3|  3|   4|   3|   0|  0|  0|  0|  0|  0|  0|  0|  0|  0|   0|   0|   0

 B2 =COUNTIF(Sheet1!$B:$B,">"&B1)
 B3 =COUNTIFS(Sheet1!$B:$B,"<="&B1,Sheet1!$C:$C,">"&B1)
 B4 =COUNTIFS(Sheet1!$C:$C,"<="&B1,Sheet1!$D:$D,">"&B1)
 それぞれ右にフィルコピー

(sy) 2017/01/15(日) 01:16


syさま βさま マナさま

どうもありがとうございました。
意図しておりましたものができました。
皆様に感謝致します。
(ひーぽん) 2017/01/15(日) 01:56


コメント返信:

[ 一覧(最新更新順) ]


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