Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Microsoft 365)
複数行列のデータ毎にグラフを作りたい
投稿日時: 22/11/17 12:03:10
投稿者: えっくん

お世話になります。
以下の様に、20行*50列の群でずらーっとデータが入っています。
この20行*50列の群ごとに、各郡で同じ列の先頭行の位置にグラフを作っていきたいのです。
この群が数千以上あるので、手作業では腱鞘炎になってしまいます。
今は、ある群(a)にあるグラフ[左上がD1]を次の群(b)の先頭行の同じ列のセルの位置[左上がD21]
にコピーして、次の群(b)においたグラフを選択し、データ範囲を次の群の範囲にD&Dで移動させる
という作業を行っています。
 
こういうことを自動化、あるいはマクロ実行毎に1群づつグラフを作成していく
ということはできないでしょうか。
以上 よろしくお願いいたします。
 
 
2800    2804    2800    2796    2800    2796,, 群a1行目
2801    2808    2797    2798    2798    2789,, 群a2行目


2798    2796    2799    2802    2796    2798,, 群a20行目
2798    2795    2791    2793    2796    2800,, 群b1行目
2802    2791    2797    2800    2791    2798,, 群b2行目


2801    2793    2806    2798    2801    2801,, 群b20行目
2791    2800    2797    2794    2791    2794,, 群c1行目
2793    2797    2791    2791    2797    2799,, 群c2行目


2801    2804    2791    2796    2802    2793,, 群c20行目
2795    2793    2795    2795    2794    2793,, 群d1行目
2795    2796    2795    2795    2791    2792,,
2795    2791    2791    2795    2787    2798,,
2798    2797    2800    2799    2798    2794

回答
投稿日時: 22/11/17 14:31:10
投稿者: Suzu

基本、マクロの自動記録を行えば ほとんどの操作については そのコードを得る事が出来ますが
今回の操作 については、グラフを選択し → コピ → 【貼り付け】 の貼り付けがコード化されない様ですね。
 
1. グラフ自体を 右クリック 「テンプレートとして保存」にて、テンプレートとして保存。
2. マクロの自動記録を ON にし データ範囲を選択後、挿入 おすすめグラフ
  グラフの種類の変更 で 全てのグラフ - テンプレート から 1.で保存したグラフを選択し OK
3. グラフが配置されますから、必要に応じ 微調整
4. マクロの自動記録 を終了
 
 上記で記録されたコードを参考にしてはどうでしょうか

投稿日時: 22/11/21 13:48:17
投稿者: えっくん

Suzu さん
アドバイスありがとうございます。以下のようなマクロが作成されました。
マクロ実装で作製したグラフを削除して、同じセルから下記マクロを実行したところ、
グラフは表示されました(グラフの種類は異なります)が、グラフ 4の行でエラー
になります。おそらく新しく作成されたグラフの名前がグラフ 4ではないためと思います。
マクロを終了させたら、グラフの形は前のグループでのグラフと同じものに変化しました。
 
難しそうですね、、、、、
 
Sub Macro1()
'
' Macro1 Macro
'
 
'
    Range("AG7381:CD7400").Select
    ActiveSheet.Shapes.AddChart2(201, xlColumnClustered).Select
    ActiveChart.ApplyChartTemplate ( _
        "C:\Users\hogehoge\AppData\Roaming\Microsoft\Templates\Charts\1.crtx")
    ActiveChart.SetSourceData Source:=Range( _
        "'1回目 Hoge'!$AG$7381:$CD$7400")
    ActiveSheet.Shapes("グラフ 4").IncrementLeft 149.0624409449
    ActiveSheet.Shapes("グラフ 4").IncrementTop 52.5
 Crying or Very sad

回答
投稿日時: 22/11/21 15:58:38
投稿者: Suzu

記録した VBA はあくまでも 参考です。
 
それを参考に コードを組んでみましょう。
 
 
質問者さんは 参考のコードを理解し 自分に合う様に改変するご意思は無い様ですので
参考コードを指示し、当方はここまでとさせていただきます。
 

