
WithEvents myChartClass As Chartを使い、グラフのイベントをクラスモジュールで処理する
グラフ選択で軸の値を表示、ダブルクリックで修正、そんな処理を作成しました。
グラフの軸の値は、
With myChartClass.Axes(xlValue)
Debug.Print "最小値.MinimumScale:" & .MinimumScale
Debug.Print "最大値.MaximumScale:" & .MaximumScale
で取得できました。
知恵袋の質問
detail.chiebukuro.yahoo.co.jp
に回答しました。他の回答も見て私も勉強しないとなぁ・・・
下記解説動画です あのあの 迷いながら方向性なく・・・
youtu.be
https://youtu.be/5Z6P4RldTsw
目次
00:00 あいさつ、やりたいこと
01:00 1.クラスモジュールでWithEvents myChartClass As Chart
01:26 2.シートのモジュールでグラフをクラスモジュールと結びつける
03:07 3.結果をA1,B1にセットしてみた
04:32 4.グラフをダブルクリック で値の入力とセット そんな蛇足
08:40 5.ThisWorkBookのイベントに書けばヨカッタみたい・・・
#ExcelVBA #グラフイベント #WithEvents #Chart #クラスモジュール #デバッグ
1.クラスモジュールで
WithEvents myChartClass As Chart
でグラフのイベントを取得します。
Option Explicit '埋め込みグラフでイベントを使用する ' https://msdn.microsoft.com/ja-jp/library/office/ff194070.aspx 'を参考にして、↓WithEventsでイベントを取得 Public WithEvents myChartClass As Chart Private Sub myChartClass_Activate() Debug.Print ".Name=" & myChartClass.Name '数値軸の最小値と最大値 ' https://docs.microsoft.com/ja-jp/office/vba/api/excel.minimumscale With myChartClass.Axes(xlValue) Debug.Print "最小値.MinimumScale:" & .MinimumScale Debug.Print "最大値.MaximumScale:" & .MaximumScale End With End Sub
2.シートのモジュールに
Worksheet_Activate()
で
用意した、
Private objChart(100) As New Class1
にグラフをセットします。
すると、グラフのイベントを取得できます。
なんかこの、
objChart(100) As New Class1 これ、違うな・・・
ひとつでいいような気がするなぁ。
※回答に恥ずかしいコードUPして、できる回答者様にツッコミ、直してもらおうかな。ぉぃぉぃ
Option Explicit Private objChart(100) As New Class1 '100個のグラフまで対応、違うな書き方が・・ '初期化のタイミングがわからなかったので、 'シートがアクティブになった時に、 'WithEvents myChartClass に グラフを代入して イベントで使用してみた Private Sub Worksheet_Activate() Debug.Print "Worksheet_Activate" Dim cnt As Integer For cnt = 1 To ActiveSheet.ChartObjects.Count 'グラフの数セットする Set objChart(cnt).myChartClass = ActiveSheet.ChartObjects(cnt).Chart Next End Sub
3.結果をA1,B1にセットしてみた
Private Sub myChartClass_Activate() Debug.Print ".Name=" & myChartClass.Name '数値軸の最小値と最大値 ' https://docs.microsoft.com/ja-jp/office/vba/api/excel.minimumscale With myChartClass.Axes(xlValue) Debug.Print "最小値.MinimumScale:" & .MinimumScale Debug.Print "最大値.MaximumScale:" & .MaximumScale Range("a1") = .MinimumScale Range("b1") = .MaximumScale End With End Sub
1行目を固定表示にしたりして、
A1,B1がスクロールしてもみえるようにしないとマズイかなぁ。
4.グラフをダブルクリック で値の入力とセット そんな蛇足
クラスモジュールにダブルクリックのイベントを追加してみた。
Option Explicit '埋め込みグラフでイベントを使用する ' https://msdn.microsoft.com/ja-jp/library/office/ff194070.aspx 'を参考にして、↓WithEventsでイベントを取得 Public WithEvents myChartClass As Chart Private Sub myChartClass_Activate() Debug.Print ".Name=" & myChartClass.Name '数値軸の最小値と最大値 ' https://docs.microsoft.com/ja-jp/office/vba/api/excel.minimumscale With myChartClass.Axes(xlValue) Debug.Print "最小値.MinimumScale:" & .MinimumScale Debug.Print "最大値.MaximumScale:" & .MaximumScale Range("a1") = .MinimumScale Range("b1") = .MaximumScale End With End Sub Private Sub myChartClass_BeforeDoubleClick(ByVal ElementID As Long, ByVal Arg1 As Long, ByVal Arg2 As Long, Cancel As Boolean) Dim n n = InputBox("最小値", "変更", myChartClass.Axes(xlValue).MinimumScale) If Trim(n) = "" Then Exit Sub myChartClass.Axes(xlValue).MinimumScale = n n = InputBox("最大値", "変更", myChartClass.Axes(xlValue).MaximumScale) If Trim(n) = "" Then Exit Sub myChartClass.Axes(xlValue).MaximumScale = n End Sub
5.ThisWorkBookのイベントに書けばヨカッタみたい・・・
Option Explicit Private objChart(100) As New Class1 '100個のグラフまで対応、違うな書き方が・・ '初期化のタイミングがわからなかったので、 'シートがアクティブになった時に、 'WithEvents myChartClass に グラフを代入して イベントで使用してみた Private Sub Workbook_SheetActivate(ByVal Sh As Object) Debug.Print "Worksheet_Activate" Dim cnt As Integer For cnt = 1 To ActiveSheet.ChartObjects.Count 'グラフの数セットする Set objChart(cnt).myChartClass = ActiveSheet.ChartObjects(cnt).Chart Next End Sub
グラフ処理でイベントを使いたい時の参考になれば・・・
かなり前に書いたブログ記事と動画も参考にしてください
ブログ:
https://ken3memo.hatenablog.com/entry/2017/09/23/033000
ken3memo.hatenablog.com
動画:
https://www.youtube.com/watch?v=Akixq4AOrKE
www.youtube.com