Ändern von Feldinhalten (VBA)

Moderator: ModerationP

Ändern von Feldinhalten (VBA)

Beitragvon BiMeTal » 07. Mär 2019, 08:23

Moinsens,

ich heiße Thomas, bin schon ein IT-Opa (ich fummelte noch mit Akustikkopplern rum) und habe auch auf Office schon so einiges zusammengebastelt. Ich spreche nicht nur MySQL und PHP ;-) sondern auch andere Programmiersprachen, aber eben immer nur als Autodidakt und das fällt mir ab und an auf die Füße. ;-)

So wie jetzt und darum brauche ich mal eine zündende Idee, wie ich folgendes Problem lösen kann:

Ich versuche mittels PowerPoint und MSAccess ein dynamisches Präsentationssystem zusammen zu bauen, dessen Inhalte dann der Öffentlichkeit gezeigt werden. Ziel ist es, das für den, der es befüllen soll möglichst einfach zu machen. Das soll mittels einer Access-Datenbank realisiert werden. Alle dort eingegebenen Daten werden von der PowerPoint-Präsentation abgegriffen und dargestellt. Da wir der "Corporate Identity" unterliegen, gibt es Vorgaben, wie Texte aufbereitet dargestellt werden, wo Bilder platziert werden, alles also sehr überschaubar.

Ich habe ein VBA-Script geschrieben, und eine Präsentation erstellt (noch mit zwei Feldern). Wenn ich das VBA-Script Schritt für Schritt durchlaufen lasse, dann funktioniert auch das Ändern des Textes in der einen Folie. Lasse ich das Script jedoch selbstständig laufen, funktioniert es nicht.

Hier mal das Script (nicht wundern, da sind noch Reste aus meinen Versuchen drin):

Code: Alles auswählen
Public Sub getData()
    On Error GoTo UserForm_Initialize_Err
    Dim cnn As New ADODB.Connection
    Dim rst As New ADODB.Recordset
    Dim count As Integer
    Dim actnum As Integer
    Dim text1 As String
    Dim headline As String
    Dim PPT As PowerPoint.Application
    Dim pres As PowerPoint.Presentation
    Dim newslide As PowerPoint.Slide
    Dim slideCtr As Integer
    Dim tb As PowerPoint.Shape
   
    cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
             "Data Source=c:\dynPres\testdata.accdb"
    rst.Open "SELECT * FROM presentationdata;", _
             cnn, adOpenStatic
    count = rst.RecordCount
    rst.MoveFirst
   

    Set PPT = CreateObject("PowerPoint.Application")
    PPT.Visible = True
    Set pres = PPT.Presentations.Application.ActivePresentation
   
    slideCtr = 1

    Set newslide = pres.Slides(1)
       
    Do
       
        text1 = rst!text1
        headline = rst!headline
       
        Set tb = newslide.Shapes("headline")
        tb.TextFrame.TextRange.Characters.Text = headline
        Set tb = newslide.Shapes("text.full")
        tb.TextFrame.TextRange.Characters.Text = text1
       
        rst.MoveNext
       
        'we need to sleep this a while...
        Sleep 1000  ' to make your macro "sleep" for one second ( 1000 milliseconds )
       
        'actnum = actnum + 1
        'If actnum = count Then
        '    actnum = 0
        '    rst.MoveFirst
        'End If
    Loop Until rst.EOF
   
   
UserForm_Initialize_Exit:
    On Error Resume Next
    rst.Close
    cnn.Close
    Set rst = Nothing
    Set cnn = Nothing
    Exit Sub
UserForm_Initialize_Err:
    MsgBox Err.Number & vbCrLf & Err.Description, vbCritical, "Error!"
    Resume UserForm_Initialize_Exit
End Sub


Ich werde versuchen, die Präsentation anzuhängen, die ich testweise erstellt habe, ich hoffe, es gelingt.

Wie es scheint, ist der Code zu schnell und die Folie wird nicht aktualisiert, darum zeigt sie die gewünschten Inhalte nicht an.

Nun konkret die Frage:
Unter Access gibt es die Funktion ".Refresh" und ".Requery" in beiden Fällen wird der Inhalt des Feldes aktualisiert. ".Requery" fällt in PowerPoint ja weg, bleibt also nur ein ".Refresh" Finde ich in PP aber nicht.

Gibt es einen ähnlichen Befehl, oder würdet Ihr einen anderen Weg gehen, den ich nicht sehe?

Mit Dank,

BiMeTal
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
BiMeTal
Neuling
 
Beiträge: 2
Registriert: 07. Mär 2019, 08:02

Re: Ändern von Feldinhalten (VBA)

Beitragvon Gast » 11. Mär 2019, 14:06

