Mostrar información del Sistema con macros en Excel

Porque antes que Administrador de Bases de datos son informático, me di a la tarea de buscar cómo podemos mostrar información de nuestra PC mediante macros en Excel.

En mi búsqueda encontré que la API de Windows Management Instrumentation (WMI) me daría la pauta para armar un formulario que me mostrará la información de mi PC.

Dentro de la API de WMI podemos usar lo siguiente, entre otros:

  • Win32_OperatingSystem: Información del Sistema Operativo.
  • Win32_Processor: Información del procesador.
  • Win32_PhysicalMemoryArray: Información de memoria.
  • Win32_LogicalDisk: Información de discos duros.
  • Win32_LogicalDisk: Información sobre controladora de video.
  • Win32_BaseService: Información de Servicios iniciados o detenidos.

Formulario para mostrar información del Sistema

Haciendo uso dela API les desarrollé un formulario para mostrar la información antes mencionada.

El formulario contiene un ComboBox el cual se llenará con el tipo de Información que deseemos mostrar. La información se mostrará en un ListBox, como se muestra en la Figura 1.

image

Figura 1. Formulario en Excel vba para mostrar información del Sistema.

Código vba

A continuación comparto el código vba usado en el formulario:

'-----------------------------------------------------------------------------------------------------------------------------
' Module    : UserForm1
' Author    : MVP, Sergio Alejandro Campos
' Date      : 30/jun/2015
' Purpose   : Mostrar información del Sistema
' Soruce    : Código basado en https://sites.google.com/site/beyondexcel/project-updates/exposingsystemsecretswithvbaandwmiapi
'------------------------------------------------------------------------------------------------------------------------------
'
'BotónMostrar Información
Private Sub CommandButton3_Click()
Static oWMILocator As Object      'SWbemLocator
Dim oWMISrvEx As Object    'SWbemServicesEx
Dim oWMIObjSet As Object  'SWbemServicesObjectSet
Dim oWMIObjEx As Object    'SWbemObjectEx
Dim oWMIProp As Object    'SWbemProperty
Static sUID As String
Static sPWD As String
Dim sWQL As String    'WQL Statement
Dim vResult As Variant
Dim TipoInfo
    '
    On Error Resume Next
    '
    If Me.cmbTipo.Value = "" Then Exit Sub
    '
    Me.ListBox1.Clear
    '
    TipoInfo = Me.cmbTipo.Value
    '
    If oWMILocator Is Nothing Then
        Set oWMILocator = CreateObject("WbemScripting.SWbemLocator")
    End If
    '
    sWQL = "Select *  From " & TipoInfo    'Win32_OperatingSystem""
    Set oWMISrvEx = oWMILocator.ConnectServer(sSystem, "root\cimv2", sUID, sPWD)
    If oWMISrvEx Is Nothing Then _
       Err.Raise DspError, , "Could not create WMI connection to " & sSystem
    Set oWMIObjSet = oWMISrvEx.ExecQuery(sWQL)
    If oWMIObjSet Is Nothing Then _
       Err.Raise DspError, , sWQL & " returned no results"
    For Each oWMIObjEx In oWMIObjSet
        For Each oWMIProp In oWMIObjEx.Properties_
            If IsArray(oWMIProp.Value) Then
                For n = LBound(oWMIProp.Value) To UBound(oWMIProp.Value)
                    '
                    Me.ListBox1.AddItem oWMIProp.Name
                    '
                Next
            Else
                '
                On Error Resume Next
                '
                Me.ListBox1.AddItem oWMIProp.Name
                ListBox1.List(ListBox1.ListCount - 1, 1) = oWMIProp.Value
                '
                On Error GoTo 0
                '
            End If
        Next
    Next
    '
    On Error GoTo 0
    '
End Sub
'
'Botón Cerrar
Private Sub CommandButton2_Click()
    Unload Me
End Sub
'
'Al dar click en el ListBox
Private Sub ListBox1_Click()
'
'Declaramos variables
Dim Cuenta As Integer
Dim Numero As Integer
Dim j As Integer
Dim i As Integer
    '
    Cuenta = Me.ListBox1.ListCount
    '
    'Validamos que haya un elemento seleccionado.
    For j = 0 To Cuenta - 1

        If Me.ListBox1.Selected(j) = True Then
            Numero = Numero + 1
        End If

    Next j
    '
    'La hoja seleccionada se pasará al ListBox de hojas visibles.
    For i = 0 To Cuenta - 1
        If Me.ListBox1.Selected(i) = True Then
            TextoSel1 = Me.ListBox1.List(i)
            TextoSel2 = Me.ListBox1.List(i, 1)
        End If
    Next i

    If IsNull(TextoSel1) Then TextoSel1 = "Nulo"
    If IsNull(TextoSel2) Then TextoSel2 = "Nulo"

    Me.lblVariable.Caption = TextoSel1
    Me.lblValor.Caption = TextoSel2

End Sub
'
'Al inicial el Formulario
Private Sub UserForm_Initialize()
'
    With Me
        '
        .ListBox1.ColumnCount = 2
        .ListBox1.ColumnWidths = "100 pt;200 pt"
        .cmbTipo.AddItem "Win32_OperatingSystem"
        .cmbTipo.AddItem "Win32_Processor"
        .cmbTipo.AddItem "Win32_PhysicalMemoryArray"
        .cmbTipo.AddItem "Win32_LogicalDisk"
        .cmbTipo.AddItem "Win32_VideoController"
        .cmbTipo.AddItem "Win32_BaseService"
        '
    End With
    '
End Sub

Anexos

Descargar Mostrar propiedades del Sistema.rar

Referencia: Exposing System Secrets with VBA and WMI API

You may also like...