リボン関連

既存の機能の代わりにマクロを実行する

Over riding Default controls in Word using Custom UI editor and VBA」で回答したコードです。

“「ファイルを開く」コマンドを実行したときに本来の機能ではなくマクロを実行したい”という質問なのですが、この処理を実現するためにはcommand要素のonAction属性を使います。

[標準モジュール]

Private Sub office_FileOpen(control As IRibbonControl, ByRef cancelDefault)
 If MsgBox("Do you really open file...?", vbYesNo) = vbYes Then cancelDefault = False
End Sub

[リボンXML]

<?xml version="1.0" encoding="utf-8"?>
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
 <commands>
  <command idMso="FileOpen" onAction="office_FileOpen" />
 </commands>
 <ribbon startFromScratch="true">
  <qat>
   <sharedControls>
    <button idMso="FileOpen" screentip="This is Happy" supertip="Click here for a happy message" />
   </sharedControls>
  </qat>
 </ribbon>
</customUI>

下記ページも参考になるかと思います。

「既存の機能の代わりにマクロを実行する」
//www.ka-net.org/ribbon/ri22.html

関連記事

  1. リボン関連

    Re: Excel 2013のデザインタブはどこに?

    「インストラクターのネタ帳」で有名なExcel MVPの伊藤さんが「E…

  2. Office関連

    「クイックアクセスツールバーからPowerPointマクロを実行するアドイン」のコード

    2年ほど前に書いたPowerPointマクロの記事「クイックアクセスツ…

  3. リボン関連

    続・Office Ribbon Editorがダウンロード出来ない?

    「Office Ribbon Editorがダウンロード出来ない?」で…

  4. リボン関連

    複数のtoggleButton要素の中から1つだけしかオンにできないようにする

    「リボンのトグルボタン」で回答したコードです(下に記載しているコードは…

  5. Office関連

    A1セルを選択してから保存するExcelアドイン

    @yu_tang_さんのツイートで面白いものがありました。…

コメント

    • あくしず
    • 2013年 3月 03日

    現在90個程の項目を持った集計システムを旧式のプルダウンメニューからリボンインターフェースに換装している最中で、このサイトには大変お世話になってます。90個とも成ると、通常のボタンでは賄えず、Split Button を併用しています。通常のボタンをジャンルとし、Split Button を各項目にする事で、操作性の改善を目論んでいます。この様な例は少ないとは思いますが、Split Button を紹介されては如何でしょう。

  1. > あくしず様

    当サイトにご訪問いただき、ありがとうございます。
    たしかに大量の項目をまとめるのにsplitButton要素は便利ですね。
    早速記事を書きました。

    ・[リボン・カスタマイズ]splitButton要素で大量にある項目を使いやすくまとめる。
    http://www.ka-net.org/blog/?p=2806

    • あくしず
    • 2013年 4月 03日

    以前頂いた、ボタンを動的に変化させる方法で、マクロ内部のトップに有るサブプロシジャーから始めて、リボンの1個のボタンをグレーアウトさせる事が出来ました。しかし、複数のボタンでは、暗礁に乗り上げてしまいました。多くても10項目程度ですが、プルダウンメニューを使っている既存のシステムが幾つも有り、リボンに換装したいと思っています。

  2. > あくしず様

    先日付けましたコメント( http://www.ka-net.org/blog/?p=2674#comment-1060 )通り、具体的なコードが分からないと何とも言えないのですが、menu要素の子要素であろうとなかろうと、有効・無効を動的に設定する場合はgetEnabled属性を使います。

    コントロールが複数ある場合には、例えば下記のように(リボンXMLのxmlns属性の値は文字化けしてしまうので意図的に「h ttp」に変更してあります)適当な変数を配列で用意して適宜切り替えるとか、コントロールの有効・無効を、Excelであれば非表示のシート上のセルに記録しておく、Wordであればドキュメント変数に入れておく、あるいはレジストリーに保存する(SaveSetting)、外部のテキストやini・XMLファイル等に書き出しておく、といった方法が考えられますので、このあたりは状況に応じて使い分けるのが良いだろうと思います。

    ・リボンXML:

    <?xml version="1.0" encoding="utf-8"?>
    <customUI onLoad="Ribbon_onLoad" xmlns="h ttp://schemas.microsoft.com/office/2006/01/customui">
      <ribbon>
        <tabs>
          <tab id="tabSample" label="Sample Tab">
            <group id="grpSample" label="Sample Group">
              <menu id="mnuSample" label="Sample Menu" size="large" itemSize="normal" imageMso="HappyFace">
                <button id="btn1" label="Button1" imageMso="HappyFace" getEnabled="button_getEnabled" tag="1" />
                <button id="btn2" label="Button2" imageMso="HappyFace" getEnabled="button_getEnabled" tag="2" />
                <button id="btn3" label="Button3" imageMso="HappyFace" getEnabled="button_getEnabled" tag="3" />
                <button id="btn4" label="Button4" imageMso="HappyFace" getEnabled="button_getEnabled" tag="4" />
                <button id="btn5" label="Button5" imageMso="HappyFace" getEnabled="button_getEnabled" tag="5" />
              </menu>
              <button id="btnSample1" label="Sample Button1" imageMso="HappyFace" size="large" onAction="button_onAction" />
              <button id="btnSample2" label="Sample Button2" imageMso="HappyFace" size="large" onAction="button_onAction" />
            </group>
          </tab>
        </tabs>
      </ribbon>
    </customUI>

    ・VBAコード:

    Option Explicit
    
    Private myRibbon As Office.IRibbonUI
    Private flg(1 To 5) As Boolean
    
    Public Sub Ribbon_onLoad(ribbon As IRibbonUI)
      Dim i As Long
      Set myRibbon = ribbon
      For i = LBound(flg) To UBound(flg): flg(i) = True: Next
    End Sub
    
    Public Sub button_getEnabled(control As IRibbonControl, ByRef returnedVal)
      returnedVal = flg(CLng(control.Tag))
    End Sub
    
    Public Sub button_onAction(control As IRibbonControl)
      Select Case control.ID
        Case "btnSample1"
        '"btn3"だけ無効に設定
          flg(3) = False
          myRibbon.InvalidateControl "btn3" '"btn3"だけ更新
        Case "btnSample2"
        '"btn1" - "btn5"を設定
          flg(1) = True
          flg(2) = False
          flg(3) = True
          flg(4) = False
          flg(5) = True
          myRibbon.Invalidate 'リボン全体を更新
      End Select
    End Sub
    • あくしず
    • 2013年 4月 04日

    有難う御座います。getEnabledやInvalidateControlは何度も穴の空く程見ていたのですが、単純にN倍化する事ばかり考えていたので、行き詰っていました。
    いっそ、IDとON/OFFのパラメーターを持ったクラスモジュールを作ろうかとも考えていた所でした。

    • あくしず
    • 2013年 4月 05日

    昨日頂いたコードを試して見ました。正常に動作しましたが、flgのIndexの元になっているcontrol.Tagとは何物でしょうか?

    • あくしず
    • 2013年 4月 06日

    前作がプルダウンメニューのため、Ribbon IF のリニューアル版もグレーアウトが必須と思い込んでいましたが、初期状態では10個のボタンの内9個がグレーアウトで、カラフルな Ribbon IFに直す意味がなくなる事に気が付き、MessageBoxでガイドする事にしました。大変有難う御座いました。

  3. とりあえずは解決されたようで何よりです。

    > control.Tagとは何物でしょうか?

    対象コントロールのtag属性の値です。
    “btn1″でいうと「1」になります。

      • あくしず
      • 2013年 4月 12日

      頂いたソースコードを見ていて、今一つ繋がりに納得できない所が有ったのですが、ByRefの事に気が付いて、ようやく理解できました。今の開発が終わったらグレイアウト版も作って、どちらが良い感触か試して見たいと思っています。

        • あくしず
        • 2013年 4月 18日

        現在開発中のシステムのインターフェースは、エンドユーザーの声でカラフルなリボンとメッセージボックスの組み合わせに決まりましたが、比較検討用のグレーアウトのインターフェースも今日完成しました。以前頂いたコードをメニューから通常のボタンに代えた物です。此処まで漕ぎ着けられたのは、きぬあさ様の御かげです。有難う御座いました。

          • あくしず
          • 2013年 4月 27日

          頂いたグレーアウトのコードも大分理解できるようになったので、ボタンの配色とグレーアウト動作のチェックを兼ねたテストベンチを、インターフェース換装予定の4種類と新規開発の1品種についてこの数日に作成し、私の為に書いていただいたグレーアウトのコードは多くの人にとっても非常に有効なコードで有る事を痛感いたしました。私への返信だけではもったいなく、正式のトピックスに再掲されてはいかがでしょう。コールバックの解説なども加えれば、より多くの人にとって貴重な資料と成ると思います。

    • あくしず
    • 2013年 6月 02日

    Gray Out付きRibbon UI の3個目が完成しました。既存のシステムをできる限り新しいUIに換装したかったので、大変助かりました。Ribbon onLoad とGray Out の記述を保存したシートからコピペするようにしたら、Gray Out付きRibbon UIに換装するのが楽になりました。換装したい物は大量に有りますが、マクロのコードは、同系列の物は内蔵アップデータで移植できるので、XMLのインポートと共に時間を見計らってやって行こうと思っています。

    • > あくしず様

      システム移行の件でお役に立てたようで何よりです。
      旧システムをそのまま移行して「アドイン」タブから利用する、という方法もありますが、新しいUIリボンに合わせた形に換装した方が、使い勝手としては良くなりますね。
      getEnabled関連の新しい記事に関しては、落ち着き次第記事にしようかと思います。

Time limit is exhausted. Please reload CAPTCHA.

最近の記事

アーカイブ

RapidSSL_SEAL-90x50
PAGE TOP