Toon posts:

[VBA/Powerpoint] Wijziging SlideId voorkomen *

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik zoek nu al dagen naar een oplossing voor het volgende probleem:

Ik heb 170 sheets gebouwd in powerpoint met behulp van VBA. Een standaard sheet ziet heeft bijvoorbeeld een textbox, een checkbox en een commandbutton. De text in textbox1 is bijvoorbeeld afhankelijk van welke checkbox is aangevinkt op een andere sheet. Dus
code:
1
If slide2.checkbox1.value then textbox1.text = ""


Tot zo ver mijn (beknopte) weergave van hoe het in zijn simpelste vorm uit ziet. Nu zou ik graag het hele gebeuren modulair willen maken. M.a.w. ik zou het hele model graag in stukjes willen ophakken en willen opslaan. sheet 1 t/m 5 bijvoorbeeld en de rest. Zodat ik van het hele model, er meerdere maak. Het voordeel daarvan is dat ik steeds een nieuwe presentatie kan samenstellen door die losse presentaties bij elkaar te voegen.

Nu is het probeem echter, wanneer ik sheets naar een andere presentatie wil halen, dat automatisch de SlideID veranderd. Met als ernstig gevolg dat mijn verwijzingen in de VBA code niet meer werken. ALs ik dan als code heb slide2.checkbox1.value dan werkt dat niet meer, omdat de slide een andere ID heeft gekregen in de nieuwe presentatie

Ik heb dit ergens gevonden op het internet:

"When you create a new slide, it gets a unique SlideID, a unique number that's read-only ... you can't change it manually or programmatically. Reordering the slides won't cause it to change. Once a slide is created, it keeps the same SlideID forever."

Het probleem is dus dat die Slide ID dus wel verandert als je slides naar een andere presentatie haalt.

Mijn vraag aan jullie is dan ook hoe ik dit kan ondervangen???

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Je kunt bijvoorbeeld zelf een koppeling bijhouden tussen een SlideID en een slide zoals jij ze zelf onderscheidt. Dit kun je doen door een centrale VBA file in te stellen (main.bas of iets dergelijks) met daarin een Collection van slideIds.

code:
1
2
3
4
5
6
7
8
9
' dit stuk staat in main.bas
Dim colSlides As New Collection

' vervolgens bij creatie van de slide
Dim newSlide As Slide
Set newSlide = ActivePresentation.Add( 1, ppLayoutBlank )

' zet de info van de nieuwe slide op de gewense info
' en hier eventueel het bijwerken van de links...


Begrijp je het idee een beetje?

[ Voor 15% gewijzigd door bigbeng op 26-07-2004 13:49 ]


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Titel afgemaakt, denk daar de volgende keer aub zelf even aan.

Professionele website nodig?


Verwijderd

Je kunt de slides een naam geven en ze dan opzoeken bij naam. De naam zal niet veranderen als je slides kopiëert.

Als er geen ingebouwde functie is om slides bij naam op te halen, dan maak je die zelf één, op de volgende manier:

code:
1
2
3
4
5
6
7
8
Public Function GetSlideByName(oSlides, sName)
For Each oSlide In oSlides
  If oSlide.Name = sName Then
    GetSlideByName = oSlide
    Exit Function
  End If
Next
Err.Raise 666, "Slide not found!"


oSlides is dus een collectie van slides, waaruit je de slide met jouw naam wilt ophalen.

Waarschuwing: ik heb noppes-de-nada ervaring met PowerPoint, maar aannemende dat het lijkt op de andere Office programmaatjes denk ik dat het vorige wel moet werken. Geen garanties ;).
Verwijderd schreef op 26 juli 2004 @ 13:14:
Ik heb dit ergens gevonden op het internet:

"When you create a new slide, it gets a unique SlideID, a unique number that's read-only ... you can't change it manually or programmatically. Reordering the slides won't cause it to change. Once a slide is created, it keeps the same SlideID forever."
Waarschijnlijk telt het kopiëren van een slide wel als een nieuwe aanmaken. Er wordt in de nieuwe presentatie namelijk een nieuwe slide aangemaakt en dan worden alle eigenschappen en alle inhoud gewoon gekopiëerd van de oude naar de nieuwe.

Je kunt ook zien dat de naam niet hetzelfde kan blijven na kopiëren. De naamgeving die ze nu hebben namelijk (slide1, slide2, ...) zou nooit kunnen voldoen voor globaal unieke identifiers. Wat zou er gebeuren als je slide1 van presentatie1 kopiëert naar presentatie2 met behoud van de slidenaam? En je zou het daarna nòg een keer willen doen? Conflict!

