Excel VBA質問箱 IV

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

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


5198 / 13646 ツリー ←次へ | 前へ→

【52144】既存のメニューを追加するアドインを作成する方法 やまP 07/10/24(水) 19:13 質問[未読]
【52145】Re:既存のメニューを追加するアドインを作... りん 07/10/24(水) 20:44 回答[未読]
【52146】Re:既存のメニューを追加するアドインを作... neptune 07/10/24(水) 21:47 回答[未読]
【52147】Re:既存のメニューを追加するアドインを作... neptune 07/10/24(水) 22:31 発言[未読]
【52150】Re:既存のメニューを追加するアドインを作... やまP 07/10/24(水) 23:17 お礼[未読]

【52144】既存のメニューを追加するアドインを作成...
質問  やまP  - 07/10/24(水) 19:13 -

引用なし
パスワード
   お世話になっております。

以下の内容のアドインを配布したいと思っております。
・ツールバーに「新メニュー」というオリジナルメニューを作る。
・「新メニュー」のサブメニューに「値の貼り付け」という既存の機能を追加する。

方法を知っている方がいらっしゃいましたら教えてください。

※アドインでなく個人的に行うのであれば、
「ツール」⇒「ユーザ設定」から作成することができる

※全てオリジナルのメニューでアドインを作成するのであれば、
(ThisWorkbookに)
Private Sub Workbook_AddinInstall()

 Set NewMenu = Application.CommandBars("Worksheet Menu Bar").Controls _
    .Add(Type:=msoControlPopup)
    NewMenu.Caption = "新メニュー(&1)"
    Set submenu1 = NewMenu.Controls.Add
    submenu1.Caption = "値の貼り付け(&1)"
    submenu1.OnAction = "値の貼り付け"

End Sub()

(標準モジュールに)
Sub 値の貼り付け()
 ****************
 ****************
End Sub

といった記述で作成可能であることは分かっております。
よろしくお願いします。

【52145】Re:既存のメニューを追加するアドインを...
回答  りん E-MAIL  - 07/10/24(水) 20:44 -

引用なし
パスワード
   やまP さん、こんばんわ。

>以下の内容のアドインを配布したいと思っております。
>・ツールバーに「新メニュー」というオリジナルメニューを作る。
>・「新メニュー」のサブメニューに「値の貼り付け」という既存の機能を追加する。
該当のコマンドのIDを指定することで機能を追加できます。
ただし、EXCEL2003ではId:=370なのですが、ほかのバージョンでは違う可能性があるので、検索するようにしています。

Sub test2()
  Dim cb As CommandBarControl, INum&
  '値貼り付けのコマンドを検索
  For II& = 1 To 40000
   Set cb = Nothing
   On Error Resume Next
   Set cb = Application.CommandBars.FindControl(ID:=II&)
   On Error GoTo 0
   'すでにコマンドバーに乗せていたら後者、それ以外は前者で該当しました(XL2003)
   If Not cb Is Nothing Then
     If cb.Caption = "値(&V)" Or cb.Caption = "値の貼り付け(&P)" Then
      INum& = II&: Exit For
     End If
   End If
  Next
  If INum& = 0 Then
   MsgBox "みつかりませんでした", vbExclamation
  Else
   'メニューバーにコマンド追加
   With Application.CommandBars("Worksheet Menu Bar")
     With .Controls.Add(ID:=INum&)
      .BeginGroup = True
     End With
   End With
  End If
  '
  Set cb = Nothing
End Sub

うまくいかなかったら、一度どれかのバーに乗せてIDを判定し、EXCELのバージョンごとにIDを分岐するようにしてみてください。EXCEL2007はコマンドバーがない(リボンだそうです)という話なのでテストはしていません。

【52146】Re:既存のメニューを追加するアドインを...
回答  neptune  - 07/10/24(水) 21:47 -

引用なし
パスワード
   ▼やまP さん:
