● Word2010のリボンに、Word2000と同じプログラムコードのコピペでユーザー設定ボタンを生成する。(一応ツールバー単位で)

※間違ってたらすみません。
※メモ書きなので、自分でも意味不明な箇所も多いです。ごめんなさい。
  
目次
 ★ はじめに
 ★ Excelの場合との違い
 ★ プログラムをコピペする場所と標準モジュールの名前の変え方
 ★ コピペするプログラム内容
 (01)ツールバーの各ボタンの動作を決めるプログラム
 (02) リボンに2つのツールバー(各ボタン含む)を生成するプログラム
 (03)前項の(02)のテストプログラムを動かしたい場合は、以下のコードもコピペします。
 ★ ツールバーの削除、ボタンの増やし方の方法
※Shift+TABキー、もしくは、Homeキー、Homeキー+TAB数回、を押すと、目次付近に戻れます。
  
  
★ はじめに

リボンに何もない状態から・・・、「挿入系ツールバー01」というツールバーと、「テキスト操作系ツールバー01」というツールバーが生成されるようにし、前者においては矩形や矢印などを自動挿入、後者においては段落とフォントの自動設定、等々のボタンを配置します。そしてそれらの作業がラクに行えるようにします。

このプログラムは、Word2003、2000などの、古いバージョンでもそのまま使えます。

といいますか、本当は 旧バージョンで動くプログラムをバージョン2010でも試してみたら、一応動いてしまい、「完全じゃないけどまあそれなりに使える」という状況になっていたものですから、ご紹介させて頂きました。

本来は、リボンを直接操作するプログラムで「矩形や矢印などを自動挿入のボタン」などをリボンに作るべきだと思いますが、面倒なので、古いバージョンのプログラムでやってみました。(全バージョン共通で動くものがあれば、もともとたくさんのメニューボタンを作るわけではないので それはそれで使いやすいかと思い無理矢理動かして使っています・・・。)

下図のような動きになります。

図01:ツールバーの自動配置

図02:ボタンの動きの例-01

図03:ボタンの動きの例-02

※注意
Wordの場合各図形(各オートシェイプ)のアンカーの位置を、各図形ごとに変えたほうがその後のトラブルが少ないようなので、図形を表示したい付近の行の先頭に、いったん点滅カーソルを置いたほうがいいみたいです。Excelの場合はアンカーの概念が無い気がするので必要ないかもしれません。

★ Excelの場合との違い

基本的にほぼ同じプログラム内容でExcelでも行けますが、まず、終盤の(02)でご紹介する『(02) リボンに2つのツールバー(各ボタン含む)を生成するプログラム』の、すべての「OnAction 」の行の、「=」の右側が異なります。

Wordの場合は、マクロのボタンと「挿_矢印_赤1()」というプログラムを紐付けしたい場合、つまり、メニューボタンを押したときに「挿_矢印_赤1()」というプログラムが実行されるようにしたい場合、「挿_矢印_赤1()」が書かれている標準モジュール名を指定します。
「 ×××.OnAction = 標準モジュール名.プロシージャ名」という形です。

例えば下記のようになります。

それに対してExcelの場合は、「 ×××.OnAction = ファイル名!標準モジュールのプロシージャ名」という形です。
例えば下記のようになります。

あとは、次項の「(01)ツールバーの各ボタンの動作を決めるプログラム」での、すべてのプロシージャの、

Dim myDocument As Document

Dim myDocument As Worksheet

に書き換えて、かつ、

Set myDocument = ActiveDocument

Set myDocument = ActiveSheet

に書き換えればOKです。
(いずれも一括置換でもOKです。)

また、バージョンによってボタンのIDの番号が変わってくるかもしれないので、もしそうならその場合はさらに変えます。たとえばWord2010の場合、マクロのボタンのIDは「1」のようですので、すべての「myBar.Controls.Add ID:=2950」の「2950」を「1」に書き換えて、「myBar.Controls.Add ID:=1」とします。以下のような感じになります。

もちろん、ExcelにあってWordに無い命令・メニュー、の場合やその逆の場合は同じプログラムは使えません。

ケースやプログラム内容によっては、丸ごとWordに転用できないこともあるかと思いますが、おおむね、このような違いさえ理解していただければ、今回のようにオートシェイプを挿入するような、ExcelでもWordでも共通なメニューなら、根本的なプログラムとして書く内容は同じです。

※補足01
Wordの場合、メニュー関係の共用部品は「Normal.dot」というファイルに書くことが多いです。「Normal.dot」にプログラムを書くと、すべてのWordファイルにプログラムを保存・上書き保存・実行ができます。「docx」拡張子のファイルを開いていた時でも、「Normal.dot」ファイルにだけはVBAプログラムを保存・上書き保存・実行ができます。

