Start Hilfe und Support Microsoft Office EXCEL 2010 VBA: Datentyp einer Variant-Variablen bestimmen - TypeName()

EXCEL 2010 VBA: Datentyp einer Variant-Variablen bestimmen - TypeName()

E-Mail PDF

Eine Variable des Datentyps Variant kann alles sein, aber welcher Datentyp steckt in der Variant-Variablen nun eigentlich drin?

Kontext

Das folgende Beispiel baut auf dem Beispiel Die Verwendung von ParamArray auf. Wer die Vorgeschichte kennenlernen möchte, kann sich das Beispiel ansehen, es ist jedoch für das Verständnis der Ermittlung des Datentyps einer Variant-Variablen nicht notwendig.

Aufgabenstellung

An die SUMMEn-Funktion von EXCEL kann eine beliebige Anzahl von Parametern übergeben werden und die Parameter können von unterschiedlichem Typ sein. In der Regel werden an eine Summenfunktion Range-Objekte (also Bereiche aus der Tabelle) oder Werte übergeben. Um was es sich handelt, muss also von der SUMMEn-Funktion selbst herausgefunden werden.

In diesem Beispiel wird die Summen-Funktion nachempfunden, die Funktion hört auf den Namen MeineSumme. Wie bei der Originalfunktion von EXCEL, der Funktion SUMME, kann eine beliebige Anzahl von Parametern unterschiedlichen Datentyps übergeben werden. Für die Summenfunktion ist das wichtig, gilt es doch, auf ein Range-Objekt, das übergeben wird, anders zu reagieren als auf Zahlenwerte, die der Funktion mitgegeben werden. Dann muss noch geklärt werden, ob es sich wirklich um eine Zahl handelt, die man auch summieren kann.

Hier die beispielhafte Aufgabenstellung auf einem EXCEL-Arbeitsblatt:

datentyp_bestimmen_aufgabenstellung_typename

In diesem Beispiel werden die Grün markierten Bereiche und Zellen in der selbstgeschriebenen Funktion "MeineSumme" aufsummiert und zusätzlich die Zahl 5. Als Kontrollrechnung wird die Standardfunktion von EXCEL SUMME verwendet:

  • Das Original: =SUMME(A2:B3;B5;C5:C7;D9;B11:D11;C13;5)
  • Die Fälschung: =MeineSumme(A2:B3;B5;C5:C7;D9;B11:D11;C13;5)

Bestimmung des Inhalts eine Variablen des Datentyps Variant mit der Funktion "TypeName()"

Um die vollständige Funktionsweise der Funktion "MeineSumme" nachzuvollziehen, lesen Sie bitte den Artikel Die Verwendung von ParamArray. In der folgenden Beschreibung geht es nur um die Typbestimmung des Inhaltes einer Variant-Variablen.

Die folgenden Erläuterungen beziehen sich auf den blau dargestellten Programmcode.

An die Funktion MeineSumme wird eine unbestimmte Anzahl an Parametern übergeben, der Empfänger der Parameter ist die Variable vBereich(), die als Variant typisiert ist. In dieser Variablen vBereich() können also Inhalte unterschiedlichen Typs stecken. In einer Summenfunktion können ausschließlich Zahlenwerte aufsummiert werden, also gilt es, alle Inhalte von vBereich() herauszufiltern, die Zahlenwerte enthalten. Diese zentrale Aufgabe übernimmt die VBA-Funktion TypeName(). Steckt man eine Variable in TypeName(), kommt als Rückgabeparameter ein beschreibender Text zurück, der den Typ der übergebenen Variablen charakterisiert. Dabei kann man als Entwickler auf die folgenden Rückgabewerte reagieren.

Objekt-Typ Beschreibung
Byte Byte-Variable (Ganzzahl)
Integer Integer-Variable (Ganzzahl)
Long Longinteger-Variable (Ganzzahl)
Single Single-Variable, (reelle Zahl)
Double Double-Variable (reelle Zahl)
Currency Währungs-Variabel
Decimal Decimal-Variable (reelle Zahl, Verwendung in der Datebank Access)
Date Datums-Variabel
String String-Variable (enthält alphanumerische Zeichen)
Boolean Boolsche Variable (Wahr und Falsch)
Error Fehlermeldung
Empty Variable ist nicht initialisiert bzw. leer
Null Keine gültigen Dateninhalte
Object Object-Variable (diese kann unterschiedliche Ausprägungen haben, in diesem Beispiel wird auf den Rückgabewert Range reagiert)
Unknown Unbekannter Objecttyp
Nothing Eine Objektvariable zeigt ins nichts, ist also nicht referenziert

Dies Analyse des Inhalts wird in der Select Case-Struktur vorgenommen. Je nachdem, was TypeName() als Ergebnis zurückgibt, wird in unterschiedliche Vorgehensweisen verzweigt. Handelt es sich um einen Zahlenwert, wird die Zahl in der Variablen dSumme aufsummiert, handelt es sich um das Objekt Range, wird die Auswertung des Inhalts von Range in einer weiteren Funktion verarbeitet (die übrigens auch wieder den Ihnalt der einzelnen Range-Werte entsprechend des Typs untersucht).

Man kann die Fallunterscheidung auch mit If .. Then .. Else bewerkstelligen, Select .. Case finde ich jedoch übersichtlicher.

Nun folgt noch der Programmcode...

