Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


789 / 13645 ツリー ←次へ | 前へ→

【78283】グラフを右クリック時のメニュー追加 North 16/6/17(金) 9:07 質問[未読]
【78285】Re:グラフを右クリック時のメニュー追加 kamikaya 16/6/17(金) 9:20 発言[未読]
【78293】Re:グラフを右クリック時のメニュー追加 kamikaya 16/6/17(金) 14:36 発言[未読]
【78294】Re:グラフを右クリック時のメニュー追加 North 16/6/17(金) 14:45 お礼[未読]
【78295】Re:グラフを右クリック時のメニュー追加 kamikaya 16/6/17(金) 15:18 質問[未読]
【78297】Re:グラフを右クリック時のメニュー追加 kamikaya 16/6/17(金) 21:05 発言[未読]

【78283】グラフを右クリック時のメニュー追加
質問  North  - 16/6/17(金) 9:07 -

引用なし
パスワード
   グラフを右クリックした時のメニューを追加したいのですが

  With Application.CommandBars("Shapes").Controls.Add()
    .BeginGroup = True
    .Caption = "調整"
    .OnAction = "mAdj"
  End With

  With Application.CommandBars("Chart").Controls.Add()
    .BeginGroup = True
    .Caption = "調整"
    .OnAction = "mAdj"
  End With

上記どちらもうまくいきません。
アドバイスいただければ助かります。
よろしくお願いします。

【78285】Re:グラフを右クリック時のメニュー追加
発言  kamikaya  - 16/6/17(金) 9:20 -

引用なし
パスワード
   ▼North さん:

結論から言わせていただくと、グラフの右クリックメニューへの追加はできないようです。

私も以前挑戦しており、その際に多くのサイトを見てまわりましたがどなたも同じ結論でした。おそらくバグなのだと思います。

>グラフを右クリックした時のメニューを追加したいのですが
>
>  With Application.CommandBars("Shapes").Controls.Add()
>    .BeginGroup = True
>    .Caption = "調整"
>    .OnAction = "mAdj"
>  End With
>
>  With Application.CommandBars("Chart").Controls.Add()
>    .BeginGroup = True
>    .Caption = "調整"
>    .OnAction = "mAdj"
>  End With
>
>上記どちらもうまくいきません。
>アドバイスいただければ助かります。
>よろしくお願いします。

【78293】Re:グラフを右クリック時のメニュー追加
発言  kamikaya  - 16/6/17(金) 14:36 -

引用なし
パスワード
   ▼North さん:

先ほども言ったように,グラフの既存の右クリックメニューへの追加はできませんが,以下のように独自の右クリックメニューを作成することはできます。

下記のコードをそれぞれのモジュールにコピーして,プロシージャ"実行するマクロ"を実行してみてください。

グラフ上で[Shift]キーを押しながら右クリックを押すことで独自右クリックメニュー(Test)がポップアップするようになっています。

※これでは各ブックで行わなくてはならないので,実装するならアドインファイルとした方が良いかと思います。

【Microsoft Excel Objects ThisWorkbook】

Private WithEvents xApp As Application

【標準モジュール】

Option Explicit

Public MyMenu
Private ChrtEvents As New Collection

'■はじめに起動する場所
Sub 実行するマクロ()

  '独自右クリックメニューの作成
  subSettingMyMenu

  '独自右クリックメニューのグラフへの割り当て
  Dim CH As ChartObject
  Dim WS As Worksheet
  
  'アクティブブック上のすべてのグラフに独自右クリックメニューを割り当てる
  For Each WS In ActiveWorkbook.Worksheets
    For Each CH In WS.ChartObjects
      Dim ChartEvent As New Class1 '"Class1"の箇所はクラスモジュールの名前と揃える
      Set ChartEvent.xChart = CH.Chart
      ChrtEvents.Add ChartEvent
    Next
  Next

End Sub

'■独自右クリックメニューの作成
Private Sub subSettingMyMenu()

  Set MyMenu = Application.CommandBars.Add(Position:=msoBarPopup, Temporary:=True)
  With MyMenu
    With .Controls.Add
      .Caption = "Test"     'そちらの"調整"に相当
      .OnAction = "subTest"   'そちらの"mAdj"に相当
    End With
  End With
  
End Sub

'■最終的に実行したいマクロ

Private Sub subTest()

  MsgBox "Hello world"

End Sub

【クラスモジュール(Class1)】

Option Explicit

Public WithEvents xChart As Chart
Dim Flag As Boolean

'■グラフ上でマウスボタンが押されたら…
Private Sub xChart_MouseDown(ByVal Button As Long, ByVal Shift As Long, ByVal X As Long, ByVal Y As Long)

  If Button = 2 Then
    If Shift = 1 Then
      MyMenu.ShowPopup
    End If
  End If
  Flag = True

End Sub

'■グラフが右クリックされたら…
Private Sub xWorksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)

  If Flag = True Then
    Cancel = True
    Flag = False
  End If

End Sub

【78294】Re:グラフを右クリック時のメニュー追加
お礼  North  - 16/6/17(金) 14:45 -

引用なし
パスワード
   kamikayaさん
ご回答ありがとうございます。本当に助かります。
提示いただいたコードを参考にやってみます。
また不明点など出てきたら質問させていただきます。

【78295】Re:グラフを右クリック時のメニュー追加
質問  kamikaya  - 16/6/17(金) 15:18 -

引用なし
パスワード
   ▼kamikaya さん:

ちょっと加筆修正しました。

下記のコードはアドインファイルに記述します。既存のブックが開かれるたびにグラフの割り当てを自動的に行います。

ただし,これの問題はすでに開いているブックで新たにグラフを作成した場合,そのグラフには手動でイベント割り当てを行う必要があります(そのためのマクロ"実行するマクロ")。

逆質問で申し訳ないのですが,シート上でグラフが新規作成された場合にイベントを発生させる方法を知っている方がいらっしゃいましたらご教授のほどお願いします。

【Microsoft Excel Objects ThisWorkbook】

Option Explicit

Private WithEvents xApp As Application

'■アドインファイル(これ)が起動したとき…
Private Sub Workbook_Open()

  ' アドイン起動時、Applicationオブジェクトのイベントをキャッチ
  Set xApp = Me.Application
  
End Sub

'■既存のブックが開いたとき…
Private Sub xApp_WorkbookOpen(ByVal WB As Workbook)

  'グラフの割り当て
  subChartEventSetting WB

End Sub

【標準モジュール】

Option Explicit

Public MyMenu
Private ChrtEvents As New Collection

'■はじめに起動する場所
Sub 実行するマクロ()

  subChartEventSetting ActiveWorkbook

End Sub

'■グラフの割り当て
Public Sub subChartEventSetting(WB As Workbook)

  '独自右クリックメニューの作成
  subSettingMyMenu

  '独自右クリックメニューのグラフへの割り当て
  Dim CH As ChartObject
  Dim WS As Worksheet
  
  'アクティブブック上のすべてのグラフに独自右クリックメニューを割り当てる
  For Each WS In WB.Worksheets
    For Each CH In WS.ChartObjects
      Dim ChartEvent As New Class1
      Set ChartEvent.xChart = CH.Chart
      ChrtEvents.Add ChartEvent
    Next
  Next

End Sub

'■独自右クリックメニューの作成

Private Sub subSettingMyMenu()

  Set MyMenu = Application.CommandBars.Add(Position:=msoBarPopup, Temporary:=True)
  With MyMenu
    With .Controls.Add
      .Caption = "Test"
      .OnAction = "subTest"
    End With
  End With
  
End Sub

'■最終的に実行したいマクロ

Private Sub subTest()

  MsgBox "Hello world"

End Sub

【クラスモジュール(Class1)】

Option Explicit

Public WithEvents xChart As Chart