※補足02
Excelの場合のメニュー関係の共用部品は、「C:\Users\ユーザー名\AppData\Roaming\Microsoft\Excel\XLSTART」というフォルダに、まず「PERSONAL.XLS」という名前の空のXLSファイルを作り、その中の標準モジュールに書いたプログラム(プロシージャ)の名前を指定します。ファイル名の拡張子は「xlsm」ではなくて「xls」です。作成したら、いったんそのファイルを開いて「非表示」の設定にして上書き保存して閉じます(「非表示」にしないと普通のExcelファイルを開いたときに「PERSONAL.XLS」もいっしょに画面に表示されてしまうためです)。それで共用部品化設定が完了です。
なお、標準モジュールの名前は何でもいいです。ここでのプログラムは 標準モジュール名には左右されません。Excelの場合、左右されるのはファイル名とプロシージャ名のみです。
Wordと同様、どのExcelファイルからもプログラムを保存・上書き保存・実行ができます。

※「PERSONAL.XLS」の作り方
2010の場合、最初、xlsx拡張子として画面が開きますので、先に、マイドキュメントなどに空のxlsファイルを別名保存します。ファイル→名前を付けて保存→ファイルの種類のドロップダウンメニューを「Excel97-2003ブック(xls)」に変更→PERSONAL.XLSという名前で「OK」します。(Excel2010でも「PERSONAL.XLS」という名前でOKです。拡張子はxlsmではなくて「xls」です。)
空のxlsファイルができたら「C:\Users\ユーザー名\AppData\Roaming\Microsoft\Excel\XLSTART」というフォルダに、そのファイルを移動します。

なお、2007以降?の場合は、「xlsb」拡張子ほうのが本当みたいです。自動的に個人用マクロブックとして生成されるのが普通です。でもxls拡張子でも動きます。もしxlsで不具合が出るなら前述の容量で今度は空のxlsbファイルを作って、それにプログラムをインポートすればOKかと思います。(インポートできるのかな?できなかったら単純にモジュールごとにxlsからコピペでOKです。)

移動完了したら、いったんそのファイルを開いて「非表示」の設定にして上書き保存して閉じます。
「非表示」にしないと普通のExcelファイルを開いたときに「PERSONAL.XLS」もいっしょに画面に表示されてしまうためです。これで共用部品化設定が完了です。

非表示設定のしかたは以下のとおりです。
2007以降の場合は「表示」タブ→「ウィンドウ」グループ→「表示しない」でいいようです。
「表示しない」が無いように見えたら、アイコンだけ出ている状態かもしれません。画面を最大化するか横方向に目いっぱい広げるとアイコンと文言の両方が見えると思います。
2003以前の場合は、ウィンドウ→「表示しない」でOKです。

  
  
★ プログラムをコピペする場所と標準モジュールの名前の変え方

プログラムはすべて Normal.dot にコピペします。
理由は、Normal.dot に書かれたプログラムは、マクロが動かないはずの「docx」拡張子のファイル上でも動くからです。(さらにその理由は、Normal.dot が、docxやdocmなどのすべてのWordファイルのひな型だからです。Normal.dotで「既定」に設定されたものはすべてのワードファイルの「既定」となるからです。そのため、Normal.dotに書かれたプログラムは拡張子がdocxでもdocmでも共用部品・共用プログラムとして動きます。)

Word2010の場合、「開発」タブ→VisuaiBasic で Normal.dotに標準モジュールを作れるようになります。

下図のように「Visual Basic Editor」が開きますので、まずその画面の左側・上のペインの「Normal」を押します。

この「Normal」は「Normal.dotのプログラムが集まってますよ~」という意味です。

そこをクリックしたら、今度は「挿入」→「標準モジュール」とクリックしていきます。

「Module1」という標準モジュールができます。
多くのプログラムはここにコピペします。

なお、原則としては、標準モジュールにプログラムをコピペすれば、その標準モジュールの名前が「Module1」だろうが「Module2」だろうが何だろうがプログラムは動きます。
ただ、今回のこの記事では、「ある標準モジュールの名前だけは ××× という名前でなければならない」ということをしなければなりません。

そのように何らかの名前変更の指示があった場合だけは、標準モジュールの名前を変えます。

あとはどんな標準モジュール名でもいいので、「共通部品01」とか「ツールバー用」とか「メニューバー用」とか管理しやすい名前に変更します。

なお、標準モジュールの名前を変更するには、下図のようにします。

