Zum Inhalt springen

powerPoint VBA motion


forTeesSake

Empfohlene Beiträge

hi und hallo,

habe folgendes anliegen in Power Point 2003:

- ich habe ein rechteck

- beim klick auf das rechteck soll dieses sich um 200 pixel nach rechts bewegen (als beispiel)

- es soll aber dorthin "fahren", also nicht springen (das wäre ja easy)

- das ganze muss über VBA geregelt werden, weil später daraus eine viel komplexere dynamiche anwendung werden soll.

ich habe lange im netz zum thema gesucht, aber nichts befriedigendes gefunden.

nein halt! ich habe doch was gefunden aber ich kapier da was nicht.

ich poste mal den kompletten code:


Sub ZoomToZoomer(sh As Shape)

Const speed = 20

Dim l As Integer, t As Integer, h As Integer, w As Integer, pos As Variant

On Error Resume Next

' see if we have the basic position

pos = Split(sh.AlternativeText)

If UBound(pos) <> 4 Then

    ' we haven't top,left,height, width - save it

    sh.AlternativeText = sh.Left & " " & sh.Top & " " & sh.Height & " " & sh.Width

    If sh.HasTextFrame Then sh.AlternativeText = sh.AlternativeText & " " & sh.TextFrame.TextRange.Font.Size

    pos = Split(sh.AlternativeText)

End If

'is shape in basic position

If pos(0) = sh.Left Then

    With ActivePresentation.SlideShowWindow.View.Slide

        l = .Shapes("Zoomer").Left

        If Err.Number <> 0 Then

            ' has no Zoomer shape, create one

            Err.Clear

            .Shapes.AddShape(msoShapeRectangle, 408, 102, 306, 288).Name = "Zoomer"

            .Shapes("Zoomer").ZOrder msoSendToBack

        End If

        l = (.Shapes("Zoomer").Left - sh.Left) / speed

        t = (.Shapes("Zoomer").Top - sh.Top) / speed

        h = (.Shapes("Zoomer").Height - sh.Height) / speed

        w = (.Shapes("Zoomer").Width - sh.Width) / speed

        On Error GoTo 0

        sh.ZOrder msoBringToFront

        For i = 1 To speed

            sh.Left = sh.Left + l

            sh.Top = sh.Top + t

            sh.Height = sh.Height + h

            sh.Width = sh.Width + w

            If sh.HasTextFrame Then sh.TextFrame.TextRange.Font.Size = sh.TextFrame.TextRange.Font.Size + 1

            DoEvents

        Next

        sh.Left = .Shapes("Zoomer").Left

        sh.Top = .Shapes("Zoomer").Top

        sh.Height = .Shapes("Zoomer").Height

        sh.Width = .Shapes("Zoomer").Width

    End With

Else

    'put shape to basic position

    sh.Left = pos(0)

    sh.Top = pos(1)

    sh.Height = pos(2)

    sh.Width = pos(3)

    If sh.HasTextFrame Then sh.TextFrame.TextRange.Font.Size = pos(4)

End If

End Sub

im endeffekt passiert hier folgendes: - beim klick auf das übergebene "sh" object, das ein shape ist fährt dieses auf die position des "zoomer" shapes und skaliert sich dabei. - also im grunde genau das was ich will. - man kann sogar die geschwindigkeit der bewegung einstellen. was ich aber nicht verstehe: wo findet denn die zeitliche verzögerung, also genau das "fahren" statt? die animation an sich ist ja hier zu finden

For i = 1 To speed

            sh.Left = sh.Left + l

            sh.Top = sh.Top + t

            sh.Height = sh.Height + h

            sh.Width = sh.Width + w

            If sh.HasTextFrame Then sh.TextFrame.TextRange.Font.Size = sh.TextFrame.TextRange.Font.Size + 1

            DoEvents

        Next

aber das alleine in meine anwendung angebaut lässt natürlich mein rechteck auch nur wieder springen...

wäre sehr glücklich über jeden anstoss

Link zu diesem Kommentar
Auf anderen Seiten teilen

oder vielleicht gibt es eine möglichkeit über einen timer die for schleife zu verlangsamen. aber ein timer steuerelement scheint es in vba ja nicht zu geben oder?

ich stelle mir das so for


for i = 1 to targetX

    thisX = thisX + 1

    wait(200) 'hier 200mx warten um motion effekt zu simulieren

next

zwar sehr dirty wie ich meine aber das würde es auch tun.

weiss da jemand was?

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 Wochen später...

hier nun die (etwas verwirrende aber funktionierende) lösung

der "nicht-vba-teil"

- man baut sich ein menü aus mehreren objekten

- man gruppiert das menu

- man baut zwei buttons einen für rein, einen für rausfahren

- man belegt die buttons mit triggern

- und legt darauf benutzerdefinierte animationen für das menü

der vba teil

- man baut sich einen eventhandler der beim folienwechsel das gruppierte menü egal wohin bewegt.

also ich hab halt gesagt "gruppe1" (mein gruppiertes menü), bitte beim folienwechsel auf x = -irgendwas springen.

lustigerweise ist der "irgendwas" wert tatsächlich egal. kann bei -1 oder +5 liegen. wurscht. die benutzerdefinierte animation merkt offensichtlich dass das objekt angefasst wurde und startet somit wieder im urzustand...

hoffe es bringt jemand anderem vielleicht auch was. aber nun zu meinem nächsten problem:

Link zu diesem Kommentar
Auf anderen Seiten teilen

ich poste das mal hier um das forum nicht mit ppt threads zu überschwemmen.

ich möchte eine folie von einer präsentation in die andere kopieren.

eigentlich kein problem, aber leider haben meine folien "layouts".

viele unterschiedliche folien haben unterschiedliche "layout" vorgaben, also grössen, farben, positionen.

wenn ich nun eine folie in eine andere präsentation kopiere verliert sie das layout.

das layout wird zwar mitkopiert aber ich muss es der folie neu zuweisen.

auch kein prob im grunde....aaaaaabbberrrr:

ein benutzer soll sich aus der quellfolie per vba folien raussuchen und diese als neue zusammenstellung in einer neuen präsentation speichern können.

da aber die layout vorgaben verloren gehen sieht dann alles mistig aus.

und ich finde nichts, das das layout fest an die folie bindet

hat da jemand ne idee?

ich habe tatsächlich eine idee im kopf, aber die ist seeeeeehr unfein und benötigt angaben in z.b. einer xml-datei die ausgelesen werden muss.

vielleicht gibts irgendeinen trick oder so..

*verzweifelt an powerpoint vba*

Link zu diesem Kommentar
Auf anderen Seiten teilen

so, nach einigem weiterforschen und rumkrepieren habe ich mir einen workaround ausgedacht.

für die dies interessiert:

- anstatt eine neue präsentation zu erzeugen wird die aktuelle präsentation unter neuem namen gespeichert.

- dann werden alle unbenötigten folien rausgeworfen

- somit bleiben alle masterfolien, farbschemata, layouts und und und erhalten.

easy peasy..freu

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 Wochen später...

hi und hallo,

ich habe eine powerpointpräsentation die aus 30 folien besteht.

über ein vba menü lasse ich einem benutzer eine neue präsentation aus den vorhandenen folien zusammenstellen.

ich habe ein (simuliertes) menü, das aus so vielen einträgen (= rechtecken) besteht wie der benutzer folien ausgewählt hat. diese menüeintrage werden am ende der automatischen generierung zu einer gruppe namens "groupMenu" zusammengefügt.

es gibt für dieses menü 2 generierte trigger, die den effekt einfliegen/ausfliegen besitzen, damit der benutzer später das menü ein bzw. ausfahren kann.

damit das menü wenn es auf, sagen wir seite 1 ausgefahren, ist und der benutzer auf seite 2 gewechselt ist, beim zurückkehren auf seite 1 wieder eingefahren ist, habe ich folgenden code auf die gruppe "groupMenu" gelegt:


Sub Auto_NextSlide(Index As Long)


    Dim iCount

    Dim slideNumber


    For slideNumber = 1 To ActivePresentation.Slides.Count

        With ActivePresentation.Slides(slideNumber).Shapes("groupMenu").AnimationSettings

            .Animate = msoTrue 'DAS ERZEUGT DEN FEHLER

            .EntryEffect = ppEffectNone 'DAS ERZEUGT DEN FEHLER

            End With

    Next

End Sub

bei jedem seitenwechsel wir dann das menü auf jeder folie erst einmal wieder "ausgeblendet"

das funktioniert hervorragend.

nun das problem:

auf manchen folien sind "manuelle" animationen eingefügt. das heisst z.b. reinfliegende wörter, unterstreichungen und hervorhebungen die zeitlich aufeinander abgestimmt sind.

----->und genau diese zeitliche abstimmung geht nach dem ausführen der o.g. animation verloren!!

wenn also auf der folie für manche objekte eine zuordnung in der ERWEITERTEN ZEITACHSEN ANSICHT vorhanden ist, wird diese komplett überschrieben und die animation werden dann nur noch strikt nacheinander ausgeführt.

kann mir irgendwer irgendwie weiterhelfen und mir sagen was ich tun muss, dass die erweiterten zeitachseneinstellungen vorhanden bleiben, obwohl ich die o.g. funktion ausführe?

ich weiss, das ist alles sehr speziell, aber ich kann mir ncht vorstellen dass noch niemand auf dieses problem (oder vllt sogar bug?) gestossen ist...

vielen dank im vorraus

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...