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

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

E-Mail PDF

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

Kontext

In dem Artikel EXCEL 2010 VBA: Datentyp einer Variant-Variablen bestimmen - TypeName() wird eine Möglichkeit erläutert, wie man den Datentyp einer Variant-Varialben ermitteln kann. Da es viele Wege nach Rom gibt, wird hier die weitere Möglichkeit vorgestellt, das mit VarType() zu realisieren.

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_vartype_aufgabenstellung

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

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

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. Im Übergabeparameter vBereich() können somit alle möglichen Werte als auch Range-Objekte stecken, also gilt es, alle Range-Objekte von vBereich() herauszufiltern, die in der Funktion SummeRange() weiterverarbeitet werden. Diese zentrale Aufgabe übernimmt die VBA-Funktion VarType(). Steckt man eine Variable in VarType(), kommt als Rückgabeparameter ein Integer-Wert zurück, der den Typ der übergebenen Variablen charakterisiert. Dabei kann man als Entwickler auf die folgenden VBA-Konstenten reagieren, die bereits vordefiniert sind.

Konstante Wert Beschreibung
vbEmpty 0 Empty (nicht initialisiert)
vbNull 1 Null (kein gültiger Dateninhalt)
vbInteger 2 Integer
vbLong 3 Long integer
vbSingle 4 Single-Variable
vbDouble 5 Double-Variable
vbCurrency 6 Währung
vbDate 7 Datumswert
vbString 8 Zeichenkette
vbObject 9 Objekt
vbError 10 Fehlerwert
vbBoolean 11 Boolean
vbVariant 12 Variant-Variable
vbDataObject 13 Datenobjekt (in Zusammenhang mit Access)
vbDecimal 14 Dezimal-Wert
vbByte 17 Byte-Wert
vbUserDefinedType 36 Anwenderdefinierter Variablentyp
vbArray 8192 Array

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 VarType(vBereich(lZaehlerAnzahlEintraege))
      Case 8204: ' Das Resultat 8.204 entspricht einem Range-Objekt
        dSumme = dSumme + SummeRange(vBereich(lZaehlerAnzahlEintraege))
      Case Else:
        If IsNumeric(vBereich(lZaehlerAnzahlEintraege)) Then ' Prüfung, ob es sich um einen numerischen Wert handelt
          dSumme = dSumme + vBereich(lZaehlerAnzahlEintraege)
        End If
    End Select
  Next lZaehlerAnzahlEintraege

  MeineSumme = dSumme

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
      If IsNumeric(vBereich.Cells(lZaehlerZeilen, lZaehlerSpalten).Value) Then ' Prüfung, ob es sich
                                                                               ' um einen numerischen Wert handelt

        dSumme = dSumme + vBereich.Cells(lZaehlerZeilen, lZaehlerSpalten).Value
      End If
    Next lZaehlerSpalten
  Next lZaehlerZeilen

  SummeRange = dSumme

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 VarType(vBereich(lZaehlerAnzahlEintraege))
      Case 8204: ' Das Resultat 8.204 entspricht einem Range-Objekt
        dSumme = dSumme + SummeRange(vBereich(lZaehlerAnzahlEintraege))
      Case Else:
        If IsNumeric(vBereich(lZaehlerAnzahlEintraege)) Then ' Prüfung, ob es sich um einen numerischen Wert handelt
          dSumme = dSumme + vBereich(lZaehlerAnzahlEintraege)
        End If
    End Select
  Next lZaehlerAnzahlEintraege

  MeineSumme = dSumme

End Function

Schlussbetrachtung

Auch dieses Beispiel können Sie sich herunterladen. Bitte beachten Sie auch den Folgenden Artikel: EXCEL 2010 VBA: Datentyp einer Variant-Variablen bestimmen - TypeName()


Zuletzt aktualisiert am Montag, den 04. November 2013 um 18:40 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!