2012-04-30 1 views
1

(Cela semble surtout être un problème spécifique PowerPoint 2007, que je ne peux pas reproduire facilement dans PPT 2010)forme dans PowerPoint et défaisant programatically provoque forme à « perdue »

Un moyen facile de reproduire localement est à:

1) Insert a shape into blank slide 
2) Run command: ActivePresentation.Slides(1).Shapes(1).Delete in immediate window in Visual Studio. (You can alternatively delete through C#) 
3) Undo the deletion in the PowerPoint presentation (do this non-programatically) 

pour une raison quelconque, vous ne pouvez pas accéder à la forme à nouveau en utilisant des appels comme:

ActivePresentation.Slides(1).Shapes(1) //Does not allow any methods/properties to work 

la seule chose que j'ai à distance Gotten est que, grâce à Selection.ShapeRange, vous pouvez en quelque sorte obtenir une référence à l'élément, mais la plupart des propriétés/méthodes lancent ComExceptions lorsque vous essayez d'utiliser cet objet.

Est-ce que quelqu'un sait comment je peux retrouver la forme ou rafraîchir la présentation pour obtenir des objets Com propres?

+0

Je n'ai pas 2007 à portée de main pour tester en ce moment, mais la version d'origine était un gâchis en ce qui concerne l'automatisation. Une série de Service Packs a résolu certains problèmes et introduit d'autres. SP3 semble être le meilleur pari; Si vous n'avez pas appliqué cela, je le ferais et je considérerais refuser de prendre en charge toute version de PPT 2007 qui n'a pas eu au moins SP1 appliquée. –

+0

Hmm, je ne suis pas sûr qu'un tel refus soit possible. Je m'occupe d'une base d'utilisateurs diversifiée qui peut avoir différentes versions de système d'exploitation, différentes versions de bureau, etc. Essayer de faire appliquer le SP sur certains utilisateurs n'est probablement pas possible. – Shark

+0

Votre appel, bien sûr, mais pré-SP1 PPT 2007 est tout simplement un désastre. –

Répondre

1

Je peux confirmer dans Ppt2007 SP3. Essayez comme solution de contournement .cut et .paste. Ensuite, j'ai pu accéder aux autres méthodes/propriétés. - acclamations, www.MSO-dlx.com

ActivePresentation.Slides(1).Shapes(1).Delete 
Application.CommandBars.ExecuteMso "Undo" 'or manually Undo 
ActiveWindow.Selection.SlideRange(1).Shapes(1).Cut 
ActiveWindow.Selection.SlideRange(1).Shapes.Paste 
ActiveWindow.Selection.SlideRange(1).Shapes(1).TextFrame.TextRange.Text = "ABC" 
0

ainsi, je peux confirmer que c'est un problème; même en 2010 et a trouvé un « moins cher » alternatif:

Public Sub arf() 

Dim arf As Slide 
Dim shape As shape 
Dim shapes As shapes 

Set shapes = ActivePresentation.Slides(1).shapes 
Set shape = shapes(2) 
shape.Select 

shape.Delete 
Application.CommandBars.ExecuteMso "Undo" 
MsgBox ("shape: " & shape.Name & ",Type: " & shape.Type) 

Set shapes = ActivePresentation.Slides(1).shapes 
Set shape = Nothing 
Set shape = shapes(2) 

' Cut and paste makes this work, but not required... 
'shape.Select 
'shape.Cut 
'shapes.Paste 

'Set shape = Nothing 
'Set shape = shapes(2) 

Set arf = shape.Parent 
MsgBox ("slide: " & arf.Name) 

End Sub 
0

En ce moment, je l'ai résolu avec succès le problème, partager la page Web qui a beaucoup aidé: https://www.add-in-express.com/creating-addins-blog/2014/06/24/exception-hresult-0x800a01a8/

Le point critique libère l'objet après la suppression il, ce qui est exactement comme Skovly et sharkTwo a fait. Cependant, je ne sais pas comment faire cela en utilisant C#, et le lien m'a donné la réponse.

Marshal.ReleaseComObject(titleShape); titleShape = null; 

Juste comme ceci.

Questions connexes