Excel (VBA)

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

 
(Windows 8.1 : Excel 2013)
図形選択右クリックメニューの追加
投稿日時: 19/02/09 10:59:51
投稿者: VBA-stepup

お世話になります。
 
図形選択右クリックメニューに実行マクロを追加したく下記コードを作成しましたが追加されません。

    With Application.CommandBars("Shapes").Controls.Add
        .Caption = "復元コピー"
        .OnAction = "復元コピー図形選択"
    End With

検索して
https://www.ka-net.org/blog/?p=5093
にたどり着いたのですが、理解できません。
リボンの設定等必要なのでしょうか?
 
OSのバージョン  Windows 8.1
Excelのバージョン  Excel 2013
 
OSのバージョン Excelのバージョン等の違いによる設定変更など必要な処置が有れば
教えて頂きたいと思います。
どなたかご教授宜しくお願いします。
 
引用:

たとえば、上記コードのように図形選択時の右クリックメニューをカスタマイズする場合は下記のようなコード(下記はExcel向け)になります。
 
・リボンXML
 
<?xml version="1.0" encoding="utf-8"?>
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
  <contextMenus>
    <contextMenu idMso="ContextMenuShape">
      <menu id="mnuOrg" label="My ContextMenu">
        <button id="btnMenu" label="My Menu" imageMso="HappyFace" onAction="btnMenu_onAction" />
      </menu>
    </contextMenu>
  </contextMenus>
</customUI>
・標準モジュール
 
Option Explicit
  
Public Sub btnMenu_onAction(control As IRibbonControl)
  MsgBox "こんにちは。", vbSystemModal + vbInformation
End Sub

 

回答
投稿日時: 19/02/09 12:43:44
投稿者: ピンク

>下記コードを作成しましたが追加されません。
Excel2007以降、仕様が変わったようですね
 
With Application.CommandBars("Shapes").Controls.Add
  .Caption = "復元コピー"
  .OnAction = "復元コピー図形選択"
End With
上記コードを実行後
図形に"Test"を登録後、シングルクリックでメニューが表示されませんか
Sub Test()
  Application.CommandBars("Shapes").ShowPopup
End Sub
Sub 復元コピー図形選択()
    MsgBox "復元コピー図形選択"
End Sub
手元のWin7-Excel2010では確認しましたがExcel2013では未確認です。

回答
投稿日時: 19/02/09 13:11:41
投稿者: simple

引用:
https://www.ka-net.org/blog/?p=5093
にたどり着いたのですが、理解できません。
リボンの設定等必要なのでしょうか?

リボンを設定する方法については、
https://www.ka-net.org/ribbon/ri02.html
に書かれています。
一度トライしてみてはいかがですか。
 
私なら、クイックアクセスツールバーにマクロを登録する方法で逃げますが。

投稿日時: 19/02/09 13:36:48
投稿者: VBA-stepup

ピンク様返信有難うございます。
 
これって図形にマクロの登録ですよね?
自分の仕様だと作成した図形(グループ図形)をコレクションシートのセルにサイズ、縮尺、名前と一緒に保存し
必要な時に選択した図形を元サイズに戻して別シート及び別ブックに張付けるという事をやりたいのですが?
 
他にいい方法がないのでしょうか。
マクロの登録セットのコードと削除のコード考えてみます。

投稿日時: 19/02/09 13:55:03
投稿者: VBA-stepup

simple様返信有難うございます。
 

引用:

私なら、クイックアクセスツールバーにマクロを登録する方法で逃げますが。

 
一応配布してコレクション図形を担当の人に作成してもらうつもりですので設定等を自分がするのは面倒かなと思いまして質問に至りました。
引用:

リボンを設定する方法については、
https://www.ka-net.org/ribbon/ri02.html
に書かれています。
一度トライしてみてはいかがですか。

これも配布には向かないようですね
 
ピンク様のマクロの登録少しチャレンジしてみます。

回答
投稿日時: 19/02/09 16:39:45
投稿者: ピンク

>必要な時に選択した図形を元サイズに戻して
こんな事かな
Option Explicit
Dim ShpName As String
Sub Test()
    ShpName = Application.Caller
    Application.CommandBars("Shapes").ShowPopup
End Sub
Sub 復元コピー図形選択()
    With ActiveSheet.Shapes(ShpName)
        .Height = 50
        .Width = 100
    End With
End Sub

回答
投稿日時: 19/02/09 17:10:03
投稿者: チオチモリン

> リボンを設定する方法については、
> https://www.ka-net.org/ribbon/ri02.html
> に書かれています。
> 一度トライしてみてはいかがですか。
 
>これも配布には向かないようですね
 
いえ、まさに配布向けの方法なんですけど。
手間がかかるのが難点ですが、一度トライされてみては?
 
---------リボンXLM
<?xml version="1.0" encoding="utf-8"?>
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
  <contextMenus>
    <contextMenu idMso="ContextMenuShape">
        <button id="mybtn01" label="復元コピー" imageMso="HappyFace" onAction="復元コピー図形選択" />
    </contextMenu>
  </contextMenus>
