[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『棒グラフの横軸を日数に応じた幅にしたいです』(河合)
お世話になります。
棒グラフで横軸を日付にしまして、縦軸にその日の数値を入力したグラフを作成したいと考えています。たとえば、
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 >
(隠居じーさん) 2021/01/28(木) 12:59
空白セルには、数式で入力すればよいです。
(マナ) 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
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
面 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.