All posts tagged VB .net

Utiliser des fonctions du Framework .NET en VBA

On peut faire beaucoup, beaucoup de choses en Excel/VBA… Au fil des articles, nous avons souvent étudié la possibilité de faire interagir Excel avec d’autres applications (Power MAC, Word, PowerPoint, Business Objects…) ou avec diverses fonctionnalités Windows (gestion de fichier FSO…). Pour cela, il faut faire appel à des bibliothèques de fonctionnalités, accessibles via le menu de l’éditeur VBA « outils – références ».

S’il existe une bibliothèque de fonctionnalités (si on peut l’appeler ainsi…) bien documentée, il s’agit du Framework .NET fourni par Microsoft. Mais à priori, pour l’utiliser, nous devons avoir affaire aux langages de « haut niveaux » que sont VB.NET et C# (entre autres), ainsi qu’à l’atelier de développement Visual Studio. Pourtant, en étant (vraiment…) motivé, on peut utiliser des fonctionnalités du Framework en VBA office. Pour l’exemple, nous allons utiliser une classe du Framework 2.0 :

la classe STRINGBUILDER (SYSTEM.TEXT.STRINGBUILDER) , qui est censée être plus rapide pour traiter les chaines de caractère. L’exemple n’est pas le meilleur du monde, car on n’est pas sensé exécuter un code rapide en VBA…

Pour utiliser une classe du Framework Dotnet, il est nécessaire (comme toujours quand on utilise des bibliothèques autres que VisualBasic, Office et Excel) d’en importer la référence via le menu de l’éditeur VBA d’Excel : « Outils – Références ». Mais on ne trouvera aucune référence au Framework, .NET ou dotnet ! Il faut l’importer manuellement. Comment savoir où se trouve cette bibliothèque, dans quel fichier dll ?

Pour cela, ouvrons le programme Visual Studio (une version gratuite Visual Basic Express Edition fait parfaitement l’affaire), nous affichons l’explorateur d’objet (F2), et nous cherchons StringBuilder :

Nous affichons l’espace de nom Sytem.Text pour connaitre la dll, il s’agit de la mscorlib :

Le chemin est le suivant (pour le Framework 2.0, si on a choisi ce Framework dans les propriétés du projet Visual Studio) :

Nous pouvons désormais importer non pas la dll dans VBA, mais le fichier avec l’extension tlb

Le code suivant fonctionne parfaitement sous Visual Studio en .NET :

Pourtant, en VBA, cela ne fonctionne pas !

Cela est dû au fait que les fonctions et les procédures (les méthodes donc…) .NET peuvent avoir plusieurs signatures, et visiblement, le compilateur VBA ne s’y retrouve pas… On observe dans l’explorateur d’objets de Visual Studio (voir copie d’écran un peu plus haut) une multitude de signatures différentes pour la méthode Append de l’objet StringBuilder. Pas moins de 19 !

Pour « invoquer » une signature, il suffit (ce n’était pas trivial…) de suffixer la méthode Append par son numéro. Pour adresser la bonne signature, celle qui attend du type « String » en paramètre, il faut suffixer par un numéro mais lequel ? Et bien, cela se corse… Il faut essayer toutes les possibilités ! Sur certains forums, il est dit qu’il suffit de donner le numéro inverse de l’ordre d’apparition dans l’explorateur d’objet, mais je n’ai rien constaté de tel. Non, il faut tester toutes les combinaisons une à une, jusqu’à la suivante :

C’est donc laborieux, mais nous avons réussi ! Cette manipulation n’est bien sûr à réserver qu’à des cas bien précis, et affirmons-le tout de suite, ce sera très rare ! De plus, l’explorateur d’objet n’est pas opérationnel en VBA, l’IntelliSense n’est plus de la partie… Encore plus mystérieux, la méthode Replace fonctionne sans invoquer la bonne signature, pas de numéro à suffixer ! Comme évoqué en début d’article, cela fonctionne, mais il faut rester motivé…

Sub TestDotnet()

Dim MonStringBuilder As New StringBuilder

Set MonStringBuilder = MonStringBuilder.Append_3(« test1 numéro 1 »)

Set MonStringBuilder = MonStringBuilder.Replace(« numéro », « chiffre »)

MsgBox (MonStringBuilder.ToString())

End Sub

Top

Manipuler Excel en dotnet : utiliser l’automation

Attardons-nous aujourd’hui sur le langage haut de gamme Microsoft, dotnet. Que ce soit du VB.net ou du C#, qu’importe, les principes sont exactement les mêmes. Nous pouvons au sein d’un projet Visual Studio (toutes versions) manipuler Excel presque de la même manière que dans l’éditeur VBA d’Excel, c’est l’Automation (on manipule Excel à l’aide de son modèle objet)

Il faut au préalable importer les références Excel (au même titre que dans l’éditeur VBA Excel, nous importons parfois les références « dll » d’autres logiciels tels que Business Objects ou Word).

Pour cela, ajoutons la référence COM à Microsoft Excel. Ce n’est pas une référence .NET ! Nous verrons que cela a une incidence.

Validons par OK. En ajoutant la référence dans notre code :

Imports Excel = Microsoft.Office.Interop.Excel

Nous pourrons utiliser ainsi un code très proche du VBA, comme en témoignent les quelques lignes ci-dessous.

Dim MonExcel As New Excel.Application
MonExcel.Visible = True
Dim MonFichier As Excel.Workbook = MonExcel.Workbooks.Open(MonPath)
Dim MaFeuille As Excel.Worksheet = MonFichier.Sheets(1)
Dim MaPlage As Excel.Range = MaFeuille.Range(MaFeuille.Cells(2, 1), & _
 MaFeuille.Cells(2, 1).End(Excel.XlDirection.xlToRight).End(Excel.XlDirection.xlDown))
Dim MonEntete As Excel.Range = MaFeuille.Range(MaFeuille.Cells(1, 1), & _
 MaFeuille.Cells(1, 1).End(Excel.XlDirection.xlToRight))

A titre d’exemple, nous proposons ici un code simpliste qui ouvre Excel, accède à un fichier Excel choisi par l’utilisateur, et affiche le contenu du fichier (pour peu que ce contenu soit sous forme de table) dans un composant DATAGRIDVIEW d’une application Windows.

Le code VB.net proposé pour l’exemple (pas de classe, pas de gestion des erreurs) est :

Imports Excel = Microsoft.Office.Interop.Excel
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'CHOIX DU FICHIER EXCEL
Dim MonOpenFileDialog As New Windows.Forms.OpenFileDialog()
MonOpenFileDialog.Filter = "Fichiers Excel (*.xls)
*.xls"
MonOpenFileDialog.ShowDialog()
Dim MonPath As String = MonOpenFileDialog.FileName
'DECLARATION OBJETS EXCEL
Dim MonExcel As New Excel.Application
MonExcel.Visible = True
Dim MonFichier As Excel.Workbook = MonExcel.Workbooks.Open(MonPath)
Dim MaFeuille As Excel.Worksheet = MonFichier.Sheets(1)
Dim MaPlage As Excel.Range = MaFeuille.Range(MaFeuille.Cells(2, 1), & _ 
 MaFeuille.Cells(2, 1).End(Excel.XlDirection.xlToRight).End(Excel.XlDirection.xlDown))
Dim MonEntete As Excel.Range = MaFeuille.Range(MaFeuille.Cells(1, 1), & _ 
 MaFeuille.Cells(1, 1).End(Excel.XlDirection.xlToRight))
 
'AJOUT DATAGRIDVIEW DANS LE FORM1
Dim MonDataGridView As New Windows.Forms.DataGridView
MonDataGridView.Location = New Point(0, 0)
MonDataGridView.Dock = DockStyle.Fill
Me.Controls.Add(MonDataGridView)
 
'METHODE : AUTOMATION CLASSIQUE
For Each MaCellule As Excel.Range In MonEntete
MonDataGridView.Columns.Add(MaCellule.Value, MaCellule.Value)
Next
MonDataGridView.Rows.Add(MaPlage.Rows.Count - 1)
For Each MaCellule As Excel.Range In MaPlage
MonDataGridView.Item(MaCellule.Column - 1, MaCellule.Row - 2).Value = MaCellule.Value
Next
End Sub
End Class

Nous obtenons un résultat comme celui-ci :

AVANTAGES :

Pour celui qui connait bien le modèle objet Excel, qui a l’habitude de VBA, l’automation Excel en dotnet est très simple. Presque aucune adapation de code n’est requise, à part pour les constantes (dans le code, voir Excel.XlDirection.xlToRight)

INCONVENIENTS :

De même qu’en VBA, attention à la lenteur d’un tel code ! Pour extraire les 1000 lignes de l’exemple ci-dessus, il a fallu près de 15 secondes !

Un autre inconvénient majeur est que la référence n’est pas .NET, mais COM. Aussi, les objets parlent assez « sommairement » entre eux. Nous aurions pu imaginer que le RANGE Excel puisse se déverser directement dans un objet typé dotnet, comme une DATATABLE, ou directement dans les ITEMS du DATAGRIDVIEW, mais il n’en n’est rien. Le RANGE Excel est un Array d’object, avec lequel on ne peut pas travailler directement. Il faut boucler sur tous les éléments pour les exploiter, ce qui prend un temps considérable.

CONCLUSION :

L’automation permet donc de manipuler Excel exactement comme on le ferait dans Excel, mais attention aux performances ! Pour un accès rapide, il faudra travailler avec Excel comme un fournisseur de donner et exploiter ADO.NET.

Top
Page 1 of 1

Contactez-nous contact@expert-data.fr

EXPERT data, solutions pour TPE/PME et grands comptes