web-dev-qa-db-ja.com

VBAを使用してカスタムリボンタブを追加する方法

Excelリボンにカスタムタブを追加して、いくつかのボタンを追加する方法を探しています。 Googleを介してそれに対処するいくつかのリソースを見つけましたが、すべてが危険で途方もなく複雑に見えます。

それを行うための迅速かつ簡単な方法は何ですか? VBAがExcelに読み込まれると、新しいタブが読み込まれるようにしたい。

UPDATEhere からこの例を試しましたが、最後の命令で「オブジェクトが必要です」というエラーが表示されました:

Public Sub AddHighlightRibbon()
Dim ribbonXml As String

ribbonXml = "<mso:customUI xmlns:mso=""http://schemas.Microsoft.com/office/2009/07/customui"">"
ribbonXml = ribbonXml + "  <mso:ribbon>"
ribbonXml = ribbonXml + "    <mso:qat/>"
ribbonXml = ribbonXml + "    <mso:tabs>"
ribbonXml = ribbonXml + "      <mso:tab id=""highlightTab"" label=""Highlight"" insertBeforeQ=""mso:TabFormat"">"
ribbonXml = ribbonXml + "        <mso:group id=""testGroup"" label=""Test"" autoScale=""true"">"
ribbonXml = ribbonXml + "          <mso:button id=""highlightManualTasks"" label=""Toggle Manual Task Color"" "
ribbonXml = ribbonXml + "imageMso=""DiagramTargetInsertClassic"" onAction=""ToggleManualTasksColor""/>"
ribbonXml = ribbonXml + "        </mso:group>"
ribbonXml = ribbonXml + "      </mso:tab>"
ribbonXml = ribbonXml + "    </mso:tabs>"
ribbonXml = ribbonXml + "  </mso:ribbon>"
ribbonXml = ribbonXml + "</mso:customUI>"

ActiveProject.SetCustomUI (ribbonXml)
End Sub
90
BuZz

私の知る限り、VBA Excelを使用してExcelリボンにカスタムタブを作成することはできません。ただし、VBAを使用してリボンコンポーネントを非表示/表示にすることができます。また、上記のリンクはMS Project用であり、MS Excel用ではありません。

カスタムUIエディター と呼ばれるこの無料のユーティリティを使用して、Excelアプリケーション/アドインのタブを作成します。


編集:OPによる新しいリクエストに対応するために

チュートリアル

約束どおりの短いチュートリアルを次に示します。

  1. カスタムUIエディター(CUIE)をインストールしたら、それを開いて、[ファイル]、[ファイル]の順にクリックします。関連するExcelファイルを開いて選択します。 CUIEで開く前に、Excelファイルが閉じていることを確認してください。例として、新しいワークシートを使用しています。

    enter image description here

  2. 下の画像に示すように右クリックし、「Office 2007カスタムUIパーツ」をクリックします。 「customUI.xml」を挿入します

    enter image description here

  3. 次に[挿入]メニューをクリックします|サンプルXML |カスタムタブ。基本的なコードが自動的に生成されることに気付くでしょう。これで、要件に従って編集する準備がすべて整いました。

    enter image description here

  4. コードを調べてみましょう

    enter image description here

    label="Custom Tab":「カスタムタブ」をタブに付ける名前に置き換えます。とりあえず「ジェローム」と呼びましょう。

    以下の部分は、カスタムボタンを追加します。

    <button id="customButton" label="Custom Button" imageMso="HappyFace" size="large" onAction="Callback" />
    

    imageMso:これはボタンに表示される画像です。 「HappyFace」は、現在表示されているものです。 ここからさらにイメージIDをダウンロードできます

    onAction="Callback":「コールバック」は、ボタンをクリックしたときに実行されるプロシージャの名前です。

デモ

それで、2つのボタンを作成し、それらを「JGボタン1」と「JGボタン2」と呼びましょう。最初の画像として幸せそうな顔を保ち、2番目の「太陽」を保ちましょう。修正されたコードは次のようになります。

<customUI xmlns="http://schemas.Microsoft.com/office/2006/01/customui">
<ribbon startFromScratch="false">
<tabs>
<tab id="MyCustomTab" label="Jerome" insertAfterMso="TabView">
<group id="customGroup1" label="First Tab">
<button id="customButton1" label="JG Button 1" imageMso="HappyFace" size="large" onAction="Callback1" />
<button id="customButton2" label="JG Button 2" imageMso="PictureBrightnessGallery" size="large" onAction="Callback2" />
</group>
</tab>
</tabs>
</ribbon>
</customUI>

