[[20210128104649]] 『棒グラフの横軸を日数に応じた幅にしたいです』(河合) ページの最後に飛ぶ

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

 

『棒グラフの横軸を日数に応じた幅にしたいです』(河合)

お世話になります。
棒グラフで横軸を日付にしまして、縦軸にその日の数値を入力したグラフを作成したいと考えています。たとえば、
1月1日から1月15日まで15
1月16日から1月17日まで10
1月18日から1月30日まで5
というような不規則な間隔で、隣り合う棒グラフは隙間なく並べたいです。
グラフで「集合縦棒」を選択、グラフをクリックし「データ系列の書式設定」の「要素の間隔」を0にすれば希望のグラフは出来るのですが、問題はデータが5年分あることです。
それぞれ不規則な期間の入力だけで済むといいのですが、1日ずつ入力すると、上記の場合でも
1月1日15、1月2日15、1月3日15・・・と5年分繰り返さなければならず膨大な行数になってしまいます。
だからと言って、
1月1日15、1月16日10、1月18日5とするとそれぞれが離れた棒グラフしか出来ません。
ヒストグラムですと近いグラフになるのですが、横軸を時間軸に変更できませんので異なる日にちの間隔が等間隔になってしまいましてだめでした。
なだらかな変化ではないですので、折れ線グラフでは困ります。
全ての日をコツコツ入力するしかなさそうでしょうか。
長々と失礼しましたが、何卒よろしくお願いします。

< 使用 Excel:Excel2016、使用 OS:unknown >


w。。。2セル入力後、選択して右下+になった
所を好きなだけ下へぐり〜。。。するだけでは
ダメなので。。。?

(隠居じーさん) 2021/01/28(木) 12:59


ご指摘誠にありがとうございます。
下にずーっとドラッグして5年分の日付を入れるしかないでしょうか。
日付だけでも365×5列となりますが、日付は変化ないものの、縦軸に該当する数字は2週間同じこともあれば、1週間だけのこともあり、それもやはり全てドラッグして入力するしかなさそうでしょうか。
何卒よろしくお願い申し上げます。
(河合) 2021/01/28(木) 19:20

>縦軸に該当する数字

空白セルには、数式で入力すればよいです。

(マナ) 2021/01/28(木) 19:34


>空白セルには、数式で入力すればよいです。

全部、数式のほうが簡単かも
値は、HLOOKUPで求め、エラーなら、左隣のセルの値とすればよい?

(マナ) 2021/01/28(木) 19:42


こんな感じで

B5:=IFERROR(HLOOKUP(B4,1:2,2,FALSE),A5)

 	A	B	C	D	E	F	G	H
 1	日付	1月1日	1月4日	1月6日				
 2	値	15	10	20				
 3								
 4	日付	1月1日	1月2日	1月3日	1月4日	1月5日	1月6日	1月7日
 5	値	15	15	15	10	10	20	20

(マナ) 2021/01/28(木) 19:55


 こんばんは ^^
いまグラフ、作ってみたのですが ^^; ← あまり理解が出来ていなくて
すみません。私の勘違いだったみたいで。。。お許しを。。。また、やってし
まいました。河合さん、すみませんm(__)m
マクロでも、
間隔詰めなら、できそぉですね。( ̄▽ ̄)。。。← また勘違いしてるかも
<< _ _ >>
(隠居じーさん) 2021/01/28(木) 21:04

日付部分も数式にして、雛形として使えば
完全自動化になりますね。

なので、以下は、使う必然性の全くないものです。
単にPower Query勉強目的です。無視してください。
備忘録代わりに場所をお借りします。

'----
Power Queryで、元データを
指定の期間のグラフ作成用データに加工しています。

 1)テーブル名:元データ

  日付        値
 2021/1/2     10
 2021/1/4     20
 2021/1/6     15

 2)テーブル名:期間

  期間
 2021/1/1
 2021/1/7

 3)クエリ名;元データ
     読み込み先:接続専用

 let
    ソース = Excel.CurrentWorkbook(){[Name="元データ"]}[Content],
    変更された型 = Table.TransformColumnTypes(ソース,{{"日付", type date}, {"値", Int64.Type}}),
    フィルターされた行 = Table.SelectRows(変更された型, each [日付] <> null and [日付] <> "")
 in
    フィルターされた行

 4)クエリ名:指定期間のグラフデータに加工
     読み込み先:ピボットグラフ

 let
    ソース = Excel.CurrentWorkbook(){[Name="期間"]}[Content],
    変更された型 = Table.TransformColumnTypes(ソース,{{"期間", type date}}),
    開始日 = 変更された型{0}[期間],
    終了日 = 変更された型{1}[期間],
    カスタム1 = List.Dates(開始日, Number.From(終了日)- Number.From(開始日) + 1, #duration(1, 0, 0, 0)),
    テーブルに変換済み = Table.FromList(カスタム1, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    #"名前が変更された列 " = Table.RenameColumns(テーブルに変換済み,{{"Column1", "条件日付"}}),
    変更された型1 = Table.TransformColumnTypes(#"名前が変更された列 ",{{"条件日付", type date}}),
    マージされたクエリ数 = Table.NestedJoin(変更された型1, {"条件日付"}, 元データ, {"日付"}, "元データ", JoinKind.FullOuter),
    #"展開された 元データ" = Table.ExpandTableColumn(マージされたクエリ数, "元データ", {"日付", "値"}, {"元データ.日付", "元データ.値"}),
    追加された条件列 = Table.AddColumn(#"展開された 元データ", "全日付", each if [条件日付] = null then [元データ.日付] else [条件日付]),
    並べ替えられた行 = Table.Sort(追加された条件列,{{"全日付", Order.Ascending}}),
    下方向へコピー済み = Table.FillDown(並べ替えられた行,{"元データ.値"}),
    削除された他の列 = Table.SelectColumns(下方向へコピー済み,{"条件日付", "元データ.値"}),
    フィルターされた行 = Table.SelectRows(削除された他の列, each [条件日付] <> null and [条件日付] <> ""),
    #"名前が変更された列 1" = Table.RenameColumns(フィルターされた行,{{"条件日付", "日付"}, {"元データ.値", "値"}})
 in
    #"名前が変更された列 1"

 5)ピボットではなく、テーブルに出力し、それをグラフ化してもよいです。
  出力例;
  日付       値
 2021/1/1   
 2021/1/2    10
 2021/1/3    10
 2021/1/4    20
 2021/1/5    20
 2021/1/6    15
 2021/1/7    15

参考にしたサイト
https://modernexcel7.hatenablog.com/entry/2019/07/15/005216

(マナ) 2021/01/29(金) 00:07


 軸のオプションでテキスト軸に変えるとよいのでは?
( はまちゃん) 2021/01/29(金) 01:55

 >>軸のオプションでテキスト軸に変えるとよいのでは?
なるほど (^◇^)v。。。( ..)φメモメモ

   |      ←  →  ■  
   | |             ■■   [四角の間隔は埋まっている]みたいに。

とても勉強になりました。。。。m(_ _)m

(隠居じーさん) 2021/01/29(金) 06:16


	面
1月16日	15
1月18日	10
1月30日	5
1月1日	15
1月16日	10
1月18日	5
15日まで≒16日0:00までと考えればこれで直に面作れば
棒が隙間なく並んだのとおなじことになるまいか?
(なまけもの) 2021/01/29(金) 13:07

皆様ご丁寧に大変ありがとうございます。

マナ様のB5:=IFERROR(HLOOKUP(B4,1:2,2,FALSE),A5)という式が一番早そうなのですが、これは行列入れ替えても式を変更すれば大丈夫のはずなのですよね。
B5のセルに=IFERROR(HLOOKUP(B4,1:2,2,FALSE),A5)と入れると例で言えば「値」と出てきてしまいます。

はま様の軸のオプションをテキスト軸にしますと等間隔になりますので今回の目的では使えそうにありません。

結局は隠居じー様のドラッグして5年分根気強く入力というしかなさそうでした。
(河合) 2021/01/29(金) 16:20


>行列入れ替えても式を変更すれば大丈夫のはずなのですよね。

データが縦方向に並んでいるならVlookupですが
使ったことありませんか?

  D2:=A2
  D3:=D2+1
  E2:=IFERROR(VLOOKUP(D2,A:B,2,FALSE),E1)

       -A-       -B-     -C-     -D-         -E-
 1    日付       値              日付        値
 2  2021/1/1     10             2021/1/1     10
 3  2021/1/4     20             2021/1/2     10
 4  2021/1/6     15             2021/1/3     10
 5                              2021/1/4     20
 6                              2021/1/5     20
 7                              2021/1/6     15
 8                              2021/1/7     15
 9                              2021/1/8     15

(マナ) 2021/01/29(金) 20:33


うまくUpできたかな?
https://f.easyuploader.app/eu-prd/upload/20210130060433_397737596d425169.PNG
表さえできれば日付軸にかってになるから。。。
(なまけもの) 2021/01/30(土) 06:31

グラフでなく四角で描いてみた。

Sub tes1()
'A列 日付
'B列 でーた
'作図範囲 選択セル範囲
'
'作図範囲座標取得
Dim X1 As Double, X2 As Double
Dim Y1 As Double, Y2 As Double
With Selection(1)

    Y1 = .Top
    X1 = .Left
    With .Offset(Selection.Rows.Count, Selection.Columns.Count)
        Y2 = .Top
        X2 = .Left
    End With
End With
Debug.Print "WAKU"; X1, Y1, X2, Y2
With ActiveSheet.Shapes.AddShape(Type:=1, _
                        Left:=X1, Top:=Y1, _
                        Width:=X2 - X1, Height:=Y2 - Y1)
    .Line.ForeColor.RGB = RGB(255, 0, 255)
    .Fill.Visible = False
End With

'データ範囲
Dim Rg As Range
Set Rg = Range("A2").CurrentRegion
'最大値
Dim Max As Double
Max = Application.WorksheetFunction.Max(Rg.Columns(2))
'日付
Dim minDate As Date, maxDate As Date
minDate = Rg(1, 1).Value
maxDate = Rg(Rg.Rows.Count, 1).Value
If Month(maxDate) = Month(maxDate + 1) Then

  maxDate = DateSerial(Year(maxDate), Month(maxDate) + 1, 0)
End If
Debug.Print "YOKOJIKU"; minDate, maxDate

'描画単位
Dim stepX As Double, stepY As Double
stepX = (X2 - X1) / (maxDate - minDate)
stepY = (Y2 - Y1) / Max

Debug.Print stepX, stepY
'

Dim r As Range
Dim fX As Double
Dim Haba As Double, Tate As Double
fX = X1
For Each r In Rg.Columns(1).Areas(1) '<-範囲の1列目取得になぜAreas(1)いるんだろう

    If r.Offset(1, 0).Value = 0 Then
        Haba = (maxDate - r.Value) * stepX
    Else
        Haba = (r.Offset(1, 0).Value - r.Value) * stepX
    End If
    Tate = r.Offset(0, 1).Value * stepY

Debug.Print "<"; r.Offset(0, 1).Value; ">"; fX, Y2 - Tate, Haba, Tate,

    With ActiveSheet.Shapes.AddShape(Type:=1, _
        Left:=fX, Top:=Y2 - Tate, _
        Width:=Haba, Height:=Tate)
        .Line.ForeColor.RGB = RGB(0, 0, 255)
        .Fill.Visible = True
        .Fill.ForeColor.RGB = RGB(0, 0, 255)
    End With
    fX = fX + Haba
Next

End Sub

(ふむ〜) 2021/01/30(土) 17:58


 >'<-範囲の1列目取得になぜAreas(1)いるんだろう

 わたしは、Columns(1).Cellsを使っています。
 そのほうが意味がわかりやすいかと思って。

(マナ) 2021/01/30(土) 18:29


皆様大変ありがとうございます。

マナ様の縦方向の式でうまく並べられそうです。縦だとVlookupですか。全くの初心者ですみませんでした。
詳細に式を教えて頂けましたのでこれで出来そうです。このやり方ですと、例で言うAとBの列を見れば変化がある日だけを容易に拾うことが出来、視覚的にも分かり易いです。ありがとうございました。

なまけもの様ありがとうございます。セルの入力が頭の中でごちゃごちゃになりまして5年分間違わずこれをやるのは大変困難な気がしてきました。

ふむ〜様ありがとうございます。難しくてよく分かりませんが、ありがとうございました。
(河合) 2021/02/01(月) 19:58


Toまで+1日をまず置く
Fromからの数値置く
値は同じ
たったこれだけの原理を理解すればまちがえることはない。
といいながらおいらは一点間違いを犯した。
マクロを使えない人間のやることです。
	面
1月16日	15
1月18日	10
1月30日	5
1月1日	15
1月16日	10
1月18日	5

30日は31日のまちがいでした。
ここだけ以外はFromと同じ日
あたまに
1月1日 0
とつけとけばわかりやすかったかな?
(なまけもの) 2021/02/02(火) 07:51


なまけもの様
詳細にありがとうございます。

1つの質問にこれだけさまざまな角度からアドバイス頂けてびっくりしました。
初心者には分からないことだらけですが、大変助かりました。
(河合) 2021/02/02(火) 20:47


マナ様に教えて頂きました方法でやらせて頂いておりますが、

データが縦方向に並んでいるならVlookupですが 使ったことありませんか?
  D2:=A2
  D3:=D2+1
  E2:=IFERROR(VLOOKUP(D2,A:B,2,FALSE),E1)
       -A-       -B-     -C-     -D-         -E-
 1    日付       値              日付        値
 2  2021/1/1     10             2021/1/1     10
 3  2021/1/4     20             2021/1/2     10
 4  2021/1/6     15             2021/1/3     10
 5                              2021/1/4     20
 6                              2021/1/5     20
 7                              2021/1/6     15
 8                              2021/1/7     15
 9                              2021/1/8     15

これにもう一つ別の値を入力したいのですが、たとえばCの列に入力して同様にする場合には「F」の列にどのような式を入れさせて頂けばよろしいでしょうか。
度々すみません。
(河合) 2021/02/04(木) 10:36


 せっかく目の前に電子機器があるのですから有効活用しましょう。
https://dekiru.net/article/21009/
 上に限らず、vlookupの解説記事は世の中にとてもたくさんありますので
 調べて自分で一旦チャレンジしてみてください。
 使えるようになるととても便利ですよ。
(ななし) 2021/02/04(木) 11:45

コメント返信:

[ 一覧(最新更新順) ]


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