'■グラフ上でマウスボタンが押されたら…
Private Sub xChart_MouseDown(ByVal Button As Long, ByVal Shift As Long, ByVal X As Long, ByVal Y As Long)

  If Button = 2 Then
    If Shift = 1 Then
      MyMenu.ShowPopup
    End If
  End If

End Sub

【78297】Re:グラフを右クリック時のメニュー追加
発言  kamikaya  - 16/6/17(金) 21:05 -

引用なし
パスワード
   ▼kamikaya さん:

解決しました。
新規にグラフを追加した際にはNewChartイベントが発生するみたいなので次のように改良しました。

またNorthさんの追加したい項目が"調整"となっていましたが,これはグラフのサイズなどを調整するということでしょうか??
もしそうでしたらVectorでグラフ調整ソフト"GrapgAdjust"というものを配布しているので良ければ使ってみてください(ステマ(笑))

【Microsoft Excel Objects ThisWorkbook】

Option Explicit

Private WithEvents xApp As Application

'■アドインファイル(これ)が起動したとき…
Private Sub Workbook_Open()

  ' アドイン起動時、Applicationオブジェクトのイベントをキャッチ
  Set xApp = Me.Application
  
  '独自右クリックメニューの作成
  subSettingMyMenu
 
End Sub

'■既存のブックが開いたとき…
Private Sub xApp_WorkbookOpen(ByVal wb As Workbook)

  Dim Chrt As ChartObject
  Dim WS As Worksheet

  'グラフの割り当て
  For Each WS In wb.Worksheets
    For Each Chrt In WS.ChartObjects
      subChartEventSetting Chrt.Chart
    Next
  Next

End Sub

'■新規ブックが作成されたとき…(新規ブックにはグラフはないはずなので要らないかも)
Private Sub xApp_NewWorkbook(ByVal wb As Workbook)

  Dim Chrt As ChartObject
  Dim WS As Worksheet

  For Each WS In wb.Worksheets
    For Each Chrt In WS.ChartObjects
      subChartEventSetting Chrt.Chart
    Next
  Next

End Sub

'■新しくグラフが追加されたとき…
Private Sub xApp_WorkbookNewChart(ByVal wb As Workbook, ByVal Ch As Chart)

  'グラフの割り当て
  subChartEventSetting Ch
  
End Sub

【標準モジュール】

Option Explicit

Public MyMenu
Public MyMenu2
Private ChrtEvents As New Collection

'■グラフの割り当て
Public Sub subChartEventSetting(Ch As Chart)

   'アクティブブック上のすべてのグラフに独自右クリックメニューを割り当てる
  Dim ChartEvent As New Class1
  Set ChartEvent.xChart = Ch
  ChrtEvents.Add ChartEvent

End Sub

'■独自右クリックメニューの作成
Public Sub subSettingMyMenu()

  Dim i As Integer

  Set MyMenu = Application.CommandBars.Add(Position:=msoBarPopup, Temporary:=True)
  With MyMenu
    With .Controls.Add
      .Caption = "Test"
      .OnAction = "subTest"
    End With
  End With
 
End Sub

'■最終的に実行したいマクロ
Private Sub subTest()

  MsgBox "Hello world"

End Sub

'■何らかの原因でイベント処理が割り当てられなかったとき用の手動割り当て
Sub 実行するマクロ()

  Dim Chrt As ChartObject
  Dim WS As Worksheet

  '独自右クリックメニューの作成
  subSettingMyMenu

  'グラフの割り当て
  For Each WS In ActiveWorkbook.Worksheets
    For Each Chrt In WS.ChartObjects
      subChartEventSetting Chrt.Chart
    Next
  Next
  
End Sub

【クラスモジュール(Class1)】

Option Explicit

Public WithEvents xChart As Chart

'■グラフ上でマウスボタンが押されたら…
Private Sub xChart_MouseDown(ByVal Button As Long, ByVal Shift As Long, ByVal X As Long, ByVal Y As Long)

  If Button = 2 Then
    If Shift = 1 Then
      MyMenu.ShowPopup
    End If
  End If

End Sub

789 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free