PowerPoint に、形状の情報を提供するマクロがあります。シェイプが選択されていない場合にエラーを回避するには、エラーマスクを挿入します。ただし、これは非常に面倒です。
したがって、たとえば形状が選択されていない場合、ボタンをグレーアウトすることは可能ですか。そうすれば、ユーザーはそれをクリックする機会すらありません。
カスタム UI XML: http://pastebin.com/T6NQ8WF8
PowerPoint に、形状の情報を提供するマクロがあります。シェイプが選択されていない場合にエラーを回避するには、エラーマスクを挿入します。ただし、これは非常に面倒です。
したがって、たとえば形状が選択されていない場合、ボタンをグレーアウトすることは可能ですか。そうすれば、ユーザーはそれをクリックする機会すらありません。
カスタム UI XML: http://pastebin.com/T6NQ8WF8
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 が有効ではありません。ここで編集しました:
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
図形を選択すると、虫めがねアイコンが有効になります。
形状が選択されていない場合、ボタンは無効になります。
最後に、複数の図形が選択されている場合: