Ä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: 1
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
 


Zurück zu PowerPoint Forum (provisorisch)

Wer ist online?

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