Dale Oberg, ArtinSoft.com

Paru le 01 juin 2005

S'applique à :
Microsoft Visual Studio 2005
Microsoft Visual Studio 2005 Tools pour Microsoft Office System
Microsoft Visual Basic 2005
Microsoft Visual Basic pour Applications
les éditions de Microsoft Office 2003
Microsoft Office Excel 2003

Lire l'article en anglais

Résumé : Convertissez des solutions de Microsoft Visual Basic pour Applications (VBA) vers Microsoft Visual Studio 2005 Tools pour Office et Microsoft Visual Basic 2005. Faites migrer la solution d'analyseur de journal IIS VBA de Trey Research vers Visual Studio 2005 Tools pour Office afin de mettre en évidence les problèmes que vous pourrez rencontrer lors de la migration de vos projets. (22 pages imprimées)

Remarque : Cet article est une version préliminaire de la documentation et pourra faire l'objet de modifications dans les versions futures. Visual Studio 2005 Tools pour Office Bêta 2 est inclus dans Microsoft Visual Studio 2005 Bêta 2.
Téléchargez le fichier exemple IISLogAnalysis.msi.

Sur cette page

Introduction à la migration des solutions VBA vers Visual Studio 2005 Tools pour Office Introduction à la migration des solutions VBA vers Visual Studio 2005 Tools pour Office
Présentation de la sécurité de Visual Studio 2005 Tools pour Office Présentation de la sécurité de Visual Studio 2005 Tools pour Office
Présentation du système de journal d'IIS Présentation du système de journal d'IIS
Présentation de la solution d'analyseur de journal IIS de Trey Research Présentation de la solution d'analyseur de journal IIS de Trey Research
Configuration de la solution d'analyseur de journal IIS de Trey Research Configuration de la solution d'analyseur de journal IIS de Trey Research
Migration des projets de VBA vers Visual Studio 2005 Tools pour Office Migration des projets de VBA vers Visual Studio 2005 Tools pour Office
Migration des feuilles de calcul Excel de VBA vers Visual Studio 2005 Tools pour Office Migration des feuilles de calcul Excel de VBA vers Visual Studio 2005 Tools pour Office
Migration des interfaces utilisateur de VBA vers Visual Studio 2005 Tools pour Office Migration des interfaces utilisateur de VBA vers Visual Studio 2005 Tools pour Office
Migration du code de logique métier en VBA vers Visual Studio 2005 Tools pour Office Migration du code de logique métier en VBA vers Visual Studio 2005 Tools pour Office
Migration du code ADO de VBA vers Visual Studio 2005 Tools pour Office Migration du code ADO de VBA vers Visual Studio 2005 Tools pour Office
Sécurité du code Sécurité du code
Conclusion Conclusion
Ressources supplémentaires Ressources supplémentaires
À propos de l'auteur À propos de l'auteur

Introduction à la migration des solutions VBA vers Visual Studio 2005 Tools pour Office

Microsoft Visual Basic pour Applications (VBA) est à la fois l'environnement de programmation et le langage que Microsoft Office a utilisé pendant des années. Les éditions de Microsoft Office 2003 disposent aujourd'hui d'un nouvel environnement pour générer les applications. Baptisé Visual Studio Tools pour Office, cet environnement repose sur Microsoft .NET Framework.

Microsoft Visual Studio Tools pour Office version 2003 présentait déjà de nombreux avantages par rapport à VBA, mais Microsoft Visual Studio 2005 Tools pour Office améliore ces fonctionnalités pour offrir aux utilisateurs une productivité encore meilleure.

Cet article analyse les problèmes de migration que vous pouvez rencontrer lorsque vous utilisez le langage Visual Basic pour migrer directement une solution VBA vers Visual Studio 2005 Tools pour Office. L'article précédent de cette série Convert VBA Code to Visual Basic .NET When Migrating to Visual Studio 2005 Tools for Office (en anglais) traite des problèmes de codage de bas niveau rencontrés lors de la migration de VBA vers Microsoft Visual Basic .NET. L'article qui suit dans cette série s'attarde sur la restructuration de la solution Visual Studio 2005 Tools pour Office présentée dans cet article pour tirer parti de la richesse des fonctions qu'offre Visual Studio 2005 Tools pour Office.

La solution VBA, l'analyseur de journal IIS de Trey Research, analyse les fichiers journaux Microsoft Internet Information Services (IIS). Cet analyseur importe les fichiers IIS au format texte dans une base de données Microsoft SQL Server que Microsoft Office Excel 2003 interroge ensuite. L'accès à SQL Server se fait à l'aide d'objets ADO, Microsoft ActiveX Data Objects. Un système d'interrogation reposant sur des formulaires interagit avec l'utilisateur et appelle le code de la logique métier. Les résultats sont stockés dans une feuille de calcul Excel, accompagnés d'un graphique. Le code de la logique métier contient l'essentiel de la logique de programme nécessaire pour acquérir les données et ne contient aucun code d'interface utilisateur (UI).

Chez ArtinSoft, nous avons migré la solution d'analyseur de journal IIS de Trey Research vers Visual Studio 2005 Tools pour Office afin de tirer parti de Visual Basic 2005 et de la sécurité .NET Framework. Nous avons migré le formulaire VBA vers Microsoft Windows Form et l'ensemble du code VBA ADO vers du code ADO dans Visual Studio 2005 Tools pour Office. Le code de la logique métier est dans une classe distincte de la solution.

L'article suivant de cette série explique comment effectuer les actions suivantes :

  • Restructurer le code ADO pour utiliser ADO.NET.

  • Tirer parti des fonctionnalités dans .NET Framework.

Présentation de la sécurité de Visual Studio 2005 Tools pour Office

Les virus de macro écrits en VBA constituent un grave risque de sécurité pour les documents Microsoft Office Word et Excel. Visual Studio 2005 Tools pour Office met en œuvre de nouveaux mécanismes de sécurité qui améliorent considérablement la sécurité des documents Word et Excel. Dans VBA, les macros sont stockées au sein même du document Office. Ce type de stockage constitue un véritable risque de sécurité dans la mesure où il est difficile de déterminer l'origine du code et son action. Dans Visual Studio 2005 Tools pour Office, le code de macro est conservé hors du document Word ou Excel, dans un assembly dont l'auteur peut signer le code. Lorsqu'une application Office est introduite dans l'environnement d'une entreprise, l'assembly peut être placé en lecture seule sur un lecteur partagé du réseau local. Ce mécanisme de déploiement présente l'avantage de permettre le contrôle rigoureux de tout le code Visual Studio 2005 Tools pour Office et la vérification de son authenticité avant de l'exécuter. Autre avantage de gestion de ce type de déploiement : vous pouvez mettre à jour le code indépendamment du document Word ou Excel.

Lorsque vous créez ou ouvrez une solution Visual Studio 2005 Tools pour Office pour la première fois, la boîte de dialogue illustrée en figure 1 s'affiche, et fait office de mesure de sécurité supplémentaire.

OfficeVSTOExcelVBAMigration_Fig1_thumb.gif

Figure 1. Boîte de dialogue de sécurité dans Visual Studio 2005 Tools pour Office (Cliquez sur l'image pour l'agrandir.)

Le CLR et le .NET Framework fournissent également un mécanisme de sécurité appelé sécurité d'accès au code. La sécurité d'accès au code limite l'exécution du code suivant les circonstances. Le principe de sécurité d'accès au code est un sujet relativement complexe mais une présentation rapide du mécanisme de sécurité peut se révéler très utile pour mettre en œuvre une sécurité de base dans les applications Visual Studio 2005 Tools pour Office.

Dans le système de sécurité d'accès au code, la stratégie met en correspondance les preuves et les autorisations. Une preuve est composée des types d'informations suivants :

  • La zone d'origine de l'assembly, généralement la zone Internet, la zone Intranet ou la zone Poste de travail

  • L'URL spécifique de l'assembly

  • Les informations sur l'auteur de l'assembly, généralement définies par le nom fort ou le certificat de l'éditeur de l'assembly

Il existe quatre niveaux de stratégie dans la sécurité d'accès au code :

  • Entreprise

  • Machine

  • Utilisateur

  • Application

Chaque niveau de stratégie détermine l'association entre la preuve et chaque jeu d'autorisations. Le système de sécurité accorde une autorisation uniquement si elle est accordée par les quatre niveaux de stratégie.

Les autorisations de confiance totale accordent l'autorisation d'effectuer tout ce que l'utilisateur actif a le droit de faire. Les autorisations de confiance partielle accordent l'autorisation d'utiliser une partie de l'espace du disque dur, de produire des interfaces utilisateur et d'accéder au nom de l'utilisateur actif. La confiance partielle ne permet pas de modifier les fichiers, les variables d'environnement ou les clés de Registre. Les autorisations Pas de confiance signifient que le code ne peut pas être exécuté et qu'aucun accès ne lui est accordé.

Le niveau de stratégie Entreprise par défaut est Confiance totale. Le niveau de stratégie Machine par défaut est Pas de confiance, mais il est composé de sous-catégories pour les autres zones qui accordent une confiance. Ces zones et leurs stratégies se présentent comme suit :

  • La zone machine locale, qui dispose de la confiance totale

  • La zone Internet, qui dispose de la confiance partielle

  • La zone Intranet, qui dispose de la confiance partielle

Le niveau de stratégie Utilisateur par défaut est Confiance totale et il en est de même pour le niveau de stratégie Application. Pour plus d'informations sur la sécurité d'accès au code dans Visual Studio 2005 Tools pour Office, reportez-vous à l'article Eric Lippert - Discussing Visual Studio Tools for Office .

Les applications Visual Studio 2005 Tools pour Office ayant souvent besoin d'effectuer des tâches telles que l'enregistrement d'un document à un emplacement arbitraire, elles ont besoin des autorisations de confiance totale pour s'exécuter. Par défaut un assembly Visual Studio 2005 Tools pour Office n'a pas l'autorisation de s'exécuter s'il est chargé à partir d'une zone Intranet ou Internet. L'utilisateur doit explicitement modifier la stratégie de sécurité pour exécuter ce type d'application à partir des zones Intranet ou Internet car Visual Studio 2005 Tools pour Office est conçu pour privilégier la sécurité plutôt que le caractère pratique du déploiement par défaut.

Présentation du système de journal d'IIS

Internet Information Services (IIS) peut enregistrer des informations sur chaque accès à un site Web. Vous pouvez activer l'enregistrement des accès à un site Web dans la console de gestion d'IIS. Il est possible de choisir différentes versions du fichier journal IIS. La solution d'analyseur de journal IIS de Trey Research prend en charge le format de fichier journal Microsoft IIS par défaut. Pour plus d'informations sur les formats des fichiers journaux IIS, rendez-vous sur la page IIS Log File Formats.

Le format du fichier journal de Microsoft IIS est un fichier texte délimité par des virgules dont chacune des lignes a le format suivant :

Client IP, Username, Hit Date, Hit Time, Service Instance, Computer Name, Server IP, Time Taken, Bytes Sent, Bytes Received, Service Status Code, Windows Status Code, Request Type, Target Url, Parameters

Une ligne de fichier journal IIS peut se présenter comme suit :

172.16.255.255, anonymous, 03/20/04, 23:58:11, MSFTPSVC, SALES1, 172.16.255.255, 60, 275, 0, 0, 0, PASS, /Intro.htm, -,

