[[20200513093307]] 『複数のグラフで開始日終了日をセルで指定したい』(クララ) ページの最後に飛ぶ

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

 

『複数のグラフで開始日終了日をセルで指定したい』(クララ)

お知恵貸してください。
一つのシートに20項目の日付別データがあり、このデータを基に20種のグラフがあります。
グラフは5つのシートに4つずつ作成しています。
過去一か月+一週間のグラフを表示するため、毎週20種グラフの開始日・終了日を入力しています。
これをマクロでできないものでしょうか。

一つのグラフでマクロ記録すると下記になりました。
B1 B2 に開始日・終了日を入力し、すべてのグラフの開始日・終了日に反映させるにはどうすればいいでしょう。

【マクロ】

    ActiveSheet.ChartObjects("グラフ 8").Activate
    ActiveChart.Axes(xlCategory).Select
    ActiveChart.Axes(xlCategory).MinimumScale = 43927		’4/6
    ActiveChart.Axes(xlCategory).MaximumScale = 43962		’5/11
    ActiveChart.Axes(xlCategory).CategoryType = xlCategoryScale
     ’↑自動的に土日が入るのでこれを避けるため「テキスト基準を自動的に選択する」から「テキスト軸」へ変更

【元データ】
    A   B   C   D  〜  JP
――――――――――――――――――――――――――――――――――
1| 開始  3/30 (4/6 4/13 B1に毎週一週間ずらしてハンド入力)
2| 終了  5/4 (5/11 5/18 B2に毎週一週間ずらしてハンド入力)
3|
4|      4/1  4/2  4/3 〜 12/31
5| 基準上 20  20  20    '(基準上・基準下は上限線・下限線を引くためのデータ)
6| 基準下 10  10  10
7| 
8| 項目1 10  15  16
9| 項目2 12  11  13
 |   |
27| 項目20 15  20  13

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


記録されたものを修正すると
 Option Explicit

 Sub test()
    Dim ws As Worksheet
    Dim cho As ChartObject
    Dim 開始 As Long
    Dim 終了 As Long

    開始 = Worksheets("元データ").Range("B1").Value2
    終了 = Worksheets("元データ").Range("B2").Value2

    For Each ws In Worksheets
        For Each cho In ws.ChartObjects
            With cho.Chart.Axes(xlCategory)
                 .CategoryType = xlTimeScale
                .MinimumScale = 開始
                .MaximumScale = 終了
                .CategoryType = xlCategoryScale
            End With
        Next
    Next

 End Sub

(マナ) 2020/05/13(水) 11:32


↑ごめんなさい、だめでした。

(マナ) 2020/05/13(水) 11:35


時間はかかるかもしれません。

 Option Explicit

 Sub test2()
    Dim ws As Worksheet
    Dim cho As ChartObject
    Dim r As Range
    Dim 開始 As Long
    Dim 終了 As Long
    Dim k As Long

    With Worksheets("元データ")
        Set r = .Range("C4", .Range("C4").End(xlToRight))
        開始 = Application.Match(.Range("B1").Value2 - 0.1, r, 1) + 1
        終了 = Application.Match(.Range("B2").Value2, r, 1)
    End With

    Application.ScreenUpdating = False

    For Each ws In Worksheets
        For Each cho In ws.ChartObjects
            With cho.Chart.ChartGroups(1)
                For k = 1 To 開始 - 1
                    .FullCategoryCollection(k).IsFiltered = True
                Next
                For k = 開始 To 終了
                 .FullCategoryCollection(k).IsFiltered = False
                Next
                For k = 終了 + 1 To .FullCategoryCollection.Count
                    .FullCategoryCollection(k).IsFiltered = True
                Next
            End With
        Next
    Next

 End Sub

(マナ) 2020/05/13(水) 14:07


修正
 >Set r = .Range("C4", .Range("C4").End(xlToRight))
           ↓      ↓
  Set r = .Range("B4", .Range("B4").End(xlToRight))

(マナ) 2020/05/13(水) 14:12


ループの順番を入れ替えないとだめかも。

 For k = 開始 To 終了
  ↓
 For k = 1 To 開始 - 1
  ↓
 For k = 終了 + 1 To .FullCategoryCollection.Count

(マナ) 2020/05/13(水) 14:24


 マナさんありがとうございます。
 11:32のコードはどこが×でしたか?
  .CategoryType = xlCategoryScale
    ↓
  .CategoryType = xlAutomatic
 これだけで問題なさそうなのですが…。

 いろいろテストしてみます。明日お返事します。

(クララ) 2020/05/13(水) 14:53


これは、どうなったのでしょうか

 >自動的に土日が入るのでこれを避けるため

(マナ) 2020/05/13(水) 21:42


状況だけ… やはりうまくいきません
■データ(選択範囲?)によって結果が変わります。
うまくいく時もあれば、指定した日付にならなかったり、グラフが左右に偏ったり時にはエクセルが落ちます。

■14:24の「ループの順番入れ替え」とは下記の意味でよろしいでしょうか。

 For k = 1 To 開始 - 1	'1
     .FullCategoryCollection(k).IsFiltered = True	'2
 Next
 For k = 開始 To 終了	'3
  .FullCategoryCollection(k).IsFiltered = False		'4

1234を
3412の意味ですね?
3214と両方トライしたのですがうまくいきませんでした(上記の現象)。

■もしかして
1.日付形式では土日が表示される
2.文字形式では軸の最小値最大値を操作できない
3.文字形式を日付にすると日付やグラフがずれる
これらが相反して無理のような気がしてきました。

もう少しやってみます。
明日ご連絡します。

(クララ) 2020/05/14(木) 12:11


グラフ作成用の表を別に用意するのではだめですか。
そうすると、対象期間のデータを、表にコピペするだけのマクロになります。

例えば、こんな感じです。
表のセル範囲には名前定義("グラフデータ")しておいてください。

 Sub test3()
    Dim r As Range
    Dim 開始
    Dim 終了

    開始 = 1
    終了 = 1
    With Worksheets("元データ")
        Set r = .Range("B4", .Range("B4").End(xlToRight))
        On Error Resume Next
        開始 = Application.Match(.Range("B1").Value2 - 0.1, r, 1) + 1
        終了 = Application.Match(.Range("B2").Value2, r, 1)
        On Error GoTo 0
    End With

    With Range("グラフデータ")
        .ClearContents
        r.Cells(開始).Resize(.Rows.Count, 終了 - 開始 + 1).Copy
        .Cells(1).PasteSpecial xlPasteValues
    End With

 End Sub

(マナ) 2020/05/14(木) 20:26


新しいコードテストしてみましたが…
●開始・終了を日付で指定しているので元データを日付形式で持っていく必要がある
●日付形式は土日を含む
二律背反でダメでした。

お時間をとっていただいたのに申し訳ないのですが別アプローチで考えてみます。
●日付を文字で持っておき、指定日付(文字)をセル位置で返す
●日付を指定してから文字に変換(今回ヒントをもらったコピーなど)して、指定日付(文字)をセル位置で返す 
また、前回グラフを作成しグラフをアクティブにした上でデータ上の範囲 □ をドラッグすればokということも分かったのでこれらで考え直してみます。

いろいろとお力になっていただきありがとうございました。

(クララ) 2020/05/15(金) 10:13


コメント返信:

[ 一覧(最新更新順) ]


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