Numéro d'article: 268016 - Dernière mise à jour: lundi 22 mai 2006 - Version: 4.2

PROBLÈME : Internet Explorer ne peut pas ouvrir un fichier de macro complémentaire Excel (*.xla)

A noterCet article s'applique à un système d'exploitation différent de celui que vous utilisez. Le contenu de l'article qui ne vous concerne peut-être pas est désactivé.

Sommaire

Agrandir tout | Réduire tout

Symptômes

Lorsque vous naviguez vers un fichier de macro complémentaire Microsoft Excel (*.xla) à partir d'une page Web à l'aide d'Internet Explorer, la macro complémentaire n'est pas chargée et Internet Explorer affiche un avertissement indiquant que la page que vous recherchez n'est pas disponible actuellement. Ce problème se produit lorsque vous ouvrez la macro complémentaire à l'aide du protocole HTTP plutôt que FILE.

Cause

L'avertissement se produit car la macro complémentaire Excel (*.xla) est en réalité un classeur Excel (*.xls) qui ne contient pas de feuilles de calcul. La seule partie du fichier utilisée par Excel est le sous-stockage de projet Visual Basic pour Applications (VBA), qui contient le code de la macro (VBA). Toutefois, puisque le fichier .xla est en fait un fichier .xls déguisé, il a le même CLSID qu'un classeur Excel ("{00020820-0000-0000-C000-000000000046}") et est représenté par le même type MIME (Multipurpose Internet Mail Extensions) ("application/vnd.ms-excel").

Les versions 3.0 et ultérieure d'Internet Explorer prennent en charge l'activation sur place d'objets documents ActiveX (ADO) dans le navigateur Web. Étant donné qu'un fichier .xla possède le même CLSID qu'un classeur Excel, Internet Explorer tente de charger le fichier .xla en tant que classeur incorporé. Puisque le fichier .xla ne contient aucune feuille de travail pour la modification sur place, l'incorporation échoue et Internet Explorer affiche l'avertissement. L'instance de Microsoft Excel en cours qui a été démarrée pour le processus d'incorporation peut soit se fermer immédiatement, soit devenir visible. Toutefois, du fait de l'échec de l'activation sur place, l'instance apparaît sans menus ni barres d'outils.

Internet Explorer utilise le paramètre de type MIME des documents renvoyés d'un serveur pour savoir comment activer la page pour l'affichage. Si un serveur HTTP renvoie un type de contenu MIME "application/vnd.ms-excel" pour une page demandée, Internet Explorer essaie de charger le contenu du fichier en tant que classeur Excel. Par défaut, les services Internet (IIS) associent l'extension *.xla avec ce type MIME, ce qui provoque le comportement décrit ci-dessus dans le cas d'un lien hypertexte vers un fichier .xla.

Résolution

Pour éviter d'ouvrir la macro complémentaire à l'aide du protocole HTTP, votre page Web peut utiliser un script côté client pour démarrer Microsoft Excel à l'aide d'Automation, puis charger le fichier .xla à partir d'une URL. Les étapes ci-dessous illustrent cette méthode.
  1. Créez un nouveau fichier texte dans le Bloc-notes et ajoutez le code suivant :
    <HTML>
    <BODY>
    Press the button to start Excel and load an XLA.
    
    <SCRIPT LANGUAGE="JScript">
    function LoadMyXLA()
    {
      var oXL = new ActiveXObject("Excel.Application");  
      var oAddin = oXL.Workbooks.Open("C:\\Test.xla");
      oAdd.RunAutoMacros(1);
      oXL.Visible = true;
      oXL.UserControl = true;
    }
    </SCRIPT>
    <P><INPUT ID=button1 TYPE=button 
       VALUE="Load XLA" ONCLICK="LoadMyXLA()">
    </BODY>
    </HTML>
    					
  2. Remplacez la chaîne passée à la méthode Open par le chemin de votre fichier .xla (fixe ou URL).
  3. Enregistrez le fichier texte et renommez-le avec une extension .htm, puis ouvrez-le dans Internet Explorer et cliquez sur le bouton. Notez qu'Excel démarre dans une fenêtre distincte et que le fichier .xla est chargé.

Plus d'informations

Les macros complémentaires Excel (*.xla) ne prennent pas en charge l'incorporation et ne peuvent pas être ouvertes à partir d'Internet Explorer. Les utilisateurs finals n'ouvrent normalement pas de fichiers .xla ; ils ouvrent plutôt un fichier .xls qui (le cas échéant) charge une ou plusieurs macros complémentaires lors du démarrage. Ce n'est que dans de rares cas qu'un utilisateur doit démarrer un fichier .xla directement. Dans ces situations, un code de script peut être utilisé si vous souhaitez démarrer le fichier à partir d'Internet Explorer.

Toutefois, l'automatisation d'Excel à partir de script ne fonctionne pas si l'ordinateur client est défini sur Sécurité élevée ou si l'option "Contrôles d'initialisation et de script ActiveX non marqués comme sécurisés" est désactivée. Ces clients doivent abaisser leurs paramètres de sécurité vers "Demander" pour pouvoir exécuter le code de script et ouvrir le fichier .xla. Les fichiers .xla et Excel Automation ne sont pas sécurisés pour le script par défaut.

Pour plus d'informations sur la façon de modifier par programmation ces options Internet Explorer à l'aide d'un contrôle approuvé ou d'un utilitaire d'installation (mais pas d'un script), cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances.
182569  (http://support.microsoft.com/kb/182569/ ) Description des entrées du Registre relatives aux zones de sécurité de Microsoft Internet Explorer

Autres considérations et solutions de contournement

Si les scripts ne constituent pas une solution adaptée à la conception de vos pages Web, vous pouvez contourner le problème via les modifications du Registre et du fichier XLA lui-même. Cette procédure doit être accomplie en dehors d'Internet Explorer ou de pages ASP (Active Server Pages) et elle ne constitue pas une solution viable dans le cas d'applications Web où l'environnement client ne peut pas être contrôlé. Les propos ci-dessous décrivent de manière plus détaillée la cause du problème et les procédures à effectuer pour l'éviter.

Étant donné qu'Internet Explorer utilise le type MIME spécifié par le serveur lors d'une opération HTTP GET, vous devez empêcher les services Internet (ou le serveur Web avec lequel vous communiquez) d'associer l'extension *.xla au type MIME "application/vnd.ms-excel". Les services Internet (IIS) enregistrent ces informations dans les paramètres de propriétés du dossier Web (c'est-à-dire dans la métabase). Pour modifier le comportement de votre site Web IIS, vous devez donc modifier la métabase. Pour cela, dans IIS versions 4.0 et 5.0, vous pouvez procéder comme suit :
  1. Démarrez le Gestionnaire des services Internet.
  2. Cliquez avec le bouton droit sur le dossier qui contient la macro complémentaire sous le Site Web par défaut et choisissez Propriétés dans le menu déroulant.
  3. Sélectionnez l'onglet En-têtes HTTP, puis cliquez sur Types de fichiers sous la section MIME.
  4. Cliquez sur Nouveau type. Spécifiez .xla comme Extension associée et text/plain comme Type de contenu (MIME). Cliquez sur OK pour ajouter le type de fichier.
  5. Cliquez sur OK pour fermer la boîte de dialogue Types de fichiers, puis à nouveau sur OK pour fermer la boîte de dialogue Propriétés des dossiers.

    REMARQUE : Vous devrez peut-être arrêter et redémarrer le serveur IIS pour que les modifications soient appliquées.
Pour les fichiers ouverts localement ou ouverts à partir d'un serveur Web qui ne spécifie pas de type MIME, Internet Explorer utilise l'identificateur CLSID du fichier lui-même pour associer un serveur et charger le fichier. Étant donné qu'un fichier .xla est semblable à un fichier .xls, le CLSID du stockage racine est celui d'un classeur Excel (Feuille de calcul Excel 8). Pour empêcher Internet Explorer d'utiliser ce CLSID, vous devez l'extraire du fichier à l'aide des API de stockage structuré OLE. Ceci n'a normalement pas d'incidence sur la fonctionnalité du fichier dans Excel, mais si le fichier est modifié dans Excel, l'identificateur CLSID sera réinséré dans le fichier.

Le code Microsoft Visual C++ suivant illustre comment remplacer le CLSID du stockage principal par un CLSID NULL :
#include <windows.h>
int PASCAL WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
   LPSTR pszCmdLine, int nCmdShow)
{
  WCHAR wszFile[MAX_PATH];
  CHAR  szFile[MAX_PATH];
  szFile[0] = 0;

  OPENFILENAME    ofn;
  ZeroMemory(&ofn, sizeof(OPENFILENAME));

  if (FAILED(CoInitialize(NULL)))
    return -1;

  ofn.lStructSize      = sizeof(OPENFILENAME);
  ofn.lpstrFilter      = "Microsoft Excel Addins (*.xla)\0*.xla\0\0";
  ofn.nFilterIndex     = 1L;
  ofn.lpstrDefExt      = "xla";
  ofn.lpstrFile        = szFile;
  ofn.nMaxFile         = MAX_PATH;
  ofn.Flags            = OFN_HIDEREADONLY | OFN_FILEMUSTEXIST;

  if (GetOpenFileName(&ofn) && (szFile[0] != '\0'))
  {
		
    if (!MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED,
           szFile, -1, wszFile, MAX_PATH))
    {
       MessageBox(NULL, "Can't convert to Unicode!",
          "XlaClsid", MB_ICONSTOP | MB_SETFOREGROUND);
       return -2;
    }

    IStorage* pstg = NULL;
    HRESULT hr = StgOpenStorage(wszFile, NULL,
             STGM_READWRITE | STGM_SHARE_EXCLUSIVE, NULL, 0, &pstg);
    if (SUCCEEDED(hr) && pstg)
    {			
       pstg->SetClass(GUID_NULL);
       pstg->Release();
       MessageBox(NULL, "Call succeeded. CLSID has been stripped.",
          "XlaClsid", MB_ICONINFORMATION | MB_SETFOREGROUND);
    }
    else
    {
       MessageBox(NULL, "Unable to open file. It may be in use.",
          "XlaClsid", MB_ICONSTOP | MB_SETFOREGROUND);
    }
    
  }

  CoUninitialize();
  return 0;
}
				
Remarque Internet Explorer ne vérifie pas l'identificateur CLSID à partir du fichier de stockage structuré si le fichier .xla est ouvert à partir de la barre d'adresses, mais il le vérifie si le fichier .xla est référencé dans un lien hypertexte. Ce comportement peut être modifié dans les versions futures d'Internet Explorer ; il est recommandé de ne pas vous fier au comportement actuel et de ne pas omettre de supprimer l'identificateur CLSID du fichier .xla.

Si le CLSID du fichier a été supprimé et le serveur n'a pas spécifié un type MIME, Internet Explorer utilise l'extension du fichier pour démarrer Excel et charger le fichier .xla. Selon la configuration du Registre sur le système client, le fichier sera peut-être encore incorporable, donc il sera peut-être nécessaire de modifier le Registre client. Les clés de Registre correspondantes sont les suivantes :
   HKEY_CLASSES_ROOT\.xla
				
- et -
   HKEY_CLASSES_ROOT\Excel.Addin
				
Vous devez vous assurer qu'aucune valeur "Type de contenu" n'a été spécifiée sous ces clés de Registre car les clés peuvent réorienter Internet Explorer vers un type MIME et de là le renvoyer au CLSID du classeur. En outre, la clé Excel.Addin peut contenir une sous-clé CLSID qui réoriente également Internet Explorer vers l'utilisation de l'incorporation. Cette clé doit être renommée ou supprimée afin d'empêcher Internet Explorer de trouver l'identificateur CLSID.

Si toutes les étapes ci-dessus sont effectuées, Internet Explorer ne trouvera pas d'identificateur CLSID pour ce type de fichier et chargera le fichier à l'aide d'une commande ShellExecute. Ceci exécute le fichier comme si l'utilisateur avait double-cliqué dessus à partir d'Internet Explorer.

Références

Pour plus d'informations sur les types MIME et les documents Office, cliquez sur les numéros ci-dessous pour afficher les articles correspondants dans la Base de connaissances Microsoft.
199841  (http://support.microsoft.com/kb/199841/ ) COMMENT FAIRE : Afficher les résultats ASP à l'aide d'Excel dans Internet Explorer avec des types MIME
266263  (http://support.microsoft.com/kb/266263/ ) BOGUE : Word 2000 et Excel 2000 affichent la source ASP lors de l'utilisation du type MIME pour la diffusion de données en continu
247389  (http://support.microsoft.com/kb/247389/ ) IIS : Comment faire pour désactiver la mise en cache de types MIME spécifiques

Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Office Excel 2003
  • Microsoft Excel 2002
  • Microsoft Excel 2000 Standard
  • Microsoft Excel 97 Standard
  • Microsoft Internet Explorer 3.0
  • Microsoft Internet Explorer 4.0 Édition 128 bits
  • Microsoft Internet Explorer 5.0
  • Microsoft Internet Explorer 5.5
Mots-clés : 
kbprb kbprogramming KB268016
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.