Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Variant-Funktion - Rückgabewert Text oder Objekt

Variant-Funktion - Rückgabewert Text oder Objekt
Daniel
Hallo
ich möchte eine Funktion schreiben, die mir als Ergebnis entweder ein Objekt, oder einen Hinweistext liefert, falls das Objekt nicht erstellt/gefunden werden konnte. Dieser Text soll dann die Information enthalten, was jetzt die Ursache für den Fehler war.
Das ist soweit alles kein Problem, scheitert aber an der Tatsache, daß man Objekte immer mit Set zuweisen muss.
dh wenn ich
xxx = MeineFunktion()
schreibe, bekomme ich einen Fehler, wenn die Funktion das Objekt zurückgibt
wenn ich
Set xxx = MeineFunktion()
schreibe, bekomme ich den Fehler, wenn die Funktion den Hinweistext zurückgibt.
Kennt jemand hierfür eine elgante Lösung?
vielen Dank, Daniel
Anzeige
AW: Variant-Funktion - Rückgabewert Text oder Objekt
16.09.2011 13:07:05
Martin
Hallo Daniel,
dann entferne den Hinweistext aus deiner Function und nehme die Variante

Set xxx = MeineFunktion()
Falls das Objekt nicht gefunden wurde:

    If xxx Is Nothing Then
MsgBox "Kein Objekt gefunden"
Exit Sub
End If
Viele Grüße
Martin
Anzeige
AW: Variant-Funktion - Rückgabewert Text oder Objekt
16.09.2011 13:21:22
Daniel
HI
nein, das ist zu einfach.
ich will dem Anwender schon mitteilen, warum die Funktion gescheitert ist, bzw welcher der eingebenen Parameter für das Scheitern verantwortlich ist.
Das kann ich während dem Funktionlauf ganz gut ermitteln und möchte dies natürlich nutzen, ohne daß ich die Funktion 2x laufen lassen muss.
Gruß, Daniel
Anzeige
AW: Variant-Funktion - Rückgabewert Text oder Objekt
16.09.2011 13:30:42
Martin
Hallo Daniel,
mit "VarType(VarName)" kannst du den Untertyp einer Variablen abfragen.
Viele Grüße
Martin
AW: Variant-Funktion - Rückgabewert Text oder Objekt
16.09.2011 13:54:03
Daniel
HI
ja, aber ich müsste ja hierfür den VarType kennen, bevor ich die Variable überhaupt befülle, deswegen geht das nicht.
Gruß, Daniel
AW: Variant-Funktion - Rückgabewert Text oder Objekt
16.09.2011 14:24:48
Martin
Hallo Daniel,
nein, der VarType wird doch automatisch erkannt:

Sub test()
MsgBox VarType(7)
MsgBox VarType("Hinweistest")
End Sub
Gruß,
Martin
Anzeige
AW: Variant-Funktion - Rückgabewert Text oder Objekt
16.09.2011 15:22:05
Daniel
Hi
das würde dann höchsten so funktionieren:

dim Ergebnis as Variant
if Vartype(MeineFunktion(...)) = 9 then
Set Ergebnis = Meine(Funktion(...)
Else
Ergebnis = MeineFunktion(...)
Ende if

das hat aber den Nachteil, daß ich die Funktion 2x laufen lassen muss, das erste mal, um den Typ ihres Rückgabewerts zu ermitteln und das 2. Mal, um das Ergebnis zu berechnen.
Das möchte ich vermeiden, da die Funktion etwas länger zum berechnen braucht.
Gruß, Daniel
Anzeige
Keine Funktion, aber Sub für Text oder Objekt
17.09.2011 17:14:27
Erich
Hi Daniel,
wenn man nicht darauf besteht, dass eine Funktion verwendet werden soll, geht das eigentlich ganz einfach
mit einer Sub-Prozedur mit einem Parameter:

Sub myTest()
Dim varE ' as variant
mySub varE                             ' ein Aufruf
If VarType(varE) = 9 Then
MsgBox "Objekt: " & varE.Name
Else
MsgBox "Hinweis:" & vbLf & varE
End If
End Sub
Sub mySub(vErg)
If Second(Now) Mod 10 > 4 Then
Set vErg = Sheets(1)       ' manchmal ein Objekt
Else
vErg = "Falsche Zeit - kein Objekt" ' sonst Text
End If
End Sub
Die Prozedur für die Objektermittlung muss nur einmal aufgerufen werden.
Im Parameter steht nachher ein Objekt oder ein Text, was sich mit VarType prüfen lässt.
Hier sorgt VBA für die Parameterübergabe und übergibt den jeweils gewünschten Wert.
Bei der Funktion war das Problem, dass man beim Aufruf noch nicht weiß,
ob man das Fkt-Ergebnis ohne oder mit "Set" in eine Variable schreiben soll.
Besser finde natürlich auch ich Franz' Vorschlag mit zwei Parametern - einem Objekt (im Erfolgsfall)
und einem String (für den Hinweis).
Vor längerer Zeit waren sogenannte ReturnCodes (RCs) Standard bei der Programmierung...
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: Keine Funktion, aber Sub für Text oder Objekt
17.09.2011 23:09:41
Daniel
Hi
Stimmt natürlich, wenn man die ByRef-Funktionalität nutzt, um einen Eingabeparameter direkt als Rückgabewert zu verwenden, dann braucht man im prinzip auch keine Funktion mehr, da ist das natürlich nur konsequent.
Trotzdem bleibt wohl die Erkenntnis, das eine Variant-Funktion aufgrund der Set-Problematik nur eingeschränkt "variant" ist, nämlich entweder als normale Variable oder als Objekt. Beides gleichzeitig ist wohl nicht möglich.
Gruß, Daniel
Anzeige
oder etwa doch?
18.09.2011 00:05:40
Erich
Hi Daniel,
hier ein Beispiel für eine Fkt., die sowohl ein Objekt als auch einen String zurückgeben kann.
Die Fkt. ist damit "voll" variant - nicht nur eingeschränkt.
Ein Problem ist nur, im aufrufenden Programm den Funktionswert einer Variablen zuzuweisen.
Da sehe ich jetzt nur die Möglichkeit, die Fkt. zweimal aufzurufen:

Sub myTest()
Dim varE ' as variant
On Error Resume Next
varE = myFkt()                           ' Aufruf sonst
Set varE = myFkt()                       ' Aufruf Objekt
On Error GoTo 0
If VarType(varE) = 9 Then
MsgBox "Objekt: " & varE.Name
Else
MsgBox "Hinweis:" & vbLf & varE
End If
End Sub
Function myFkt()
If Second(Now) Mod 10 > 4 Then
Set myFkt = Sheets(1)       ' manchmal ein Objekt
Else
myFkt = "Falsche Zeit - kein Objekt" ' sonst Text
End If
End Function
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
mal ohne Funktion
18.09.2011 00:13:22
Erich
Hi Daniel,
nur um zu zeigen, dass die Variant-liefernde Fkt. nicht das Problem ist,
mal ein Beispiel ohne Fkt.:

Sub myTest()
Dim varQ, varE ' as variant
If Second(Now) Mod 10 > 4 Then
Set varQ = Sheets(1)       ' manchmal ein Objekt
Else
varQ = "Falsche Zeit - kein Objekt" ' sonst Text
End If
On Error Resume Next
varE = varQ                           ' Zuweisung sonst
Set varE = varQ                       ' Zuweisung Objekt
On Error GoTo 0
If VarType(varE) = 9 Then
MsgBox "Objekt: " & varE.Name
Else
MsgBox "Hinweis:" & vbLf & varE
End If
End Sub
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: mal ohne Funktion
18.09.2011 15:15:54
Daniel
Hi Erich
danke für den Hinweis, aber ich denke soweit war das schon klar, daß nicht die Funktion das Problem ist, sondern die Zuweisung an die Variable.
Gruß, Daniel
AW: Variant-Funktion - Rückgabewert Text oder Objekt
16.09.2011 13:30:42
fcs
Hallo Daniel,
wenn du den Fehler-Text nicht in der Function als Meldung ausgeben willst, dann musst du in der Aufrufenden Prozedur eine entsprechende Variabiable deklarieren. Für die Funktion deklarierst du einen zusätzlichen Parameter, in den der Fehlertext geschrieben wird.
Das ganze packst du in eine Fehlerbehandlung in der Funktion.
Gruß
Franz

Sub MakeObject()
Dim sFehlerText As String, oObject As Object, sTest As String
sTest = "Tabelle12"
Set oObject = fncHoleObject(sTest, sFehlerText)
If oObject Is Nothing Then
MsgBox sFehlerText, vbInformation, "Fehler - fncHoleObject - """ & sTest & """"
Else
MsgBox "Objekt wurde eingerichtet" & vbLf & "Objekt-Name: " & oObject.Name, _
vbInformation, "fncHoleObject"
End If
End Sub
Public Function fncHoleObject(ByVal sObjectName As String, ByRef sText As String) As Object
On Error GoTo Fehler
Set fncHoleObject = ActiveWorkbook.Worksheets(sObjectName)
Fehler:
With Err
Select Case .Number
Case 0 'alles ok
Case Else
sText = "Fehler-Nr.: " & .Number & " in Function ""fncHoleObject""" _
& vbLf & .Description
Set fncHoleObject = Nothing
End Select
End With
End Function

Anzeige
AW: Variant-Funktion - Rückgabewert Text oder Objekt
16.09.2011 13:52:54
Daniel
HI
Ok, verstehe, du verwendest eine zusätzlichen Variable, die über die ByRef-Funktionaliät der Funktion befüllts und wandelst damit einen Eingabeparameter zu einem zweiten Rückgabewert.
nicht schlecht die Idee, guter Workaround.
Gruß, Daniel
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Variant-Funktion in VBA: Rückgabewerte von Text oder Objekt


Schritt-für-Schritt-Anleitung

Um eine Funktion in VBA zu erstellen, die entweder ein Objekt oder einen Hinweistext zurückgibt, folge diesen Schritten:

  1. Deklaration der Variablen: Erstelle eine Variable vom Typ Variant, um sowohl Objekte als auch Text speichern zu können.

    Dim Ergebnis As Variant
  2. Funktion schreiben: Implementiere die Funktion, die je nach Bedingung entweder ein Objekt oder einen Hinweistext zurückgibt.

    Function MeineFunktion() As Variant
       If Second(Now) Mod 10 > 4 Then
           Set MeineFunktion = Sheets(1) ' Gibt ein Objekt zurück
       Else
           MeineFunktion = "Falsche Zeit - kein Objekt" ' Gibt einen Text zurück
       End If
    End Function
  3. Aufruf der Funktion: Achte darauf, die Rückgabewerte korrekt zuzuweisen, je nachdem, ob es sich um ein Objekt handelt oder nicht.

    On Error Resume Next
    Ergebnis = MeineFunktion()
    Set Ergebnis = MeineFunktion()
    On Error GoTo 0
  4. Überprüfung des Rückgabetyps: Verwende VarType, um zu überprüfen, ob das Ergebnis ein Objekt oder ein Text ist.

    If VarType(Ergebnis) = vbObject Then
       MsgBox "Objekt: " & Ergebnis.Name
    Else
       MsgBox "Hinweis:" & vbLf & Ergebnis
    End If

Häufige Fehler und Lösungen

  • Fehler bei der Rückgabe: Wenn du versuchst, einen Hinweistext mit Set zuzuweisen, wirst du einen Typfehler erhalten. Stelle sicher, dass du Set nur für Objekte verwendest.

  • Doppelte Funktionsaufrufe: Um die Funktion nur einmal auszuführen und dennoch den Rückgabewert zu erhalten, implementiere eine Fehlerbehandlung, um den Rückgabewert zu analysieren und entsprechend zu handeln.


Alternative Methoden

Statt einer Funktion kannst du eine Sub-Prozedur verwenden, um den Rückgabewert zu übergeben:

Sub myTest()
    Dim varE As Variant
    mySub varE
    If VarType(varE) = vbObject Then
        MsgBox "Objekt: " & varE.Name
    Else
        MsgBox "Hinweis:" & vbLf & varE
    End If
End Sub

Sub mySub(ByRef vErg As Variant)
    If Second(Now) Mod 10 > 4 Then
        Set vErg = Sheets(1) ' Gibt ein Objekt zurück
    Else
        vErg = "Falsche Zeit - kein Objekt" ' Gibt einen Text zurück
    End If
End Sub

Dies ermöglicht eine einfachere Handhabung der Rückgabewerte.


Praktische Beispiele

Hier ist ein einfaches Beispiel, das die Verwendung der Variant-Funktion in Excel zeigt:

Sub Beispiel()
    Dim Ergebnis As Variant
    Ergebnis = MeineFunktion()

    If VarType(Ergebnis) = vbObject Then
        MsgBox "Das zurückgegebene Objekt ist: " & Ergebnis.Name
    Else
        MsgBox "Es gab einen Fehler: " & Ergebnis
    End If
End Sub

Dieses Skript demonstriert die Anwendung einer Variant-Funktion in einer typischen Excel-Anwendung.


Tipps für Profis

  • Verwende On Error Resume Next: Dies kann hilfreich sein, um Fehler abzufangen, ohne dass das Skript stoppt.

  • Nutze ByRef für Parameter: Wenn du eine Sub-Prozedur verwendest, um Rückgabewerte zu übergeben, ist ByRef die beste Wahl, um sicherzustellen, dass die Änderungen an der Variablen auch außerhalb der Sub sichtbar sind.

  • Vermeide doppelte Funktionsaufrufe: Um die Effizienz zu steigern, solltest du sicherstellen, dass eine Funktion nur einmal aufgerufen wird, um die Leistung zu optimieren, besonders bei rechenintensiven Funktionen.


FAQ: Häufige Fragen

1. Kann ich eine Funktion in VBA verwenden, die mehrere Rückgabewerte hat?
Ja, dies kann durch die Verwendung von Parametern erreicht werden, die mit ByRef übergeben werden. So kannst du mehrere Werte zurückgeben.

2. Wie erkenne ich, ob ein Rückgabewert ein Objekt oder ein Text ist?
Verwende die Funktion VarType, um den Typ des Rückgabewerts zu bestimmen, bevor du versuchst, ihn zu nutzen.

3. Was ist der Unterschied zwischen Set und einer normalen Zuweisung?
Set wird verwendet, um Objekte zuzuweisen, während normale Zuweisungen für primitive Datentypen wie String oder Integer verwendet werden.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige