0

PowerPoint に、形状の情報を提供するマクロがあります。シェイプが選択されていない場合にエラーを回避するには、エラーマスクを挿入します。ただし、これは非常に面倒です。

したがって、たとえば形状が選択されていない場合、ボタンをグレーアウトすることは可能ですか。そうすれば、ユーザーはそれをクリックする機会すらありません。

カスタム UI XML: http://pastebin.com/T6NQ8WF8

4

1 に答える 1

1

2007 以降のバージョンの PowerPoint を使用していると仮定すると、リボンのコントロールやボタンなどを操作する唯一の方法は、リボンの拡張機能を使用することです。.Enabled実行時に vba フックを使用してこれを行うことは可能ですが、VBA を使用してコントロールや.Visibleプロパティを操作できた以前のバージョンの PowerPoint よりもはるかに困難です。

実行時にリボンをカスタマイズするためにリボンの拡張機能を使用する例を次に示します。ご覧のとおり、簡単ではありません。これについては、以下のオプション 2 で説明します。

.Typeこの場合、 のプロパティを使用して簡単に識別できるエラー状態がありますSelection.ShapeRange。実行時にこのボタンを条件付きで無効にしようとすること (以下のオプション 2) は、おそらく価値があるよりも面倒だと思います。

アップデート

効果のないすべてのボタンを灰色にする設定はありますか。

いいえ。マクロの結果が何も実行されない場合でも、マクロは「効果」です。あなたが求めているのは、マクロをコンパイルして解釈し、そのマクロが「アクション」を実行するかどうかを判断し (たとえば、形状を操作する、プロパティの割り当てを変更するなど)、この決定に基づいてボタンを無効にする設定があるかどうかです。 . そのような設定はありません。

オプション 1 -- MsgBox を表示しない。選択が無効な場合はアクションを実行しない

コードをクリーンアップするためにいくつかの編集を行い、そのエラーを回避するためのより良い方法を使用します。

Sub Infos()

   Dim n as String
   Dim w as String
   Dim h as String
   Dim l as String
   Dim T as String

   With ActiveWindow.Selection.ShapeRange
   Select Case .Type
        Case 0
            'MsgBox ("No shape selected.")
            Exit Sub
        Case Else
            n = .Name
            w = .Width
            h = .Height
            l = .Left
            T = .Top

            MsgBox "Name: " & n & Chr$(CharCode:=13) & "Länge: " & w & _
                   Chr$(CharCode:=13) & "Höhe: " & h & Chr$(CharCode:=13) & _
                   "Linkeposition: " & l & Chr$(CharCode:=13) & "Höhenposition: " & T
    End Select
End Sub

オプション 2 -- アプリケーション イベント ハンドラを使用し、実行時にリボンを操作する

これは簡単ではないことを述べました。サンプル ファイルをGoogle Docs Presentation1.pptmにアップロードしました。これで始められるはずです。この方法がいかに難しいかお分かりいただけると思います。PPAM/アドイン ファイルを作成している場合は、さらに考慮すべき事項や複雑な問題が発生する可能性があります。幸運を!

コードにいくつかのエラーがあります。

1. Custom UI Editor でチェックインすると、XML が有効ではありません。ここで編集しました:

http://pastebin.com/SpG0Rtqq

2.Infosマクロにエラーが含まれています。End Withまた、ステートメントを省略します。またn、選択が複数の形状の場合、割り当ては失敗します (残りの部分は奇妙な結果を生成します)。次の方法で修正できます。

n = IIf(.ShapeRange.Count > 1, "Multiple shapes", .ShapeRange(1).Name)
w = IIf(.ShapeRange.Count > 1, "Multiple shapes", .ShapeRange(1).Width)
h = IIf(.ShapeRange.Count > 1, "Multiple shapes", .ShapeRange(1).Height)
l = IIf(.ShapeRange.Count > 1, "Multiple shapes", .ShapeRange(1).Left)
T = IIf(.ShapeRange.Count > 1, "Multiple shapes", .ShapeRange(1).Top)

これらのコンポーネントを修正したら...

mod_EventHandlerこのコードを含むというモジュールを追加します。これにより、アプリケーション イベント ハンドラ クラス オブジェクトが作成されますcEventClass

Option Explicit
Public cPPTObject As New cEventClass
Public TrapFlag As Boolean

Sub TrapEvents()
'Creates an instance of the application event handler
If TrapFlag = True Then
   MsgBox "Relax, my friend, the EventHandler is already active.", vbInformation + vbOKOnly, "PowerPoint Event Handler Example"
   Exit Sub
End If
   Set cPPTObject.PPTEvent = Application
   TrapFlag = True
End Sub

Sub ReleaseTrap()
If TrapFlag = True Then
   Set cPPTObject.PPTEvent = Nothing
   Set cPPTObject = Nothing
   TrapFlag = False
End If
End Sub

このクラス オブジェクトが必要なので、クラス モジュールを PowerPoint ファイルに追加しますcEventClass。このモジュールでは、このコードを以下に配置します。このコードは、リボンを強制的に更新します。このプロシージャは暗黙的にEnabledBtInfoサブルーチンを呼び出し、現在の選択が Shape(s) であるかどうかをテストします。

Option Explicit
Public WithEvents PPTEvent As Application
Private Sub PPTEvent_WindowSelectionChange(ByVal Sel As Selection)
    'Force refresh of the "btInfo" button:
    RefreshRibbon "btInfo"
End Sub

最後に、ボタンの表示/有効化を制御するこのコードを含む別の標準コード モジュールです。EnabledBtInfoはこのボタンの VBA フックであり、リボンを更新する前に、Selection が形状かどうかをテストすることに注意してください。

Option Explicit
Public Rib As IRibbonUI
Public xmlID As String

'Callback for customUI.onLoad
Sub RibbonOnLoad(ribbon As IRibbonUI)
    TrapEvents  'instantiate the event handler
    Set Rib = ribbon
End Sub

Sub EnabledBtInfo(control As IRibbonControl, ByRef returnedVal)
    'Check the ActiveWindow.Selection.ShapeRange
    returnedVal = (ActiveWindow.Selection.Type = ppSelectionShapes)
    Call RefreshRibbon(control.Id)
End Sub

Sub RefreshRibbon(Id As String)
    xmlID = Id
    If Rib Is Nothing Then
        MsgBox "Error, Save/Restart your Presentation"
    Else
        Rib.Invalidate
    End If
End Sub

図形を選択すると、虫めがねアイコンが有効になります。

ここに画像の説明を入力

形状が選択されていない場合、ボタンは無効になります。

ここに画像の説明を入力

最後に、複数の図形が選択されている場合:

ここに画像の説明を入力

于 2013-08-19T14:16:15.187 に答える