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
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
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
- Dans le menu Démarrer de Windows, lancez Excel 2010.
- Lancez une deuxième instance d'Excel. Vérifiez que les deux fenêtres Excel sont affichées.
- Dans la barre des tâches de Windows, choisissez puis sélectionnez Ouvrir le gestionnaire des tâches.
- 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).
- Fermez les deux instances d'Excel.
- Dans le menu Démarrer de Windows, choisissez Excel 2013.
- Lancez une deuxième instance d'Excel. Vérifiez que les deux fenêtres Excel sont affichées.
- Redémarrez le gestionnaire des tâches.
- 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
- Dans le menu Démarrer de Windows, choisissez Excel 2010.
- Choisissez la fenêtre Excel pour qu’elle soit active et vérifiez que Classeur1 est le classeur actif.
- Appuyez sur CTRL+N pour ouvrir un autre classeur. Vérifiez que Classeur2 devient le classeur actif.
- Réduisez le document Classeur2 ; vous voyez alors le document Classeur1. Les deux classeurs sont contenus dans la même instance d'Excel.
- Fermez Excel.
- Dans le menu Démarrer de Windows, choisissez Excel 2013.
- Choisissez la fenêtre Excel pour qu’elle soit active et vérifiez que Classeur1 est le classeur actif.
- 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).
- 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
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
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
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).Width
ThisWorkbook.Windows(1).Right
ThisWorkbook.Windows(1).Left
, , ThisWorkbook.Windows(1).Minimize
ThisWorkbook.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.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
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 ouSheet.Visible = False
, respectivement. Détectez et annulez tous les événements fermants à l’aide deWorkbook.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
- Ouvrir des classeurs Excel dans des fenêtres distinctes et les afficher côte à côte
- L'interface SDI dans Excel 2013 : comment recréer votre volet des tâches pour qu'il la prenne en charge
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.
Commentaires
https://aka.ms/ContentUserFeedback.
Coming soon: Throughout 2024 we will be phasing out GitHub Issues as the feedback mechanism for content and replacing it with a new feedback system. For more information see:Envoyer et afficher des commentaires pour