(01)「挿入」→「標準モジュール」を押して生成された標準モジュール(「Module1」など)をクリック
(02)するとその下にも標準モジュール名が出てくるので、そちら側で名前を変更してEnterします。
(03)上部の標準モジュールの名前にもその変更が反映されます。
  
  
★ コピペするプログラム内容

(01)ツールバーの各ボタンの動作を決めるプログラム
Normal.dotに標準モジュールを作り、名前を、「ToolBarButtonCode」にしてからコピペします。

「ToolBarButtonCode」という標準モジュール名は変えないでください。

他の関連プログラムの中で「ToolBarButtonCode」という文字列を直接記述して使っているので、それ以外の標準モジュール名に変えてしまうと全体のプログラムが動かなくなってしまうからです。

  

(02) リボンに2つのツールバー(各ボタン含む)を生成するプログラム
Normal.dotに標準モジュールを作り、名前を、「MakeToolBar」にしてからコピペします。
実はこちらのプログラムでは、(01)と違って「MakeToolBar」という名前を変えても動きますが、一応、判別しやすいようにその名前で作ってみてください。

コピペしたあとに、「MultipleCmdBarAllAdd01()」を実行すると、各ボタンと機能を備えた「挿入系ツールバー01」というツールバーと、「テキスト操作系ツールバー01」というツールバーの、2つのツールバーがリボンに生成されます。

  

(03)前項の(02)のテストプログラムを動かしたい場合は、以降に挙げたのサイトのコードもコピペします。
新しく標準モジュールを作り、「クリップボード操作」という名前に変えてからコピペします。

「Access2000Tips Win32 API クリップボードへ変数などの文字を送る、クリップボードの文字を取得する」
https://euc-access-excel-db.com/tips/ct07_se/ct075010_ac2ktips/access2000tips-win32-api-clipboad
をご参照ください。

この処理は、僕は(有)ロードシステム様のサンプルをそのまま使わせて頂いています。
このサイトは有益な情報がたくさんありますから、皆さんもぜひ見てみてください。

(有)ロードシステム様
http://www.loadsystem.jp/api/

コピペするのは、
http://www.loadsystem.jp/api/api15.htm の「Source」の内容です。

直リンクだと
http://www.loadsystem.jp/api/lsapi15.txt の内容を標準モジュールにコピペするだけで使えます。

ただし、ここでは、クリップボードに送れる文字数を増やすために、

Public Const MAXSIZE = 4096

の行だけ、

Public Const MAXSIZE = 15000000

と、書き換えて上書き保存します。

それで完了です。
  
  
★ ツールバーの削除、ボタンの増やし方の方法

ツールバーの削除は、ツールバーのどのボタンの上でもいいので右クリックして「ユーザー設定のツールバーの削除」でOKです。

「アドイン」タブの中に単一のツールバーしかない場合、それを削除すると、同時に「アドイン」タブも消えます。

複数のツールバーが生成されていた場合、最後のツールバーが削除されると「アドイン」タブも消えます。

再度、プログラムでツールバーを自動生成すると、同名のツールバーが生成されます。
(本サンプルでは「テキスト操作系ツールバー01」ツールバーや「挿入系ツールバー01」ツールバー。)

新しくボタンを追加したい場合は、まず先に、「ToolBarButtonCode」標準モジュールに、追加するボタンにどんなプログラムを実行させたいかのプロシージャを書きます。
その後、そのプロシージャとどんなボタンを紐付けするかを、既存のツールバー生成のプロシージャに追記します。

本サンプルだと、「CmdBarChkAndAdd_TypeInsert01()」や「CmdBarChkAndAdd_TypeTxtOpe01()」です。「CmdBarChkAndAdd_TypeInsert01()」に9個目、10個目、あるいは、「CmdBarChkAndAdd_TypeTxtOpe01()」に2つ目、3つ目、とボタンの登録のプログラムを追加します。

そして、いったん、既存のツールバーを削除してから、再度、同じ名前でツールバーを登録します。

つまり、右クリック→「ユーザー設定のツールバーの削除」にて、「テキスト操作系ツールバー01」ツールバーと「挿入系ツールバー01」ツールバーをいったん削除してから、再度、「MultipleCmdBarAllAdd01()」を実行します。

ボタンを増やしたいときはこれの繰り返しとなります。

  
  
※関連記事
Excel2010のリボンに、Excel2000と同じプログラムコードのコピペでユーザー設定ボタンを生成する。(一応ツールバー単位で)
https://euc-access-excel-db.com/tips/ct08_exceltruebasic/ct080860_vba_basic/tool-bar-auto-make-excel