こんにちは

>以下の内容のアドインを配布したいと思っております。
>・ツールバーに「新メニュー」というオリジナルメニューを作る。
>・「新メニュー」のサブメニューに「値の貼り付け」という既存の機能を追加する。
>
>方法を知っている方がいらっしゃいましたら教えてください。
>
>※アドインでなく個人的に行うのであれば、
>「ツール」⇒「ユーザ設定」から作成することができる
>
>※全てオリジナルのメニューでアドインを作成するのであれば、
>(ThisWorkbookに)
>Private Sub Workbook_AddinInstall()
ここに新メニューが存在するか否かを確認し、あれば削除する処理
があるのがベター。
> Set NewMenu = Application.CommandBars("Worksheet Menu Bar").Controls _
>    .Add(Type:=msoControlPopup)
>    NewMenu.Caption = "新メニュー(&1)"
>    Set submenu1 = NewMenu.Controls.Add
>    submenu1.Caption = "値の貼り付け(&1)"
>    submenu1.OnAction = "値の貼り付け"
>
CommandBars→ControlsオブジェクトのFaceId プロパティで全ての
FaceId を調べられますから、それで調べて、submenu1 にそのFaceId
設定してやればよいと思うんですが。

長い事書いてないので一応手持ちのコードを調べたらこんなのがありました。
CommandBarsオブジェクトは状況に合わせて変更が必要です。
  Dim myCBCtrl As CommandBarButton
  
  Set myCBCtrl = Application.CommandBars("Cell").Controls.Add _
    (Type:=msoControlButton, ID:=370, Before:=4, Temporary:=True)
  myCBCtrl.Caption = "値の貼り付け★★★"

【52147】Re:既存のメニューを追加するアドインを...
発言  neptune  - 07/10/24(水) 22:31 -

引用なし
パスワード
   ▼やまP さん:
ややこしいので作りました。これで調べて下さいませ。
Excel2000で作成。一応動きました。
他に必要なら、必要な物を追加してください。

Sub 全てのメニューの名前とIDをシートに書き出す()
Dim bar As CommandBar
Dim ctrl As CommandBarControl
Dim i As Long, r As Long, col As Long

  For Each bar In Application.CommandBars
    r = r + 1
    col = 1
    Cells(r, col).Value = "Name : " & bar.Name & "   index : " & bar.Index
    i = 0
    For Each ctrl In bar.Controls
      Cells(r, col + 1).Value = "Caption : " & ctrl.Caption
      Cells(r, col + 2).Value = "ID : " & ctrl.ID
      r = r + 1
    Next
  Next
End Sub

【52150】Re:既存のメニューを追加するアドインを...
お礼  やまP  - 07/10/24(水) 23:17 -

引用なし
パスワード
   ▼neptune さん:
>▼やまP さん:
>ややこしいので作りました。これで調べて下さいませ。
>Excel2000で作成。一応動きました。
>他に必要なら、必要な物を追加してください。
>
>Sub 全てのメニューの名前とIDをシートに書き出す()
>Dim bar As CommandBar
>Dim ctrl As CommandBarControl
>Dim i As Long, r As Long, col As Long
>
>  For Each bar In Application.CommandBars
>    r = r + 1
>    col = 1
>    Cells(r, col).Value = "Name : " & bar.Name & "   index : " & bar.Index
>    i = 0
>    For Each ctrl In bar.Controls
>      Cells(r, col + 1).Value = "Caption : " & ctrl.Caption
>      Cells(r, col + 2).Value = "ID : " & ctrl.ID
>      r = r + 1
>    Next
>  Next
>End Sub

りんさん
neptuneさん

ご丁寧に素早いご回答ありがとうございます。
エラー回避のことまで教えてくださって、大変助かります。

取り入れて完成させるまでに時間がかかってしまいそうなので、
お礼のみ先に言わせて頂こうと思います。

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