La boîte à Tutoriels de Christopher PECAUD

Obtenir des informations sur votre ordinateur en utilisant WMI avec VBA sous Excel

Laisser un commentaire

SOMMAIRE

I Introduction
II Prérequis
III Ecriture du code
IV Conclusion

I Introduction

Dans ce tutoriel nous allons voir comment utiliser la bibliothèque WMI Scripting fournie par Microsoft dans Microsoft Office pour effectuer des requêtes WMI afin d’obtenir des informations sur votre ordinateur.

II Prérequis

Avant de commencer notre script il va falloir ajouter la référence à la bibliothèque. Pour ce faire, dans le menu Outils->Références de l’onglet « Développeur » d’Excel, vous devez sélectionner le nom suivant : « Microsoft WMI Scripting V1.2 Library » comme ceci :

description image

Une fois la bibliothèque référencée dans le projet nous pouvons passer à l’écriture du script en lui-même.

III Ecriture de la macro

Dans ce tutoriel nous allons voir comment requêter les classes d’objets WMI suivantes :

  • Win32_ComputerSystem ;
  • Win32_OperatingSystem.

Dans un premier temps, afin de récupérer l’ensemble des données d’une requête nous allons nous appuyer sur une fonction qui prendra en argument la requête de type string.

Le corps de la fonction est somme toute assez simple il suffit de créer une variable qui nous permettra d’instancier un objet WMI et de lui affecter notre requête pour qu’il nous renvoie en retour l’ensemble des données voulu.

Pour commencer nous déclarons et assignons les variables nécessaires dans le corps de la fonction :

Dim oWMI As Object

Dim oWMIData As Object

On les assigne en utilisant les fonctions GetObject qui nous permet de créer un objet de requête WMI et ExecQuery pour appliquer la requête fournie en argument :

Set oWMI = GetObject("winmgmts:root/CIMV2")
Set oWMIData = oWMI.ExecQuery(qry)

Pour finir, la fonction retourne le contenu de la variable oWMIData :

Set GetData = oWMIData

Voici le corps complet de la fonction :

Function GetData(qry)
Dim oWMI As Object
Dim oWMIData As Object


Set oWMI = GetObject("winmgmts:root/CIMV2")
Set oWMIData = oWMI.ExecQuery(qry)

Set GetData = oWMIData

End Function 

Dans un second temps allons écrire notre fonction ShowsimpleData. Cette fonction prend en argument :

  • L’ensemble de données récupéré ;
  • Le numéro de la feuille de calcul à traiter qui permettra d’afficher les données ;

Ensuite nous déclarons nos variables utiles pour gérer ces requêtes comme ceci :

Dim DataItem, DataProp As Object

La variable Data sera utilisée pour obtenir l’ensemble des données retourné par la requête.

La variable DataItem nous permettra d’itérer chaque élément inclus dans l’objet Data.

La variable DataProp nous permettra de récupérer la valeur associée.

Nous avons de même besoin des variables permettant d’accéder aux objets Classeur et feuille de travail :

Dim oWb As Workbook
Dim oWs As Worksheet

Nous les assignons comme ceci :

Set oWb = ActiveWorkbook
Set oWs = oWb.Worksheets(WSNbr)

On effectue un effacement de l’ensemble des cellules de la feuille de calculs active :

oWs.Cells.Clear

Nous allons donc utiliser une boucle de type For Each… pour récupérer chacun des éléments de la structure de données retournée.

Il suffit d’itérer chacun des éléments de cet ensemble de données pour récupérer ensuite les différents noms de propriété ainsi que leurs valeurs respectives à l’aide d’une seconde boucle For Each… imbriquée, comme suit :

i = 1
For Each DataItem In Data
    For Each DataProp In DataItem.Properties_
        oWs.Cells(i, 1).Value = DataProp.Name
        oWs.Cells(i, 2).Value = DataProp.Value
        
        i = i + 1
    Next
    
Next

Le résultat est affiché dans les deux premières colonnes de chaque feuille de calculs.


Sub ShowSimpleData(Data, WSNbr)


Dim oWb As Workbook
Dim oWs As Worksheet
Dim DataItem, DataProp As Object
Dim i As Long


Set oWb = ActiveWorkbook
Set oWs = oWb.Worksheets(WSNbr)

oWs.Cells.Clear



i = 1
For Each DataItem In Data
    For Each DataProp In DataItem.Properties_
        oWs.Cells(i, 1).Value = DataProp.Name
        oWs.Cells(i, 2).Value = DataProp.Value
        
        i = i + 1
    Next
    
Next

End Sub

Nous allons écrire enfin notre dernière fonction qui regroupe toutes les requêtes à effectuer, nous l’appellerons CheckData. Elle permet d’appeler la première fonction que nous avons créé pour récupérer un ensemble de données en lui passant en argument une requête. L’ensemble de données est ensuite envoyé en argument à la seconde fonction que l’on vient de créer pour afficher les données dans chaque feuille.

Par défaut nous choisissons de récupérer toutes les propriétés des classes WMI :

Set Data = GetData("Select * From Win32_ComputerSystem")

Vous pouvez les filtrer en modifiant * par le nom des propriétés à récupérer.

On appelle ensuite la deuxième fonction comme suit :

Call ShowSimpleData(Data, 1)

Voici le code complet de la procédure :

Sub CheckData()
Dim Data As Object

Set Data = GetData("Select * From Win32_ComputerSystem")
Call ShowSimpleData(Data, 1)

Set Data = GetData("Select * From Win32_OperatingSystem")
Call ShowSimpleData(Data, 2)
End Sub

Voici le code complet de ce script VBA :

Option Explicit

Function GetData(qry)
Dim oWMI As Object
Dim oWMIData As Object


Set oWMI = GetObject("winmgmts:root/CIMV2")
Set oWMIData = oWMI.ExecQuery(qry)

Set GetData = oWMIData

End Function



Sub ShowSimpleData(Data, WSNbr)


Dim oWb As Workbook
Dim oWs As Worksheet
Dim DataItem, DataProp As Object
Dim i As Long


Set oWb = ActiveWorkbook
Set oWs = oWb.Worksheets(WSNbr)

oWs.Cells.Clear



i = 1
For Each DataItem In Data
    For Each DataProp In DataItem.Properties_
        oWs.Cells(i, 1).Value = DataProp.Name
        oWs.Cells(i, 2).Value = DataProp.Value
        
        i = i + 1
    Next
    
Next

End Sub

Sub CheckData()
Dim Data As Object

Set Data = GetData("Select * From Win32_ComputerSystem")
Call ShowSimpleData(Data, 1)

Set Data = GetData("Select * From Win32_OperatingSystem")
Call ShowSimpleData(Data, 2)


End Sub

blog comments powered by Disqus