Forum Clubic

[VBA] Obtenir la version du document sous PPT - je trouve pas

Salut.

Je cherche à afficher la version du fichier powerpoint sur lequel je travaille.
Typiquement, on la trouve quand on fait un “save as”, c’est le type par défaut.

Exemples :
.ppt (Powerpoint presentation)
.ppt (Powerpoint 95)
etc etc…

En gros, je veux que ma macro me dise si le fichier est déja enregistré au format le plus recent !

D’avance merci si vous trouvez !!!

Je cherche… mais impossible de trouver pour le moment.
Ca n’est evidement pas dans les builtinproperties… ou alors j’ai mal cherché.

Sub foo()
MsgBox Application.Version
End Sub

Et j’ai presque jamais utilisé powerpoint … :smiley:

Et c’est pas ce que je demande…

En fait je veut la VERSION DU DOCUMENT (powerpoint 95, etc…) pas de mon programme !

Merci qd même :wink:

Je ne sais pas si on peux, mais visibilement, c’est pas prévu par microsoft: :slight_smile:

  • l’objet “Presentation” ne contient aucun atttribut de version
  • la méthode saveas de Presentation enregistre systématiquement à la version de l’application, pas celle cu fichier (donc inutile de tenter un enregistrement dans une autre version pour trapper les warning)
  • la méthode open de “Presentations” ne comporte pas de paramètre version, donc impossible de forcer une version pour tenter de déterminer la version du fichier avant de l’ouvrir.

Donc soit c’est non-documenté par microsoft, soit c’est inexistant. Tu pourrait le tenter par des outils tierces (bib d’openoffice etc), mais bon l’enjeu n’en vaut pas la chandelle…
:neutre:

Je serait tenté de dire de parser l’entête de fichier, ça doit surement se trouver la dedans :neutre:

Ouaip
j’y ai pensé… mais c’est un peu complexe.

Je sais que quand je fais un saveas de mon fichier, dans la dialogbox apparait par défaut le type du doc (PPT 95, PPT 97-200 & 95)…
on doit pouvoir traquer cette valeur, mais la je sais pas faire !

J’ai enregistré en ppt 95 et j’ai remarqué qu’a l’offset 0x3C on à deux, en enregistrant en ppt (par défaut), j’ai un 11 (donc office 2000 et >), si tu as moyen d’enregistrer au format ppt 97 et en esperant que le chiffre soit différent, tu pourras checker la version.

Pas de chance, le header ppt semble le plus mal documenté:
http://wvware.sourceforge.net/wvInfo.html

Sinon, c’est pas la mer à boire de lire le fichier en binaire et de comparer un byte à un emplacement précis dont tu es sûr qu’il détermine la version.
J’ai comparé sous eltra edit en hexa des fichier ppt de différente version, j’ai vu des différence au niveau des bytes 204H, 208H (vaut 0x03 pour 95 et 0xFE pour 2003)
Après, si tu prend un grand nombre de jeu de test pour chaque version ppt, ton prog pourra être assez fiable.
Reste à voir si tu veux passer une semaine de dev et debug dessus :wink:

edit: l’offset de kralkox a l’air mieux choisi, mais moi en 2003, j’ai 0x15 à 0x3c, je ne sais pas si c’est cohérent.

Moi, j’ai 0x11 avec Office 2003 (build 11.5529.5606), bizarre que tu ais 0x15 :??:

Sous excel on fait :
Application.ActiveWorkbook.FileFormat

Il devrait y avoir la même chose avec PP

Réponse : NON
because j’ai opté pour une solution plus facile :
Qu’importe le type de fichier… il fait quand même l’opération demandée (une conversion + 2 ou 3 autres conneries)
Du coup, je peux faire sans “le type” :slight_smile:
C’est un peu plus long, mais c’est pas grand chose.

Mais bon… j’aimerai bien savoir comment faire quand même !! :oui:
Vais y réfléchir ce we, là : pas le temps !

Et bien… NON ! :wink:

Merci à tous, en tout cas de tous les forums que j’ai testés, vous etes les plus réactifs ! (les autres cherchent encore…)

J’ai vérifié c’est bien ça
ma version :
Microsoft@ Office PowerPoint@ 2003 (11.6361.6360) SP1
Part of Microsoft Office Professional Edition 2003

si on peut "hoster" le fichier quelque part, ça pourrait servir de cas de test.

bizarre quand même qu’on ne trouve nulle part une fonction Microsoft non-documentée pour ça, il n’y a jamais aucune fuite dans les labos de dev microsoft? Ils en font quoi de leur developpeur ?? :peur:

>stupid: je te comprend, pour avoir utilisé des produits Domino/Office sous OLE, on est souvent amené à changer son fusil d’épaule.

glop !
maintenant… comment faire une macro qui va chercher et me filer cette pu#%$ d’info ???

Il faut lire le fichier en binaire, après une recherche, voici l’exemple de quelqu’un qui ne lit que les premiers caratères:
http://www.vbfrance.com/infomsg_VB-NET-LEC…IRE_651631.aspx

tu t’arrête au 0x3Cème caratère, et tu ne teste que celui là.