Pour activer l'enregistrement sur un site Web spécifique :

  1. Dans le menu Démarrer, cliquez sur Panneau de configuration, choisissez Outils d'administration, puis double-cliquez sur le fichier Internet Information Services pour afficher la console de gestion d'IIS.
    Remarque : Si le fichier Internet Information Services n'existe pas, il doit être installé.

  2. Cliquez avec le bouton droit de la souris sur le site Web pour lequel vous souhaitez activer l'enregistrement, puis cliquez sur Propriétés.

  3. Dans la boîte de dialogue Propriétés, cliquez sur l'onglet Site Web et activez la case Activer l'enregistrement dans le journal.

  4. Dans la liste Format du journal actif, sélectionnez Format de fichier journal Microsoft IIS, et cliquez sur OK.

Présentation de la solution d'analyseur de journal IIS de Trey Research

La solution d'analyseur de journal IIS de Trey Research est un programme VBA sous Excel qui agit comme un outil d'analyse des rapports pour les journaux IIS. Le programme contient un formulaire de définition des critères de rapport (Report Criteria) permettant de spécifier sur quel critère importer et analyser les données qui sont extraites de la base de données et copiées dans la feuille de calcul Excel. La solution crée en haut de la feuille de calcul Excel un histogramme qui représente les sept premières lignes des cellules de rapport de la feuille de calcul, comme illustré en figure 2.

OfficeVSTOExcelVBAMigration_Fig2_thumb.gif

Figure 2. Feuille de calcul VBA Excel de l'analyseur de journal IIS de Trey Research (Cliquez sur l'image pour l'agrandir.)

La solution permet d'importer un fichier journal IIS existant au format de fichier journal Microsoft IIS. Pour importer un fichier journal, ouvrez la solution d'analyseur de journal IIS de Trey Research et appuyez sur CTRL+R pour ouvrir le formulaire de définition des critères du rapport présenté en figure 3.

OfficeVSTOExcelVBAMigration_Fig3_thumb.gif

Figure 3. Formulaire VBA utilisateur de critère de rapport (Cliquez sur l'image pour l'agrandir.)

Dans le formulaire, cliquez sur Add IIS Log File To Database et sélectionnez le fichier journal à importer. Tous les fichiers journaux importés sont ajoutés à une table de base de données SQL Server.

Une fois les fichiers journaux IIS importés dans la solution, vous pouvez exécuter différents rapports à partir du formulaire de définition des critères du rapport. Leurs résultats sont copiés dans la feuille de calcul. Le graphique situé en haut de la feuille de calcul est mis à jour pour prendre en compte les nouvelles données.

Le principal objectif de cette solution est de montrer comment faire migrer une application VBA de VBA à Visual Studio 2005 Tools pour Office et de fournir un exemple réel et simplifié d'une analyse de journaux IIS. Vous pouvez toutefois améliorer les fonctions de la solution et l'utiliser comme base pour générer un outil d'analyse interne et personnalisé des journaux IIS afin d'afficher les fichiers journaux de vos sites Web comme vous le souhaitez. L'amélioration de la solution peut passer, par exemple, par l'acquisition d'une base de données démographiques IP et la fourniture de rapports démographiques sur tous les accès à vos sites Web.

Configuration de la solution d'analyseur de journal IIS de Trey Research

Pour configurer la solution d'analyseur de journal IIS de Trey Research :

  1. Pour créer la table de base de données SQL Server TreyResearchIISLog nécessaire au stockage des données du journal, copiez le script Transact SQL de CreateIISLogTable.sql dans l'Analyseur de requêtes SQL et exécutez-le.

  2. Dans SQL Enterprise Manager, modifiez la sécurité de la nouvelle table IISLog dans la base de données TreyResearchIISLog afin d'autoriser l'accès SELECT à tous les utilisateurs souhaités.

  3. Ouvrez la feuille de calcul Excel IISLogAnalysis.xls et modifiez les informations dans la feuille de calcul Setup pour la connecter à la base de données TreyResearchIISLog.

  4. Importez un fichier journal IIS en cliquant sur Add IIS Log File to Database dans le formulaire Report Criteria.

Pour plus de détails sur la configuration, consultez le fichier readme.txt dans le fichier téléchargé.

Migration des projets de VBA vers Visual Studio 2005 Tools pour Office

Il n'existe actuellement pas de méthode automatisée pour migrer un projet VBA vers un projet Visual Studio 2005 Tools pour Office. La meilleure façon de faire migrer un projet est de créer un projet miroir du projet VBA dans Visual Studio 2005 Tools pour Office.
Pour créer un projet dans Visual Studio 2005 Tools pour Office :

  1. Ouvrez Visual Studio 2005.

  2. Dans le menu File, choisissez New.

  3. Dans le menu File, choisissez New.

OfficeVSTOExcelVBAMigration_Fig4_thumb.gif

Figure 4. Création d'un projet dans Visual Studio 2005 Tools pour Office (Cliquez sur l'image pour l'agrandir.)

Une fois que vous avez créé le projet de base, vous devez faire migrer plusieurs éléments de la solution VBA vers la solution Visual Studio 2005 Tools pour Office :

  • Feuilles de calcul Excel

  • Formulaires utilisateur

  • Code de la logique métier

Migration des feuilles de calcul Excel de VBA vers Visual Studio 2005 Tools pour Office

La méthode la plus simple pour faire migrer une feuille de calcul Excel de VBA à Visual Studio 2005 Tools pour Office est de créer une copie de cette feuille de calcul et de supprimer le code VBA de cette copie. Lorsqu'ensuite vous créez un projet Visual Studio 2005 Tools pour Office, cliquez sur Copy an existing document dans la boîte de dialogue Select a Document For Your Application, comme illustré en figure 5.

OfficeVSTOExcelVBAMigration_Fig5_thumb.gif

Figure 5. Copie d'une feuille de calcul Excel dans un nouveau un projet Visual Studio 2005 Tools pour Office (Cliquez sur l'image pour l'agrandir.)

Dans le champ Path to the existing document, entrez le nom de la feuille de calcul Excel existante.

Migration des interfaces utilisateur de VBA vers Visual Studio 2005 Tools pour Office

