11 juin 2010

Réaliser un complément PowerPoint pour générer un diaporama à partir d'un dossier

Présentation du projet







idea Rien de vous empêche de réaliser votre propre menu ou bien de faire en sorte que cette rubrique soit située dans un autre menu.



2-1. Utilisation





Const JPG As String = "jpg"
Const BMP As String = "bmp"
Const WMF As String = "wmf"
Const EMF As String = "emf"


HKEY_CURRENT_USER\Software\VB and VBA Program Settings\

2-2. Fin de génération


info 1) - Le temps de réalisation du diaporama dépend à la fois de l'ordinateur sur lequel est exécuté ce projet et aussi du nombre d'images contenu dans le dossier. J'avais envisagé de greffer une barre de progression mais je vous laisse le choix d'ajouter ce petit plus finalement superflu...



2-3. Chargement et déchargement du complément



C:\Documents and Settings\Argyronet\Application Data\Microsoft\Macros complémentaires


warning Ce message n'apparaît pas du tout si le niveau de sécurité est défini à Bas (non recommandé) et charge le complément ou si votre projet est signé numériquement.
Donc, réglez la sécurité sur Moyen de manière à ce que ce message s'affiche systématiquement.

Vous cliquez alors sur Activer les macros derrière quoi,
cette fenêtre apparaît selon les modalités expliquées ici...

La fenêtre de la liste des compléments reste affichée :

  • Le complément que vous avez sélectionné se voit alors précédé d'une croix pour signifier qu'il est chargé.
  • La croix disparaît lorsqu'il est déchargé.

Cliquez alors sur Fermer et choisissez Créer un diaporama depuis le menu Insertion.

info La procédure CloseAddinsPopup() ferme par API la fenêtre des compléments dès que vous avez appuyé sur OK sur la fenêtre de bienvenue.

3. Code VBA du projet


Le code VBA du projet nécessite un certain degré de connaissance en matière de développement.

Il est vrai qu'il n'est pas commenté (Je commente très peu mon code en général) du fait que la lisibilité associée au nom des objets et procédures soit suffisament explicite pour un développeur habitué au VB ou au VBA.


3-1. Le module de gestion des diapositives

C'est le module qui contient l'ensemble du code qui gère les images à savoir :

  • l'insertion de nouvelle diapos en fonction du nombre d'images du dossier
  • leur sélection et leur mise en place dans les diapositives en les ajustant
Le tout cerné par l'ensemble des routines

  • d'appels de sélection de dossier,
  • de confirmation d'utilisation de la présentation en cours,
  • du délai à définir pour le diaporama,
  • de l'enregistrement de la présentation,
  • ...
Module basPictures
Option Explicit

Public Const APP_NAME As String = "DiaporamaCreator"
Public Const KEY_SETTINGS As String = "Settings"
Public Const VALUE_LASTPATHUSED As String = "LastPathUsed"
Public Const VALUE_DONOTSHOWATSTARTUP As String = "DoNotShowAtStartup"
Public Const MENU_NAME As String = "Insert"
Public Const MENU_NAME_FR As String = "Insertion"
Public Const ICON_CAPTION As String = "Créer un diaporama..."

Private Const ACTION_TO_DO As String = "InsertAutoFitPicturesIntoSlides"
Private Const TOOL_TIP_TEXT As String = "Génération d´un diaporama"
Private Const ICON_DESCRIPTION As String = "Insére des photos ajustées pour la génération d´un diaporama"
Private Const ICON_TAG As String = "TAG_InsertAutoFitPictureIntoSlides"

Private Const THIS_PRESENTATION_PPT As String = "DiaporamaCreator.ppt"
Private Const THIS_PRESENTATION_PPA As String = "DiaporamaCreator.ppa"

Sub Auto_Open()
Dim oBar As CommandBar
Dim oControl As CommandBarControl
Dim oCBMenu As CommandBars
Dim blnFound As Boolean
Dim blnValue As Boolean
Dim I As Integer
    

    On Error Resume Next
    Set oCBMenu = Application.CommandBars
    For Each oControl In oCBMenu(MENU_NAME).Controls
        If oControl.Tag = ICON_TAG Then
            blnFound = True
            Exit For
        End If
    Next oControl
    
    If blnFound = False Then
        On Error Resume Next
        Set oControl = CommandBars(MENU_NAME).Controls.Add(msoControlButton)
            With oControl
                .BeginGroup = msoTrue
                .FaceId = 1362
                .OnAction = ACTION_TO_DO
                .TooltipText = TOOL_TIP_TEXT
                .Caption = ICON_CAPTION
                .DescriptionText = ICON_DESCRIPTION
                .Visible = msoTrue
                .Style = msoButtonCaption
                .Tag = ICON_TAG
            End With
    End If

    Set oControl = Nothing
 
    blnValue = CBool(GetSetting(APP_NAME, KEY_SETTINGS, VALUE_DONOTSHOWATSTARTUP))
    If blnValue = False Then frmWelcome.Show
    On Error GoTo 0
    DoEvents
    CloseAddinsPopup
End Sub

Sub Auto_Close()
Dim oBar As CommandBar
Dim oControl As CommandBarControl
Dim oCBMenu As CommandBars

    On Error Resume Next
    Set oCBMenu = Application.CommandBars
    For Each oControl In oCBMenu(MENU_NAME).Controls
        If oControl.Tag = ICON_TAG Then
          oControl.Delete
        End If
    Next oControl
    Set oCBMenu = Nothing
End Sub

Sub InsertAutoFitPicturesIntoSlides()
Dim straFilesName() As String
Dim strFilesName As String
Dim strPictureName As String
Dim strPath As String
Dim strDelay As String
Dim strFileName As String
Dim strLastFolderUsed As String
Dim I As Integer
    
    If Presentations.Count <> 0 Then
        If ActivePresentation.Name <> THIS_PRESENTATION_PPT And ActivePresentation.Name <> THIS_PRESENTATION_PPA Then
            If MsgBox("Voulez-vous utiliser la présentation active (" & ActivePresentation.Name & ") pour insérer les photos ?", _
   36, "Utiliser la présentation") = 6 Then
                If ActiveWindow.ViewType <> ppViewSlideSorter Then
                   ActiveWindow.ViewType = ppViewSlideSorter
                End If
            Else
                CreateNewPresentation
            End If
        Else
            CreateNewPresentation
        End If
    Else
        CreateNewPresentation
    End If

    ActiveWindow.ViewType = ppViewSlide
    strDelay = InputBox("Combien de secondes entre chaque photos ?", "Durée du cycle", "5")
    If Len(strDelay) Then
      If IsNumeric(strDelay) = msoFalse Then
        Exit Sub
      End If
    Else
      Exit Sub
    End If
    
    strLastFolderUsed = GetSetting(APP_NAME, KEY_SETTINGS, VALUE_LASTPATHUSED)
    If Len(strLastFolderUsed) = 0 Then
        strLastFolderUsed = Left(ActivePresentation.Path, 3)
    End If
    strPath = GetPicturesFolder(strLastFolderUsed)
    strLastFolderUsed = strPath
    strFilesName = GetFileString(strPath)
    
    If Len(strFilesName) = 0 Then
        MsgBox "Exécution annulée par l´utilisateur !", 48, "Fin"
        Exit Sub
    Else
      straFilesName = Split(strFilesName, SEPARATOR)
    End If
    
    For I = LBound(straFilesName) To UBound(straFilesName)
      strPictureName = strPath & Trim(straFilesName(I))
      AutoFitCurrentPicture strPictureName
      If I < UBound(straFilesName) Then
        ActiveWindow.View.GotoSlide ActivePresentation.Slides.Add(ActivePresentation.Slides.Count, ppLayoutBlank).SlideIndex
      End If
    Next
    
    If MsgBox("Le diaporama est maintenant créé..." & vbCrLf & vbCrLf & "Voulez-vous l´enregistrer ?" & vbCrLf & _ 
 vbCrLf & "Note: Le dossier cible sera" & vbCrLf & strPath, 36, "Enregistrer la présentation") = 6 Then
      strFileName = "Diaporama No " & Format(Now, "dmyyyy hhmmss")
      ActivePresentation.SaveAs strPath & strFileName, ppSaveAsShow, msoFalse
    End If
    
    ShowDiaporama CInt(strDelay)
    
    With ActivePresentation.SlideShowSettings
      .Run
    End With
End Sub

Private Sub SetSlideBackground()
    If ActivePresentation.HasTitleMaster Then
        With ActivePresentation.TitleMaster.Background
            .Fill.Visible = msoTrue
            .Fill.ForeColor.SchemeColor = ppTitle
            .Fill.Transparency = 0#
            .Fill.OneColorGradient msoGradientFromTitle, 2, 0.89
        End With
    End If
    With ActivePresentation.SlideMaster.Background
        .Fill.Visible = msoTrue
        .Fill.ForeColor.SchemeColor = ppTitle
        .Fill.Transparency = 0#
        .Fill.OneColorGradient msoGradientFromTitle, 2, 0.89
    End With
    With ActivePresentation.Slides.Range
        .FollowMasterBackground = msoTrue
        .DisplayMasterShapes = msoTrue
    End With
End Sub

Private Sub AutoFitCurrentPicture(ByVal FileName As String)
Dim oShape As ShapeRange
Dim sngPictureWidth As Single
Dim sngPictureHeight As Single
Dim sngSlideWidth As Single
Dim sngSlideHeight As Single
Dim sngScaleValue As Single
  
  ActiveWindow.Selection.SlideRange.Shapes.AddPicture(FileName, msoFalse, msoTrue, 0, 0).Select
  Set oShape = ActiveWindow.Selection.ShapeRange
  
  sngPictureWidth = oShape.Width
  sngPictureHeight = oShape.Height
  sngSlideWidth = ActivePresentation.PageSetup.SlideWidth
  sngSlideHeight = ActivePresentation.PageSetup.SlideHeight
  
  If sngPictureWidth > sngPictureHeight Then
      sngScaleValue = sngSlideWidth / sngPictureWidth
  Else
      sngScaleValue = sngSlideHeight / sngPictureHeight
  End If
  sngScaleValue = sngScaleValue - 0.16
  
  oShape.ScaleHeight CSng(sngScaleValue), msoTrue
  oShape.ScaleWidth CSng(sngScaleValue), msoTrue
  
  With ActivePresentation.PageSetup
      oShape.Left = (.SlideWidth \ 2) - (oShape.Width \ 2)
      oShape.Top = (.SlideHeight \ 2) - (oShape.Height \ 2)
      oShape.Select
  End With
End Sub

Private Sub CreateNewPresentation()
    Presentations.Add msoTrue
    ActiveWindow.View.GotoSlide ActivePresentation.Slides.Add(1, ppLayoutBlank).SlideIndex
    SetSlideBackground
End Sub

Private Sub ShowDiaporama(ByVal Delay As Integer)

  ActiveWindow.ViewType = ppViewSlideSorter
  ActivePresentation.Slides.Range.Select
  With ActivePresentation.Slides.Range.SlideShowTransition
    .EntryEffect = ppEffectFade
    .Speed = ppTransitionSpeedSlow
    .AdvanceOnClick = msoTrue
    .AdvanceOnTime = msoTrue
    .AdvanceTime = Delay
    .SoundEffect.Type = ppSoundNone
  End With
  With ActivePresentation.SlideShowSettings
    .ShowType = ppShowTypeSpeaker
    .LoopUntilStopped = msoTrue
    .ShowWithNarration = msoTrue
    .ShowWithAnimation = msoTrue
    .RangeType = ppShowAll
    .AdvanceMode = ppSlideShowUseSlideTimings
    .PointerColor.SchemeColor = ppForeground
  End With
End Sub
  • La procédure Auto_Open() : S'exécute au démarrage du complément et créé le menu.
  • La procédure Auto_Close() : S'exécute au déchargement du complément et supprime le menu.
  • La procédure InsertAutoFitPicturesIntoSlides() : Procédure globale du projet qui gère la mise en place des images dans chaque diapositive.
  • La procédure SetSlideBackground() : Créé un arrière plan sur chaque diapositive.
  • La procédure AutoFitCurrentPicture() : Ajuste l'objet picture au sein de la diapositive en cours.
  • La procédure CreateNewPresentation() : Créé une nouvelle présentation vierge.
  • La procédure ShowDiaporama() : Configure les paramètres du diaporama et l'exécute en bouche jusqu'à Echap.

3-2. Le module de gestion des dossiers et des fichiers

Ce module contient l'ensemble des API's nécessaires au projet associé aux fonctions qui s'occupent de fournir le nom du dossier des images et celles permettant la construction de la chaîne contenant les fichiers.
Module basFiles
Option Explicit

Private Const OFN_FILEMUSTEXIST = &H1000
Private Const OFN_HIDEREADONLY = &H4
Private Const OFN_ALLOWMULTISELECT = &H200
Private Const OFN_EXPLORER As Long = &H80000

Private Const BIF_STATUSTEXT  As Long = &H4&
Private Const BIF_RETURNONLYFSDIRS  As Long = 1
Private Const BIF_DONTGOBELOWDOMAIN  As Long = 2
Private Const MAX_PATH  As Long = 260

Private Const WM_USER  As Long = &H400
Private Const BFFM_INITIALIZED  As Long = 1
Private Const BFFM_SELCHANGED  As Long = 2
Private Const BFFM_SETSTATUSTEXT  As Long = (WM_USER + 100)
Private Const BFFM_SETSELECTION  As Long = (WM_USER + 102)

Public Const SEPARATOR As String = "|"

Private Type OPENFILENAME
    lStructSize As Long
    hwndOwner As Long
    hInstance As Long
    lpstrFilter As String
    lpstrCustomFilter As String
    nMaxCustFilter As Long
    nFilterIndex As Long
    lpstrFile As String
    nMaxFile As Long
    lpstrFileTitle As String
    nMaxFileTitle As Long
    lpstrInitialDir As String
    lpstrTitle As String
    flags As Long
    nFileOffset As Integer
    nFileExtension As Integer
    lpstrDefExt As String
    lCustData As Long
    lpfnHook As Long
    lpTemplateName As String
End Type

Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias _
  "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long

Private Declare Sub CoTaskMemFree Lib "ole32.dll" (ByVal hMem As Long)
Private Declare Function SendMessage Lib "user32" Alias _
  "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam _
  As Long, ByVal lParam As String) As Long
Private Declare Function SHBrowseForFolder Lib "shell32" (lpbi As _
  BROWSEINFO) As Long
Private Declare Function SHGetPathFromIDList Lib "shell32" (ByVal _
  pidList As Long, ByVal lpBuffer As String) As Long
Private Declare Function lstrcat Lib "kernel32" Alias _
  "lstrcatA" (ByVal lpString1 As String, ByVal lpString2 As String) As _
  Long

Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd _
  As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias _
  "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As _
  String) As Long
Private Declare Function PostMessage Lib "user32" Alias _
  "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam _
  As Long, lParam As Any) As Long
Private Declare Function GetClassName Lib "user32" Alias _
  "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, _
  ByVal nMaxCount As Long) As Long
Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, _
  ByVal nCmdShow As Long) As Long
Private Const SW_SHOWNORMAL = 1
Private Const WM_CLOSE = &H10
Private Const ADDIN_POPUP_CLASSNAME As String = "#32770"
Private Const ADDIN_POPUP_TITLE As String = "Macros complémentaires"

Private Type BROWSEINFO
    hwndOwner      As Long
    pidlRoot       As Long
    pszDisplayName As Long
    lpszTitle      As Long
    ulFlags        As Long
    lpfnCallback   As Long
    lParam         As Long
    iImage         As Long
End Type

Private m_strDirectory As String

Public Sub CloseAddinsPopup()
Dim lngHWnd As Long

    lngHWnd = FindWindow(ADDIN_POPUP_CLASSNAME, ADDIN_POPUP_TITLE)
    Call SetForegroundWindow(lngHWnd)
    If lngHWnd Then
        PostMessage lngHWnd, WM_CLOSE, 0&, 0&
    End If
End Sub

Public Function GetPicturesFolder(ByVal StartPath As String) As String
Dim strFolder As String
    strFolder = BrowseForFolder(StartPath)
    If Len(strFolder) Then
        SaveSetting APP_NAME, KEY_SETTINGS, VALUE_LASTPATHUSED, strFolder
        strFolder = AddDirSep(strFolder)
    End If
    GetPicturesFolder = strFolder
End Function

Private Function StripNullChar(ByVal Buffer As String) As String
Dim intPosition As Integer
    intPosition = InStr(Buffer, vbNullChar)
    If intPosition > 0 Then
        StripNullChar = Left(Buffer, intPosition - 1)
    Else
        StripNullChar = Buffer
    End If
End Function

Private Function AddDirSep(strPathName As String)
    If Right(Trim(strPathName), Len("\")) <> "\" And _
       Right(Trim(strPathName), Len("\")) <> "\" Then
        strPathName = RTrim$(strPathName) & "\"
    End If
    AddDirSep = strPathName
End Function

Public Function GetFileString(ByVal Path As String) As String
Dim oFSO As Object ' As Scripting.FileSystemObject
Dim oFld As Object ' As Scripting.Folder
Dim oFile As Object ' As Scripting.File
Dim strFilesName As String
Dim strFilePath As String
Dim strType As String
Dim I As Integer
    
Const JPG As String = "jpg"
Const BMP As String = "bmp"
Const WMF As String = "wmf"
Const EMF As String = "emf"
    
    Set oFSO = CreateObject("Scripting.FileSystemObject")
'    Set oFSO = New FileSystemObject
    Set oFld = oFSO.GetFolder(AddDirSep(Path))
    For Each oFile In oFld.Files
        strType = Mid(oFile.Name, InStrRev(oFile.Name, ".") + 1)
        Select Case LCase(strType)
            Case JPG, BMP, WMF, EMF
                strFilesName = strFilesName & oFile.Name & SEPARATOR
            Case Else
        End Select
    Next
    If Len(strFilesName) Then
        GetFileString = Left(strFilesName, Len(strFilesName) - 1)
    End If
    Set oFld = Nothing
    Set oFile = Nothing
    Set oFSO = Nothing
End Function

Public Function BrowseForFolder(StartDir As String) As String
Dim lngReturn As Long
Dim strBuffer As String
Dim udtBrowseInfo As BROWSEINFO

  m_strDirectory = StartDir & vbNullChar

  With udtBrowseInfo
    .hwndOwner = 0
    .lpszTitle = lstrcat("Sélection d´un dossier contenant des photos...", " ")
    .ulFlags = BIF_RETURNONLYFSDIRS
    .lpfnCallback = GetAddressOfFunction(AddressOf BrowseCallbackProc)
  End With

  lngReturn = SHBrowseForFolder(udtBrowseInfo)
  If (lngReturn) Then
    strBuffer = Space(MAX_PATH)
    SHGetPathFromIDList lngReturn, strBuffer
    CoTaskMemFree lngReturn
    strBuffer = StripNullChar(strBuffer)
    BrowseForFolder = strBuffer
  Else
    BrowseForFolder = vbNullString
  End If
  
End Function
 
Private Function BrowseCallbackProc(ByVal hwnd As Long, ByVal uMessage As Long, ByVal lpIDList As Long, _
ByVal pData As Long) As Long
Dim lngRet As Long
Dim strBuffer As String
  
  On Error Resume Next
  Select Case uMessage
    Case BFFM_INITIALIZED
        Call SendMessage(hwnd, BFFM_SETSELECTION, 1, m_strDirectory)
    Case BFFM_SELCHANGED
      strBuffer = Space(MAX_PATH)
      lngRet = SHGetPathFromIDList(lpIDList, strBuffer)
      If lngRet = 1 Then
        Call SendMessage(hwnd, BFFM_SETSTATUSTEXT, 0, strBuffer)
      End If
  End Select
  BrowseCallbackProc = 0
End Function

Private Function GetAddressOfFunction(P As Long) As Long
  GetAddressOfFunction = P
End Function
  • La procédure CloseAddinsPopup() : ferme la boîte de dialogue "Macros complémentaires" une fois que vous cliquez sur OK du UserForm.
  • La fonction GetPicturesFolder() : retourne le nom du dossier sélectionné et l'inscrit dans le Registre.
  • La procédure StripNullChar() : supprime les caractères vbNullChar "Chr(0)" d'une chaîne passée en paramètre.
  • La fonction AddDirSep() : ajoute le séparateur de fichier.
  • La fonction GetFileString() : retourne la chaîne complète de l'ensemble des fichiers images du dossier, séparés par le séparateur (Constante SEPARATOR) qui sera traitée comme un tableau avec la fonction Split().
  • La fonction BrowseForFolder() : affiche la boîte de dialogue de sélection des dossiers.
  • La fonction BrowseCallbackProc() : initialise l'élément typé lpfnCallback de la variable udtBrowseInfo : cette initialisation est facultative mais permet de pouvoir afficher cette fenêtre sur le dernier dossier sélectionné (StartDir).
  • La fonction GetAddressOf : retourne l'adresse de la fonction (Attention ceci n'est pas supporté par Office 97)
warning L'usage des variables associées à Scripting.FileSystemObject sont déclarées en Objet de façon volontaire afin d'éviter la référence à scrrun.dll. Mais rien ne vous empêche de cocher la référence et ainsi bénéficier de l'intellisence pour compléter par exemple le code.

L'affectation de la variable oFSO se fait alors avec un CreateObject().

3-3. Le formulaire UserForm

Pour concevoir le UserForm, insérer un nouvel objet UserForm dans votre projet et insérez-y :

  • Un contrôle Image contenant l'icône vbInformation
  • Un contrôle Label nommé lblMessage dont la légende est # signifiant (pour moi) que celui-ci est alimenté dynamiquement.
  • Un contrôle CheckBox intitulé chkDontShow
  • Un contrôle bouton de commande intitulé cmdOK
Vous nommerez cet objet frmWelcome.
- Il n'y a pas de propriétés particulières à définir ici si ce n'est le titre qui est "Créer un diaporama".
- Vous les disposez de telle sorte à ce que vous obteniez quelque chose ressemblant à l'illustration ci-dessous.


Le label devant contenir le message à afficher contient un caractère #.

En effet, c'est sur l'événement UserForm_Activate() que s'initialise ce message.
Ce message est stockée provisoirement dans une variable de type String où sont appelées les valeurs des constantes du nom du menu (MENU_NAME_FR) et le nom de la rubrique (ICON_CAPTION).
Code du UserForm frmWelcome
Option Explicit

Private Sub chkDontShow_Click()
    SavePreferences chkDontShow.Value
End Sub

Private Sub cmdOK_Click()
    SavePreferences chkDontShow.Value
    Unload Me
End Sub

Private Sub UserForm_Activate()
Dim strMessage As String

    strMessage = "Vous êtes prêt(e) à créer un diaporama à partir des photos que vous allez sélectionner..." & _
 vbCrLf & vbCrLf & "Dans le menu [" & MENU_NAME_FR & "], choisissez la rubrique [" & _
 ICON_CAPTION & "]."
    lblMessage.Caption = strMessage
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    Cancel = (CloseMode = vbFormControlMenu)
End Sub

Private Sub SavePreferences(ByVal ShowAtStartup As Boolean)
    SaveSetting APP_NAME, KEY_SETTINGS, VALUE_DONOTSHOWATSTARTUP, ShowAtStartup
End Sub
  • L'événement chkDontShow_Click : Evénement Click qui appelle la procédure SavePreferences.
  • L'événement cmdOK_Click : Evénement Click qui appelle la procédure SavePreferences puis décharge le UserForm.
  • L'événement UserForm_Activate : Initialise le contenu du Label lblMessage.
  • L'événement UserForm_QueryClose : Empêche la fermeture de la fenêtre par la croix en initialisant Cancel selon le paramètre CloseMode.
  • La procédure SavePreferences : Procédure écrivant la valeur dans la base de Registre.

4. Comment cela fonctionne t-il ?

1 - Le principe est relativement simple :

L'ouverture de l'application entraîne l'exécution de la procédure Auto_Open() qui installe le menu puis affiche un message de bienvenue.
Lorsque l'utilisateur charge le complément depuis la liste des macros complémentaires (à faire une seule et unique fois) le même phénomène se produit.

2 - Déroulement :

Lorsque l'utilisateur clique sur le menu pour créer son diaporama, le programme vérifie d'abord s'il y a une présentation active autre
que celle du projet, bien entendu.
La question lui est-alors posée, le cas échéant, de savoir s'il veut ou non l'utiliser s'il y en a une.
Cela permet en fait d'enrichir la présentation de photos à partir de dossiers différents.

=> Dans tout autre cas, une nouvelle présentation est créée.

La question du délai à définir entre chaque diapo est alors posée puis la sélection du dossier s'en suit aussitôt après...

3 - Sélection du dossier :

Le programme ensuite appelle l'ouverture de la boîte de dialogue des dossiers par le biais de la fonction BrowseForFolder() mais
vérifie dans le Registre si un dossier a déjà été sélectionné auquel cas il affiche la dite boîte sur ce dernier.

Aussitôt après, le nom du dossier est exploité par la fonction GetFileString() qui alimente la variable strFilesName.
Cette variable va contenir une chaîne de l'ensemble des fichiers du dossier séparés par un séparateur déclaré en constante.


4 - Construction de la présentation :

Une boucle s'établit alors avec l'exploitation des bornes d'un tableau de Strings retourné par la fonction Split() :

Pour chaque élément du tableau, une variable s'initialise avec le nom du dossier suivi du nom du fichier dans l'index de la boucle et appelle
la procédure AutoFitCurrentPicture() pour y loger l'image.

4 - Visualisation :

Lorsque la boucle a terminé son cycle, un message apparaît pour en informer l'utilisateur et pose la question de l'enregistrement
de cette dernière.

Le diaporama est alors lancé quelle que soit la réponse.


5. Création du complément

La dernière étape consiste à générer le complément.


5-1. Sauvegarde du projet

  • Commencez par enregistrer votre projet au format Présentation PowerPoint (PPT) sous un nom explicite
    de manière à garder une source modifiable ;
  • Une fois cela fait, testez votre projet en appuyant sur F5 dans la procédure Auto_Open();

5-2. Les tests

  • Réduisez l'éditeur VBE;
  • Sélectionnez dans le menu Insertion la rubrique Créer un diaporama: la procédure doit s'exécuter aussitôt ;
  • Sélectionnez un dossier contenant des images aux formats appropriés ;
  • C'est tout...

5-3. La génération du complément

Une fois que vos tests sont concluants, enregistrez votre projet au format Macro complémentaire PowerPoint (PPA).

C'est terminé.


6. Conclusion

Ce tutoriel va vous permettre de connaître l'étendue de quelques possibiltés intéressantes réalisables avec PowerPoint.
Il est évident que cette application n'est pas vouée à être exploitée en tant que telle comme les autres applications Office mais, il peut être intéressant de connaître et mettre en place ce genre de processus pour par exemple, faire une présentation instantanée par programme depuis une autre application.

Les possibiltés sont relativement vastes compte tenu du fait que ce sont les idées qui vous permettront d'exploiter ce tutoriel.
Si vous rencontrez des difficultés ou si j'ai omis de préciser quelque chose qui reste obscur, n'hésitez pas à m'en faire part. 
 آخر مواضيع منتدى نقاش المغرب العربي

Aucun commentaire:

Enregistrer un commentaire