2011-07-24 21 views
1

私は最初のPowerpoint 2007マクロを作成していますが、それに問題があり、次のスライドに移動させません。私はスライドショーを終了するためにESCAPEを押すことができますが、スペースバーなどを押すと次のスライドに進むことはできません。しばらくすると、ちょうどクラッシュします。私はC++/Javaのバックグラウンドから来ているので、私は欠けている基本的なものだと思う。Powerpointマクロ - カウンターの基本的な問題

基本的には、特定の日付から日/分/秒をカウントするカウンタスライドを実行しようとしています。スライドが読み込まれると、その日からどれくらいの時間が実際に表示されるようにしたいのですか?私は時間を更新するためにうまく動作する無限のループに入れましたが、次のスライドに進むことはできません。

は、ここに私のコードです:

Sub OnSlideShowPageChange(ByVal SSW As SlideShowWindow) 
    'If SSW.View.CurrentShowPosition = 3 Then 
    Do While SSW.View.CurrentShowPosition = 3 ' infinite loop 
     Dim currentSlide As Integer 
     currentSlide = SSW.View.CurrentShowPosition 

     Dim startDate As Date 
     Dim currentDate As Date 
     Dim sngDiff As Single 
     Dim lngDays As Long 
     Dim lngHours As Long 
     Dim lngMinutes As Long 
     Dim lngSeconds As Long 

     startDate = #7/22/2011 2:00:00 PM# 
     currentDate = Now 

     sngDiff = currentDate - startDate 
     lngDays = CLng(sngDiff) 
     sngDiff = sngDiff - lngDays 
     lngHours = Hour(sngDiff) 
     lngMinutes = Minute(sngDiff) 
     lngSeconds = Second(sngDiff) 

     With ActivePresentation.Slides(currentSlide) 
      With .Shapes(2) 
      .TextFrame.TextRange.Text = "It has been:" & lngDays & " Days " & lngHours & " hours " & lngMinutes & " minutes " & lngSeconds & " Seconds" 
      End With 
     End With 

    DoEvents 
    Loop 
End Sub 

私はこの無限ループを停止するにはクリックボタンのいくつかの並べ替えをリッスンする必要がありますか、または私はこれをどのように行うのですか?

ありがとうございました。

答えて

0

ユーザーフォームは、VBAエディタで追加するものです。それはあなたが通常はダイアログボックスと考えるものですが、フォームは他のものに使うことができ、見えるようにする必要もありません。それは我々がここでやろうとしているものです:

Option Explicit 
Public bFormCodeRunning As Boolean 

Sub FormDemo() 

' Set a flag to let us know the code in the form 
' is running 
bFormCodeRunning = True 

' "show" the form 
UserForm1.Show vbModeless 


End Sub 

Sub KillForm() 
' call this at some other point in the presentation 
' when you're sure you're done running the form code 

If Not bFormCodeRunning Then 
    Unload UserForm1 
End If 

' You could actually call this from your slide change event handler 

End Sub 

[挿入、メニューからユーザーフォームが新しいフォームを追加します。ダブルクリックしてコードを表示し、次のコードを追加してください:

Private Sub UserForm_Activate() 

    ' Don't show my face 
    Me.hide 
    DoEvents 

    ' prove that the form's loaded 
    MsgBox "I'm well-formed" 

    DoEvents 
    ' and put your other code here 

    ' and when the code's done, flag it 
    bFormCodeRunning = False 

End Sub 
0

VBAの文脈における時間遅延を行うために、あなたのコードになるようform_timerオブジェクトを使用することは通常より良いですがあります

If SSW.View.CurrentShowPosition = 3 Then 
    Me.TimerInterval = 1000 
Else 
    Me.TimerInterval = 0 
End If 

または類似のものを。そして、フォームのタイマーコードであなたの時計の更新コード

Private Sub Form_Timer() 
// Your clock update code here 
End Sub 

を持っている私は、私は少しさびが、私はこれが役に立てば幸いので、任意のVBAをやったので、それは年をされています。一般的にスレッドをスレッド化するためのループではなくタイマーを使用するので、VBAはそれらにうまく対処できません。

0

問題は、あなたのルーチンがアプリを「所有している」ということです。それが終了するまで、あなたは手動で何かをすることはできません(すなわち、次のスライドに進む)。

フォームにタイマーを使用するかどうかにかかわらず、タイマーコントロールはVBAと同じようにVBAに同梱されていないため、フォームがあなたの解決策である可能性があります。

イベントハンドラにモードをロードしてから終了します。

フォーム内のコードは、スライドや他のどのようなものにも対応できます。 メインアプリケーションの速度を落とさない程度にDoEventsを含めますが、フォームのコードはメインアプリケーションの動作とは独立して動作します。

フォームを表示する必要はありません。

+0

私は昨日からこれらのマクロを学習し始めました。これらのフォームの使い方を私に見せてもらえますか?私はまだVBAの用語に精通していない。フォームは問題のスライドに貼り付けた「シェイプ」のタイプですか、それともマルコ自体に付けられた名前ですか? – eoinzy