CUIEで生成されたすべてのコードを削除し、その代わりに上記のコードを貼り付けます。 CUIEを保存して閉じます。 Excelファイルを開くと、次のようになります。

enter image description here

これでコード部分です。 VBAエディターを開き、モジュールを挿入して、次のコードを貼り付けます。

Public Sub Callback1(control As IRibbonControl)

    MsgBox "You pressed Happy Face"

End Sub

Public Sub Callback2(control As IRibbonControl)

    MsgBox "You pressed the Sun"

End Sub

Excelファイルをマクロ対応ファイルとして保存します。スマイリーまたは太陽をクリックすると、関連するメッセージボックスが表示されます。

enter image description here

お役に立てれば!

139
Siddharth Rout

Excel 2013のVBAでこれを達成できました。特別なエディターは必要ありませんでした。必要なのは、[開発]タブでアクセスできるVisual Basicコードエディターだけです。 [開発]タブはデフォルトでは表示されないため、[ファイル]> [オプション]> [リボンのカスタマイズ]で有効にする必要があります。 [開発]タブで、[Visual Basic]ボタンをクリックします。コードエディターが起動します。左側のプロジェクトエクスプローラーペインを右クリックします。挿入メニューをクリックして、モジュールを選択します。以下の両方のサブを新しいモジュールに追加します。

Sub LoadCustRibbon()

Dim hFile As Long
Dim path As String, fileName As String, ribbonXML As String, user As String

hFile = FreeFile
user = Environ("Username")
path = "C:\Users\" & user & "\AppData\Local\Microsoft\Office\"
fileName = "Excel.officeUI"

ribbonXML = "<mso:customUI      xmlns:mso='http://schemas.Microsoft.com/office/2009/07/customui'>" & vbNewLine
ribbonXML = ribbonXML + "  <mso:ribbon>" & vbNewLine
ribbonXML = ribbonXML + "    <mso:qat/>" & vbNewLine
ribbonXML = ribbonXML + "    <mso:tabs>" & vbNewLine
ribbonXML = ribbonXML + "      <mso:tab id='reportTab' label='Reports' insertBeforeQ='mso:TabFormat'>" & vbNewLine
ribbonXML = ribbonXML + "        <mso:group id='reportGroup' label='Reports' autoScale='true'>" & vbNewLine
ribbonXML = ribbonXML + "          <mso:button id='runReport' label='PTO' "   & vbNewLine
ribbonXML = ribbonXML + "imageMso='AppointmentColor3'      onAction='GenReport'/>" & vbNewLine
ribbonXML = ribbonXML + "        </mso:group>" & vbNewLine
ribbonXML = ribbonXML + "      </mso:tab>" & vbNewLine
ribbonXML = ribbonXML + "    </mso:tabs>" & vbNewLine
ribbonXML = ribbonXML + "  </mso:ribbon>" & vbNewLine
ribbonXML = ribbonXML + "</mso:customUI>"