Je kunt het dus beter lezen als: slide id's zijn uniek en onveranderlijk binnen 1 presentatie.

Verwijderd

Topicstarter
Bedankt voor de reacties, maar het heeft vooralsnog geen succes opgeleverd. Ik heb ook een discussie begonnen op de microsoft developers community. Deze gaat als volgt:
Hi, I have created a PPT presentation with aprox. 170 sheets. A example of a sheet is as follows: A sheet contains for example a textbox and a commandbutton with the following code: If slide#.checkbox1.value then textbox1.text = "..."

Checkbox1 is on another sheet (slide#).

Everything alright so far!

But the problems arise when I want to copy paste my slides to another presentation. The copied slides get another SlideID in the second presentation, and the problem is that my code does not properly function any longer. The code with the Slide#.checkbox1. value does not work any longer because in the second presentation the slide where I can find the checkbox has another SlideID.

Hence, my question is as follows:

How to solve this problem. Is there a code that will give my slides a unique name and a way that they can keep that unique name when I copy paste them into another presentation??


REPLY: You can set the Slide Name of a slide, but it will not transfer to a new presentation when you copy the slide or Insert Slide from File. The following code is on my web site under Example 8.7 at http://www.loyola.edu/education/PowerfulPowerPoint/:

'The following procedures are for getting and setting the names of slides.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Sub GetSlideName()
    MsgBox ActiveWindow.View.Slide.Name
End Sub

Sub SetSlideName()
    Dim slideName As String
    
    slideName = InputBox(prompt:="Type a name for the slide")
    slideName = Trim(slideName)
    If slideName = "" Then
        MsgBox ("You did not type anything. " & _
            "The name will remain " & _
            ActiveWindow.View.Slide.Name)
    Else
        ActiveWindow.View.Slide.Name = slideName
    End If
End Sub


The first procedure gets the slide name, and the second procedure allows you to set the name of a slide.

--David

David M. Marcovitz
Author of _Powerful PowerPoint for Educators_
http://www.loyola.edu/education/PowerfulPowerPoint/

REPLY

Thank you for your quick answer, but I think it does not offer a solution for my problem. I have changed the name of of a couple of my slides, but VBA still requires the original name to be written down in the code. If I, for example, change the name from slide10 to SlideDavid, and I also change the code: If slide10.checkbox1.value then textbox1.text = "Yes" => Slidedavid.checkbox1.value etc. Then VBA will not recognise Slidedavid.

My other problem still remains, and I am beginning to think that there is no solution for it. I still want to copy slides from one ppt to another, without having to alter all my codes, because of the change of SlideID's.

Kind Regards,

Bas
M.a.w. het probleem blijft zich voordoen, ondanks jullie oplossingen. Waar ik nu meer aan zit te denken is een toevoeging aan al mijn codes.

Als ik bijvoorbeeld in presentatie 1 twee sheets heb met slideID's : Slide224 en Slide225 en een bijhorende code: If slide224.checkbox1.value then..... en ik zet die over naar een 2e presentatie waardoor de SlideID's veranderen van Slide224 en Slide225 naar Slide1 en Slide2. Is het dan mogelijk om boven mijn code iets neer te zetten van Slide2 = Slide224, zonder dat ik dus de hele code hoef door te lopen om Slide224 te vervangen door Slide2?

Of hebben jullie betere oplossingen voorradig?

Verwijderd

...


Je snapt 't niet goed, geloof ik.

Als je je slide SlideDavid genoemd hebt, dan doe je daarna niet:

code:
1
SlideDavid.CheckBox1.Value


maar

code:
1
GetSlideByName("SlideDavid").CheckBox1.Value


Zoals gezegd, kun je de ID van slides niet veranderen; ID is wat gebruikt wordt als je de naam letterlijk in de code zet. Conclusie: je kunt het niet bij letterlijke code houden, omdat de IDs (moeten) veranderen.

Wat je wèl kunt doen, is een andere manier zoeken om aan slides te refereren. Dat betekent wel dat je het niet letterlijk in de code kan doen. Je gebruikt in plaats daarvan een functie die de slide die jij bedoelt opzoekt, via de één of andere methode. In de voorbeelden die zowel door mij als door David zijn aangedragen gebeurt dat via het Name attribuut, dat je wel naar hartelust kan zetten op wat jij wil.

Het kan ook nog op ~tig andere manieren, maar met Name is waarschijnlijk de makkelijkste.

[ Voor 68% gewijzigd door Verwijderd op 29-07-2004 10:54 ]

Pagina: 1