[codebox]
Dim fStream As New IO.FileStream("c:\tonimage.bmp", IO.FileMode.Open, IO.FileAccess.Read)
Dim BinReader As New IO.BinaryReader(fStream)
Dim buffer As Byte() = New Byte(60) {}

BinReader.Read(buffer, 0, buffer.Length)

fStream.Close()
BinReader.Close()
[/codebox]

Sub MyBinReader()
Dim fStream As New IO.FileStream("c:\tonimage.bmp", IO.FileMode.Open, IO.FileAccess.Read)
Dim BinReader As New IO.BinaryReader(fStream)
Dim buffer As Byte() = New Byte(60) {}
BinReader.Read(buffer, 0, buffer.Length)
fStream.Close()
BinReader.Close()
End Sub

=> la Syntax error j’en fais quoi !??? :MDR

Sub sImportAll()

'creating the path
MyPath = ActivePresentation.Path
ChDir MyPath
myFile = MyPath & "\" & "PPT95.ppt"
    
'go !
    On Error GoTo E_Handle
    Dim strImport As String
    Dim lngChars As Long
    Dim intFile As Integer
    
    intFile = FreeFile
    
    Open myFile For Binary Access Read As intFile
    MsgBox LOF(intFile)
    lngChars = LOF(intFile)
    strImport = Input(lngChars, intFile)
    
    MsgBox strImport
sExit:
    On Error Resume Next
    Reset
    Exit Sub
E_Handle:
    MsgBox Err.Description, vbOKOnly + vbCritical, "Error: " & Err.Number
    Resume sExit
End Sub

=> marche pas… les retours sont les mêmes

humm… ça devait être du vb net, pas du vba, c’est pas de ma faute si microsoft est pas fichu d’utiliser le mêm langage dans toutes ses applis …
bref, en vba, on utilise les outils préhistoriques (cherche “open statement” et “get statement” dans l’aide VBA de ppt):
[codebox]
Sub macrotest()
Dim i As Integer
i = getPPTFileType(“c:\tmp\test.ppt”)
MsgBox “result=” & i

End Sub

Function getPPTFileType(pathname As String) As Integer
Dim fileh As Integer
Dim result As Byte
result = 5
fileh = FreeFile
Open pathname For Binary Access Read As #fileh
Get #fileh, 61, result
Close fileh
getPPTFileType = result
End Function

[/codebox]

edit: je viens juste de voir ton dernier post, j’ai apparemment le bon retour avec mon code, je lit la position 61 (cad 60 si on indexe à partir de 0 donc 0x3c) et j’ai comme retour 21 (donc 0x15)

je reteste avec d’autres versions.
edit2: donc ton code fait à peu prêt pareil que le mien, mais essaye d’utiliser le statement “get” au lieu de input, en indiquant la position, comme ça tu ne lit vraiement que l’octet dont tu as besoin.

Note: je vien de découvrir le tag [ codebox ] ça rend les post vachement plus court :wink:

edit3: et ça me revnoie bien “2” avec une version 95. plus qu’à tester avec un certain nombre de fichier.
note: j’aurais tendance à tester des intervalle plutôt qu’une égalité, notamment les dernières versions 2003 sont celle qui sont >= à la valeur donnée par karlkox, et on peut avoir une valeur plus grand, comme c’est le cas pour ma version.

Super boulot, ca marche chez moi

je teste… et je vous tiens au jus !

MERCI ! :super:

Bon, j’ai testé et ca deconne un peu:
Voici mon code, il teste tous les fichiers d’un repertoire et balance dans une msgbox le nom du fichier + le numero retourné par la fonction (qui lit en 61)

[CODEBOX]Sub testfull()
'------------------------------------------
'INIT !
Dim ByteNumber As Integer
ByteNumber = 61

Dim myfilepath As String
myfilepath = ActivePresentation.Path & “\*.PPT”
NbFilesToConvert = GetNbFiles(myfilepath) - 1 'enlever 1 pour ne pas tenir compte de CE fichier
MsgBox NbFilesToConvert & " files to check"

Dim myfile As String

'------------------------------------------
'DO !
myfile = Dir(myfilepath)
If myfile <> ThisPPT Then
MyMSG = “” & myfile & " = " & getPPTFileType(myfile, ByteNumber) & Chr(10)
End If

Do
'Call Dir again without arguments to return the next *.INI file in the same directory.
myfile = Dir
If Len(myfile) = 0 Then Exit Do 'evite la string nulle en fin de boucle
If myfile <> ThisPPT Then
MyMSG = MyMSG & “” & myfile & " = " & getPPTFileType(myfile, ByteNumber) & Chr(10)
End If

Loop
MsgBox MyMSG

End Sub

Function getPPTFileType(pathname As String, ByteNumber As Integer) As Integer
Dim fileh As Integer
Dim result As Byte
result = 5
fileh = FreeFile
Open pathname For Binary Access Read As #fileh
Get #fileh, ByteNumber, result
Close fileh
getPPTFileType = result
End Function[/CODEBOX]

Je tombe sur du 2, du 254 et tu 91…
ca qui est moyen glop !

P.S. : trop bon le codebox !! :wink: