Type: Unterschied zwischen den Versionen
Pwania (Diskussion | Beiträge) (Die Seite wurde neu angelegt: „== Definition == Der benutzerdefinierte Datentyp <code>Type</code> ist tatsächlich kein eigener Datentyp, sondern stellt die Möglichkeit zur Verfügung, ein…“) |
Pwania (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
||
(7 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
[[Category:vba-wiki]] | |||
== Definition == | == Definition == | ||
Der benutzerdefinierte Datentyp <code>Type</code> 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 <code>End Type</code>. Bitte denken Sie daran, dies selbst zu tun! Bei der Definition wird lediglich angegeben, welche Bestandteile der <code>Type</code> besitzen soll, also die Struktur definiert. Ein <code>Type</code> 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: | Der benutzerdefinierte Datentyp <code>Type</code> ist tatsächlich kein eigener Datentyp, sondern stellt die Möglichkeit zur Verfügung, eine Gruppe von Eigenschaften und Werten zusammenzufassen: | ||
<span style="Color:blue">Option Explicit | |||
Private Type </span>tpeUserData | |||
FirstName<span style="Color:blue"> As String</span> | |||
LastName<span style="Color:blue"> As String</span> | |||
BirthDate<span style="Color:blue"> As Date | |||
End Type</span> | |||
'''Achtung:''' Der VBA-Editor ergänzt nicht, wie bei Sub, Function und Property, automatisch das <code>End Type</code>. Bitte denken Sie daran, dies selbst zu tun! | |||
* Bei der Definition wird lediglich angegeben, welche Bestandteile der <code>Type</code> besitzen soll, also die Struktur definiert. | |||
* Ein <code>Type</code> 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: | |||
* <code>Private</code> beschränkt den Einsatz auf das Modul (die Klasse, die UserForm), in dem der <code>Type</code> definiert wurde | * <code>Private</code> beschränkt den Einsatz auf das Modul (die Klasse, die UserForm), in dem der <code>Type</code> definiert wurde | ||
* <code>Public</code> (ausschließlich in Modulen!) erweitert den Einsatz auf das gesamte Projekt ''' Bitte beachten:''' Ein benutzerdefinierter Datentyp muss mindestens ein Element enthalten. | * <code>Public</code> (ausschließlich in Modulen!) erweitert den Einsatz auf das gesamte Projekt | ||
''' Bitte beachten:''' Ein benutzerdefinierter Datentyp muss mindestens ein Element enthalten. | |||
== Deklaration == | == Deklaration == | ||
Dim myData As tpeUserData | <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<span style="Color:blue"> | |||
End Sub</span> | |||
== 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( | '''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 | 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 == | ||
Der benutzerdefinierte Datentyp kann '''NICHT''' als Element in eine [[Collection]] aufgenommen werden. Die Bildung eines [[Array|Arrays]] mit Elementen eines benutzerdefinierten Datentyps ist | Der benutzerdefinierte Datentyp kann '''NICHT''' als Element in eine [[Collection]] aufgenommen werden. | ||
Die Bildung eines [[Array|Arrays]] mit Elementen eines benutzerdefinierten Datentyps ist hingegen möglich. | |||
Die einzelnen Elemente eines benutzerdefinierten Datentyps können neben den natürlichen Datentypen auch eine Collection oder ein Array aufnehmen: | |||
<span style="Color:blue">Private Type </span>tpeMyType | |||
CollectionEntries<span style="Color:blue"> As </span>Collection | |||
ArrayEntries<span style="Color:gray">()</span><span style="Color:blue"> As String | |||
End Type</span> | |||
== Alternative == | == Alternative == | ||
Alternativ zum benutzerdefinierten Datentyp können Sie eine [[Klassenobjekte#Datenklassen|Datenklasse]] einsetzen, um zusammengesetzte Datengruppen handhaben zu können. Bitte beachten Sie dazu den [[Klassenobjekte#Vergleich mit Datentyp 'Type'|Vergleich zwischen Datenklasse und 'Type']]. | Alternativ zum benutzerdefinierten Datentyp können Sie eine [[Klassenobjekte#Datenklassen|Datenklasse]] einsetzen, um zusammengesetzte Datengruppen handhaben zu können. | ||
Bitte beachten Sie dazu den [[Klassenobjekte#Vergleich mit Datentyp 'Type'|Vergleich zwischen Datenklasse und 'Type']]. |
Aktuelle Version vom 28. Januar 2023, 00:39 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 derType
definiert wurdePublic
(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 hingegen möglich.
Die einzelnen Elemente eines benutzerdefinierten Datentyps können neben den natürlichen Datentypen auch eine Collection oder ein Array aufnehmen:
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'.