Function MeineSumme(ParamArray vBereich() As Variant) As Double

  Dim lAnzahlEintraege As Long
  Dim lZaehlerAnzahlEintraege As Long
  Dim dSumme As Double

  lAnzahlEintraege = UBound(vBereich()) ' Die Anzahl der übergebenen Parameter wird bestimmt
                                        ' ACHTUNG: da VBA die Indizierung bei 0 beginnt, kommt als Wert

                                        ' Anzahl-der-Einträge - 1 heraus, also bei 6 Elementen 5

  dSumme = 0  ' Wert Initialisieren, ist eigentlich in VBA bei erstmaliger Verwendung nicht notwendig,
              ' aber eine alte Gewohnheit

  For lZaehlerAnzahlEintraege = 0 To lAnzahlEintraege  ' Hier werden die Werte in den einzelnen Ranges aufsummiert
    Select Case UCase(TypeName(vBereich(lZaehlerAnzahlEintraege))) 'um Groß- und Kleinschreibfehler zu umgehen, wird der Rückgabewert in Großbuchstaben umgewandelt
      Case "RANGE":
        dSumme = dSumme + SummeRange(vBereich(lZaehlerAnzahlEintraege))
      Case "BYTE", "INTEGER", "LONG", "SINGLE", "DOUBLE", "CURRENCY", "DEZIMAL":
        dSumme = dSumme + vBereich(lZaehlerAnzahlEintraege)
    End Select
  Next lZaehlerAnzahlEintraege

  MeineSumme = dSumme ' Rückgabewert wird an die Funktion übergeben

End Function

Der Vollständige Programmcode

Option Explicit


Function SummeRange(ByVal vBereich As Range) As Double

  Dim lZeilen As Long
  Dim lSpalten As Long
  Dim lZaehlerZeilen As Long
  Dim lZaehlerSpalten As Long
  Dim dSumme As Double

  lZeilen = vBereich.Rows.Count  ' Die Anzahl Zeilen werden bestimmt
  lSpalten = vBereich.Columns.Count  ' Die Anzahl Spalten werden bestimmt

  dSumme = 0  ' Wert Initialisieren, ist eigentlich in VBA bei erstmaliger Verwendung nicht notwendig,
              ' aber eine alte Gewohnheit

  For lZaehlerZeilen = 1 To lZeilen  ' Hier werden die Werte in den einzelnen Zellen aufsummiert
    For lZaehlerSpalten = 1 To lSpalten
      Select Case UCase(TypeName(vBereich.Cells(lZaehlerZeilen, lZaehlerSpalten).Value))
        Case "BYTE", "INTEGER", "LONG", "SINGLE", "DOUBLE", "CURRENCY", "DEZIMAL":
          dSumme = dSumme + vBereich.Cells(lZaehlerZeilen, lZaehlerSpalten).Value
      End Select
    Next lZaehlerSpalten
  Next lZaehlerZeilen

  SummeRange = dSumme ' Rückgabewert wird an die Funktion übergeben

End Function


Function MeineSumme(ParamArray vBereich() As Variant) As Double

  Dim lAnzahlEintraege As Long
  Dim lZaehlerAnzahlEintraege As Long
  Dim dSumme As Double

  lAnzahlEintraege = UBound(vBereich()) ' Die Anzahl der übergebenen Parameter wird bestimmt
                                        ' ACHTUNG: da VBA die Indizierung bei 0 beginnt, kommt als Wert
                                        ' Anzahl-der-Einträge - 1 heraus, also bei 6 Elementen 5
   
  dSumme = 0  ' Wert Initialisieren, ist eigentlich in VBA bei erstmaliger Verwendung nicht notwendig,
              ' aber eine alte Gewohnheit

  For lZaehlerAnzahlEintraege = 0 To lAnzahlEintraege  ' Hier werden die Werte in den einzelnen Ranges aufsummiert
    Select Case UCase(TypeName(vBereich(lZaehlerAnzahlEintraege)))
      Case "RANGE":
        dSumme = dSumme + SummeRange(vBereich(lZaehlerAnzahlEintraege))
      Case "BYTE", "INTEGER", "LONG", "SINGLE", "DOUBLE", "CURRENCY", "DEZIMAL":
        dSumme = dSumme + vBereich(lZaehlerAnzahlEintraege)
    End Select
  Next lZaehlerAnzahlEintraege

  MeineSumme = dSumme ' Rückgabewert wird an die Funktion übergeben

End Function

Schlussbetrachtung

Auch dieses Beispiel können Sie sich herunterladen. Der Abend hat sich gelohnt, nun dürften alle Eigenschaften von der Summenfunktion abgebildet sein. Wenn Sie noch einen offenen Punkt sehen, hinterlassen Sie bitte eine Nachricht.

Bitte beachten Sie auch den Artikel EXCEL 2010 VBA: Datentyp einer Variant-Variablen bestimmen - VarType(), dort wird das gleiche Problem mit der Funktion VarType() gelöst.


Zuletzt aktualisiert am Montag, den 04. November 2013 um 18:44 Uhr  


Machen Sie mit

Sie haben noch alte Bilder gefunden über Happerschoß und Umgebung. Es wäre schön, wenn Sie diese zur Verfügung stellen, so dass viele daran Freude haben und sich vielleicht an alten Zeiten erinnern können. Bitte melden Sie sich! Gehen Sie bitte direkt über die Kontaktseite und schreiben Sie eine Nachricht. Es geht natürlich auch mit einer Mail an Info@happerschoss.net. Natürlich sind auch alte Negative und Dias (farbig oder schwarz/weiß) willkommen, ganz gleich in welchem Format (Kleinbild, 6x6 oder auch von einer Plattenkamera), ein bearbeiteter und schöner Abzug von Ihrem Bild ist Ihnen versprochen. Danke für Ihre Mithilfe!