Type: Unterschied zwischen den Versionen

Aus VBA-wiki
Zur Navigation springen Zur Suche springen
Zeile 32: Zeile 32:
== Verwendung ==
== Verwendung ==


myData.FirstName = "Max" myData.LastName = "Muster" myData.BirthDate = "1966-03-05"
<span style="Color:blue">Private Sub </span>WorkWithType<span style="Color:gray">()</span>
    <span style="Color:blue"> Dim </span>myData<span style="Color:blue"> As </span>tpeUserData
   
    myData<span style="Color:gray">.</span>FirstName <span style="Color:gray">=</span> <span style="Color:gray">"Max"</span>
    myData<span style="Color:gray">.</span>LastName <span style="Color:gray">=</span> <span style="Color:gray">"Muster"</span>
    myData<span style="Color:gray">.</span>BirthDate <span style="Color:gray">=</span> <span style="Color:gray">"1966-03-05"</span><span style="Color:blue">
End Sub</span>


=== Als Rückgabewert einer Funktion ===
=== Als Rückgabewert einer Funktion ===


Private Function LoadUserData() As tpeUserData LoadUserData.FirstName = "Max" LoadUserData.LastName = "Muster" LoadUserData.BirthDate = "1966-03-05" End Function
<span style="Color:blue">Private Function </span>LoadUserData<span style="Color:gray">()</span><span style="Color:blue"> As </span>tpeUserData
   
    LoadUserData<span style="Color:gray">.</span>FirstName <span style="Color:gray">=</span> <span style="Color:gray">"Max"</span>
    LoadUserData<span style="Color:gray">.</span>LastName <span style="Color:gray">=</span> <span style="Color:gray">"Muster"</span>
    LoadUserData<span style="Color:gray">.</span>BirthDate <span style="Color:gray">=</span> <span style="Color:gray">"1966-03-05"</span><span style="Color:blue">
End Function</span>


=== Als Übergabeparameter ===
=== Als Übergabeparameter ===


'''Wichtig:''' Die Übergabe eines benutzerdefinierten Datentyps kann ausschließlich 'ByRef' erfolgen! Private Sub WriteUserData('''ByRef''' thisData As tpeUserData) Debug.Print thisData.FirstName & " " & thisData.LastName Debug.Print thisData.BirthDate End Sub
'''Wichtig:''' Die Übergabe eines benutzerdefinierten Datentyps kann ausschließlich 'ByRef' erfolgen!
 
<span style="Color:blue">Private Sub </span>WriteUserData<span style="Color:gray">(</span><span style="Color:blue">ByRef </span>thisData<span style="Color:blue"> As </span>tpeUserData<span style="Color:gray">)</span>
   
    Debug<span style="Color:gray">.</span>Print thisData<span style="Color:gray">.</span>FirstName & <span style="Color:gray">" "</span> & thisData<span style="Color:gray">.</span>LastName Debug<span style="Color:gray">.</span>Print thisData<span style="Color:gray">.</span>BirthDate<span style="Color:blue">
End Sub</span>


=== Verschachtelte Anwendung ===
=== Verschachtelte Anwendung ===


Im folgenden Beispiel bestehen die Dokumentdaten eines Briefes aus Autorendaten und zwei möglichen Unterschriften. Anstatt alle Daten einzeln in einem benutzerdefinierten Datentyp unterzubringen, werden hier die Autorendaten getrennt von den Unterschriften definiert. Im Datentyp der Dokumentdaten selbst wird lediglich eine neue Eigenschaft, das Datum, definiert und der Autor wird als tpeAuthorData deklariert. Die insgesamt zwei möglichen Unterschriften erhalten beide den Datentyp tpeSignature. Private Type '''tpeAuthorData''' FirstName As String LastName As String Phone As String Fax As String EMail As String End Type Private Type '''tpeSignature''' FirstName As String LastName As String Department As String End Type Private Type tpeDocumentData Date As String Author As '''tpeAuthorData''' Signature As '''tpeSignature''' AdditionalSignature As '''tpeSignature''' End Type '''Bitte beachten:''' Folgende Reihenfolge muss bei verschachtelten Datentypen eingehalten werden: Der benutzerdefinierte Datentyp, welcher Elemente eines anderen Datentyps enthält (tpeDocumentData), muss im Code unterhalb der Definition des anderen Datentyps definiert werden (tpeAuthorData und tpeSignature). In einer Prozedur werden Teile der oben dargestellten Struktur wie folgt mit Daten gefüllt: Private Sub LoadData() Dim myDocData As tpeDocumentData myDocData.Date = Date myDocData.Author.FirstName = "Max" myDocData.Author.LastName = "Muster" End Sub
Im folgenden Beispiel bestehen die Dokumentdaten eines Briefes aus Autorendaten und zwei möglichen Unterschriften.  
 
* Anstatt alle Daten einzeln in einem benutzerdefinierten Datentyp unterzubringen, werden hier die Autorendaten getrennt von den Unterschriften definiert.  
* Im Datentyp der Dokumentdaten selbst wird lediglich eine neue Eigenschaft, das Datum, definiert und der Autor wird als tpeAuthorData deklariert.  
* Die insgesamt zwei möglichen Unterschriften erhalten beide den Datentyp tpeSignature.
 
<span style="Color:blue">Option Explicit
Private Type </span>tpeAuthorData
    FirstName<span style="Color:blue"> As String</span>
    LastName<span style="Color:blue"> As String</span>
    Phone<span style="Color:blue"> As String</span>
    Fax<span style="Color:blue"> As String</span>
    EMail<span style="Color:blue"> As String
End Type
Private Type </span>tpeSignature
    FirstName<span style="Color:blue"> As String</span>
    LastName<span style="Color:blue"> As String</span>
    Department<span style="Color:blue"> As String
End Type
Private Type </span>tpeDocumentData
    <span style="Color:blue"> Date As String</span>
    Author<span style="Color:blue"> As </span>tpeAuthorData
    Signature<span style="Color:blue"> As </span>tpeSignature
    AdditionalSignature<span style="Color:blue"> As </span>tpeSignature<span style="Color:blue">
End Type</span>
 
'''Bitte beachten:''' Folgende Reihenfolge muss bei verschachtelten Datentypen eingehalten werden: Der benutzerdefinierte Datentyp, welcher Elemente eines anderen Datentyps enthält (tpeDocumentData), muss im Code unterhalb der Definition des enthaltenen Datentyps definiert werden (tpeAuthorData und tpeSignature).  
 
In einer Prozedur werden Teile der oben dargestellten Struktur wie folgt mit Daten gefüllt:  
<span style="Color:blue">Private Sub </span>LoadData<span style="Color:gray">()</span>
    <span style="Color:blue"> Dim </span>myDocData<span style="Color:blue"> As </span>tpeDocumentData
   
    myDocData<span style="Color:gray">.</span>Date <span style="Color:gray">=</span><span style="Color:blue"> Date</span>
    myDocData<span style="Color:gray">.</span>Author<span style="Color:gray">.</span>FirstName <span style="Color:gray">=</span> <span style="Color:gray">"Max"</span>
    myDocData<span style="Color:gray">.</span>Author<span style="Color:gray">.</span>LastName <span style="Color:gray">=</span> <span style="Color:gray">"Muster"</span><span style="Color:blue">
End Sub</span>


== Types und Datenfelder ==
== Types und Datenfelder ==

Version vom 21. Juni 2019, 17:50 Uhr

Definition

Der benutzerdefinierte Datentyp Type ist tatsächlich kein eigener Datentyp, sondern stellt die Möglichkeit zur Verfügung, eine Gruppe von Eigenschaften und Werten zusammenzufassen:

Option Explicit

Private Type tpeUserData
    FirstName As String
    LastName As String
    BirthDate As Date
End Type

Achtung: Der VBA-Editor ergänzt nicht, wie bei Sub, Function und Property, automatisch das End Type. Bitte denken Sie daran, dies selbst zu tun!

  • Bei der Definition wird lediglich angegeben, welche Bestandteile der Type besitzen soll, also die Struktur definiert.
  • Ein Type kann nur in einem Modul (einer Klasse, einem UserForm) definiert werden, nicht in einer Prozedur.
  • Er kann nur im Kopf des Moduls (der Klasse, der UserForm) definiert werden, wie eine modulweite Variable.

Hierbei gilt folgendes:

  • Private beschränkt den Einsatz auf das Modul (die Klasse, die UserForm), in dem der Type definiert wurde
  • Public (ausschließlich in Modulen!) erweitert den Einsatz auf das gesamte Projekt

Bitte beachten: Ein benutzerdefinierter Datentyp muss mindestens ein Element enthalten.

Deklaration

Private Sub WorkWithType()
    Dim myData As tpeUserData
End Sub

Verwendung

Private Sub WorkWithType()
    Dim myData As tpeUserData
    
    myData.FirstName = "Max"
    myData.LastName = "Muster"
    myData.BirthDate = "1966-03-05"
End Sub

Als Rückgabewert einer Funktion

Private Function LoadUserData() As tpeUserData
    
    LoadUserData.FirstName = "Max"
    LoadUserData.LastName = "Muster"
    LoadUserData.BirthDate = "1966-03-05"
End Function

Als Übergabeparameter

Wichtig: Die Übergabe eines benutzerdefinierten Datentyps kann ausschließlich 'ByRef' erfolgen!

Private Sub WriteUserData(ByRef thisData As tpeUserData)
    
    Debug.Print thisData.FirstName & " " & thisData.LastName Debug.Print thisData.BirthDate
End Sub

Verschachtelte Anwendung

Im folgenden Beispiel bestehen die Dokumentdaten eines Briefes aus Autorendaten und zwei möglichen Unterschriften.

  • Anstatt alle Daten einzeln in einem benutzerdefinierten Datentyp unterzubringen, werden hier die Autorendaten getrennt von den Unterschriften definiert.
  • Im Datentyp der Dokumentdaten selbst wird lediglich eine neue Eigenschaft, das Datum, definiert und der Autor wird als tpeAuthorData deklariert.
  • Die insgesamt zwei möglichen Unterschriften erhalten beide den Datentyp tpeSignature.
Option Explicit

Private Type tpeAuthorData
    FirstName As String
    LastName As String
    Phone As String
    Fax As String
    EMail As String
End Type

Private Type tpeSignature
    FirstName As String
    LastName As String
    Department As String
End Type

Private Type tpeDocumentData
    Date As String
    Author As tpeAuthorData
    Signature As tpeSignature
    AdditionalSignature As tpeSignature
End Type

Bitte beachten: Folgende Reihenfolge muss bei verschachtelten Datentypen eingehalten werden: Der benutzerdefinierte Datentyp, welcher Elemente eines anderen Datentyps enthält (tpeDocumentData), muss im Code unterhalb der Definition des enthaltenen Datentyps definiert werden (tpeAuthorData und tpeSignature).

In einer Prozedur werden Teile der oben dargestellten Struktur wie folgt mit Daten gefüllt:

Private Sub LoadData()
    Dim myDocData As tpeDocumentData
    
    myDocData.Date = Date
    myDocData.Author.FirstName = "Max"
    myDocData.Author.LastName = "Muster"
End Sub

Types und Datenfelder

Der benutzerdefinierte Datentyp kann NICHT als Element in eine Collection aufgenommen werden. Die Bildung eines Arrays mit Elementen eines benutzerdefinierten Datentyps ist dagegen möglich. Die Elemente eines benutzerdefinierten Datentyps können neben den natürlichen Datentypen auch eine Collection oder ein Array sein: Private Type tpeMyType CollectionEntries As Collection ArrayEntries() As String End Type

Alternative

Alternativ zum benutzerdefinierten Datentyp können Sie eine Datenklasse einsetzen, um zusammengesetzte Datengruppen handhaben zu können. Bitte beachten Sie dazu den Vergleich zwischen Datenklasse und 'Type'.