ribbonXML = Replace(ribbonXML, """", "")

Open path & fileName For Output Access Write As hFile
Print #hFile, ribbonXML
Close hFile

End Sub

Sub ClearCustRibbon()

Dim hFile As Long
Dim path As String, fileName As String, ribbonXML As String, user As String

hFile = FreeFile
user = Environ("Username")
path = "C:\Users\" & user & "\AppData\Local\Microsoft\Office\"
fileName = "Excel.officeUI"

ribbonXML = "<mso:customUI           xmlns:mso=""http://schemas.Microsoft.com/office/2009/07/customui"">" & _
"<mso:ribbon></mso:ribbon></mso:customUI>"

Open path & fileName For Output Access Write As hFile
Print #hFile, ribbonXML
Close hFile

End Sub

WookbookのLoadCustRibbonサブを開き、ThisWorkbookコードファイルのBefore_CloseイベントでClearCustRibbonサブを呼び出します。

25
Roi-Kyi Bryant

私は怒って苦労しましたが、これは実際には正しい答えです。それが価値があるものとして、私が逃したのはこれでした:

  1. 他の人が言うように、VBAを使用してCustomUIリボンを作成することはできませんしかし、、あなたはする必要はありません!
  2. アイデアは、Excelの[ファイル]> [オプション]> [リボンのカスタマイズ]を使用してxmlリボンコードを作成し、リボンを.customUIファイルにエクスポートすることです(xmlが含まれた単なるtxtファイルです)。
  3. 次はトリックです:あなたはincludeあなたの.customUIコードをここで参照するMSツールを使用して、.customUIファイルからコードをコピーすることにより、.xlsmファイル
  4. .xlsmファイルに含まれると、開くたびに、定義したリボンがユーザーのリボンにaddedになりますが、<リボンを使用してくださいstartFromScratch = "false">またはリボンの残りを失います。ブックを終了すると、リボンが削除されます。
  5. ここからは簡単です。リボンを作成し、リボンに固有のxmlコードを.customUIファイルからコピーし、上記のようにラッパーに配置します(... <tabs> your xml </ tabs .. )

ちなみに、Ronのサイトで説明しているページは http://www.rondebruin.nl/win/s2/win002.htm にあります。

そして、リボンのボタンを有効/無効にする方法についての彼の例があります http://www.rondebruin.nl/win/s2/win013.htm

リボンの他のxmlの例については、 http://msdn.Microsoft.com/en-us/library/office/aa338202%28v=office.12%29.aspx も参照してください。

19
Jan Wijninckx

ここでの回答は、カスタムUIエディターの使用に固有のものです。私はその素晴らしいプログラムなしでインターフェースを作成するのにしばらく時間を費やしました。そこで、カスタムUIエディターが必要かどうかを他の誰かが決定できるように、ここでソリューションを文書化しています。

次のマイクロソフトヘルプWebページに遭遇しました- https://msdn.Microsoft.com/en-us/library/office/ff861787.aspx 。これは、インターフェイスを手動でセットアップする方法を示していますが、カスタムアドインコードを指すときに問題が発生しました。

ボタンをカスタムマクロで使用するには、このSO answer- リボンからExcelマクロを呼び出す の説明に従って、.xlamサブルーチン内のマクロを呼び出すようにセットアップします。基本的に、リボンxmlから指定されたモジュールに「control As IRibbonControl」パラメーターを追加する必要があります。また、アドインによってロードされたモジュールを適切に呼び出すために、リボンxmlにonAction = "myaddin!mymodule.mysub"構文が必要です。

これらの手順を使用して、VBAがアドインと共にExcelに読み込まれるときにカスタムタブが読み込まれるExcelアドイン(.xlamファイル)を作成できました。ボタンは、アドインからコードを実行し、アドインを削除します。

16
Jomtung

Roi-Kyi Bryantの回答に加えて、このコードはExcel 2010で完全に機能します。ALT+ F11を押すと、VBAエディターがポップアップ表示されます。左側のThisWorkbookをダブルクリックして、次のコードを貼り付けます。

Private Sub Workbook_Activate()

Dim hFile As Long
Dim path As String, fileName As String, ribbonXML As String, user As String

hFile = FreeFile
user = Environ("Username")
path = "C:\Users\" & user & "\AppData\Local\Microsoft\Office\"
fileName = "Excel.officeUI"

ribbonXML = "<mso:customUI      xmlns:mso='http://schemas.Microsoft.com/office/2009/07/customui'>" & vbNewLine
ribbonXML = ribbonXML + "  <mso:ribbon>" & vbNewLine
ribbonXML = ribbonXML + "    <mso:qat/>" & vbNewLine
ribbonXML = ribbonXML + "    <mso:tabs>" & vbNewLine
ribbonXML = ribbonXML + "      <mso:tab id='reportTab' label='My Actions' insertBeforeQ='mso:TabFormat'>" & vbNewLine
ribbonXML = ribbonXML + "        <mso:group id='reportGroup' label='Reports' autoScale='true'>" & vbNewLine
ribbonXML = ribbonXML + "          <mso:button id='runReport' label='Trim' " & vbNewLine
ribbonXML = ribbonXML + "imageMso='AppointmentColor3'      onAction='TrimSelection'/>" & vbNewLine
ribbonXML = ribbonXML + "        </mso:group>" & vbNewLine
ribbonXML = ribbonXML + "      </mso:tab>" & vbNewLine
ribbonXML = ribbonXML + "    </mso:tabs>" & vbNewLine
ribbonXML = ribbonXML + "  </mso:ribbon>" & vbNewLine
ribbonXML = ribbonXML + "</mso:customUI>"

ribbonXML = Replace(ribbonXML, """", "")

Open path & fileName For Output Access Write As hFile
Print #hFile, ribbonXML
Close hFile

End Sub

Private Sub Workbook_Deactivate()

Dim hFile As Long
Dim path As String, fileName As String, ribbonXML As String, user As String

hFile = FreeFile
user = Environ("Username")
path = "C:\Users\" & user & "\AppData\Local\Microsoft\Office\"
fileName = "Excel.officeUI"

ribbonXML = "<mso:customUI           xmlns:mso=""http://schemas.Microsoft.com/office/2009/07/customui"">" & _
"<mso:ribbon></mso:ribbon></mso:customUI>"

Open path & fileName For Output Access Write As hFile
Print #hFile, ribbonXML
Close hFile

End Sub

ブックを保存して再度開くことを忘れないでください。お役に立てれば!

7
Erikas

multipleアドインがリボンを変更しようとしたときに、Roi-Kyi Bryantのソリューションで問題が発生しました。また、職場のコンピューターに管理者アクセス権がないため、Custom UI Editorをインストールできませんでした。したがって、あなたが私と同じ船に乗っている場合、Excelのみを使用してリボンをカスタマイズするための代替exampleがあります。注、私のソリューションは Microsoftガイド から派生しています。


  1. リボンをカスタマイズするExcelファイルを作成します。私の場合、2つの.xlamファイル、Chart Tools.xlamおよびPriveleged UDFs.xlamを作成し、複数のアドインがリボンと対話する方法を示しました。
  2. 作成したばかりのeachファイルに対して、任意のフォルダー名でフォルダーを作成します。
  3. 作成した各フォルダー内に、customUIおよび_relsフォルダーを追加します。
  4. customUIフォルダー内で、customUI.xmlファイルを作成します。 customUI.xmlファイルには、Excelファイルがリボンとどのようにやり取りするかが詳しく説明されています。 Microsoftガイドのパート2 は、customUI.xmlファイルの要素をカバーしています。

customUI.xmlChart Tools.xlamファイルは次のようになります

<customUI xmlns="http://schemas.Microsoft.com/office/2006/01/customui" xmlns:x="sao">
  <ribbon>
    <tabs>
      <tab idQ="x:chartToolsTab" label="Chart Tools">
        <group id="relativeChartMovementGroup" label="Relative Chart Movement" >
            <button id="moveChartWithRelativeLinksButton" label="Copy and Move" imageMso="ResultsPaneStartFindAndReplace" onAction="MoveChartWithRelativeLinksCallBack" visible="true" size="normal"/>
            <button id="moveChartToManySheetsWithRelativeLinksButton" label="Copy and Distribute" imageMso="OutlineDemoteToBodyText" onAction="MoveChartToManySheetsWithRelativeLinksCallBack" visible="true" size="normal"/>
        </group >
        <group id="chartDeletionGroup" label="Chart Deletion">
            <button id="deleteAllChartsInWorkbookSharingAnAddressButton" label="Delete Charts" imageMso="CancelRequest" onAction="DeleteAllChartsInWorkbookSharingAnAddressCallBack" visible="true" size="normal"/>
        </group>
      </tab>
    </tabs>
  </ribbon>
</customUI>

customUI.xmlPriveleged UDFs.xlamファイルは次のようになります

<customUI xmlns="http://schemas.Microsoft.com/office/2006/01/customui" xmlns:x="sao">
  <ribbon>
    <tabs>
      <tab idQ="x:privelgedUDFsTab" label="Privelged UDFs">
        <group id="privelgedUDFsGroup" label="Toggle" >
            <button id="initialisePrivelegedUDFsButton" label="Activate" imageMso="TagMarkComplete" onAction="InitialisePrivelegedUDFsCallBack" visible="true" size="normal"/>
            <button id="deInitialisePrivelegedUDFsButton" label="De-Activate" imageMso="CancelRequest" onAction="DeInitialisePrivelegedUDFsCallBack" visible="true" size="normal"/>
        </group >
      </tab>
    </tabs>
  </ribbon>
</customUI>
  1. 手順1で作成したeachファイルの場合、ファイル名の末尾に.Zipを付けます。私の場合、名前をChart Tools.xlamからChart Tools.xlam.Zipに、Privelged UDFs.xlamPriveleged UDFs.xlam.Zipに変更しました。
  2. .Zipファイルを開き、_relsフォルダーに移動します。 .relsファイルをステップ3で作成した_relsフォルダーにコピーします。テキストエディターでeach.relsファイルを編集します。 Microsoftガイド から

最後の<Relationship>要素と閉じている<Relationships>要素の間に、ドキュメントファイルとカスタマイズファイルの間に関係を作成する行を追加します。フォルダー名とファイル名を正しく指定してください。

<Relationship Type="http://schemas.Microsoft.com/office/2006/
  relationships/ui/extensibility" Target="/customUI/customUI.xml" 
  Id="customUIRelID" />

.relsChart Tools.xlamファイルは次のようになります

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
        <Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties" Target="docProps/app.xml"/><Relationship Id="rId2" Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" Target="docProps/core.xml"/>
        <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="xl/workbook.xml"/>
        <Relationship Type="http://schemas.Microsoft.com/office/2006/relationships/ui/extensibility" Target="/customUI/customUI.xml" Id="chartToolsCustomUIRel" />
    </Relationships>

.relsPriveleged UDFsファイルは次のようになります。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
        <Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties" Target="docProps/app.xml"/><Relationship Id="rId2" Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" Target="docProps/core.xml"/>
        <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="xl/workbook.xml"/>
        <Relationship Type="http://schemas.Microsoft.com/office/2006/relationships/ui/extensibility" Target="/customUI/customUI.xml" Id="privelegedUDFsCustomUIRel" />
    </Relationships>
  1. .relsファイルの.Zipファイルを、前の手順で変更した.relsファイル/ファイルに置き換えます。
  2. 作成した.customUIフォルダをコピーして、.Zipファイル/ファイルのホームディレクトリに貼り付けます。
  3. 作成したExcelファイルから.Zipファイル拡張子を削除します
  4. .xlamファイルを作成した場合は、Excelに戻って、Excelアドインに追加します。
  5. 該当する場合、各アドインでcallbacksを作成します。ステップ4では、ボタンにonActionキーワードがあります。 onActionキーワードは、含む要素がトリガーされると、ExcelアプリケーションがonActionキーワードの直後に引用符で囲まれたサブルーチンをトリガーすることを示します。これはcallbackとして知られています。 .xlamファイルには、コールバックサブルーチンを含めたCallBacksというモジュールがあります。

CallBacks Module

Chart Tools.xlamCallBacksモジュールは次のようになります

Option Explicit

Public Sub MoveChartWithRelativeLinksCallBack(ByRef control As IRibbonControl)
  MoveChartWithRelativeLinks
End Sub

Public Sub MoveChartToManySheetsWithRelativeLinksCallBack(ByRef control As IRibbonControl)
  MoveChartToManySheetsWithRelativeLinks
End Sub

Public Sub DeleteAllChartsInWorkbookSharingAnAddressCallBack(ByRef control As IRibbonControl)
  DeleteAllChartsInWorkbookSharingAnAddress
End Sub

Priveleged UDFs.xlamCallBacksモジュールは次のようになります

オプション明示

Public Sub InitialisePrivelegedUDFsCallBack(ByRef control As IRibbonControl)
  ThisWorkbook.InitialisePrivelegedUDFs
End Sub

Public Sub DeInitialisePrivelegedUDFsCallBack(ByRef control As IRibbonControl)
  ThisWorkbook.DeInitialisePrivelegedUDFs
End Sub

異なる要素には、異なるコールバックサブルーチンシグネチャがあります。ボタンの場合、必須のサブルーチンパラメーターはByRef control As IRibbonControlです。必要なコールバック署名に準拠していない場合、VBAプロジェクトのコンパイル中にエラーが表示されます。 Microsoftガイドのパート は、すべてのコールバック署名を定義します。


完成した例は次のようになります

Finished Product


最後のヒント

  1. アドインでリボン要素を共有する場合は、idQおよびxlmns:キーワードを使用します。私の例では、Chart Tools.xlamPriveleged UDFs.xlamは両方とも、idQx:chartToolsTabx:privelgedUDFsTabに等しい要素にアクセスできます。これが機能するには、x:が必要です。また、customUI.xmlファイルの最初の行で<customUI xmlns="http://schemas.Microsoft.com/office/2006/01/customui" xmlns:x="sao">という名前空間を定義しました。 Microsoftガイド のセクションFluent UIをカスタマイズする2つの方法に、詳細が記載されています。
  2. アドインがExcelに付属のリボン要素にアクセスするようにするには、isMSOキーワードを使用します。 Microsoftガイド のセクションFluent UIをカスタマイズする2つの方法に、詳細が記載されています。
3
Joshua Daly