Dans VBA, vous créez vos interfaces utilisateur à l'aide de UserForm. Dans Visual Studio 2005 Tools pour Office, vous utiliserez Windows Form. Il n'existe aucun outil de migration automatisé pour vous aider à migrer les interfaces utilisateur d'un UserForm à un Windows Form. La meilleure façon de migrer une interface utilisateur en VBA est de la réécrire. Visual Studio 2005 Tools pour Office possède de nombreux contrôles qui offrent les fonctionnalités de la plupart des contrôles VBA, de sorte que la réécriture d'une interface est généralement relativement simple.

La figure 7 montre un Windows Form après la migration. Pour appeler ce formulaire, nous avons placé sur la feuille de calcul un bouton Windows Form appelé Report Criteria Form. Il est impossible de placer un contrôle sur une feuille de calcul en VBA, mais vous pouvez le faire dans Visual Studio 2005 Tools pour Office. Par conséquent, là où il y avait du texte dans la solution VBA, il y a maintenant ce bouton. La figure 6 présente la feuille de calcul migrée de l'analyseur de journal IIS de Trey Research.

OfficeVSTOExcelVBAMigration_Fig6_thumb.gif

Figure 6. Feuille de calcul migrée de l'analyseur de journal IIS de Trey Research (Cliquez sur l'image pour l'agrandir.)

La solution d'analyseur de journal IIS de Trey Research comporte un UserForm VBA qui est présenté en figure 3. Le nouveau formulaire Windows Form Visual Studio 2005 Tools pour Office présenté en figure 7 a un aspect similaire.

OfficeVSTOExcelVBAMigration_Fig7_thumb.gif

Figure 7. Formulaire Report Criteria migré (Cliquez sur l'image pour l'agrandir.)

Le UserForm VBA d'origine possède différents types de contrôles, parmi lesquels des étiquettes, des calendriers, des zones de liste déroulantes et des boutons. Tous ces contrôles ont des équivalents très similaires dans Visual Studio 2005 Tools pour Office. Le tableau 1 montre les correspondances des contrôles pour la migration de VBA vers Visual Studio 2005 Tools pour Office.

Tableau 1. Correspondance des contrôles pour la migration de l'analyseur de journal IIS

Contrôle VBA UserForm Contrôle Windows Form
Label Label
Calendar MonthCalendar
ComboBox ComboBox
CommandButton Button

Nous avons recodé rapidement la logique sous-jacente de l'interface utilisateur en utilisant une logique presque identique à celle de la solution VBA d'origine. Au cours de la migration, nous avons modifié le code de l'interface utilisateur à quelques endroits en raison des différences existantes entre les composants VBA et ceux de Visual Studio 2005 Tools pour Office. L'exemple suivant montre comment nous avons fait migrer le code la boîte de dialogue File Open.

' VBA code.
logFileName = Application.GetOpenFilename("IIS Log Files (*.log* ), _
    *.log", 1, "Import IIS Log File", , False)
If VarType(logFileName) = vbString Then
    If logFileName <> "False" Then
        SetDBConnectionString
        success = BusinessLogicLayer.ImportLogFile(logFileName, numberLines)

' Visual Basic code in the Visual Studio 2005 Tools for Office project.
ImportLogOpenFileDialog.FileName = ""
ImportLogOpenFileDialog.Filter = _
              "Log files (*.log)|*.log|All files (*.*)|*.*"
ImportLogOpenFileDialog.Title = "Import IIS Log File"
ImportLogOpenFileDialog.ShowDialog()
logFileName = ImportLogOpenFileDialog.FileName.Trim()
If logFileName.Length > 0 Then
    SetDBConnectionString()
    success = BusinessLogicLayer.ImportLogFile(logFileName, numberLines)

Dans Visual Studio 2005 Tools pour Office, nous avons créé la variable ImportLogOpenFileDialog par glisser-déplacer du composant OpenFileDialog depuis la Toolbox sur le Windows Form.

Un autre problème rencontré tient au fait que l'objet Application est facilement accessible depuis le code VBA UserForm. Dans Visual Studio 2005 Tools pour Office, cependant, la variable analogue ThisApplication n'est pas directement disponible à partir du Windows Form. Examinons le code VBA suivant du UserForm :

' VBA code.
Private Sub TransferDBArrayToWorkSheet(rowArray)
    Application.Worksheets(1).Range("A23:F5000") = ""
    If IsEmpty(rowArray) Then
        MsgBox "No data matches criteria", , "Warning"
        Application.Worksheets(1).Cells(rowNumber, 1) = _
           "No Data Matches Criteria"
        Exit Sub
    End If
    totalRowNumber = beginRowNumber + UBound(rowArray, 2) + 1  
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Application.StatusBar = "Retrieving IIS Log ..."
    
    Application.Worksheets(1).Cells(rowNumber, 3).Formula = _
        "Percent Of Total"
End Sub

Nous avons fait migrer ce code VBA vers Visual Studio 2005 Tools pour Office, comme illustré dans l'exemple suivant. Notez que nous avons créé la sous-routine SetThisApplication afin que la variable de classe appelée ThisApplication puisse être définie avec la variable ThisApplication disponible dans le code de la feuille de calcul Visual Studio 2005 Tools pour Office.

' Visual Basic code.
Public Sub SetThisApplication(ByRef ThisApplication As _
        Microsoft.Office.Interop.Excel.Application)
    ' The Me.ThisApplication is the class level variable which is assigned
    ' the value of ThisApplication
    Me.ThisApplication = ThisApplication
End Sub
Private Sub TransferDBArrayToWorkSheet(ByVal rowArray)
    ThisApplication.Worksheets(1).Range("A23:F5000") = ""
    If IsNothing(rowArray) Then
        MsgBox("No data matches criteria", , "Warning")
        ThisApplication.Worksheets(1).Cells(rowNumber, 1) = _
            "No Data Matches Criteria"
        Exit Sub
    End If
    totalRowNumber = beginRowNumber + UBound(rowArray, 2) + 1
    ThisApplication.ScreenUpdating = False
    ThisApplication.Calculation = _ 
        Microsoft.Office.Interop.Excel.XlCalculation.xlCalculationManual
    ThisApplication.StatusBar = "Retrieving IIS Log ..."
    ThisApplication.Worksheets(1).Cells(rowNumber, 3).Formula = _
        "Percent Of Total"
End Sub

Dans l'exemple de code migré, la sous-routine TransferDBArrayToWorkSheet utilise fréquemment la variable ThisApplication située dans la classe active pour accéder à l'instance Microsoft.Office.Interop.Excel.Application.

Autre problème illustré par l'exemple de code migré, la fonction VBA IsEmpty est migrée vers la fonction IsNothing de Visual Studio 2005 Tools pour Office. Si VBA affecte aux objets VBA non alloués la valeur EMPTY, il affecte aux objets COM non alloués la valeur NOTHING. Comme vous le voyez, VBA a deux mécanismes pour définir la valeur des objets non alloués. Visual Studio 2005 Tools pour Office utilise en revanche une seule valeur pour les objets non alloués et il s'agit de la valeur NOTHING. Tous les appels IsEmpty en VBA doivent par conséquent être convertis en IsNothing dans Visual Studio 2005 Tools pour Office.

Pour plus d'informations sur la fonction IsNothing, consultez l'article IsNothing Function .

Migration du code de logique métier en VBA vers Visual Studio 2005 Tools pour Office

Une fois que vous avez migré le classeur et le UserForm, vous pouvez commencer la migration du code de la logique métier à l'aide de l'assistant de mise à niveau de Visual Basic 2005 (Visual Basic 2005 Upgrade Wizard).

L'assistant de mise à niveau de Visual Basic 2005, inclus dans Microsoft Visual Studio 2005, est un outil permettant de mettre à niveau les projets Microsoft Visual Basic 6.0 vers Microsoft Visual Basic 2005. L'interface utilisateur de l'assistant est intégrée dans l'environnement de Visual Studio 2005. Il existe également un outil à ligne de commande, VBUpgrade.exe, qui offre la même fonctionnalité. L'assistant de mise à niveau de Visual Basic 2005, n'est pas conçu pour migrer spécifiquement des applications VBA vers Visual Studio 2005 Tools pour Office, mais vous pouvez l'utiliser pour la migration d'une partie d'une application VBA. Cet assistant ne prend pas en charge la migration d'un UserForm VBA mais le code de la logique métier se prête bien à la migration avec cet outil. Cet article porte plus particulièrement sur la façon de faire migrer le module BusinessLogicLayer de la solution d'analyseur de journal IIS VBA de Trey Research vers Visual Basic 2005 à l'aide de l'assistant de mise à niveau de Visual Basic 2005.

Pour faire migrer le module BusinessLogicLayer, vous devez tout d'abord enregistrer le module dans un fichier sur le disque dur. Pour ce faire, chargez le classeur IISLogAnalysis.xls et dans le menu Outils, sélectionnez Macro, puis modifiez QueryIISLog qui est la seule macro dans cette application. L'éditeur VBA s'ouvre et affiche le projet VBA dans son ensemble. Double-cliquez sur le module BusinessLogicLayer et, dans le menu Fichier, sélectionnez Exporter pour exporter le fichier sur le disque dur.

Pour utiliser l'assistant de mise à niveau de Visual Basic 2005

  1. Dans Visual Studio 2005, créez un projet vierge Visual Basic 6.0. Vous ne pouvez pas exécuter l'assistant de mise à niveau Visual Basic 2005, si vous ne disposez pas de Visual Basic 6.0.

  2. Ajoutez au projet le fichier de code que vous avez exporté du classeur Excel.

  3. Enregistrez et fermez le projet.

  4. Ouvrez Visual Studio 2005, choisissez Open dans le menu File, puis cliquez sur Convert.

  5. Dans la boîte de dialogue Convert, cliquez sur Visual Basic 2005 Upgrade Wizard, comme illustré en figure 8.

OfficeVSTOExcelVBAMigration_Fig8_thumb.gif

Figure 8. Conversion des fichiers code à l'aide de l'assistant de mise à niveau de Visual Basic 2005 (Cliquez sur l'image pour l'agrandir.)

Si vous ne souhaitez pas utiliser l'assistant de mise à niveau de Visual Basic 2005, vous pouvez également mettre à niveau les projets Visual Basic 6.0 vers Visual Basic 2005 en utilisant l'outil à ligne de commande Vbupgrade.exe. Utilisez la commande suivante pour exécuter l'outil à ligne de commande :

VBUpgrade IISLog.vbp

Pour plus d'informations sur la mise à niveau d'un projet à l'aide de l'outil à ligne de commande, reportez-vous aux articles Upgrading a Project from the Command Line et Vbupgrade Command-Line Syntax .

Remarque : Vbupgrade.exe n'est pas dans le chemin d'accès par défaut. Vous devez l'ajouter au chemin d'accès ou basculer vers le répertoire dans lequel il est installé avant de l'exécuter à partir de la ligne de commande. L'emplacement par défaut de l'installation dans Visual Studio 2005 est C:\Program Files\Microsoft Visual Studio 8\Vb\VBUpgrade. Par défaut, le résultat de l'assistant de mise à niveau de Visual Basic 2005 est stocké dans un répertoire appelé OutDir, situé sous le répertoire actif. Les résultats dans le répertoire OutDir sont composés du projet Visual Basic et de l'ensemble du code source.

La façon la plus simple d'ajouter au projet le code de la logique métier mis à niveau est de copier le fichier .vb créé par l'assistant de mise à niveau de Visual Basic 2005 dans le répertoire de projet de Visual Studio 2005 Tools pour Office. Après avoir ajouté le fichier, cliquez avec le bouton droit de la souris sur le nom du projet et choisissez Add Existing dans le menu contextuel. Sélectionnez le fichier .vb à ajouter au projet actif Visual Studio 2005 Tools pour Office. Le code migré est maintenant inclus dans le projet mais vous devez encore intervenir pour qu'il fonctionne correctement.

Le code de sortie produit par l'assistant de mise à niveau de Visual Basic 2005 contient généralement des commentaires qui signalent les erreurs, les avertissement ou les problèmes. En effet, l'assistant utilise ce moyen pour avertir l'utilisateur des problèmes potentiels de migration.

Ainsi, le code qui suit est un avertissement dans BusinessLogicLayer.vb :

'UPGRADE_WARNING: Couldn't resolve default property of object recSet.GetRows(). 
Click for more: 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="vbup1037"'

Cet avertissement particulier n'a pas d'incidence sur la logique du code dans cette solution et peut donc être ignoré. Nous l'avons laissé dans le code afin d'illustrer le type d'erreurs, d'avertissements ou de problèmes signalés par l'assistant de mise à niveau de Visual Basic 2005 et pour montrer que dans d'autres solutions, vous devrez peut être résoudre le point en question. Si, dans vos propres solutions, une erreur, un avertissement ou un problème signalé n'a pas de conséquence pour le fonctionnement du code, il est recommandé de supprimer le commentaire pour améliorer la lisibilité de votre code.

La migration est plus facile si un programme est organisé de telle sorte que la logique métier soit placée dans des modules distincts. Elle est plus complexe dès lors que la logique métier est mélangée au code de l'interface. Dans ce dernier cas, il est toujours possible d'utiliser l'assistant de mise à niveau de Visual Basic 2005, mais ce dernier génère de nombreuses erreurs, avertissements ou problèmes pour le code de l'interface. Vous pouvez utiliser les exemples de code Visual Basic fournis dans le code migré pour recréer la logique métier dans le nouveau projet Visual Studio 2005 Tools pour Office.

L'ensemble de la logique métier de la solution d'analyseur de journal IIS VBA de Trey Research est stocké dans un fichier appelé BusinessLogicLayer.

Migration du code ADO de VBA vers Visual Studio 2005 Tools pour Office

La façon la plus simple de faire migrer du code ADO de VBA vers Visual Studio 2005 Tools pour Office est de continuer à utiliser la bibliothèque ADO dans Visual Studio 2005 Tools pour Office. ADO.NET offre des fonctions plus riches et nombreuses, mais le code ADO migré nécessite une certaine restructuration. La restructuration de la solution d'analyseur de journal IIS VBA de Trey Research pour utiliser ADO.NET fait l'objet de l'article suivant de cette série. Dans notre article, nous étudions les problèmes associés à la migration directe d'ADO entre VBA et Visual Studio 2005 Tools pour Office.

Pour utiliser ADO, il faut que la nouvelle solution Visual Studio 2005 Tools pour Office ait une référence dans la bibliothèque ADO. Pour ajouter cette référence, cliquez avec le bouton droit de la souris sur le projet dans l'Explorateur de solutions et sélectionnez Ajouter une référence. Sélectionnez l'onglet COM et choisissez la dernière version de la bibliothèque d'accès aux données Microsoft ActiveX.

La plupart des objets ADO, y compris les objets fréquemment utilisés comme ADODB.Connection, ADODB.Recordset et ADODB.Command, sont identiques dans VBA et dans Visual Studio 2005 Tools pour Office. Visual Studio 2005 Tools pour Office requiert toutefois des wrappers interop COM pour ces objets afin d'autoriser l'interopérabilité entre l'environnement CLR dans Visual Studio 2005 Tools pour Office et les objets COM ADO. Ces classes de wrappers gérées génèrent quelques différences subtiles qui ont pour conséquence de modifier légèrement les objets COM ADO d'origine.

Ainsi, le code suivant correspond à la fonction CreateDBTableArray de BusinessLogicLayer. Cette fonction peut accepter jusqu'à deux chaînes de requêtes comme paramètres et effectuer une requête sur SQL Server à l'aide d'ADO. Cette fonction accepte deux chaînes SQL car, dans certains cas, il est nécessaire de créer une table temporaire pour effectuer une requête et l'exécution d'une telle requête nécessite deux instructions SQL. La fonction renvoie un tableau à deux dimensions contenant les lignes renvoyées par la requête ainsi que les noms de champ de la requête.

' VBA code.
Private Function CreateDBTableArray(sqlString As String, Optional _
        sqlString2 As String) As Variant
    Dim connect As ADODB.connection
    Dim recSet As ADODB.Recordset
    Dim cmdCommand As ADODB.Command
    Dim rowArray As Variant
    
    Set connect = New ADODB.connection
    connect.connectionString = conString
    connect.Open
    
    Set cmdCommand = New ADODB.Command
    Set cmdCommand.ActiveConnection = connect
    cmdCommand.CommandText = sqlString
    cmdCommand.CommandType = adCmdText
    cmdCommand.Execute
    
    If sqlString2 <> "" Then
        cmdCommand.CommandText = sqlString2
        cmdCommand.CommandType = adCmdText
        cmdCommand.Execute
    End If
    
    Set recSet = New ADODB.Recordset
    Set recSet.ActiveConnection = connect
    recSet.Open cmdCommand
    
    ' No rows found.
    If recSet.EOF = True Then
        CreateDBTableArray = Empty
        connect.Close
        Set connect = Nothing
        Exit Function
    End If
    
    rowArray = recSet.GetRows()
      
    ReDim Preserve rowArray(UBound(rowArray, 1), UBound(rowArray, 2) + 1)
...
End Function

Lorsque nous faisons migrer ce code VBA à l'aide de l'assistant de mise à niveau de Visual Basic 2005, nous obtenons le code suivant :

' Visual Basic code.
Private Function CreateDBTableArray(ByRef sqlString As String,
          Optional ByRef sqlString2 As String = "") As Object
      
      Dim connect As New ADODB.Connection
      connect.connectionString = conString
      connect.Open()
      
      Dim cmdCommand As New ADODB.Command
      cmdCommand.ActiveConnection = connect
      cmdCommand.CommandText = sqlString
      cmdCommand.CommandType = ADODB.CommandTypeEnum.adCmdText
      cmdCommand.Execute()
      
      If sqlString2 <> "" Then
         cmdCommand.CommandText = sqlString2
         cmdCommand.CommandType = ADODB.CommandTypeEnum.adCmdText
         cmdCommand.Execute()
      End If
      
      Dim recSet As New ADODB.Recordset
      recSet.ActiveConnection = connect
      recSet.Open(cmdCommand)
      
      ' No rows found.
      If recSet.EOF = True Then
         CreateDBTableArray = Nothing
         connect.Close()
         connect = Nothing
         Exit Function
      End If
      
      'UPGRADE_WARNING: Couldn't resolve default property of object recSet.GetRows(). 
Click for more: 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="vbup1037"'
      Dim rowArray As Object = recSet.GetRows()
      
      ReDim Preserve rowArray(UBound(rowArray, 1), UBound(rowArray, 2) + 1)
...      
End Function

L'avertissement indiquant « Couldn't resolve default property » (Impossible de résoudre la propriété par défaut) n'est pas très préoccupant pour ce code dans la mesure où il ne fait référence à aucun élément susceptible de modifier la fonctionnalité et la logique du code. Cet avertissement est présent en raison des ambiguïtés qui peuvent exister dans le code obtenu. L'assistant de mise à niveau de Visual Basic 2005 n'est pas parvenu à déterminer complètement s'il existait une propriété par défaut dans le programme migré. Le code ne va pas s'exécuter correctement dans Visual Studio 2005 Tools pour Office en raison de différences subtiles dans le fonctionnement d'ADO avec les classes de wrapper interop COM. Pour obtenir un code de logique métier migré qui fonctionne de la même façon que le code de la logique métier VBA d'origine, nous l'avons modifié comme suit :

' Visual Basic code.
Private Function CreateDBTableArray(ByRef sqlString As String,
        Optional ByRef sqlString2 As String = "") As Object

    Dim connect As New ADODB.Connection
    connect.connectionString = conString
    connect.Open()

    Dim cmdCommand As New ADODB.Command
    Dim cmdCommand2 As New ADODB.Command
    Dim recSet As New ADODB.Recordset

    cmdCommand.ActiveConnection = connect
    cmdCommand.CommandText = sqlString
    cmdCommand.CommandType = ADODB.CommandTypeEnum.adCmdText

    If sqlString2 <> "" Then
        cmdCommand.Execute()
        cmdCommand2.ActiveConnection = connect
        cmdCommand2.CommandType = ADODB.CommandTypeEnum.adCmdText
        cmdCommand2.CommandText = sqlString2
        recSet = cmdCommand2.Execute()
    Else
        recSet = cmdCommand.Execute()
    End If

    ' No rows found.
    If recSet.EOF = True Then
        CreateDBTableArray = Nothing
        connect.Close()
        connect = Nothing
        Exit Function
    End If

    'UPGRADE_WARNING: Couldn't resolve default property of object
    recSet.GetRows(). Click for more: 'ms-
    help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="vbup1037"'
    Dim rowArray As Object = recSet.GetRows()

    ReDim Preserve rowArray(UBound(rowArray, 1), UBound(rowArray, 2) + 1)
    ...
End Function 

Les modifications à apporter au code migré pour qu'il fonctionne correctement dans la version Visual Studio 2005 Tools pour Office de la fonction sont les suivantes :

Code migré d'origine Visual Basic :

Dim cmdCommand As New ADODB.Command
cmdCommand.ActiveConnection = connect
cmdCommand.CommandText = sqlString
cmdCommand.CommandType = ADODB.CommandTypeEnum.adCmdText
cmdCommand.Execute()
      
If sqlString2 <> "" Then
   cmdCommand.CommandText = sqlString2
   cmdCommand.CommandType = ADODB.CommandTypeEnum.adCmdText
   cmdCommand.Execute()
End If
      
Dim recSet As New ADODB.Recordset
recSet.ActiveConnection = connect
recSet.Open(cmdCommand)

Code migré Visual Basic modifié pour Visual Studio 2005 Tools pour Office :

Dim cmdCommand As New ADODB.Command
Dim cmdCommand2 As New ADODB.Command
Dim recSet As New ADODB.Recordset
cmdCommand.ActiveConnection = connect
cmdCommand.CommandText = sqlString
cmdCommand.CommandType = ADODB.CommandTypeEnum.adCmdText

If sqlString2 <> "" Then
    cmdCommand.Execute()
    cmdCommand2.ActiveConnection = connect
    cmdCommand2.CommandType = ADODB.CommandTypeEnum.adCmdText
    cmdCommand2.CommandText = sqlString2
    recSet = cmdCommand2.Execute()
Else
    recSet = cmdCommand.Execute()
End If

Vous devez modifier le code du fait des différences de fonctionnement de ADO dans VBA et dans Visual Studio 2005 Tools pour Office avec les wrappers COM gérés. Dans la version VBA, ce code fonctionne correctement car l'objet ADODB.Command se ferme automatiquement après sa première exécution. Dans le code migré, l'objet ADODB.Command ne se ferme pas automatiquement et une erreur d'exécution se produit, indiquant que la table temporaire de l'instruction SQL est introuvable. Lorsque l'on connaît le problème, la première solution semble consister à appeler manuellement une méthode Close pour l'objet ADODB.Command, mais il n'y a pas de fonction Close disponible à partir de VBA ou de Visual Studio 2005 Tools pour Office. Une façon de contourner cette différence est d'utiliser deux instances différentes de ADODB.Command avec la même connexion.

Autre problème du code migré : les chaînes du code d'origine, concaténées à partir de plusieurs lignes de code, forment désormais une seule ligne de code. Bien que cette structure soit similaire au niveau fonctionnel, il est préférable pour la lisibilité du code, de rediviser la chaîne concaténée en plusieurs lignes. Ainsi, le code Visual Studio 2005 Tools pour Office suivant pourrait être modifié manuellement dans Visual Studio 2005 Tools pour Office pour améliorer sa lisibilité et sa maintenabilité.

Public Function GetPageViewsReport(ByRef beginDate As Date,
        ByRef endDate As Date) As Object
    Dim sqlString As String = "Select Convert(Varchar(8),HitDateTime,
112) As [Date], Count(*) As [Number Of Page Views] "
 & "From IISLog " & "Where (HitDateTime >= '" & CStr(beginDate)
 & "' AND " & "HitDateTime <= '" & CStr(endDate) & "') 
AND " & "(SubString(TargetUrl, 
Len(TargetUrl) - 3, 4) = '.htm' " & "Or SubString(TargetUrl, 
Len(TargetUrl) - 4, 5) = '.html' " & "Or SubString(TargetUrl, 
Len(TargetUrl) - 3, 4) = '.asp' " & "Or SubString(TargetUrl, 
Len(TargetUrl) - 4, 5) = '.aspx') " & "Group By 
Convert(Varchar(8),HitDateTime,112) " & "Order By 
Convert(Varchar(8),HitDateTime,112) Desc "
    GetPageViewsReport = CreateDBTableArray(sqlString)
    ChangeDateFormat(GetPageViewsReport, 0)
End Function

Cette version est plus lisible et se prête mieux à la maintenance.

Public Function GetPageViewsReport(ByRef beginDate As Date, ByRef endDate As Date) As Object
    Dim sqlString As String = _
        "Select Convert(Varchar(8),HitDateTime,112) As [Date], " _
        & "Count(*) As [Number Of Page Views] " & "From IISLog " " _
        & "Where (HitDateTime >= '" & CStr(beginDate) _
        & "' AND " & "HitDateTime <= '" & CStr(endDate) _
        & "') AND " + _
        & "(SubString(TargetUrl, Len(TargetUrl) - 3, 4) = '.htm' " _ 
        & "Or SubString(TargetUrl, Len(TargetUrl) - 4, 5) = '.html' " _
        & "Or SubString(TargetUrl, Len(TargetUrl) - 3, 4) = '.asp' " _
        & "Or SubString(TargetUrl, Len(TargetUrl) - 4, 5) = '.aspx') " _
        & "Group By Convert(Varchar(8),HitDateTime,112) " _
        & "Order By Convert(Varchar(8),HitDateTime,112) Desc "
    GetPageViewsReport = CreateDBTableArray(sqlString)
    ChangeDateFormat(GetPageViewsReport, 0)
End Function

Sécurité du code

Le code évoqué dans cet article n'est fourni qu'à titre d'exemple et vous ne devez pas l'utiliser dans des solutions déployées sans effectuer des modifications. En particulier, vous devez tenir compte de la sécurité du code.

Pour illustrer la simplicité de cette solution, une liste des menaces possibles a été établie à l'aide du processus de modélisation des menaces et des outils décrits dans l'article Modélisation de la menace de la section Sécurité du site Microsoft Technet.

Les exemples suivants signalent quelques menaces identifiées que vous devez prendre en considération avant de développer ou de déployer cette solution.

Tableau 2. Exemples de menaces

Effet de la menace

Point d'entrée

Solution connue

Accès à SQL Server compromis

Base de données SQL Server

L'accès de SQL Server doit être géré et sécurisé.

Données SQL Server compromises

Base de données SQL Server

Les tables SQL Server doivent être sécurisées.

La solution pointe vers la mauvaise base de données

Classeur

Ne pas stocker les informations de connexion aux données source dans une feuille de calcul.

Pour plus d'informations sur la sécurité du code, reportez-vous au Centre des ressources Sécurité pour les développeurs sur MSDN.

Conclusion

Il existe deux façons de migrer un projet VBA vers Visual Studio 2005 Tools pour Office. La première méthode consiste à migrer directement sans modification architecturale ou presque pour obtenir un projet prêt à s'exécuter dans Visual Studio 2005 Tools pour Office. La seconde méthode consiste à restructurer la solution pour tirer parti de la richesse des fonctionnalités disponibles dans Visual Studio 2005 Tools pour Office. Cet article traite la plupart des problèmes que vous pouvez rencontrer lors de la migration directe d'une solution VBA vers Visual Studio 2005 Tools pour Office. La migration vers Visual Studio 2005 Tools pour Office présente des avantages importants, parmi lesquels l'accès à la totalité de Microsoft .NET Framework, et mérite donc d'être sérieusement étudiée pour la plupart des projets VBA.

Vous pouvez utiliser l'assistant de mise à niveau de Visual Basic 2005 pour migrer une partie du code d'une application VBA d'origine mais vous devrez migrer manuellement l'autre partie du code dans la mesure où cet assistant est conçu à la base pour mettre à niveau les projets Visual Basic 6.0 vers Microsoft Visual Basic. Dans l'article suivant de cette série, nous expliquons comment restructurer la solution d'analyse de journal IIS de Trey Research afin de tirer pleinement parti de bon nombre des riches fonctions de Visual Studio 2005 Tools pour Office, comme les fonctions d'ADO.NET et du .NET Framework.

Ressources supplémentaires

Visual Studio 2005 Tools pour Office

Migration du code VBA

VBA

Modèles d'objets Microsoft Office

Migration

Sécurité du code

À propos de l'auteur

Depuis 1993, ArtinSoft aide ses clients dans le monde entier à utiliser et à protéger leurs investissements dans les applications courantes lorsqu'elles évoluent vers de nouvelles plates-formes et principalement vers Microsoft .NET Framework. ArtinSoft a créé des produits de migration que Microsoft fournit avec Visual Studio. ArtinSoft fait partie des fournisseurs privilégiés de Microsoft pour ses services de mise à niveau des clients dans le monde entier. Vous trouverez plus d'informations au sujet d'ArtinSoft sur le site http://www.artinsoft.com/ . Vous pouvez également leur envoyer un e-mail à info@artinsoft.com.