Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Endlosschleife mittels VBA

105 views
Skip to first unread message

Norbert Harz

unread,
May 14, 2002, 7:13:17 AM5/14/02
to
Hallo allerseits,
ich habe folgendes vor:

(PowerPoint 97)

VBA-QuellCode:

Sub Test()
Dim i As Integer, maxI As Integer
Dim dauer(1 To 10) As Integer

'Anzahl Bilder hier
maxI = 3
Do
For i = 1 To maxI
dauer(i) = Int((30 * Rnd) + 1) 'Zufallszahl 1 bis 30
ActiveWindow.View.GotoSlide Index:=i
With ActiveWindow.Selection.SlideRange.SlideShowTransition
.EntryEffect = ppEffectNone
.AdvanceOnClick = msoFalse
.AdvanceOnTime = msoTrue
.AdvanceTime = dauer(i)
.SoundEffect.Type = ppSoundNone
End With
Next i
With ActivePresentation.SlideShowSettings
.Run
End With
Loop Until solange bis ich ESCAPE drücke ...
End Sub

Ich möchte die Schleife solange durchlaufen lassen, bis jemand ESC
drückt.
Leider sind alle meine Abfragen nicht funktionsfähig.
Was kann ich bei Do Until einsetzen??

Ich hab schon mitbekommen, daß Run die Anzeige startet und bei ESC
wieder
unterbrochen wird.
Kann man die Folien anders aufrufen?
Ich will letztendlich 3 (oder mehr) Folien in einer Endlosschleife per
Zufallszeit anziegen. Die Zufallszeiten sollen bei jedem Durchlauf neu
generiert werden.

Vielleicht hat ja jemand eine Idee...

Schönen Dank für Eure Hilfe,
Norbert

--
mit freundlichen Gruessen / kind regards
Norbert Harz

--------------------------------------------
Norbert Harz (Developer/Programmer)
Harz - Data
Kastanienallee 12
10435 Berlin
Fon: 0160 351 90 32
Fon: 030 440 374 09
Fax: 030 440 374 04

mailto:nh...@norbert-harz.de
www: http://www.norbert-harz.de/
PGP: http://www.norbert-harz.de/pgp.htm
--------------------------------------------

Hans Hofmann

unread,
May 15, 2002, 5:09:03 AM5/15/02
to
Norbert Harz <nh...@norbert-harz.de> wrote:
Dear Developer/Programmer,

>ich habe folgendes vor:
>
>(PowerPoint 97)
>
>VBA-QuellCode:
Du mußt doch nur die zufällig generierte Dauer aufsummieren.
Einen Timer auf die Durchlaufzeit setzen und dann die Präsentation neu ausstatten
und wieder anstoßen. Es wird ja wohl nicht auch die paar Millisec ankommen?


Ansonsten Eventhandling initialisieren und nach der letzten Folie reagieren...


Gruß HW
--
__________________________________________________________
News suchen, lesen, schreiben mit http://newsgroups.web.de

Norbert Harz

unread,
May 15, 2002, 7:42:52 AM5/15/02
to
Hallo Hans Hofmann,


Hans Hofmann <ha...@chefmail.de> wrote:
>Du mußt doch nur die zufällig generierte Dauer aufsummieren.
>Einen Timer auf die Durchlaufzeit setzen und dann die Präsentation neu
ausstatten
>und wieder anstoßen. Es wird ja wohl nicht auch die paar Millisec ankommen?
>
>
>Ansonsten Eventhandling initialisieren und nach der letzten Folie reagieren...


Hmm..
Sowas hab ich mir schon gedacht. Nur leider funktioniert in PowerPoint so fast
garnichts, was ich aus Word oder Excel kenne.
Wie kann ich zum Beispiel rauskriegen, wann die letzte Folie zu Ende ist. Welche
Events kann man dafür verwenden?
Hab hier schon gelesen, daß es im Prinzip nur Auto_Open und Auto_Close gibt. Die
taugen ja nicht so richtig.


Fragen über Fragen...
Hab mich leider noch nie mit PowerPoint VBA befaßt...


Schöne Grüße,
Norbert Harz

Norbert Harz

unread,
May 15, 2002, 8:18:33 AM5/15/02
to
Hallo ...


will Euch meine Lösung nicht vorenthalten. Sie ist nicht besonderes schön, aber
sie geht.
Das einzige was ich noch nicht herausbekommen habe, wie man das ganze sauber
abbrechen kann. Geht mommentan nur mit <Strg> + <Pause> ....


Code:
Option Explicit


Public Const PAUSE_1SEC As Long = 1000
Public Const PAUSE_2SEC As Long = 2000
Public Const PAUSE_10SEC As Long = 10000


Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)


Sub Test()
Dim Abbruch As Boolean


With ActivePresentation.SlideShowSettings
.ShowType = ppShowTypeSpeaker
.LoopUntilStopped = msoFalse
.ShowWithNarration = msoFalse
.ShowWithAnimation = msoFalse
.RangeType = ppShowAll
.AdvanceMode = ppSlideShowManualAdvance
.PointerColor.SchemeColor = ppForeground
.Run
End With
Do
SlideShowWindows(Index:=1).View.GotoSlide 2
funcSleep PAUSE_1SEC
SlideShowWindows(Index:=1).View.GotoSlide 3
funcSleep PAUSE_2SEC
SlideShowWindows(Index:=1).View.GotoSlide 1
funcSleep PAUSE_1SEC
Loop Until Abbruch = True
End Sub


Public Function funcSleep(ByRef LWarteZeit As Long)
Sleep LWarteZeit
End Function


Hier jetzt mit Zufallszahlen rumspielen ist dann doch eher leicht ...


Vielleicht hat ja noch jemand eine Idee, wie man das sauber beenden kann, also
Taste drücken oder so ...

Hans Hofmann

unread,
May 15, 2002, 1:35:01 PM5/15/02
to
On 15 May 2002 14:18:33 +0200, Norbert Harz <nh...@bsu-berlin.de>
wrote:

Hallo ...
>
>
>will Euch meine Lösung nicht vorenthalten. Sie ist nicht besonderes schön, aber
>sie geht.

Dann will ich mal meine Idee auscodieren und zur Diskussion stellen:

Sub Dimmer()
Const Dauer = 30


Dim i As Integer, maxI As Integer

ActivePresentation.SlideShowSettings.Run
maxI = ActivePresentation.Slides.Count
On Error GoTo esc
Do
i = 1: Do
ActivePresentation.SlideShowWindow.View.GotoSlide Index:=i
Pausenlänge = Int((Dauer * Rnd) + 1) 'Zufallszahl 1 bis 30
Start = Timer ' Anfangszeit setzen.
Do While Timer < Start + Pausenlänge
DoEvents ' Steuerung an andere Prozesse abgeben.
Loop
i = i + 1
Loop While i <= maxI
Loop Until False
esc:
End Sub

Gruß HW
Ach ja, zu VBA und Powerpoint www.lemitec.de/ppt

Norbert Harz

unread,
May 16, 2002, 8:24:44 AM5/16/02
to
Hallo Hans,

Hans Hofmann schrieb:


> Dann will ich mal meine Idee auscodieren und zur Diskussion stellen:
>
> Sub Dimmer()
> Const Dauer = 30
> Dim i As Integer, maxI As Integer
> ActivePresentation.SlideShowSettings.Run
> maxI = ActivePresentation.Slides.Count
> On Error GoTo esc
> Do
> i = 1: Do
> ActivePresentation.SlideShowWindow.View.GotoSlide Index:=i
> Pausenlänge = Int((Dauer * Rnd) + 1) 'Zufallszahl 1 bis 30
> Start = Timer ' Anfangszeit setzen.
> Do While Timer < Start + Pausenlänge
> DoEvents ' Steuerung an andere Prozesse abgeben.
> Loop
> i = i + 1
> Loop While i <= maxI
> Loop Until False
> esc:
> End Sub
>

OK, klarer Sieger nach Punkten :-)
Mein Problem war offensichtlich, daß ich den Begriff Timer nicht kannte.
Hab jetzt noch die von Dir empfohlene Zeile eingefügt:

Sub Dimmer()
Const Dauer = 30

Dim i As Integer, maxI As Integer, Pausenlänge As Integer, Start As
Long, nointerest As Long


ActivePresentation.SlideShowSettings.Run
maxI = ActivePresentation.Slides.Count
On Error GoTo esc
Do
i = 1: Do
ActivePresentation.SlideShowWindow.View.GotoSlide Index:=i
Pausenlänge = Int((Dauer * Rnd) + 1) 'Zufallszahl 1 bis 30
Start = Timer ' Anfangszeit setzen.
Do While Timer < Start + Pausenlänge
DoEvents ' Steuerung an andere Prozesse abgeben.

nointerest = _

ActivePresentation.SlideShowWindow.View.PresentationElapsedTime


Loop
i = i + 1
Loop While i <= maxI
Loop Until False
esc:
End Sub

Aber warum bricht er dann wirklich schneller ab?
Die Hilfe sagt ja lediglich, daß PresentationElapsedTime die Zeit
liefert,
die Zeit seit Beginn der Präsentation ermittelt wird. Aber Du greifst
doch
nirgends drauf zu??
Grübel ...

Nichts destotrotz ist dieses ein kleine und feine Routine.
Danke,

Hans Hofmann

unread,
May 16, 2002, 11:44:18 AM5/16/02
to
On Thu, 16 May 2002 14:24:44 +0200, Norbert Harz
<nh...@norbert-harz.de> wrote:

Hallo Norbert,
>
>Hans Hofmann schrieb:
8<-------

Der Befehl ist ganz willkürlich gewählt - er soll den Ablauf nicht
stören. Hauptsache es wird ein Zugriff auf ActivePresentation
provoziert, der sofort nach Beendigung der ActivePresentation den On
Error Handler zündet und damit aus der Schleife herausführt. Sonst
stoppt die Prozedur erst wenn der Timer abgelaufen ist. Das könnte
prinzipell erst lange nach dem Beenden der Präsentation geschehen.
Deshalb nointerest (kein Interesse) ;-)...

Viel Spaß
Gruß HW

Norbert Harz

unread,
May 21, 2002, 4:10:10 AM5/21/02
to
Hallo Hans


Hans Hofmann <ha...@chefmail.de> wrote:
>Der Befehl ist ganz willkürlich gewählt - er soll den Ablauf nicht
>stören. Hauptsache es wird ein Zugriff auf ActivePresentation
>provoziert, der sofort nach Beendigung der ActivePresentation den On
>Error Handler zündet und damit aus der Schleife herausführt. Sonst
>stoppt die Prozedur erst wenn der Timer abgelaufen ist. Das könnte
>prinzipell erst lange nach dem Beenden der Präsentation geschehen.
>Deshalb nointerest (kein Interesse) ;-)...
>
>Viel Spaß
>Gruß HW


OK, ich habs verstanden.
Vielen Dank für Deine ausführlich Hlife.
Viele Grüße,

0 new messages