Systeminformationen auslesen, exportieren, DICTIONARY

.. das wohl mächtigste Werkzeug in Bill Gates' Büro-Sippe. Ob reine Formeln, PowerQuery oder VBA. Hier bleiben kaum Wünsche unerfüllt.
Benutzeravatar
thowe
Beiträge: 209
Registriert: 12. Sep 2022, 16:57
Hat sich bedankt: 79 Mal
Danksagung erhalten: 67 Mal
Kontaktdaten:

Systeminformationen auslesen, exportieren, DICTIONARY

#1

Beitrag von thowe »

Moin,

Ein Spickzettel wie man sich - beispielhaft - Systeminformationen auslesen kann.
Dies folgenden Codes können auch für wietere "APP" und oder "SYSTEM"relevante Daten verwendet werden.
Beispielhaft, ob für die Nutzung des Excel-Makros eine gültige Lizenz vorliegt.

Das Einlesen erfolgt wie die Überschrift zeigt über Dictionary.
WICHTIG: Dictionar funktinieren nur in Windows-Betriebssystem, NICHT in Apple Operating Systems

Daher wird ein zweiter Thread das Einlesen via Collection durchführen, siehe hier: Umsetzung via Collection.

Die grundlegenden Unterschiede zwischen Dictionary und Collection sind:

Bei COLLECTION gilt:

- Es ist nicht überprüfbar ob ein Key existiert
- Man kann nicht das Item(Wert/Value) verändern, wenn das Item zum Key gespeichert ist. (-> da ein Objekt)
-> es gibt eine einzige Ausnahme, dies wird im Thread zur Collection erläutert.

Wie funktioniert nun das Ganze:

Dictionary ist nicht Bestandtei der Standardbibiliothek von VBA.
Es ist ein Element der "Microsoft Runtime Library"
Man kann diese Bibiliothekt wie folgt aktivieren
- Extras > Verweise > Microsoft Runtime Library "anhacken" (Kontrollkästchen aktivieren)
- oder via VBA CodeSnippet aktivieren: siehe hier: Spickzettel zu References and GUIDS


mit SystemInfosDictionary füllen wir das Dictionary mit Datensätzen (Key, Item)
-> Achtung bei Collection ist es genau umgekehrt (Item, Key)!

Code: Alles auswählen

Sub SystemInfosDictionary()
    
    Dim varKey As Variant
    'initialize
    Set m_dicSystemInfos = New Scripting.Dictionary
    
    With m_dicSystemInfos
        .Add "Betriebssystem", Application.OperatingSystem
        .Add "ExcelVersion", Application.Version
        .Add "Benutzer Excel", Application.UserName
        .Add "Benutzer angemeldet", Environ("USERNAME")
        .Add "Lizenz", pc_strLicence
    End With
    
    lngNumberSystemInfos = m_dicSystemInfos.Count
    
End Sub

Mit GetSystemInfoDictionary kann man explizit einen Key und den dazugehörigen Wert (Item, Value) abfragen.

Code: Alles auswählen

Function GetSystemInfoDictionary(strKey As String)

   'Get the System Data and
   'check if not Dictionary is NULL (Nothing)
    If m_dicSystemInfos Is Nothing Then Call SystemInfosDictionary
    
    If m_dicSystemInfos.Exists(strKey) Then GetSystemInfoDictionary = m_dicSystemInfos(strKey)
        
End Function
Mit PopulateDictionaryDataToWorksheet kann man sich den gesamten Datensatz (Dictionary) in ein Arbeitsball ausgeben lassen.
Wobei man hier noch wählen kann ob die einzelnen Datensätze zeilenweise (bolPopulateVertically = True) oder spaltenweise (bolPopulateVertically = False) übertragen möchte.

Code: Alles auswählen

Sub PopulateDictionaryDataToWorksheet(Optional strSheetName As String = "SystemInfos", Optional bolPopulateVertically As Boolean = True)

    Dim wksSheet As Worksheet
    Dim rngRange As Range
    Set wksSheet = ThisWorkbook.Worksheets(strSheetName)
    
    'Get the System Info Data
    Call SystemInfosDictionary
    
    'initialize
    wksSheet.Range("A1").CurrentRegion.Delete
    
    If bolPopulateVertically = True Then
        Set rngRange = wksSheet.Range("A1").Resize(lngNumberSystemInfos, 1)
        rngRange.Value = WorksheetFunction.Transpose(m_dicSystemInfos.Keys)
        Else
        Set rngRange = wksSheet.Range("A1").Resize(1, lngNumberSystemInfos)
        rngRange.Value = m_dicSystemInfos.Keys
    End If
    If bolPopulateVertically = True Then
        Set rngRange = wksSheet.Range("B1").Resize(lngNumberSystemInfos, 1)
        rngRange.Value = WorksheetFunction.Transpose(m_dicSystemInfos.Items)
        Else
        Set rngRange = wksSheet.Range("A2").Resize(1, lngNumberSystemInfos)
        rngRange.Value = m_dicSystemInfos.Items
    End If
    
End Sub
-> Die Ausgabe (das Speichern) in eine Textdatei erfolgt - mit einem passenden Beispiel hier:

Abshließen noch eine praktische Basteilei mit Arbeitsblättern (Worksheets)
-> damit lässt sxich kinderleicht das Vorhandensein eines Arbeitsblattes ermitteln

Ganz zum Schluss: Ein Dank (in alphabetischer Folge) an: Chandoo, Francis und snb
Folgende Benutzer bedankten sich beim Autor thowe für den Beitrag:
d'r Bastler
Benutzeravatar
thowe
Beiträge: 209
Registriert: 12. Sep 2022, 16:57
Hat sich bedankt: 79 Mal
Danksagung erhalten: 67 Mal
Kontaktdaten:

Re: Systeminformationen auslesen, exportieren, DICTIONARY

#2

Beitrag von thowe »

Huch... Ein bedeutender Fehler (es fehlt was)!

Im Modulkopf bitte folgende Deklaration:

Public dicSheets As Scripting.Dictionary

Sorry...
NS: Eventuell kann d'r Bastler im obigen Thread diesen Eintrag noch einfügen...?
Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste