もめんの格闘日記

主にPowerPointを中心としたPCのTips的なものを書いています。

リボン上にストップウォッチ風のものを作る方法

今回はリボンのカスタマイズについて書きます。

どうしても時間を計測する機能が欲しかったので、ストップウォッチ風のリボンのボタンを作ったので、紹介します。

残念ながら時間を随時カウントアップはしません。でも、100分の1秒まで一応測れます。

参考にさせて頂いたサイトは次のサイトさんです。ありがとうございます。

 

見た目は下の感じ。

f:id:momen40:20161113032521j:plain

Startボタンを押すとボタンの表示がStopになります。

Stopボタンを押すと上の時間が更新されます。

リセットを押すと上の時間が0になります。

それでは早速コードを説明します。

(PowerPoint2010で動作確認しています)

 

ストップウォッチ風のリボンのcustom.xml

<?xml version="1.0" encoding="utf-8"?>
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="onLoad">
  <ribbon startFromScratch="false">
    <tabs>
      <tab id="StopWatchTab" label="ストップウォッチ" >
        <group id="StopWatchGroup" label="ストップウォッチ">
         <labelControl id="Label1" getLabel="GetCounterLabel"></labelControl>
          <button id="StartStopButton" getLabel="ChangeName" supertip="スタート/ストップします" size="normal" onAction="Start_Stop" />
          <button id="ResetButton" label="    Reset    " supertip="リセットします"  getEnabled="ButtonEnabled" size="normal" onAction="Reset" />
        </group>
      </tab>
    </tabs>
  </ribbon>
</customUI>

 

onLoadで初期状態を決める関数を定義します。

Start/Stopボタンの表示はgetLabelで宣言した関数により動的に変更することができます。

Startを押した後、時間を測っている間はResetボタンが使用不可になります。ボンタの状態はgetEnabledで宣言した関数によります。

続いてVBAのコードになります。

 

 

ストップウォッチ風のリボンのVBA

Option Explicit

Private myRibbon As IRibbonUI ' リボン
Private Start As Single
Private ElapsedNum As Single '
Private ElapsedStr As String
Private Button As Boolean

Sub onLoad(ribbon As IRibbonUI) ' リボンの初期処理
Button = True
ElapsedStr = "0min00.00sec"
Set myRibbon = ribbon ' リボンの表示を更新できるようにするためにリボンをセットする
myRibbon.Invalidate ' リボンの表示を更新する
End Sub

Sub GetCounterLabel(control As IRibbonControl, ByRef returnedVal)
'経過時間の表示変更
returnedVal = ElapsedStr
End Sub

Sub Start_Stop(control As IRibbonControl) 'Start/Stopボタンの動作
If Button = True Then
  'ボタンがStartの場合
  Start = Timer
  If Not ElapsedNum = 0 Then ElapsedNum = (Timer - Start) + ElapsedNum
  Button = False  'ボタンの表示をStopに変更する
Else
  'ボタンがStopの場合
  ElapsedNum = (Timer - Start) + ElapsedNum
  ElapsedStr = ElapsedNum \ 60 & "min" & Format$(Round(ElapsedNum - (ElapsedNum \ 60) * 60, 2), "00.00") & "sec"
  Button = True 'ボタンの表示をStartに変更する
End If

myRibbon.Invalidate ' リボンの表示を更新する
End Sub

Sub ChangeName(control As IRibbonControl, ByRef label) 'Start/Stopの表示
If Button = True Then
  label = "    Start    "
Else
  label = "    Stop     "
End If
End Sub

Sub ButtonEnabled(control As IRibbonControl, ByRef enabled) 'ResetボタンのON/OFF
'Startボタンが押されるとResetボタンを使用不可にする
enabled = Button
End Sub

Sub Reset(control As IRibbonControl)
'時間の表記と経過時間をリセットする
ElapsedStr = "0min00.00sec"
ElapsedNum = 0
myRibbon.Invalidate
End Sub

 

見にくい。。。

でもコードをVBAに貼り付けてもらえれば、見やすくなると思います。

custom.xmlで宣言した関数名とVBAでの関数名を間違えないようにご注意ください。

ある程度コメントを入れましたが、わからない場合はコメント頂ければと思います。

 

こんなしっかりとしたコードをあげるのは初めてなのでちょっと緊張します。

ちょっとした時間を測る際に是非使ってみて下さい。

では、今回はこれで終わりです。ありがとうございました。