Lasse ich das Script jedoch selbstständig laufen, funktioniert es nicht.

Ist Dir bewusst, dass Du die immer gleichen Shapes immer der gleichen Folie überschreibst? Wenn dann noch der Anfangsinhalt dem letzten des Recordsets entspricht, sieht man dann nicht viel "Bewegung", besser gar keine => Endinhalt = Vorgabeinhalt.

Du solltest daher einen Fortschritt einbauen, also jeweils eine neue Folie oder so ähnlich.

Daneben:
Code: Alles auswählen
    Set PPT = CreateObject("PowerPoint.Application")
    PPT.Visible = True
    Set pres = PPT.Presentations.Application.ActivePresentation

    Set pres = ActivePresentation
    Set PPT = pres.Application

Wenn Du Dich sowieso in der aktuellen Präsentation bewegst, kannst Du diese unmittelbar verwenden. Die evtl. benötigte PP-Instanz kannst Du unmittelbar davon ableiten.

Code: Alles auswählen
    count = rst.RecordCount
    rst.MoveFirst

Die Anzahl benutzt Du nicht. Für die Recordsetschleife hin zu EOF benötigst Du auch keine.
Bei einem neu geöffneten Recordset steht der Datensatzzeiger automatisch auf dem ersten Datensatz, sofern es Datensätze gibt (sonst gleich auf EOF). Daher ist das MoveFirst sehr verzichtbar.

Die Pausen sind auch verzichtbar, außer es soll explizit länger dauern.
Gast
 

Re: Ändern von Feldinhalten (VBA)

Beitragvon BiMeTal » 26. Mär 2019, 15:38

Moinsens,

erstmal: sorry, dass ich mich erst jetzt wieder melde, ich war im wohlverdienten Arbeitsurlaub. Also Arbeiten statt Urlauben. Der Garten fordert seinen Frühlingstribut. :)
dann: Danke für Deine Antwort.

Ja, dass ich mich immer in der gleichen Folie bewege, war an und für sich mein Plan. Und je nach Datensatz, der auch beinhaltet in welchem Shape ich etwas setzen möchte, werden die anderen dann geleert und unsichtbar gemacht.

Beispiel:

Datensatz 1 zeigt einen Text für Textfeld1 und ein Bild für Bildfeld1
Datensatz 2 beinhaltet ein Vollbild für das Bildfeld2
Datensatz 3 beinhaltet ein Video für das Videofeld1
...

Datensatz 1 macht alle Felder unsichtbar ausser Textfeld1 und Bildfeld1 und füllt diese beiden Felder mit den Daten aus den jeweiligen Tabellenfeldern
Datensatz 2 macht alle Felder unsichtbar ausser Bildfeld2, welches die gesamte Folie einnimmt.
Datensatz 3...

Die Folie würde quasi alle Felder in sich bergen, die nur eben alle leer sind. Im Beispiel sind es nur zwei Textfelder. Und lasse ich das Script Schritt für Schritt laufen um VBA-Editor, dann funktioniert es ja.

Der Code ist noch sehr sehr schmutzig, ich kann VBA in Access gut programmieren, in PP bin ich leider ein Noob. Das muss ich natürlich in der echten Präsentation aufräumen. Doch ich bin dankbar für diesen Hinweis. Ich hätte es sonst drin gelassen. Ich habe Schnipsel aus dem Netz und damit experimentiert.

Die Frage ist nun: wenn es so nicht geht, welchen Weg würdest Du (oder auch andere) vorschlagen? Die Folien vorbereiten, nummerieren und diese Nummern dann in der Tabelle eintragen, damit PP weiss, welche Folie (als Vorlage) genommen werden soll? Oder für jeden Datensatz eine eigene Folie generieren lassen, die auf einer Vorlage basiert? Das würde aber bedeuten, dass die Präsentation wahrscheinlich nicht in Echtzeit eine Änderung erfahren könnte durch hinzufügen oder löschen eines Datensatzes, oder?

Gruß

BiMeTal
BiMeTal
Neuling
 
Beiträge: 2
Registriert: 07. Mär 2019, 08:02

Re: Ändern von Feldinhalten (VBA)

Beitragvon DerHoepp » 27. Mär 2019, 09:43

Moinsen,

nur zur Info für die Helfer, damit keiner doppelt und dreifach arbeitet. Weitere Ideen zum gleichen Thema gab's auch im MOF: https://www.ms-office-forum.net/forum/showthread.php?t=358703

Gruß
derHöpp

[Nachtrag: Da hab ich auch noch eine mögliche Lösung gepostet]
DerHoepp
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 7805
Registriert: 14. Mai 2013, 11:08


Zurück zu PowerPoint Forum (provisorisch)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste