Programmation de l'interface monodocument dans Excel

Découvrez les considérations de programmation pour l'interface SDI (single-document interface) dans Excel.

Comparaison des interfaces SDI et MDI dans Excel 2010 et Excel 2013

Excel 2013 présente une nouvelle fonctionnalité : l'interface monodocument (SDI). SDI est une méthode d'organisation des applications de l'interface utilisateur graphique en fenêtres individuelles que le gestionnaire de fenêtres du système d'exploitation gère séparément. Dans Excel 2013, chaque fenêtre Excel peut contenir uniquement un classeur, et chacune dispose de ses propres options du ruban (voir Figure 1). Par défaut, lorsque vous ouvrez un nouveau classeur, il est affiché dans une autre fenêtre Excel, bien qu'il s'agisse de la même instance d'Excel.

Figure 1. Interface SDI (single-document interface) dans Excel 2013

Interface SDI (single-document interface) dans Excel 2013

Cette interface est différente d'une interface MDI (multiple-document interface), dans laquelle une seule fenêtre parent contient plusieurs fenêtres enfants imbriquées et seule la fenêtre parent comporte une barre de menus ou une barre d'outils. Dans Excel 2010, chaque classeur ouvert dans la même instance d'Excel disposait des mêmes options du ruban (voir Figure 2).

Figure 2. Interface MDI (multiple-document interface) dans Excel 2010

Interface multidocument (MDI) dans Excel 2010

Excel 2010 utilise l’interface MDI, ce qui signifie qu’il existe une seule fenêtre au niveau de l’application contenant tous les classeurs ouverts dans une instance particulière d’Excel. Les fenêtres du classeur peuvent être organisées à l'intérieur de la fenêtre de l'application Excel, car toutes partagent les mêmes options du ruban. Avec l'interface SDI dans Excel, chaque classeur disposera de sa propre fenêtre d'application de niveau supérieur et possédera ses propres options du ruban correspondantes.

Remarque

Il n’existe aucune option de compatibilité MDI dans Excel.

Dans les systèmes à deux écrans, l'interface SDI dans Excel permet de comparer deux classeurs côte à côte en faisant glisser chaque classeur sur son propre écran. Chaque classeur fonctionne indépendamment de l'autre.

Pour voir les interfaces SDI et MDI en action, si vous disposez d'Excel 2010 et d'Excel 2013, procédez comme suit.

Pour comparer le nombre de processus pour les interfaces MDI et SDI

  1. Dans le menu Démarrer de Windows, lancez Excel 2010.
  2. Lancez une deuxième instance d'Excel. Vérifiez que les deux fenêtres Excel sont affichées.
  3. Dans la barre des tâches de Windows, choisissez puis sélectionnez Ouvrir le gestionnaire des tâches.
  4. Choisissez l’onglet Processus et faites défiler vers le bas jusqu’à ce que vous voyiez les deux entrées Excel.exe. Cela vous indique que, par défaut, Excel lance une nouvelle instance chaque fois qu'il est appelé (deux instances d'Excel).
  5. Fermez les deux instances d'Excel.
  6. Dans le menu Démarrer de Windows, choisissez Excel 2013.
  7. Lancez une deuxième instance d'Excel. Vérifiez que les deux fenêtres Excel sont affichées.
  8. Redémarrez le gestionnaire des tâches.
  9. Sous l’onglet Processus , faites défiler jusqu’à ce que vous voyiezExcel.exe. Même si vous avez ouvert deux instances d'Excel, les deux classeurs sont contenus dans la même instance d'Excel.

Pour voir comment fonctionnent les interfaces SDI et MDI au sein d'une instance d'Excel, procédez comme suit.

Pour comparer le nombre d’instances Excel pour les interfaces MDI et SDI

  1. Dans le menu Démarrer de Windows, choisissez Excel 2010.
  2. Choisissez la fenêtre Excel pour qu’elle soit active et vérifiez que Classeur1 est le classeur actif.
  3. Appuyez sur CTRL+N pour ouvrir un autre classeur. Vérifiez que Classeur2 devient le classeur actif.
  4. Réduisez le document Classeur2 ; vous voyez alors le document Classeur1. Les deux classeurs sont contenus dans la même instance d'Excel.
  5. Fermez Excel.
  6. Dans le menu Démarrer de Windows, choisissez Excel 2013.
  7. Choisissez la fenêtre Excel pour qu’elle soit active et vérifiez que Classeur1 est le classeur actif.
  8. Appuyez sur CTRL+N pour ouvrir un autre classeur. Vérifiez que le document Classeur2 est ouvert dans une fenêtre distincte d’Excel (mais dans la même instance).
  9. Fermez Excel.

Remarque

Vous pouvez ouvrir plusieurs instances d’Excel à l’aide du commutateur de ligne de commande suivant : excel.exe /x. Ce commutateur lance Excel dans un nouveau processus.

Dans cet article, nous allons étudier l'implémentation de l'interface SDI dans l'interface utilisateur d'Excel et son impact sur la programmabilité dans Excel.

Nouveautés de l'interface utilisateur

Si vous examinez attentivement l’ouverture d’un classeur Excel, vous ne voyez plus les boutons d’état de la fenêtre ( réduire, agrandir et restaurer) dans le coin supérieur droit du ruban. La figure 3 montre les boutons d'état de la fenêtre qui sont disponibles dans Excel et Excel 2007. Étant donné que la fenêtre de niveau supérieur est désormais directement liée à un classeur unique ou affichage de classeur, les options de gestion des fenêtres dans Excel ne sont plus utiles.

Figure 3. Interface utilisateur d’état Windows dans Excel 2010

Interface utilisateur d'état Windows dans Excel 2010

En outre, à partir d'Excel, le logiciel ne présente plus plusieurs fenêtres de classeur dans une seule fenêtre d'instance Excel comme illustré à la Figure 4.

Figure 4. Plusieurs classeurs dans une seule instance Excel

Plusieurs classeurs dans une seule instance Excel

Recalcul et formules

Les recalculs dans Excel seront toujours « globaux », c'est-à-dire qu'ils interviendront dans tous les classeurs d'une même instance d'Excel. Les formules qui font référence à des données entre différents classeurs ouverts dans la même instance d'Excel feront partie des calculs et utiliseront le même mode de calcul du classeur (automatique, excepté dans les tableaux de données, et manuel).

Avec l'interface MDI, une seule barre de formule permet de gérer tous les classeurs ouverts dans une même instance d'Excel. Dans l'interface SDI, il existe une barre de formule par classeur. Avec l'interface SDI, lors de la modification des références entre classeurs dans une formule, les barres de formule source et cible du classeur afficheront la formule en cours de modification comme indiqué dans la Figure 5.

Figure 5. Mise à jour de formules inter-classeurs

Mise à jour de formules inter-classeurs

Volets des tâches personnalisés

Les volets des tâches personnalisés qui étaient auparavant attachés à une fenêtre de niveau supérieur dans l'interface MDI sont maintenant attachés à la fenêtre d'un classeur particulier dans l'interface SDI. Le fait de basculer sur un autre classeur permet d'activer la fenêtre de ce classeur, auquel le volet des tâches personnalisé ne sera pas forcément associé, à moins que le code du développeur soit modifié pour afficher spécifiquement le volet des tâches personnalisé pour ce classeur.

Pour résumer, en tant que développeur, vous devez :

  • Assurez-vous que pour tous les classeurs où vous souhaitez afficher le volet Office personnalisé, vous écrivez du code pour le faire explicitement.
  • Veillez à gérer explicitement la mise à jour de l’état personnalisé du volet Office sur toutes les instances, si vous souhaitez que tous les volets Office personnalisés reflètent le même état. Par exemple, une case à cocher est activée par l’utilisateur, et vous souhaitez qu’elle soit reflétée dans tous les volets office personnalisés dans toutes les instances d’Excel.

Rubans personnalisés

Les onglets et les contrôles de ruban personnalisé qui n'apparaissaient que sur un seul et même ruban par instance d'application dans les versions précédentes d'Excel apparaîtront désormais sur le ruban de chaque classeur dans Excel. Alors que dans l'interface MDI, les développeurs travaillant sur le ruban personnalisé n'avaient pas besoin de prendre en compte plusieurs instances de ses contrôles du ruban en fonction de l'instance d'Excel, ils devront désormais tenir compte de cette situation avec SDI.

Si vous souhaitez conserver tous les contrôles d’interface utilisateur du ruban dans le même état dans les classeurs ouverts, vous devez :

  • Vous assurer que le code peut parcourir l'ensemble des fenêtres des classeurs et mettre à jour l'état des contrôles.

OU

  • Mettre en cache l'état des contrôles afin que, lorsque l'utilisateur bascule dans un autre classeur, cet événement puisse être capturé et les contrôles mis à jour dans le cadre du basculement de fenêtre.

En outre, considérez le cas où vous développez du code pour ajouter un contrôle d’interface utilisateur personnalisé à l’aide Application.Commandbar de pour accéder au ruban. Lorsque, plus tard, vous essayerez d'accéder à ce contrôle, votre code devra tenir compte du fait que le classeur actif peut ne pas être le même classeur que celui auquel vous aviez ajouté le contrôle.

Considérations pour le code VBA

Avec le passage à SDI, toutes les méthodes, événements et propriétés de fenêtre au niveau de l’application Excel restent inchangés et fonctionnent comme dans les versions précédentes d’Excel (par exemple, Application.ActiveWindow, Application.Windows, etc.).

Dans Excel, toutes les méthodes, événements et propriétés de fenêtre au niveau du classeur fonctionnent désormais sur la fenêtre de niveau supérieur (par exemple, l’événement Workbook.WindowActivate est toujours déclenché lorsque vous basculez vers un classeur particulier, l’événement Workbook.Resize est toujours déclenché lorsque ce classeur est redimensionné, et ThisWorkbook.Windows(1).Height, , ThisWorkbook.Windows(1).WidthThisWorkbook.Windows(1).RightThisWorkbook.Windows(1).Left, , ThisWorkbook.Windows(1).MinimizeThisWorkbook.Windows(1).Maximize et ainsi de suite fonctionne sur la fenêtre de niveau supérieur du classeur actif).

Les cas particuliers sont répertoriés dans le tableau suivant.

Tableau 1. Comportement du modèle objet avec SDI

Fonction Description Conséquences de l'interface SDI
Application.Visible Renvoie ou définit une valeur booléenne qui détermine si l’objet est visible. Lecture-écriture. Si toutes les fenêtres sont masquées :
  • Application.Visible devient False

  • Définir Application.Visible sur True affiche toutes les fenêtres masquées

  • L’ouverture d’un document via l’interpréteur de commandes affiche uniquement cette fenêtre et Application.Visible a désormais la valeur True

De plus :
  • Application.Visible = False masque tout et Application.Visible = True affiche tout, ignorant les paramètres au niveau du document

  • Si toutes les fenêtres sont masquées via le paramètre au niveau de l'application, le paramètre au niveau de l'application peut également les afficher

  • Si ne serait-ce qu'une seule fenêtre est affichée, cela signifie que le paramètre au niveau de l'application est défini sur True

Application.ShowWindowsInTaskbar Définie sur True s'il existe un bouton distinct de la barre des tâches Windows pour chaque classeur ouvert. La valeur par défaut est True. Boolean (en lecture/écriture). Ce paramètre est déconseillé dans Excel.
Application.Caption Renvoie ou définit une valeur String qui représente le nom affiché dans la barre de titre de la fenêtre Microsoft Excel principale. Met à jour toutes les fenêtres pour cette instance d'Excel.
Application.Hwnd Renvoie une valeur de type Long indiquant le handle de fenêtre de niveau supérieur de la fenêtre Microsoft Excel. En lecture seule. Renverra le handle de la fenêtre active.
Application.FormulaBarHeight Permet à l'utilisateur de spécifier la hauteur de la barre de formule dans des lignes. Long (en lecture/écriture). Agit sur la fenêtre du classeur actif, pas sur toutes les fenêtres pour cette instance d'Excel.
Application.DisplayFormulaBar True si la barre de formule est affichée. Boolean en lecture/écriture. Agit sur toutes les fenêtres pour cette instance d'Excel.
Workbook.Windows Renvoie une collection de fenêtres qui représente toutes les fenêtres du classeur spécifié. Objet Windows en lecture seule. Aucun changement de comportement. Renvoie la collection de fenêtres de ce classeur, à savoir les volets des tâches et les affichages supplémentaires notamment.
Workbook.WindowResize Se produit lorsque la fenêtre d'un classeur est redimensionnée. Aucun changement de comportement. Se déclenche lorsque la fenêtre d'un classeur (celle de niveau supérieur) est redimensionnée.
Window.Caption Renvoie ou définit une valeur variant qui représente le nom qui apparaît dans la barre de titre de la fenêtre de document. Aucun changement de comportement.
Workbook.Protect(Password, Structure, Windows) Protège un classeur afin qu'il ne puisse pas être modifié. Quelle que soit la valeur du paramètre Windows (True ou False), la protection de la structure de fenêtre n’est PAS activée. Aucune erreur d’exécution n’est affichée si True est spécifié, mais cette partie de l’appel de procédure retourne une valeur NO-OP.

Remarque

Aucune modification n’est requise dans le code personnalisé afin que les commandes XLM continuent de fonctionner comme prévu dans SDI Excel.

Désactivation de l'option Fenêtres dans la boîte de dialogue Protéger le classeur

Dans l'interface SDI, chaque classeur dispose de sa propre fenêtre de niveau supérieur que vous pouvez restaurer, réduire et fermer. Pour que vous ne soyez pas perdu, puisque vous ne pourrez plus déplacer, redimensionner ou fermer cette fenêtre de niveau supérieur, l'option Fenêtres dans la fonctionnalité Protéger le classeur dans Excel n'est plus disponible (voir Figure 6). Le tableau 2 décrit cette action plus en détail.

Figure 6. L’option Windows de la boîte de dialogue Protéger le classeur est désactivée

Option Windows de la boîte de dialogue Protéger le classeur

Action Comportement
Ouvrir un classeur créé dans une version antérieure d'Excel, avec la protection de fenêtre activée Excel reconnaîtra les attributs de taille et d'emplacement de la fenêtre, mais n'empêchera pas l'utilisateur d'organiser ou de fermer ces fenêtres.
Afficher la boîte de dialogue Protéger la structure et Windows Excel affiche la boîte de dialogue, mais avec l’option Windows désactivée.

Solutions aux problèmes de l'interface SDI

La section suivante fournit des solutions de contournement pour les problèmes que vous pouvez rencontrer lors de l'utilisation de l'interface SDI.

  • Un classeur ne peut pas être fermé en cliquant sur le bouton rouge « X » Fermer lorsque ce classeur est ouvert par programmation via un formulaire utilisateur modal. Pour contourner ce problème, il est conseillé d'ajouter le code suivant dans la procédure d'événement Layout de formulaire utilisateur, puis d'ouvrir le formulaire utilisateur mode non modal.

      Private Sub UserForm_Layout()
          Static fSetModal As Boolean
          If fSetModal = False Then
              fSetModal = True
              Me.Hide
              Me.Show 1
          End If
      End Sub
    

    Sinon, vous pouvez aussi ouvrir la fenêtre du classeur, activer une autre fenêtre, puis réactiver la fenêtre du classeur. Vous devez maintenant être en mesure de fermer le classeur à l’aide du bouton Fermer .

  • Supposons que votre code VBA ouvre plusieurs classeurs et utilise la propriété DataEntryMode pour contrôler l’entrée de données et la fermeture du classeur. Dans le modèle Excel SDI, étant donné que chaque classeur est contenu dans son propre processus, la propriété DataEntryMode utilisée dans un classeur ne reconnaît pas l’existence d’un autre classeur et a donc peu ou pas d’effet sur leur interaction. Pour contourner ce problème, il existe deux options. Vous pouvez masquer les classeurs ou feuilles de calcul supplémentaires à l’aide Window.Visible = False de ou Sheet.Visible = False, respectivement. Détectez et annulez tous les événements fermants à l’aide de Workbook.BeforeClose(Cancel) = True.

  • Les barres d'outils ajoutées aux classeurs Excel via le code de barre de commande et les fichiers XLA ne s'afficheront pas tant que vous n'aurez pas fermé et rouvert le classeur. L'utilisation des barres de commandes pour personnaliser l'interface utilisateur a été désactivée à partir d'Excel 2007. La solution optimale consiste à personnaliser l’interface utilisateur du ruban à l’aide de fichiers XML, comme décrit en détail dans l’article Personnalisation du ruban Office Fluent 2007 pour les développeurs

    Une autre option consiste à utiliser un événement au niveau de l’application pour détecter l’ouverture de nouveaux classeurs, puis à utiliser Application.Windows au lieu de classeurs pour ajouter le contrôle du ruban. Voici un exemple de code qui peut être utilisé pour effectuer cette opération.

      Private Sub Workbook_Open()
          ToolBarsAdd
      End Sub
    
      Sub ToolBarsAdd()
          Dim oBar As CommandBar
    
          ToolBarsDelete
          Set oBar = Application.CommandBars.Add(Name:="MyToolBar")
          '
          With oBar
              With .Controls.Add(Type:=msoControlButton)
                  .OnAction = "SayHello"
                  .FaceId = 800
              End With
          End With
          oBar.Visible = True
      End Sub
    
      Sub SayHello()
          MsgBox "Hello from '" & ActiveWorkbook.Name & "'"
      End Sub
    

    Le code suivant doit ensuite être utilisé pour supprimer la barre d'outils avant de fermer le classeur.

      Private Sub Workbook_BeforeClose(Cancel As Boolean)
          ToolBarsDelete
      End Sub
    
      Sub ToolBarsDelete()
      Dim wnd As Window
      On Error Resume Next
          For Each wnd In Application.Windows
              wnd.Activate
              Application.CommandBars("MyToolBar ").Delete
          Next wnd
      End Sub
    
  • Dans Excel 2010, un formulaire utilisateur sans mode s’affiche en tant que fenêtre de niveau supérieur au-dessus de toutes les fenêtres Excel par défaut. Dans Excel 2013, un formulaire utilisateur non modal est visible uniquement en haut de la fenêtre du classeur qui était active lors de l'affichage du formulaire utilisateur. Excel Most Valuable Professional (MVP) Jan Karel Pieterse fournit une explication du problème et une solution sur sa page web à l’adresse https://www.jkp-ads.com/articles/keepuserformontop.asp.

Résumé

La nouvelle interface SDI (single-document interface) dans Excel 2013 permet d'utiliser plusieurs classeurs en même temps. Vous pouvez même faire glisser les classeurs sur plusieurs écrans pour travailler dans une configuration plus pratique. Gardez simplement à l'esprit que chaque classeur possède sa propre fenêtre de niveau supérieur et son propre menu d'options du ruban. Vous devrez donc peut-être mettre à jour le code existant pour mettre en cache l'état des contrôles et des paramètres lorsque vous passez d'un classeur à un autre.

Voir aussi

Assistance et commentaires

Avez-vous des questions ou des commentaires sur Office VBA ou sur cette documentation ? Consultez la rubrique concernant l’assistance pour Office VBA et l’envoi de commentaires afin d’obtenir des instructions pour recevoir une assistance et envoyer vos commentaires.