『棒グラフの横軸を日数に応じた幅にしたいです』(河合) お世話になります。 棒グラフで横軸を日付にしまして、縦軸にその日の数値を入力したグラフを作成したいと考えています。たとえば、 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