三流君 ken3のmemo置き場

三流プログラマーのメモ書きです。主にVBAやWindowsの話題が多いです

挨拶・自己紹介:
失敗続きのAB型の変わり者 :三流プログラマー Ken3です
フリーのエンジニア・個人事業主です・・と書くと聞こえはイイが(それとなくカッコよく聞こえるが)、 現在は小さな案件の受注請負 と 短期派遣 で 日々つつましく?ほそぼそと暮らしてます。
よく検索されるキーワード: [質問回答XXXXさんへ] [CreateObject] [VBA] [JRA競馬オッズ]

Excel VBA グラフ選択時のイベント処理を探る クラスモジュールにWithEvents As Chartを書きイベント取得

タイトルサムネイル

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

Ken3 ホームページ 目次

分類:HPを大きく分けると4つの柱(分類)です。
・[Excel/Access VBA]の解説
・[ASP(Active Server Pages)]の解説。
・[元コンビニ店長時代の話]が弟に巻き込まれ、失敗した脱サラ、畑違い?の仕事で失敗。
・[プログラマーの愚痴]では、あまり見せたくない三流プログラマーの内面かな。
三流君を踏み台にする
主に上記4つの分類でHP作成やメルマガの発行を行ってます。
※更新頻度が落ちていて情報の鮮度が悪いです。



本当に三流なんです(笑):たまにスゴイですねなんて言われることもありますが、
真実は→ [三流君の真実は...] ←を初めに見てくださるとわかると思います。
(からくりは、成功例↑しか載せてなくて ヒドイ失敗例はお蔵入り迷宮入りが多かったりします)