2010-06-29 8 views
4

Je dois pouvoir enregistrer des présentations (par programmation) dans PowerPoint 2003 en tant qu'OpenXML (".pptx"). J'ai installé le Microsoft Office Compatibility Pack. Cela me permet en effet d'effectuer "Enregistrer en tant que présentation PowerPoint 2007" à partir de PowerPoint 2003.Enregistrer par programme sous PowerPoint 2007 (pptx), à partir de PowerPoint 2003

Comment puis-je faire cela par programme? (Par exemple VBA)

J'ai essayé Presentation.SaveAs: Bien qu'il n'y ait pas PpSaveAsFileType valeur intrinsèque ENUM dans PowerPoint 2003 pour ppSaveAsOpenXMLPresentation, je fait un programme qui imprime les valeurs PpSaveAsFileType et a constaté que pendant l'exécution, ppSaveAsOpenXMLPresentation = 24.

Cependant, j'ai essayé: SaveAs(@"c:\temp\saveas\pupik.pptx", (PpSaveAsFileType) ((int) 24), MsoTriState.msoTrue);

et a obtenu un "non valide Enumération Valeur" Exception

Toute idée comment faire ce travail?

(PS -. Je sais que cette question a déjà été posée par plusieurs personnes sur le web, mais aucune solution n'a été proposée)

Merci, Arie

Répondre

4

Modifier> Certaines grammaire

Je pense que le format pptx ne supporte pas les présentations compatibles avec les macros, donc si votre code est dans la présentation que vous essayez d'enregistrer, cela ne fonctionnera pas.

Je n'ai pas Excel 2003 à portée de main maintenant, mais si le Pack de compatibilité activé l'option « pptx » dans la boîte de dialogue de configuration, par défaut Format Enregistrer, et vous essayez d'enregistrer une autre présentation Je suppose que vous pouvez si vous utilisez quelque chose comme:

MyOtherPresentation.SaveAs "C:\Mypres", ppSaveAsDefault 

S'il vous plaît noter que cela peut fonctionner que si la présentation n'a pas encore été enregistré dans le format ppt

EDIT

Si ce qui précède ne fonctionne pas, vous pouvez essayer une approche différente. Enregistrez le fichier dans l'ancien format et l'appel d'un programme de conversion:

ppcnvcom.exe
Voir here un exemple (en utilisant wordconv.exe, mais essentiellement les mêmes)
Assurez-vous d'avoir tout le bureau mises à niveau installés, car sinon le programme se termine ne signalant aucune erreur et ne rien faire.

ofc
Voir here pour les instructions
Et here pour une bonne discussion

HTH!

+0

Merci Bélisaire, mais ce que je dois est de charger « .ppt » et enregistrer en tant que « .pptx », donc malheureusement "sauvegarder par défaut" ne fonctionnerait pas. BTW - mon code ne figure pas dans la présentation que j'essaie d'enregistrer, c'est un programme C# VSTO, donc je n'ai pas de problème avec les macros. –

+0

@Arie Livshin Peut-être que cela peut fonctionner si vous l'enregistrez avec un autre nom. Attention à essayer? –

+0

Je l'enregistre dans un autre nom que l'original. –

3

Une astuce consiste à modifier le format de sauvegarde par défaut de l'application dans le registre, puis enregistrer et enfin de restaurer le format d'enregistrement d'origine à nouveau.

la touche correspondante est

Software\Microsoft\Office\11.0\PowerPoint\Options 

Créer une valeur DWORD avec le nom DefaultFormat et mis à 0x21 pour enregistrer en tant que PPTX.

public void SomeMethod() 
{ 
    ... 
    using (PptxSaver pptxSaver = new PptxSaver()) 
    { 
     presentation.SaveAs("sample.pptx") 
    } 
    ... 
} 

class PptxSaver : IDisposable 
{ 
    private const string OptionKey = @"Software\Microsoft\Office\11.0\PowerPoint\Options"; 
    private const string OptionValue = "DefaultFormat";   
    private const int SaveFormatPptx = 0x21; 

    private int oldFormat; 

    public PptxSaver() 
    { 
     using (RegistryKey key = Registry.CurrentUser.OpenSubKey(OptionKey, true)) 
     { 
      oldFormat = (int)key.GetValue(OptionValue, -1); 
      key.SetValue(OptionValue, SaveFormatPptx, RegistryValueKind.DWord); 
     } 
    } 

    public void Dispose() 
    { 
     // Delete the value 
     using (RegistryKey key = Registry.CurrentUser.OpenSubKey(OptionKey, true)) 
     { 
      if (oldFormat == -1) 
      { 
       key.DeleteValue(OptionValue); 
      } 
      else 
      { 
       key.SetValue(OptionValue, oldFormat); 
      } 
     } 
    }  
} 
+0

@Arie Livshin C'est une approche intelligente! Pour manipuler le registre dans VBA il y a plusieurs options. Rechercher des exemples dans http://www.excelforum.com/excel-programming/531053-read-registry-keys-and-possibly-write.html Et vous pouvez l'essayer manuellement avec regedit avant de programmer. –

0

J'utilisé ppcnvcom.exe mais notez que, contrairement à une quantité considérable de messages que je l'interrupteur -oice sans le commutateur -NMe

0

Pour VBA cela fonctionne:

Sub TestSaveas() 
    SaveAs "c:\somefilepath\" 
End sub 

Private Sub SaveAs(fp As String) 
    Dim dlgSaveAs As FileDialog 
    Dim strMyFile As String 

    Set dlgSaveAs = Application.FileDialog(msoFileDialogSaveAs) 
    With dlgSaveAs 
     .InitialFileName = fp 
     If .Show = -1 Then 
      strMyFile = .SelectedItems(1) 
      Application.ActivePresentation.SaveAs strMyFile 
      'MsgBox strMyFile 
      ''-- save your file to strMyFile here 
     Else 
      MsgBox "File not saved" 
     End If 
    End With 
    dlgSaveAs.Execute 
    Set dlgSaveAs = Nothing 
End Sub 
0

I sais que c'est une vieille question, mais je me suis récemment occupé du problème en utilisant:

Presentation.SaveCopyAs "c:\temp\saveas\pupik.pptx" 

au lieu de SaveAs. Fonctionne bien, que l'original soit au format ppt ou pptx.

(je ne pouvais pas obtenir la méthode de changement de registre mentionné à travailler pour moi sans rouvrir la présentation.)

Questions connexes