● Excel2010のリボンに、Excel2000と同じプログラムコードのコピペでユーザー設定ボタンを生成する。(一応ツールバー単位で)
※まだ書きかけです。すみません。
※間違ってたらすみません。
※メモ書きなので、自分でも意味不明な箇所も多いです。ごめんなさい。
※32bitの2010までの話です。2013、2016はテストしてません。(できるかもしれませんけど)
※下図のようにボタンアイコンの絵には、オリジナルの絵を、イミディエイトで1行コードで設定(コピペ処理)することも可能です。
目次
★ はじめに
★ 使い道
★ PERSONAL.XLS(xlsb)を配置する場所
★ リボンの中に自動生成される単位
★ ツールバーの削除の方法
★ ボタンの増やし方の方法
★ ボタンのアイコンの絵の変更方法
★ ボタンのアイコンの絵を自作のビットマップの絵に変更する方法
★ テストコード01
★ テストコード02 少し作り変え
★ Wordの場合との違いについて
★ 補足~さらなる応用
★ 操作したいツールバーの削除やボタンなどについて調査、ボタンアイコンの絵の変更などのコード
※Shift+TABキー、もしくは、Homeキー、Homeキー+TAB数回、を押すと、目次付近に戻れます。
※こちらは「パート01」です。「パート02」は→こちら。
パート02も結構重要なことが書いてありますのでそちらもご覧になってみてください。
例えば次のようなことをして、Excelでの作業の効率化を図ることができます。
(01)コピー、貼り付け、などのよく使うボタンをリボンの「アドイン」タブに自動生成
(「アドイン」タブは勝手に生成されるので「アドイン」タブ用のプログラムコードは不要です。)
(02)VBAプログラムコード(プロシージャ)をコマンドボタン化して、リボンの「アドイン」タブに自動生成(特にPERSONAL.XLSの内容を)
リボンに「アドイン」タブと「ツールバー01」というツールバーを自動生成されるようにします。また、各ボタンは通常のコマンドやVBAプログラムと紐付けされていて、
・コピー、
・値の貼り付け、
・選択範囲を「hh:mm:ss」形式のセル書式にする、
・選択範囲を「yyyy/mm/dd」形式にする、
といったことなどができます。
(※「アドイン」タブは、2010などの場合はツールバーをVBAで追加すると、勝手に作られるので、「アドイン」タブを作るプログラムは要りません。郵便番号変換ウィザードをインストールしてある場合も勝手に「アドイン」タブができていると思いますが、その場合はそこにツールバーの内容が組み込まれていきます。2003以前の場合はツールバーだけが普通に追加されて表示されます。)
クイックアクセスツールバーとほとんど同じ感じになりますが、メニューボタンとVBAプログラムを紐付けすることにより、細かい制御ができるボタンを、クイックツールバーよりもかなり多く作れます。また、ボタンと名前(ボタンの文言)の両方を表示することができ、少し見やすくなります。
クイックツールバーもすごく便利なのですが、デフォルトの機能ではアイコン絵が変えられないのとボタンの文言が設定できないのでボタンが増えたときに分かりにくくなってしまいます。
なので、クイックアクセスツールバーの代わりに、2003スタイルのツールバーで代用します。2010でも2003用のツールバー作成プログラムが動きますし(自動的に「アドイン」タブができてその中に作成されます)、XMLを使わずに済むのでラクと言えば楽かもしれません。XMLのエディタやらなんやらを使うよりは、バージョン2000から共通のやり方でVBAでやってしまうほうが面倒は無いと言えば無いかもしれません。好みの問題化とは思いますが・・・。
リボンのタブを切り替えるのも面倒な、本当によく使う操作はクイックアクセスツールバーで、その他のよく使う機能は、「アドイン」タブにVBAでボタン化する、という2本柱で行くのも良いと思います。
ボタンを押したときに動かすプログラム(プロシージャ)は、
C:\Users\ユーザー名\AppData\Roaming\Microsoft\Excel\XLSTART というフォルダの中に、
「PERSONAL.XLS」というファイルを作って、その中に書きます。
そして、そのプログラム(プロシージャ)とメニューボタンを、これまたVBAプログラミングで自動紐付けさせます。
今回ここでしている作業はそういった自動作業となります。
★ 使い道
例えば「マクロの記録」で作ったマクロを、「アドインタブに2003のコードでボタン追加」したりクイックツールバーに登録すると、「リボン系のアドイン」と違って起動時に読み込む必要がないので、Excelの起動が遅くなったりするようなことがなく、便利です。
以下のような使い道があると思います。
(01)「マクロの記録」で自動的に作ったマクロを登録する。
特に、セルの値などをいじらないような処理、たとえば、以下のような処理を自動化したいときにとても便利です。
・度重なるレイアウト変更(頻度が多い定型的なレイアウト変更)
・同様のセル書式設定
・同様のウィンドウの固定場所の変更や子ウィンドウの分割その他
・同様の「いつも決まったオートシェイプの作成や境界線の変更、フォント設定の変更」など
・逆に、頻度が少なすぎて処理内容を忘れてしまいがちな上記のようなセルの値の編集をしないような処理
・マイクロソフトのOfficeは「リボン」になったせいで、2クリックも3クリックも操作が増えて操作が遅くならざるをえなくなってしまったので、例えば通常メニューのダイアログをリボン経由でワンクリックで出したい、などのとき。
※ボタンとしての登録が、自分では難しかったら、以下の記事を誰か分かる人に読んでもらってやってもらってください。
『「マクロ」のリボンへのメニューボタン化・関連の記事5つ』→1、2、3、4、5
『用語:ExcelやWordにおける「マクロ」とは?VBAと何が違う?(「ExcelやWord自身」は「マクロ」をどう判別・区別しているか?)Accessの場合は?』
※マクロの自動記録とはすごく相性がいいので、ぜひ、併用してコスパアップに貢献してほしいです。必ずしも汎用的なマクロではなくても、部分的に自動化されるだけでも十分にコスパアップに貢献できると思います。
VBAがわからなくても自動化できるんですから。
もしマクロの記録でなんともならなかったら、「UWSC」も併用すると便利です。
UWSCについてはこちらと、こちらをご参照ください。
UWSCの自動実行ファイルも、本記事の「アドインタブの自作メニュー・ボタン」から呼び出すことが可能です。
(02)「マクロの記録」で作ったマクロを、一部、汎用的に作り替えたものを登録する
・ピボットをワンクリック一発で出して設定もしてしまう(「ソースとなる表の行と列の可変化」や「ピボット自体の毎度行うオプション設定」など)
(03)リボンの編集だとXMLを覚えるのがめんどくさい。アドインタブへのツールバー登録なら、2003のコマンドバー(ツールバー)操作関連のコードがそのまま使える
(04)自分で作ったビットマップのアイコンを、ボタンのアイコンとしてちゃちゃちゃっと使いたい
★ PERSONAL.XLS(xlsb)を配置する場所
C:\Users\ユーザー名\AppData\Roaming\Microsoft\Excel\XLSTART
※「PERSONAL.XLS」の作り方
2010の場合、xlsb拡張子ですでに「PERSONAL.XLS」ではなくて「PERSONAL.XLSB」ができている場合もあります。その場合はこれ以降の処置は必要ありません。「PERSONAL.XLSB」は、「開発」→「マクロの記録」→マクロの保存先で「個人用マクロブック」となっている状態で「OK」することで自動作成されます。「C:\Users\ユーザー名\AppData\Roaming\Microsoft\Excel\XLSTART」を開いて、「PERSONAL.XLSB」ができていたら、新たにxlsを作る必要はありません。
xlsでやりたいときは次のようにします。(すでにある「PERSONAL.XLS」を使いたいときも途中から同じです。)
最初、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です。
★ リボンの中に自動生成される単位
ツールバー単位(ツールバーの名前単位)
★ ツールバーの削除の方法
Excel2010の場合ですと、ツールバーのどのボタンの上でもいいので右クリックして「ユーザー設定のツールバーの削除」でOKです。
「アドイン」タブの中に単一のツールバーしかない場合、それを削除すると、同時に「アドイン」タブも消えます。
複数のツールバーが生成されていた場合、最後のツールバーが削除されると「アドイン」タブも消えます。
再度、プログラムでツールバーを自動生成すると、同名のツールバーが生成されます。
(本サンプルでは「ツールーバー01」ツールバー。)
※2019/02/09追記
おわりのほうの「★ 操作したいツールバーの削除やボタンなどについて調査、ボタンアイコンの絵の変更などのコード」を使ってもらってもOKです。
★ ボタンの増やし方の方法
新しくボタンを追加したい場合は、そのようにプログラム内容を追記します。
そして、いったん、既存のすべてのツールバーを削除してから、再度、同じ名前でツールバーを登録します。
下記サンプルだと、「CmdBarCelHennsyuuChkAndAdd01()」に5つめ、6つめ、とボタンの登録のプログラムを追加し、そして、既存のツールバーを削除してから、「CmdBarCelHennsyuuChkAndAdd01()」を実行します。
※2019/02/09追記
おわりのほうの「★ 操作したいツールバーの削除やボタンなどについて調査、ボタンアイコンの絵の変更などのコード」を使ってもらってもOKです。
また、追加時に、「myBar.Controls(8).FaceId = 4 」みたいなコードを足していただくと、ボタンのアイコンの絵を変更することができます。「4」は絵の番号でこの例ではプリンタの絵です。
ボタンの絵の番号についてはこちらのWebページをご参考にしてください。
★ ボタンのアイコンの絵の変更方法
※2019/02/09追記
ボタンのアイコンの絵の変更をしたい場合は、おわりのほうの「★ 操作したいツールバーの削除やボタンなどについて調査、ボタンアイコンの絵の変更などのコード」の、「CmdBtnOnlyIcnChange01()」プロシージャなどを使ってもらうと変えることができます。
イミディエイトウィンドウで
Commandbars("ツールバー名").Controls(変えたいボタンの番号).FaceID = 変えたい絵の番号
とやってもOKです。
(例:Commandbars("ツールバー01").Controls(8).FaceID = 4)
変更には絵の番号が必要なのですが、それは、こちらのWebページをご参考にしてください。
また、絵を変えたいボタンの番号やそのボタンを含んでいるツールバーの名前なども必要なのですが、それは「BtnName_n_Index_Check01()」プロシージャなどや「BarName_n_Index_Check01()」プロシージャなどでチェックしてみてください。
★ ボタンのアイコンの絵を自作のビットマップの絵に変更する方法
※下図のようにボタンアイコンの絵には、オリジナルの絵を、イミディエイトで1行コードで設定(コピペ処理)することも可能です。
流れとしては、ペイントで絵を描いて、それをコピーしてクリップボードへ送り、それを「PasteFace」メソッドでボタンに貼り付けます。「PasteFace」はクリップボードにある画像(多分BMP)をボタンに貼り付けてくれる命令です。
(01)ペイントを開きます。
(02)16×16のキャンバス設定にします。
(03)あまりにちっこいので、最大限まで拡大表示します。
(04)好きな絵を描きます。
(05)一応、いったん保存します。(Officeやパソコンの再インストール後に同じ絵をアイコン復活させたいなら。)
(06)再度描いた絵を開いて、すべて選択したのち、「コピー」もします。(クリップボードに描いた画像を送る
(07)イミディエイトウィンドウで以下のようにコードを実行
Commandbars("対象のツールバー名").Controls(絵を変えたいボタンの番号).PasteFace
例:Commandbars("ツールバー01").Controls(8).PasteFace
※キャンバスの大きさは、16×16よりも多少大きくても大丈夫ですが、あまりに大きいとコードを実行しても絵が正常に表示されません。
50×50前後くらいでご自分でも色々と試してみてください。
※対象のツールバーの名前や、絵を変えたいボタンの番号を調べるには、おわりのほうの「★ 操作したいツールバーの削除やボタンなどについて調査、ボタンアイコンの絵の変更などのコード」を見てください。
その中の、「BtnName_n_Index_Check01()」プロシージャや「BarName_n_Index_Check01()」プロシージャなどであらかじめチェックしておきます。
★ テストコード01
以下のコードを標準モジュールにコピペして実行すると、「アドイン」タブと「ツールバー01」ツールバーが出来上がります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
' ' '################################################################ '「ツールバー01」ツールバーが存在するかをチェックして再作成 'ボタンの表示形式を「イメージとテキスト」にする。 '################################################################ Sub CmdBarCelHennsyuuChkAndAdd01() Dim myBar As CommandBar, i As Long, C ' Set myBar = CommandBars.Add For Each C In CommandBars If C.Name = "ツールバー01" Then '「ツールバー01」という名前のツールバーが存在したら '非表示になってるといけないので、 '表示してから終わる。 C.Visible = True Exit Sub Else End If Next C '直前のループを最後まで実行したとき '「ツールバー01」ツールバーが見つからなかった時はここに来るので、 '必要に応じて以下のメッセージを発する。 ' MsgBox "「ツールバー01」ツールバーが消えてしまっているようです。再作成してください。" ' MsgBox "「ツールバー01」ツールバーが消えてしまっているようですので再作成します。" Set myBar = CommandBars.Add '空っぽのツールバーを作成 myBar.Name = "ツールバー01" 'その空っぽのツールバーに名前をつけます。 '1つめのボタンを追加 myBar.Controls.Add ID:=19 '本ツールバーの1つ目のボタンとして「コピー」を追加します myBar.Controls(1).Style = msoButtonIconAndCaption ' ボタンの表示形式を「イメージとテキスト」にする。 '2つめのボタンを追加 myBar.Controls.Add ID:=370 '本ツールバーの2つ目のボタン「値の貼り付け」を追加します myBar.Controls(2).Style = msoButtonIconAndCaption ' ボタンの表示形式を「イメージとテキスト」にする。 '3つめのボタンを追加 myBar.Controls.Add ID:=2950 '本ツールバーの3つ目のボタン「マクロ」ボタンを追加します myBar.Controls(3).Style = msoButtonIconAndCaption ' ボタンの表示形式を「イメージとテキスト」にする。 myBar.Controls(3).Caption = "hms(&C)" ' ボタンの「テキスト」部分を、「hms(&C)」に変更する。「(&C)」を付けないとエラーになる。 myBar.Controls(3).OnAction = "PERSONAL.XLS!cell_jikoku_hh_mm_ss" ' ボタンを「PERSONAL.XLS」の「cell_jikoku_hh_mm_ss」プロシージャと関連付ける '4つめのボタンを追加 myBar.Controls.Add ID:=2950 '本ツールバーの4つ目のボタン「マクロ」ボタンを追加します myBar.Controls(4).Style = msoButtonIconAndCaption ' ボタンの表示形式を「イメージとテキスト」にする。 myBar.Controls(4).Caption = "ymd(&C)" ' ボタンの「テキスト」部分を、「ymd(&C)」に変更する。「(&C)」を付けないとエラーになる。 myBar.Controls(4).OnAction = "PERSONAL.XLS!cell_hiduke_yyyy_mm_dd" ' ボタンを「PERSONAL.XLS」の「cell_hiduke_yyyy_mm_dd」プロシージャと関連付ける myBar.Visible = True End Sub ' ' '################################################################ '以下、各ボタン用のコード(プロシージャ)です。 '一部、使わないプロシージャもあります。 '今回使うのは、cell_hiduke_yyyy_mm_dd() と、 'cell_hiduke_yyyy_mm_dd()の2つだけです。 '################################################################ 'セルを数値の設定にする(今回は使いません) Sub 列全体セル編集数値() Selection.NumberFormatLocal = "#,##0_ " End Sub '時刻化するボタン用のプロシージャ(今回使います。) Sub cell_jikoku_hh_mm_ss() Selection.NumberFormatLocal = "hh:mm:ss" End Sub 'ユーザー定義の「yyyy/mm/dd」化するボタン用のプロシージャ(今回使います。) Sub cell_hiduke_yyyy_mm_dd() Selection.NumberFormatLocal = "yyyy/mm/dd" End Sub '複数の子ウィンドウ上下に整列する(今回は使いません) Sub win_seiretu_jyouge() Windows.Arrange ArrangeStyle:=xlHorizontal End Sub '複数の子ウィンドウ左右に整列する(今回は使いません) Sub win_seiretu_sayuu() Windows.Arrange ArrangeStyle:=xlVertical End Sub ' ' |
★ テストコード02 少し作り変え
ツールバーの名前を一か所の書き換えだけで直せるように変更しました。
「StrBarChkTxt = "ツールバー01"」のところだけ「ツールバー01」を「ツールバー02」とか「ツールバー03」とか色々に直せば、その名前でツールバーが自動生成されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
' ' '################################################################ '変数StrBarChkTxt で指定した名前のツールバーが存在するかをチェックして再作成 'ボタンの表示形式を「イメージとテキスト」にする。 '################################################################ Sub CmdBarCelHennsyuuChkAndAdd02() Dim myBar As CommandBar, i As Long, C ' Set myBar = CommandBars.Add Dim StrBarChkTxt As String 'ここで、作りたいツールバーの名前を「ツールバー01」に決めておきます。 'なお、ここで別の名前に書き換えれば、たとえボタンの内容が同じだったとしても '別のツールバーとして、リボンの「アドイン」タブに新しく生成されます。 StrBarChkTxt = "ツールバー01" For Each C In CommandBars If C.Name = StrBarChkTxt Then '既に、「StrBarChkTxt = "ツールバーの名前"」で指定した名前のツールバーが存在したら '非表示になってるといけないので、 '表示してから終わる。 C.Visible = True Exit Sub Else End If Next C '直前のループを最後まで実行したとき '指定した名前のツールバーが見つからなかった時はここに来るので、 '必要に応じて以下のメッセージを発する。 ' MsgBox "「" & StrBarChkTxt & "」ツールバーが消えてしまっているようです。再作成してください。" ' MsgBox "「" & StrBarChkTxt & "」ツールバーが消えてしまっているようですので再作成します。" Set myBar = CommandBars.Add '空っぽのツールバーを作成 myBar.Name = StrBarChkTxt 'その空っぽのツールバーに名前をつけます。 '1つめのボタンを追加 myBar.Controls.Add ID:=19 '本ツールバーの1つ目のボタンとして「コピー」を追加します myBar.Controls(1).Style = msoButtonIconAndCaption ' ボタンの表示形式を「イメージとテキスト」にする。 '2つめのボタンを追加 myBar.Controls.Add ID:=370 '本ツールバーの2つ目のボタン「値の貼り付け」を追加します myBar.Controls(2).Style = msoButtonIconAndCaption ' ボタンの表示形式を「イメージとテキスト」にする。 '3つめのボタンを追加 myBar.Controls.Add ID:=2950 '本ツールバーの3つ目のボタン「マクロ」ボタンを追加します myBar.Controls(3).Style = msoButtonIconAndCaption ' ボタンの表示形式を「イメージとテキスト」にする。 myBar.Controls(3).Caption = "hms(&C)" ' ボタンの「テキスト」部分を、「hms(&C)」に変更する。「(&C)」を付けないとエラーになる。 myBar.Controls(3).OnAction = "PERSONAL.XLS!cell_jikoku_hh_mm_ss" ' ボタンを「PERSONAL.XLS」の「cell_jikoku_hh_mm_ss」プロシージャと関連付ける '4つめのボタンを追加 myBar.Controls.Add ID:=2950 '本ツールバーの4つ目のボタン「マクロ」ボタンを追加します myBar.Controls(4).Style = msoButtonIconAndCaption ' ボタンの表示形式を「イメージとテキスト」にする。 myBar.Controls(4).Caption = "ymd(&C)" ' ボタンの「テキスト」部分を、「ymd(&C)」に変更する。「(&C)」を付けないとエラーになる。 myBar.Controls(4).OnAction = "PERSONAL.XLS!cell_hiduke_yyyy_mm_dd" ' ボタンを「PERSONAL.XLS」の「cell_hiduke_yyyy_mm_dd」プロシージャと関連付ける myBar.Visible = True End Sub ' '################################################################ '以下、各ボタン用のコード(プロシージャ)です。 '一部、使わないプロシージャもあります。 '今回使うのは、cell_hiduke_yyyy_mm_dd() と、 'cell_hiduke_yyyy_mm_dd()の2つだけです。 '################################################################ 'セルを数値の設定にする(今回は使いません) Sub 列全体セル編集数値() Selection.NumberFormatLocal = "#,##0_ " End Sub '時刻化するボタン用のプロシージャ(今回使います。) Sub cell_jikoku_hh_mm_ss() Selection.NumberFormatLocal = "hh:mm:ss" End Sub 'ユーザー定義の「yyyy/mm/dd」化するボタン用のプロシージャ(今回使います。) Sub cell_hiduke_yyyy_mm_dd() Selection.NumberFormatLocal = "yyyy/mm/dd" End Sub '複数の子ウィンドウ上下に整列する(今回は使いません) Sub win_seiretu_jyouge() Windows.Arrange ArrangeStyle:=xlHorizontal End Sub '複数の子ウィンドウ左右に整列する(今回は使いません) Sub win_seiretu_sayuu() Windows.Arrange ArrangeStyle:=xlVertical End Sub ' ' |
オートシェイプやテキストボックスなどを挿入するような、ExcelでもWordでも同じメニューなら、基本的にほぼ同じプログラム内容でWordでも行けます。
が、Wordの場合、まず、前述のテストプログラムでいうと、その中のすべての「OnAction 」の行の、「=」の右側が異なります。
Excelの場合は、テストプログラムのとおり、「 ×××.OnAction = ファイル名!標準モジュールのプロシージャ名」という形です。
例えば下記のようになります。
1 2 3 4 |
' ' myBar.Controls(3).OnAction = "PERSONAL.XLS!cell_hiduke_yyyy_mm_dd" ' |
それに対してWordの場合は、マクロのボタンと例えば「挿_矢印_赤1()」というプログラムを紐付けしたい場合、つまり、メニューボタンを押したときに「挿_矢印_赤1()」というプログラムが実行されるようにしたい場合、「挿_矢印_赤1()」が書かれている標準モジュール名を指定します。
「 ×××.OnAction = 標準モジュール名.プロシージャ名」という形です。
例えば下記のようになります。
1 2 3 4 |
' ' myBar.Controls(3).OnAction = "ToolBarButtonCode.挿_矢印_赤1" ' |
また、バージョンによってボタンのIDの番号が変わってくるかもしれないので、もしそうならその場合はさらに変えます。たとえばWord2010の場合、マクロのボタンのIDは「1」のようですので、すべての「myBar.Controls.Add ID:=2950」の「2950」を「1」に書き換えて、「myBar.Controls.Add ID:=1」とします。以下のような感じになります。
1 2 3 4 5 6 7 8 9 10 11 |
' ' '2つめのボタンを追加 myBar.Controls.Add ID:=1 'Word2010の場合。本ツールバーの2つ目のボタン「マクロ」ボタンを追加します ' myBar.Controls.Add ID:=2950 'Word2000の場合 myBar.Controls(2).Style = msoButtonIconAndCaption ' ボタンの表示形式を「イメージとテキスト」にする。 myBar.Controls(2).Caption = "hms(&C)" ' ボタンの「テキスト」部分を、「hms(&C)」に変更する。「(&C)」を付けないとエラーになる。 ' myBar.Controls(2).OnAction = "PERSONAL.XLS!cell_jikoku_hh_mm_ss" ' Excelの場合。ボタンを「PERSONAL.XLS」の「cell_jikoku_hh_mm_ss」プロシージャと関連付ける myBar.Controls(2).OnAction = "ToolBarButtonCode.挿_矢印_青1" ' Wordの場合。 ' |
もちろん、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ファイルを作り、その中の標準モジュールに書いたプログラム(プロシージャ)の名前を指定します。標準モジュールの名前は何でもいいです。モジュール名には左右されません。Excelの場合、左右されるのはファイル名とプロシージャ名のみです。
Wordと同様、どのExcelファイルからもプログラムを保存・上書き保存・実行ができます。
★ 補足~さらなる応用
この仕組みを利用すると、例えば 下図のようなことができます。(ExcelではなくWordでの例の絵ですみませんが、同じことをするのでそちらの図を流用させていただきます。)
上図のようにリボンに何もない状態から・・・、上図の例の場合のように、「挿入系ツールバー01」というツールバーと、「テキスト操作系ツールバー01」というツールバーが生成されるようにし、前者においては矩形や矢印などを自動挿入、後者においては段落とフォントの自動設定、等々のボタンを配置する・・・、ということができます。そしてそれらの作業がラクに行えるようにする・・・、といったことができます。
このようなプログラムは、Excel2003、Excel2000などの、古いバージョンでもそのまま使えます。
といいますか、本当は 旧バージョンで動くプログラムをバージョン2010でも試してみたら、一応動いてしまい、「完全じゃないけどまあそれなりに使える」という状況になっていたものですから、ご紹介させて頂きました。
本来は、リボンを直接操作するプログラムで「矩形や矢印などを自動挿入のボタン」などをリボンに作るべきだと思いますが、面倒なので、古いバージョンのプログラムでやってみました。(全バージョン共通で動くものがあれば、もともとたくさんのメニューボタンを作るわけではないので それはそれで使いやすいかと思い無理矢理動かして使っています・・・。)
★ 操作したいツールバーの削除やボタンなどについて調査、ボタンアイコンの絵の変更などのコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 |
' ' '################################################################ 'すべてのツールバーの名前とインデックス番号のチェック '############################################################### Sub BarName_n_Index_Check01() Dim ObjBar As CommandBar For Each ObjBar In CommandBars Debug.Print ObjBar.Name & "------" & ObjBar.Index Next ObjBar End Sub '################################################################ '「ツールバー01」の削除。 '削除したいツールバーの名前、もしくはインデックス番号は、 'BarName_n_Index_Check01()プロシージャなどで 'あらかじめチェックしておきます。 '################################################################ Sub bardel() 'ツールバー01 の削除 Dim myBar As CommandBar 'おい、パソコンよ、ツールバーを代入するためのオブジェクト変数をメモリ上に作っとけ。 '操作したいツールバーを、オブジェクト変数に代入して操作可能にします。 '=ここでは操作したいツールバーを、「ツールバー02」に指定して操作可能にします。 'おい、パソコンよ、「ツールバー02」という名前のツールバーを、オブジェクト変数のmyBarに代入しろ。 Set myBar = CommandBars("ツールバー02") '指定したツールバーの削除 'おい、パソコンよ、オブジェクト変数に代入したツールバーを削除しろ。 myBar.Delete End Sub '################################################################################ 'ツールバーへのボタンのみの新規登録 '自分が追加したツールバーの名前か番号が分かれば、 'そこへボタンのみを新規登録することもできます。 '以下の例の「myBar.Controls(8)」の部分の「8」の値は、 'ボタンの数を数えて、すでに7個のボタンがあったら「8」にします。 '同じ番号がかぶると、文言が表示されなかったりとおかしなことになるようです。 '事前に、後述の BtnName_n_Index_Check01()プロシージャなどを実行して '現状のボタンの中をチェックしておいてもOKです。 '操作したいツールバーの名前、もしくはインデックス番号は、 'BarName_n_Index_Check01()プロシージャなどで 'あらかじめチェックしておきます。 '################################################################################ Sub CmdBtnOnlyAdd() Dim myBar As CommandBar '操作対象のツールバーを代入するオブジェクト変数 Dim myBarName As String 'ツールバーの名前を代入するための変数 myBarName = "ツールバー01" '操作したいツールバーの指定。ここでは「ツールバー01」を指定しています。 '操作対象のツールバーをオブジェクト変数に代入します。 'ここでの例では、「ツールバー01」を代入(=操作可能状態に)します。 Set myBar = CommandBars(myBarName) myBar.Controls.Add ID:=19 '新規ボタンとして「コピー」を追加します myBar.Controls(8).Style = msoButtonIconAndCaption ' ボタンの表示形式を「イメージとテキスト」にする。 End Sub '################################################################################ 'ツールバーへのボタンのみの削除 '自分が追加したツールバーの名前か番号が分かれば、 'そこへボタンのみを新規登録することもできます。 '以下の例の「myBar.Controls(8)」の部分の「8」の値は、 'ボタンの数を数えて、消したいボタンが8個目にあったら その番号を書きます。 '事前に、後述の BtnName_n_Index_Check01()プロシージャなどを実行して '現状のボタンの中をチェックしておいてもOKです。 '操作したいツールバーの名前、もしくはインデックス番号は、 'BarName_n_Index_Check01()プロシージャなどで 'あらかじめチェックしておきます。 '################################################################################ Sub CmdBtnOnlyDel() Dim myBar As CommandBar Dim myBarName As String myBarName = "ツールバー01" Set myBar = CommandBars(myBarName) myBar.Controls(8).Delete ' 番号が「8」のボタンを削除。 End Sub '############################################################################# 'ツールバーの中の、ボタンのキャプション(文言)とインデックス番号のチェック '操作したいツールバーの名前、もしくはインデックス番号は、 'BarName_n_Index_Check01()プロシージャなどで 'あらかじめチェックしておきます。 '############################################################################# Sub BtnName_n_Index_Check01() Dim ObjBar As CommandBar Dim ObjBtn As Object '「CommandBarBottun」にしてしまうと、階層ボタンのところでエラーになるのでObjectのままにしておきます。階層ボタンは「CommandBarPopup」になるようです。 Dim StrBarName As String StrBarName = "ツールバー01" Set ObjBar = CommandBars(StrBarName) For Each ObjBtn In ObjBar.Controls Debug.Print ObjBtn.Caption & "------" & ObjBtn.Index Next ObjBtn End Sub '################################################################################ 'ツールバーへのボタンのアイコンの絵のみを変える。 'アイコンの絵のみを変えるには、その絵の番号が必要ですが、 'その絵の番号については http://officetanaka.net/excel/vba/tips/tips83.htm を 'ご参考にしてください。 'また、以下の例の「myBar.Controls(8)」の部分の「8」の値は、 'ボタンの数を数えて、絵を変えたいボタンが8個目にあったら「8」にします。 'これは事前に、後述の BtnName_n_Index_Check01()プロシージャなどを実行して '現状のボタンの中をチェックしておいてもOKです。 '操作したいツールバーの名前、もしくはインデックス番号は、 'BarName_n_Index_Check01()プロシージャなどで 'あらかじめチェックしておきます。 '################################################################################ Sub CmdBtnOnlyIcnChange01() Dim myBar As CommandBar '操作対象のツールバーを代入するオブジェクト変数 Dim myBarName As String 'ツールバーの名前を代入するための変数 myBarName = "ツールバー01" '操作したいツールバーの指定。ここでは「ツールバー01」を指定しています。 '操作対象のツールバーをオブジェクト変数に代入します。 'ここでの例では、「ツールバー01」を代入(=操作可能状態に)します。 Set myBar = CommandBars(myBarName) '8個めのボタンのアイコンの絵を変える。(ボタンの新規登録時にこのコードを一緒に書いて実行してもOKです。 myBar.Controls(8).FaceId = 4 'http://officetanaka.net/excel/vba/tips/tips83.htm での、プリンタの絵にする。 End Sub ' ' |
※関連記事
Word2010のリボンに、Word2000と同じプログラムコードのコピペでユーザー設定ボタンを生成する。(一応ツールバー単位で)
https://euc-access-excel-db.com/tips/ct08_exceltruebasic/ct080860_vba_basic/tool-bar-auto-make-word
- 投稿タグ
- ExcelVBA, Excelの独学, Excel連携VBA, パソコンでの自動化, ビジネスパソコンの基礎, リボンのカスタマイズ, 自動化