</customUI>
 
---------標準モジュール
Public Sub 復元コピー図形選択(control As IRibbonControl)
    MsgBox "復元コピー図形選択" ', vbSystemModal + vbInformation
End Sub

投稿日時: 19/02/09 17:54:25
投稿者: VBA-stepup

ピンク様返信有難うございます。
 
>こんな事かな
はい。大体意図は同じだと思います。
 
コレクションシートには、C列6行目からG列まで4行1セットで各セルの
1行目  Height/Width シェイプ(登録図形)
2行目  シェイプ名
3行目  縮尺
ここまでは自動登録
4行目  備考
 
これらの登録図形を必要な時(レイアウト変更・組立アリアの変更)当の時に各シェイプと縮尺を合わせて簡単に配置出来るようにしています。
 
ピンク様から頂いたマクロ登録の件ですが、コードの中で実際の選択シェイプ名とセルに登録されたシェイプ名を比較確認してシェイプ名・サイズ・縮尺の情報を取得し復元張付けを任意の場所に行う様にしてあります。
マクロの登録で行うと実行時シェイプが選択されていない状態で実行されるためエラー処理に移行してしまいます。
 
現在はフォームボタンとセルの右クリックメニューで起動出来る様にしてあります。
 

投稿日時: 19/02/09 18:08:00
投稿者: VBA-stepup

チオチモリン様返信有難うございます。
 
>いえ、まさに配布向けの方法なんですけど。
>手間がかかるのが難点ですが、一度トライされてみては?
 
配布向けの方法だったのですね。
もう一度サイトを熟読してみます。
 
何せ理解出来ない事の方が多く少し見ただけでした。すみません。
 

引用:

---------リボンXLM
<?xml version="1.0" encoding="utf-8"?>
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
  <contextMenus>
    <contextMenu idMso="ContextMenuShape">
        <button id="mybtn01" label="復元コピー" imageMso="HappyFace" onAction="復元コピー図形選択" />
    </contextMenu>
  </contextMenus>
</customUI>

 
リボンXLM どこに有るの? 
どこに記述? 何処か変更?
どんな記述(意味)?
全く解らず投げていました。

回答
投稿日時: 19/02/09 19:19:06
投稿者: ピンク

>シェイプが選択されていない状態で実行されるため
選択が必要なら
Sub 復元コピー図形選択()
    ActiveSheet.Shapes(ShpName).Select
    With Selection
        .Height = 50
        .Width = 100
    End With
End Sub

投稿日時: 19/02/10 05:57:50
投稿者: VBA-stepup

チオチモリン様・simple様

引用:

> リボンを設定する方法については、
> https://www.ka-net.org/ribbon/ri02.html
> に書かれています。
> 一度トライしてみてはいかがですか。
  
>これも配布には向かないようですね
  
いえ、まさに配布向けの方法なんですけど。
手間がかかるのが難点ですが、一度トライされてみては?

トライしてみました。
形だけは、開設の通りに出来ていると思うのですが最後の
引用:

18. 17.のファイルを開くと、リボンに「カスタムタブ」が追加され、「カスタムグループ」の中に「カスタムボタン」が追加されていることが確認できます。

追加されていません。
エクセルのバージョンと関係が有るのかな?
中身が理解できていないのでチンプンカンプンです。
今回はあきらめます。 Embarassed
チオチモリン様・simple様有難うございました。
 
ピンク様
>ActiveSheet.Shapes(ShpName).Select
 
ShpName⇒クリックされたシェイプのグループ名を取得する方法が解りません。
少し時間をください。
 
一般的な図形のコピペ操作と同じような操作性にしようと思ったのですが、くじけそうです。 Laughing

回答
投稿日時: 19/02/10 08:25:34
投稿者: チオチモリン

>図形選択右クリックメニューに実行マクロを追加
したいということなので、投稿日時: 19/02/09 17:10:03の記述では
> 18. 17.のファイルを開くと、リボンに「カスタムタブ」が追加され
ませんよ。
 
確認するのは、そのブックの
>図形選択右クリックメニュー
です。
 
当方では確認していますので、もう一歩だと思います。
くじける前に、上記の確認をお願いします。
 
 

回答
投稿日時: 19/02/10 08:46:56
投稿者: MMYS

一応、確認しますが、ZIP圧縮ファイルは理解されてますか。
また、テキストファイルの文字コード形式も理解されてますか。
理解している前提で説明します。
 
まず、リボンを理解する前にxlsx,xlsmファイル形式の理解が必要です。
xlsx,xlsmはZIP圧縮されたXMLファイルです。
つまり、xlsx,xlsmは単なるZIP圧縮ファイルです。
 
たとえば、新しいブックを作成してそのまま保存します。
そして拡張子をzipにかえて解凍すると
フォルダが3つ。ファイルが一つ。在ることが分かります。
 

_rels
docProps
xl
[Content_Types].xml

https://tech.nikkeibp.co.jp/it/pc/article/NPC/20060629/242158/
リンク先ではExcelを使わずにデータを直接編集しています。
 
リボンの仕組みは「customUI」フォルダ内の「customUI.xml」で指定します。
つまり、xlsmファイル(実態はZIPファイル)のcustomUIフォルダ内のcustomUI.xml
に記述です。
ただし、素の状態では「customUI」フォルダ、「customUI.xml」ファイルはありませんから
新規作成します。
このとき、customUI.xmlの文字コード形式がUTF-8、、CR+LF です。
日本では文字コード形式はShiftJIS形式が主流なので注意が必要です。
 
後はもとに戻して(ZIP圧縮して拡張子をxlsmにする)、Excelで開いて確認です。

回答
投稿日時: 19/02/10 09:40:28
投稿者: MMYS

2007以降、コマンドバーによる方法は一応できます。
たとえば、下記のコードを実行すると、「アドイン」タブが追加され、
その中の「ユーザー設定のツールバー」から呼び出せます。
 

Sub MyCommandBar()
    Dim cbrX As CommandBar
    Const strMyToolBar = "独自コマンド"

    On Error Resume Next
    CommandBars(strMyToolBar).Delete
    On Error GoTo 0
    
    Set cbrX = CommandBars.Add(Name:=strMyToolBar, Position:=msoBarTop, Temporary:=True)
    cbrX.Visible = True

    With cbrX.Controls.Add
        .FaceId = 59
        .Style = msoButtonIconAndCaption
        .Caption = "復元コピー"
        .OnAction = "復元コピー図形選択"
    End With
End Sub

投稿日時: 19/02/10 14:30:04
投稿者: VBA-stepup

MMYS様・チオチモリン様
色々とご指導有難うございます。
 
何とかセット出来たようです。
図形の右クリックメニューは呼び出しが出来ていませんが、
 
>2007以降、コマンドバーによる方法は一応できます。
>たとえば、下記のコードを実行すると、「アドイン」タブが追加され、
>その中の「ユーザー設定のツールバー」から呼び出せます。
 
MMYS様のコードで呼び出せました。
よって正常にセット出来たものと思います。
お手数をかけました。じっくりと勉強します。
 

Sub Add復元コピー図形選択()
    Dim cbrX As CommandBar
    Const strMyToolBar = "独自コマンド"

    On Error Resume Next
    CommandBars(strMyToolBar).Delete
    On Error GoTo 0
    
    Set cbrX = CommandBars.Add(Name:=strMyToolBar, Position:=msoBarTop, Temporary:=True)
    cbrX.Visible = True

    With cbrX.Controls.Add
        .FaceId = 59
        .Style = msoButtonIconAndCaption
        .Caption = "復元コピー"
        .OnAction = "復元コピー図形選択"
    End With
End Sub
Sub Add復元貼付け図形選択()
    Dim cbrX As CommandBar
    Const strMyToolBar = "独自コマンド"

    On Error Resume Next
    CommandBars(strMyToolBar).Delete
    On Error GoTo 0
    
    Set cbrX = CommandBars.Add(Name:=strMyToolBar, Position:=msoBarTop, Temporary:=True)
    cbrX.Visible = True

    With cbrX.Controls.Add
        .FaceId = 59
        .Style = msoButtonIconAndCaption
        .Caption = "復元貼付け"
        .OnAction = "復元貼付け"
    End With
End Sub

Sub Del図形選択()
    Dim cbrX As CommandBar
    Const strMyToolBar = "独自コマンド"

    On Error Resume Next
    CommandBars(strMyToolBar).Delete
    On Error GoTo 0
End Sub
Sub 復元コピー図形選択()

  Msbbox ”復元コピーの処理を実行しています。”
    Call Del図形選択
    Call Add復元貼付け図形選択
End Sub

Sub 復元貼付け()
  Msgbox "復元貼付けの処理を実行しています。”
    Call Del図形選択
End Sub


処理の流れは、こんな感じです。
 
ピンク様
色々と有難う御座いました。
ここまで出来ればこちらの方法で、右クリックメニューの呼出しにチャレンジします。
 

投稿日時: 19/02/13 18:41:53
投稿者: VBA-stepup

MMYS様・チオチモリン様・ピンク様・simple様
色々とご指導頂き有難うございました。
今日まで色々と調べながら右クリックメニューの追加を試みましたが結果的に追加できませんでした。
  
>一応、確認しますが、ZIP圧縮ファイルは理解されてますか。
>また、テキストファイルの文字コード形式も理解されてますか。
>理解している前提で説明します。
  
理解していませんでした。
  
>まず、リボンを理解する前にxlsx,xlsmファイル形式の理解が必要です。
>xlsx,xlsmはZIP圧縮されたXMLファイルです。
>つまり、xlsx,xlsmは単なるZIP圧縮ファイルです。
  
はじめて知りました。
  
MMYS様のコードで一応機能は満たした動作が出来るようになりました。
自分で理解の出来る様、コード・XMLじっくり勉強したいと思います。
  
一旦閉じます。
  
皆様本当に有難うございました。