Sub Sumple()
'アクティブセル を 先頭に r行 c列 分のデータを
'1つの群として "C:\Users\hogehoge\AppData\Roaming\Microsoft\Templates\Charts\1.crtx"
' をテンプレートとして グラフ作成を 10回繰り返す (セルのデータが空白なら処理抜ける)
'
' 作成したグラフを r 行毎 に、アクティブセルの C列数分左のセルに配置

  Const r As Long = 20 'データ列方向数
  Const c As Long = 50 'データ行方向数

  Dim i As Long

  For i = 1 To 10
    If IsEmpty(ActiveCell.Offset((i - 1) * r)) = True Then Exit For
    With ActiveSheet.Shapes.AddChart2(Style:=201, XlChartType:=xlColumnClustered, Left:=ActiveCell.Offset(, c).Left, Top:=ActiveCell.Offset((i - 1) * r).Top)
      With .Chart
        .ApplyChartTemplate ("C:\Users\hogehoge\AppData\Roaming\Microsoft\Templates\Charts\1.crtx")
        .SetSourceData Source:=ActiveCell.Offset((i - 1) * r).Resize(r, c)
      End With
    End With
  Next
End Sub

投稿日時: 22/11/21 18:30:39
投稿者: えっくん

Suzu さんへ
当方力量も無く、サンプル頂くだけで申し訳ありません。
 
こちらで試させていただきました。
マイテンプレートのグラフがなぜか適応されません。
折れ線グラフなのですが、マイテンプレートで見るとグラフ形状は1つですが、
折れ線で見てみると2つグラフがあり、そこにあるもう一方の、行列が逆のグラフが
選択されて作成されているようです。
テンプレートのグラフは軸ラベルは50(系列が20個)なのですが、
作成されたグラフは軸ラベルが20(系列が50個)で作成されています。
 
ネット検索で行と列を逆にするにはSelect Case文を使うという事を知りましたので、
以下の様にしたところ、目的のグラフが作成されるようになりました。
 
また、マイテンプレートでのグラフの縦寸法は20行内の寸法なのですが、生成されたグラフは
24行分の高さです。が、これは良しとしたいと思います。
 
ありがとうございました。
 
Sub Sumple()
'アクティブセル を 先頭に r行 c列 分のデータを
'1つの群として "C:\Users\hogehoge\AppData\Roaming\Microsoft\Templates\Charts\1.crtx"
' をテンプレートとして グラフ作成を 10回繰り返す (セルのデータが空白なら処理抜ける)
'
' 作成したグラフを r 行毎 に、アクティブセルの C列数分左のセルに配置
 
  Const r As Long = 20 'データ列方向数
  Const c As Long = 50 'データ行方向数
 
  Dim i As Long
 
  For i = 1 To 10
    If IsEmpty(ActiveCell.Offset((i - 1) * r)) = True Then Exit For
     With ActiveSheet.Shapes.AddChart2(Style:=201, XlChartType:=xlColumnClustered, Left:=ActiveCell.Offset(, c).Left, Top:=ActiveCell.Offset((i - 1) * r).Top)
With .Chart
        .ApplyChartTemplate ("C:\Users\hogehoge\AppData\Roaming\Microsoft\Templates\Charts\1.crtx")
        .SetSourceData Source:=ActiveCell.Offset((i - 1) * r).Resize(r, c)
'追加始め
       Select Case .PlotBy
        Case xlRows
            .PlotBy = xlColumns
        Case xlColumns
            .PlotBy = xlRows '行と列をそれぞれ逆に設定
        End Select
'追加終了
      End With
    End With
  Next
End Sub
 
 
 
 
 
 
 

回答
投稿日時: 22/11/22 00:10:02
投稿者: simple

引用:
マイテンプレートのグラフがなぜか適応されません。
折れ線グラフなのですが、マイテンプレートで見るとグラフ形状は1つですが、
折れ線で見てみると2つグラフがあり、そこにあるもう一方の、行列が逆のグラフが
選択されて作成されているようです。

単にテンプレートがうまく作成されていないだけなのではないかと思われます。
テンプレートをいったん削除して再作成したらうまくいきませんか?
# 解決済みということなら、余計なことですが。

投稿日時: 22/11/22 08:59:33
投稿者: えっくん

simple さん コメントありがとうございます。
>テンプレートをいったん削除して再作成したらうまくいきませんか?
はい、削除して再登録してもダメでした。
 
解決済みを忘れていましたので解決済みとします。
 
皆さん ありがとうございました。